{
  "address": "0x4225bFBf2eEd292273344987bBE6ef9937009cCb",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_masterDeployer",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [],
      "name": "InvalidTokenOrder",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "UnauthorisedDeployer",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ZeroAddress",
      "type": "error"
    },
    {
      "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": "count",
          "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": "0x79f8754f2fcdc569020daa92eac6981d4111f0a714adf2576ccfb89e0b51dd6e",
  "receipt": {
    "to": null,
    "from": "0x58B4B6951e9174F153635574076241315D7d3503",
    "contractAddress": "0x4225bFBf2eEd292273344987bBE6ef9937009cCb",
    "transactionIndex": 0,
    "gasUsed": "4097005",
    "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
    "blockHash": "0x202d21c59d9e3e834ce939f384384931111ae2be45acf156b7f9aa1406409919",
    "transactionHash": "0x79f8754f2fcdc569020daa92eac6981d4111f0a714adf2576ccfb89e0b51dd6e",
    "logs": [],
    "blockNumber": 28497212,
    "cumulativeGasUsed": "4097005",
    "status": 1,
    "byzantium": true
  },
  "args": [
    "0xdCFaae69E67E4bA73d5A890Fcae097eB3C615e96"
  ],
  "solcInputHash": "426130bf1086dd12d6f15ed5763ff493",
  "metadata": "{\"compiler\":{\"version\":\"0.8.7+commit.e28d00a7\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_masterDeployer\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"InvalidTokenOrder\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorisedDeployer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"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\":\"count\",\"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    /// @dev Approves users' BentoBox assets to a \\\"master\\\" contract.\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n}\\n\",\"keccak256\":\"0x80ef2859d876a6b464e28dcaa03b4b0e8d1f81a946e3b3875d4fba66314dc369\",\"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    /// @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 finalAmountIn The amount of input tokens that are required from the user if the trade is executed.\\n    function getAmountIn(bytes calldata data) external view returns (uint256 finalAmountIn);\\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\":\"0xa6f92ccb525b018c0c209819640e8d746f1134b4c4d9acd4f22d3e170323f1fa\",\"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 getAmountIn(bytes calldata) public pure override returns (uint256) {\\n        revert();\\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\":\"0x03c587721d26a31fcc23b2cdd57aef313de83d11049cf01bd55d30d34c3a7b23\",\"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    error UnauthorisedDeployer();\\n    error ZeroAddress();\\n    error InvalidTokenOrder();\\n\\n    modifier onlyMaster() {\\n        if (msg.sender != masterDeployer) revert UnauthorisedDeployer();\\n        _;\\n    }\\n\\n    constructor(address _masterDeployer) {\\n        if (_masterDeployer == address(0)) revert ZeroAddress();\\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                if (tokens[i] >= tokens[i + 1]) revert InvalidTokenOrder();\\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 count\\n    ) external view returns (address[] memory pairPools) {\\n        pairPools = new address[](count);\\n        for (uint256 i = 0; i < count; i++) {\\n            pairPools[i] = pools[token0][token1][startIndex + i];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x34c44a489ccaf9a7b2bc05527113552a2ebc5a8b4b9d47035e465c39cf569b81\",\"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": "0x60a060405234801561001057600080fd5b50604051614a5d380380614a5d83398101604081905261002f9161006d565b806001600160a01b0381166100575760405163d92e233d60e01b815260040160405180910390fd5b60601b6001600160601b0319166080525061009d565b60006020828403121561007f57600080fd5b81516001600160a01b038116811461009657600080fd5b9392505050565b60805160601c6149946100c96000396000818161015a01528181610262015261041701526149946000f3fe60806040523480156200001157600080fd5b50600436106200007b5760003560e01c806371a25812116200005657806371a25812146200012e578063cf58879a1462000154578063f6ab6d99146200017c57600080fd5b8063169c4cef146200008057806327c3cae114620000c15780635bc93d6c14620000d8575b600080fd5b620000976200009136600462000848565b620001b5565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b62000097620000d2366004620009d6565b62000208565b6200011f620000e93660046200080a565b73ffffffffffffffffffffffffffffffffffffffff91821660009081526020818152604080832093909416825291909152205490565b604051908152602001620000b8565b620001456200013f3660046200088e565b620002d6565b604051620000b8919062000ae5565b620000977f000000000000000000000000000000000000000000000000000000000000000081565b620000976200018d366004620009bc565b60016020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60006020528260005260406000206020528160005260406000208181548110620001de57600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16925083915050565b60008060008084806020019051810190620002249190620008d9565b925092509250828282604051602001620002419392919062000b01565b604051602081830303815290604052945060008580519060200120905080867f00000000000000000000000000000000000000000000000000000000000000006040516200028f9062000761565b6200029c92919062000b78565b8190604051809103906000f5905080158015620002bd573d6000803e3d6000fd5b509450620002cd858583620003ff565b50505050919050565b60608167ffffffffffffffff811115620002f457620002f462000d3a565b6040519080825280602002602001820160405280156200031e578160200160208202803683370190505b50905060005b82811015620003f65773ffffffffffffffffffffffffffffffffffffffff80871660009081526020818152604080832093891683529290522062000369828662000c85565b815481106200037c576200037c62000d0b565b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828281518110620003bc57620003bc62000d0b565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015280620003ed8162000ca0565b91505062000324565b50949350505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146200046f576040517f03781a5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081815260016020526040812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86161790555b60018351038110156200075b57828160010181518110620004e157620004e162000d0b565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1683828151811062000514576200051462000d0b565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16106200056a576040517f3f06bf8100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600181015b8351811015620007515760008085848151811062000591576200059162000d0b565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858381518110620005ea57620005ea62000d0b565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff90811683528282019390935260409091016000908120805460018101825590825291812090910180547fffffffffffffffffffffffff000000000000000000000000000000000000000016928816929092179091558451819086908490811062000679576200067962000d0b565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858481518110620006d257620006d262000d0b565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff908116835282820193909352604090910160009081208054600180820183559183529290912090910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001692881692909217909155016200056f565b50600101620004bc565b50505050565b613bcf8062000d9083390190565b600082601f8301126200078157600080fd5b815160206200079a620007948362000c5e565b62000c0c565b80838252828201915082860187848660051b8901011115620007bb57600080fd5b6000805b86811015620007fc57825170ffffffffffffffffffffffffffffffffff81168114620007e9578283fd5b85529385019391850191600101620007bf565b509198975050505050505050565b600080604083850312156200081e57600080fd5b82356200082b8162000d69565b915060208301356200083d8162000d69565b809150509250929050565b6000806000606084860312156200085e57600080fd5b83356200086b8162000d69565b925060208401356200087d8162000d69565b929592945050506040919091013590565b60008060008060808587031215620008a557600080fd5b8435620008b28162000d69565b93506020850135620008c48162000d69565b93969395505050506040820135916060013590565b600080600060608486031215620008ef57600080fd5b835167ffffffffffffffff808211156200090857600080fd5b818601915086601f8301126200091d57600080fd5b8151602062000930620007948362000c5e565b8083825282820191508286018b848660051b89010111156200095157600080fd5b600096505b84871015620009815780516200096c8162000d69565b83526001969096019591830191830162000956565b50918901519197509093505050808211156200099c57600080fd5b50620009ab868287016200076f565b925050604084015190509250925092565b600060208284031215620009cf57600080fd5b5035919050565b60006020808385031215620009ea57600080fd5b823567ffffffffffffffff8082111562000a0357600080fd5b818501915085601f83011262000a1857600080fd5b81358181111562000a2d5762000a2d62000d3a565b62000a5f847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160162000c0c565b9150808252868482850101111562000a7657600080fd5b8084840185840137600090820190930192909252509392505050565b600081518084526020808501945080840160005b8381101562000ada57815173ffffffffffffffffffffffffffffffffffffffff168752958201959082019060010162000aa6565b509495945050505050565b60208152600062000afa602083018462000a92565b9392505050565b60608152600062000b16606083018662000a92565b82810360208481019190915285518083528682019282019060005b8181101562000b6257845170ffffffffffffffffffffffffffffffffff168352938301939183019160010162000b31565b5050809350505050826040830152949350505050565b604081526000835180604084015260005b8181101562000ba8576020818701810151606086840101520162000b89565b8181111562000bbb576000606083860101525b5073ffffffffffffffffffffffffffffffffffffffff93909316602083015250601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601606001919050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171562000c565762000c5662000d3a565b604052919050565b600067ffffffffffffffff82111562000c7b5762000c7b62000d3a565b5060051b60200190565b6000821982111562000c9b5762000c9b62000cdc565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562000cd55762000cd562000cdc565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff8116811462000d8c57600080fd5b5056fe6101406040523480156200001257600080fd5b5060405162003bcf38038062003bcf833981016040819052620000359162000966565b4660805262000112604080518082018252600e81526d29bab9b434902628102a37b5b2b760911b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527fc2bf45081e840722410522aa366600d7fe4da5bfb5a5b417f4d5125b4ed180a4818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a0808301919091528351808303909101815260c0909101909252815191012090565b60a0818152505060008060008480602001905181019062000134919062000886565b9250925092508151835114620001825760405162461bcd60e51b815260206004820152600e60248201526d494e56414c49445f41525241595360901b60448201526064015b60405180910390fd5b806200019a620f4240670de0b6b3a764000062000af4565b11158015620001bd5750620001b9600a670de0b6b3a764000062000af4565b8111155b620001fe5760405162461bcd60e51b815260206004820152601060248201526f494e56414c49445f535741505f46454560801b604482015260640162000179565b82516002111580156200021357506008835111155b620002615760405162461bcd60e51b815260206004820152601560248201527f494e56414c49445f544f4b454e535f4c454e4754480000000000000000000000604482015260640162000179565b60005b83518110156200050a5760006001600160a01b03168482815181106200028e576200028e62000b6d565b60200260200101516001600160a01b03161415620002de5760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b604482015260640162000179565b828181518110620002f357620002f362000b6d565b60200260200101516001600160881b0316670de0b6b3a7640000111580156200035557506200032c670de0b6b3a7640000603262000b17565b83828151811062000341576200034162000b6d565b60200260200101516001600160881b031611155b620003945760405162461bcd60e51b815260206004820152600e60248201526d1253959053125117d5d15251d21560921b604482015260640162000179565b604051806040016040528060006001600160781b03168152602001848381518110620003c457620003c462000b6d565b60200260200101516001600160881b031681525060086000868481518110620003f157620003f162000b6d565b6020908102919091018101516001600160a01b0316825281810192909252604001600020825192909101516001600160881b0316600160781b026001600160781b03909216919091179055835160059085908390811062000456576200045662000b6d565b60209081029190910181015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b039092169190911790558251839082908110620004a857620004a862000b6d565b602090810291909101015160048054600090620004d09084906001600160881b031662000aab565b92506101000a8154816001600160881b0302191690836001600160881b031602179055508080620005019062000b39565b91505062000264565b5062000520670de0b6b3a7640000603262000b17565b6004546001600160881b031611156200056f5760405162461bcd60e51b815260206004820152601060248201526f13505617d513d5105317d5d15251d21560821b604482015260640162000179565b6200059060006200058a670de0b6b3a7640000606462000b17565b62000747565b8060c08181525050836001600160a01b031663c14ad8026040518163ffffffff1660e01b815260040160206040518083038186803b158015620005d257600080fd5b505afa158015620005e7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200060d919062000a38565b600681905550836001600160a01b0316630c0a0cd26040518163ffffffff1660e01b815260040160206040518083038186803b1580156200064d57600080fd5b505afa15801562000662573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000688919062000861565b6001600160a01b031660e0816001600160a01b031660601b81525050836001600160a01b0316634da318276040518163ffffffff1660e01b815260040160206040518083038186803b158015620006de57600080fd5b505afa158015620006f3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000719919062000861565b6001600160601b0319606091821b81166101005294901b90931661012052505060016007555062000b999050565b806000808282546200075a919062000ad9565b90915550506001600160a01b0382166000818152600160209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b80516001600160a01b0381168114620007cb57600080fd5b919050565b600082601f830112620007e257600080fd5b81516020620007fb620007f58362000a85565b62000a52565b80838252828201915082860187848660051b89010111156200081c57600080fd5b6000805b86811015620008535782516001600160881b038116811462000840578283fd5b8552938501939185019160010162000820565b509198975050505050505050565b6000602082840312156200087457600080fd5b6200087f82620007b3565b9392505050565b6000806000606084860312156200089c57600080fd5b83516001600160401b0380821115620008b457600080fd5b818601915086601f830112620008c957600080fd5b81516020620008dc620007f58362000a85565b8083825282820191508286018b848660051b8901011115620008fd57600080fd5b600096505b848710156200092b576200091681620007b3565b83526001969096019591830191830162000902565b50918901519197509093505050808211156200094657600080fd5b506200095586828701620007d0565b925050604084015190509250925092565b600080604083850312156200097a57600080fd5b82516001600160401b03808211156200099257600080fd5b818501915085601f830112620009a757600080fd5b815181811115620009bc57620009bc62000b83565b60209150620009d4601f8201601f1916830162000a52565b8181528783838601011115620009e957600080fd5b60005b8281101562000a09578481018401518282018501528301620009ec565b8281111562000a1b5760008484840101525b50945062000a2d9050858201620007b3565b925050509250929050565b60006020828403121562000a4b57600080fd5b5051919050565b604051601f8201601f191681016001600160401b038111828210171562000a7d5762000a7d62000b83565b604052919050565b60006001600160401b0382111562000aa15762000aa162000b83565b5060051b60200190565b60006001600160881b0382811684821680830382111562000ad05762000ad062000b57565b01949350505050565b6000821982111562000aef5762000aef62000b57565b500190565b60008262000b1257634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161562000b345762000b3462000b57565b500290565b600060001982141562000b505762000b5062000b57565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b60805160a05160c05160e05160601c6101005160601c6101205160601c612fb362000c1c6000396000818161057a01526118ac0152600081816103ec01528181612100015281816121e301526122bf0152600061027601526000818161041301528181611b0a015261203f01526000610ff601526000610ecd0152612fb36000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c806367e4ac2c11610104578063a69840a8116100a2578063c14ad80211610071578063c14ad8021461056c578063cf58879a14610575578063d505accf1461059c578063dd62ed3e146105af57600080fd5b8063a69840a81461050c578063a8f1f52e14610533578063a9059cbb14610546578063af8c09bf1461055957600080fd5b80637ecebe00116100de5780637ecebe00146104905780638ae45441146104b057806392bc3219146104c657806395d89b41146104d057600080fd5b806367e4ac2c1461044857806370a082311461045d5780637ba0e2e71461047d57600080fd5b806330adf81f1161017c578063499a3c501161014b578063499a3c50146103d45780634da31827146103e757806354cf2aeb1461040e578063627dd56a1461043557600080fd5b806330adf81f146102f9578063313ce567146103205780633644e5151461033a578063469e90671461034257600080fd5b80630c0a0cd2116101b85780630c0a0cd21461027157806318160ddd146102bd57806323b872dd146102c65780632a07b6c7146102d957600080fd5b8063053da1c8146101df57806306fdde0314610205578063095ea7b31461024e575b600080fd5b6101f26101ed366004612b1a565b6105da565b6040519081526020015b60405180910390f35b6102416040518060400160405280600e81526020017f5375736869204c5020546f6b656e00000000000000000000000000000000000081525081565b6040516101fc9190612dbc565b61026161025c3660046129fd565b610982565b60405190151581526020016101fc565b6102987f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101fc565b6101f260005481565b6102616102d4366004612a62565b6109fc565b6102ec6102e7366004612b1a565b610b48565b6040516101fc9190612cc9565b6101f27f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b610328601281565b60405160ff90911681526020016101fc565b6101f2610ec9565b61039b6103503660046127d1565b6008602052600090815260409020546effffffffffffffffffffffffffffff8116906f01000000000000000000000000000000900470ffffffffffffffffffffffffffffffffff1682565b604080516effffffffffffffffffffffffffffff909316835270ffffffffffffffffffffffffffffffffff9091166020830152016101fc565b6101f26103e2366004612b1a565b611018565b6102987f000000000000000000000000000000000000000000000000000000000000000081565b6101f27f000000000000000000000000000000000000000000000000000000000000000081565b6101f2610443366004612b1a565b61101f565b610450611349565b6040516101fc9190612c6f565b6101f261046b3660046127d1565b60016020526000908152604090205481565b6101f261048b366004612b1a565b6113b8565b6101f261049e3660046127d1565b60036020526000908152604090205481565b6104b86116da565b6040516101fc929190612d2e565b6104ce6118aa565b005b6102416040518060400160405280600381526020017f534c50000000000000000000000000000000000000000000000000000000000081525081565b6101f27f54726964656e743a496e6465780000000000000000000000000000000000000081565b6101f2610541366004612b1a565b61194d565b6102616105543660046129fd565b611983565b6101f2610567366004612b1a565b611a08565b6101f260065481565b6102987f000000000000000000000000000000000000000000000000000000000000000081565b6104ce6105aa366004612aa3565b611c8b565b6101f26105bd366004612a29565b600260209081526000928352604080842090915290825290205481565b600060075460011461064d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f4c4f434b4544000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b600260075560008080808080610665888a018a612850565b73ffffffffffffffffffffffffffffffffffffffff808716600090815260086020526040808220928816825290208154979d50959b5093995091975095509350916106d3906effffffffffffffffffffffffffffff166106ce6002670de0b6b3a7640000612de7565b611fdd565b84111561073c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4d41585f494e5f524154494f00000000000000000000000000000000000000006044820152606401610644565b815481546107929186916effffffffffffffffffffffffffffff8083169270ffffffffffffffffffffffffffffffffff6f0100000000000000000000000000000091829004811693928316929190910416612028565b6040517fbd50c7b1000000000000000000000000000000000000000000000000000000008152909950339063bd50c7b1906107d1908690600401612dbc565b600060405180830381600087803b1580156107eb57600080fd5b505af11580156107ff573d6000803e3d6000fd5b505083546effffffffffffffffffffffffffffff16860191506108239050896120b2565b101561088b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4e4f545f524543454956454400000000000000000000000000000000000000006044820152606401610644565b81546effffffffffffffffffffffffffffff808216860181167fffffffffffffffffffffffffffffffffff00000000000000000000000000000092831617845582548082168c900390911691161781556108e7878a888861217c565b8673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fcd3829a3813dc3cdd188fd3d01dcf3268c16be2fdd2dd21d0665418816e46062878d604051610966929190918252602082015260400190565b60405180910390a4505060016007555094979650505050505050565b33600081815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906109ea9086815260200190565b60405180910390a35060015b92915050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526002602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14610a995773ffffffffffffffffffffffffffffffffffffffff8416600090815260026020908152604080832033845290915281208054849290610a93908490612e38565b90915550505b73ffffffffffffffffffffffffffffffffffffffff841660009081526001602052604081208054849290610ace908490612e38565b909155505073ffffffffffffffffffffffffffffffffffffffff808416600081815260016020526040908190208054860190555190918616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610b369086815260200190565b60405180910390a35060019392505050565b6060600754600114610bb6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f4c4f434b454400000000000000000000000000000000000000000000000000006044820152606401610644565b600260075560008080610bcb858701876129bf565b9250925092506000610bdf82600054612322565b60055490915067ffffffffffffffff811115610bfd57610bfd612f29565b604051908082528060200260200182016040528015610c4257816020015b6040805180820190915260008082526020820152815260200190600190039081610c1b5790505b509450610c4f308361235c565b60005b600554811015610eb857600060058281548110610c7157610c71612efa565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16808352600890915260408220549092506effffffffffffffffffffffffffffff1690610cc18583611fdd565b90506effffffffffffffffffffffffffffff8116610d3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f5a45524f5f4f55540000000000000000000000000000000000000000000000006044820152606401610644565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260086020526040902080547fffffffffffffffffffffffffffffffffff00000000000000000000000000000081166effffffffffffffffffffffffffffff918216849003821617909155610db090849083168a8a61217c565b60405180604001604052808473ffffffffffffffffffffffffffffffffffffffff168152602001826effffffffffffffffffffffffffffff16815250898581518110610dfe57610dfe612efa565b60200260200101819052508773ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f3dd1df88dc92e2788892542d81f999d720a44b4c127065d45c128f4f59fdc3738584604051610e9a92919073ffffffffffffffffffffffffffffffffffffffff9290921682526effffffffffffffffffffffffffffff16602082015260400190565b60405180910390a35050508080610eb090612e4f565b915050610c52565b505060016007555091949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610ff35750604080518082018252600e81527f5375736869204c5020546f6b656e00000000000000000000000000000000000060209182015281518083018352600181527f31000000000000000000000000000000000000000000000000000000000000009082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527fc2bf45081e840722410522aa366600d7fe4da5bfb5a5b417f4d5125b4ed180a4818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a0808301919091528351808303909101815260c0909101909252815191012090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6000806000fd5b600060075460011461108d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f4c4f434b454400000000000000000000000000000000000000000000000000006044820152606401610644565b60026007556000808080806110a4878901896127ee565b73ffffffffffffffffffffffffffffffffffffffff808616600090815260086020526040808220928716825290208154969b5094995092975090955093509161110b906effffffffffffffffffffffffffffff166106ce6002670de0b6b3a7640000612de7565b831115611174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4d41585f494e5f524154494f00000000000000000000000000000000000000006044820152606401610644565b815481546111ca9185916effffffffffffffffffffffffffffff8083169270ffffffffffffffffffffffffffffffffff6f0100000000000000000000000000000091829004811693928316929190910416612028565b82549098506effffffffffffffffffffffffffffff1683016111eb886120b2565b1015611253576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4e4f545f524543454956454400000000000000000000000000000000000000006044820152606401610644565b81546effffffffffffffffffffffffffffff808216850181167fffffffffffffffffffffffffffffffffff00000000000000000000000000000092831617845582548082168b900390911691161781556112af8689878761217c565b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fcd3829a3813dc3cdd188fd3d01dcf3268c16be2fdd2dd21d0665418816e46062868c60405161132e929190918252602082015260400190565b60405180910390a45050600160075550939695505050505050565b606060058054806020026020016040519081016040528092919081815260200182805480156113ae57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611383575b5050505050905090565b6000600754600114611426576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f4c4f434b454400000000000000000000000000000000000000000000000000006044820152606401610644565b600260075560008061143a848601866129fd565b91509150600061144c82600054612322565b905060005b6005548110156116c15760006005828154811061147057611470612efa565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16808352600890915260408220549092506effffffffffffffffffffffffffffff1690816114c157846114ed565b6114ed856effffffffffffffffffffffffffffff16836effffffffffffffffffffffffffffff16611fdd565b905061150664e8d4a51000670de0b6b3a7640000612de7565b816effffffffffffffffffffffffffffff161015611580576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f4d494e5f42414c414e43450000000000000000000000000000000000000000006044820152606401610644565b8181016effffffffffffffffffffffffffffff1661159d846120b2565b1015611605576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4e4f545f524543454956454400000000000000000000000000000000000000006044820152606401610644565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526008602090815260409182902080547fffffffffffffffffffffffffffffffffff00000000000000000000000000000081166effffffffffffffffffffffffffffff918216880182161790915582519384528516908301529189169133917ff9403b28cc8805935e0ce6943ed646d5fde3d1e14f6b398e85bfa2851d1b85f7910160405180910390a350505080806116b990612e4f565b915050611451565b506116cc83836123ef565b506001600755949350505050565b60055460609081908067ffffffffffffffff8111156116fb576116fb612f29565b604051908082528060200260200182016040528015611724578160200160208202803683370190505b5092508067ffffffffffffffff81111561174057611740612f29565b604051908082528060200260200182016040528015611769578160200160208202803683370190505b50915060005b818110156118a457600860006005838154811061178e5761178e612efa565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205484516effffffffffffffffffffffffffffff909116908590839081106117e8576117e8612efa565b602002602001018181525050600860006005838154811061180b5761180b612efa565b60009182526020808320919091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205483516f0100000000000000000000000000000090910470ffffffffffffffffffffffffffffffffff169084908390811061187a5761187a612efa565b70ffffffffffffffffffffffffffffffffff9092166020928302919091019091015260010161176f565b50509091565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c14ad8026040518163ffffffff1660e01b815260040160206040518083038186803b15801561191057600080fd5b505afa158015611924573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119489190612b8c565b600655565b6000808080808061196087890189612bc9565b945094509450945094506119778585858585612028565b98975050505050505050565b336000908152600160205260408120805483919083906119a4908490612e38565b909155505073ffffffffffffffffffffffffffffffffffffffff8316600081815260016020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906109ea9086815260200190565b6000600754600114611a76576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f4c4f434b454400000000000000000000000000000000000000000000000000006044820152606401610644565b60026007556000808080611a8c86880188612970565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260086020526040812080549154600454969a509498509296509094509092611b2e926effffffffffffffffffffffffffffff83169270ffffffffffffffffffffffffffffffffff6f0100000000000000000000000000000090910481169216867f000000000000000000000000000000000000000000000000000000000000000061245f565b8154909650611b66906effffffffffffffffffffffffffffff16611b5b6003670de0b6b3a7640000612de7565b6106ce906001612dcf565b861115611bcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4d41585f4f55545f524154494f000000000000000000000000000000000000006044820152606401610644565b80546effffffffffffffffffffffffffffff808216889003167fffffffffffffffffffffffffffffffffff000000000000000000000000000000909116178155611c19308361235c565b611c258587868661217c565b6040805173ffffffffffffffffffffffffffffffffffffffff87811682526020820189905286169133917f3dd1df88dc92e2788892542d81f999d720a44b4c127065d45c128f4f59fdc373910160405180910390a3505060016007555091949350505050565b42841015611cf5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5045524d49545f444541444c494e455f455850495245440000000000000000006044820152606401610644565b6000611cff610ec9565b73ffffffffffffffffffffffffffffffffffffffff8916600090815260036020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9928c928c928c92909190611d5a83612e4f565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810187905260e00160405160208183030381529060405280519060200120604051602001611dfb9291907f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015611e84573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590611eff57508873ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611f65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f494e56414c49445f5045524d49545f5349474e415455524500000000000000006044820152606401610644565b73ffffffffffffffffffffffffffffffffffffffff81811660009081526002602090815260408083208c8516808552908352928190208b9055518a815291928c16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050505050505050565b600080611fea8385612dfb565b905060006120016002670de0b6b3a7640000612de7565b61200b9083612dcf565b905061201f670de0b6b3a764000082612de7565b95945050505050565b6000806120358584612322565b9050600061206d887f0000000000000000000000000000000000000000000000000000000000000000670de0b6b3a764000003611fdd565b9050600061207d88838a01612322565b9050600061208b828561250e565b9050670de0b6b3a76400008190036120a38882611fdd565b9b9a5050505050505050505050565b6040517ff7888aec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301523060248301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063f7888aec9060440160206040518083038186803b15801561214457600080fd5b505afa158015612158573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f69190612b8c565b8015612265576040517f97da6d3000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152306024830152838116604483015260006064830152608482018590527f000000000000000000000000000000000000000000000000000000000000000016906397da6d309060a4016040805180830381600087803b15801561222657600080fd5b505af115801561223a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061225e9190612ba5565b505061231c565b6040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301523060248301528381166044830152606482018590527f0000000000000000000000000000000000000000000000000000000000000000169063f18d03cc90608401600060405180830381600087803b15801561230357600080fd5b505af1158015612317573d6000803e3d6000fd5b505050505b50505050565b600080612337670de0b6b3a764000085612dfb565b90506000612346600285612de7565b6123509083612dcf565b905061201f8482612de7565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604081208054839290612391908490612e38565b909155505060008054829003815560405182815273ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b806000808282546124009190612dcf565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000818152600160209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016123e3565b60008061246c8786612322565b9050600061247a8588612e38565b905060006124888289612322565b905060006124a7826124a2670de0b6b3a764000087612322565b612631565b905060006124b5828d611fdd565b905060006124c3828e612e38565b90506000886124da88670de0b6b3a7640000612e38565b6124e49190612dfb565b90506124fc826106ce83670de0b6b3a7640000612e38565b9e9d5050505050505050505050505050565b60008260011115801561253f57506001612531670de0b6b3a76400006002612dfb565b61253b9190612e38565b8311155b6125a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f494e56414c49445f4241534500000000000000000000000000000000000000006044820152606401610644565b6000670de0b6b3a76400006125ba8185612de7565b6125c49190612dfb565b905060006125d28285612e38565b905060006125ec866124a2670de0b6b3a764000086612de7565b9050816125f7578093505b600061261a87846126156402540be400670de0b6b3a7640000612de7565b6126a7565b90506126268282611fdd565b979650505050505050565b600061263e600283612e88565b61265057670de0b6b3a7640000612652565b825b905061265f600283612de7565b91505b8115612686576126728380612dfb565b925061267f600283612de7565b9150612662565b612691600283612e88565b156109f6576126a08382612dfb565b9392505050565b60008281806126be87670de0b6b3a7640000612797565b670de0b6b3a76400009550909250905083600060015b87831061278a5760006126ef670de0b6b3a764000083612dfb565b905060008061270f8961270a670de0b6b3a764000086612e38565b612797565b91509150612721866106ce848b611fdd565b955061272d8684612322565b95508561273c5750505061278a565b8615612746579315935b8015612750579315935b841561276757612760868b612e38565b9950612774565b612771868b612dcf565b99505b505050808061278290612e4f565b9150506126d4565b5050505050509392505050565b6000808284106127ad57505080820360006127b5565b505081810360015b9250929050565b803580151581146127cc57600080fd5b919050565b6000602082840312156127e357600080fd5b81356126a081612f58565b600080600080600060a0868803121561280657600080fd5b853561281181612f58565b9450602086013561282181612f58565b9350604086013561283181612f58565b925061283f606087016127bc565b949793965091946080013592915050565b60008060008060008060c0878903121561286957600080fd5b863561287481612f58565b9550602087013561288481612f58565b9450604087013561289481612f58565b93506128a2606088016127bc565b92506080870135915060a087013567ffffffffffffffff808211156128c657600080fd5b818901915089601f8301126128da57600080fd5b8135818111156128ec576128ec612f29565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561293257612932612f29565b816040528281528c602084870101111561294b57600080fd5b8260208601602083013760006020848301015280955050505050509295509295509295565b6000806000806080858703121561298657600080fd5b843561299181612f58565b935060208501356129a181612f58565b92506129af604086016127bc565b9396929550929360600135925050565b6000806000606084860312156129d457600080fd5b83356129df81612f58565b92506129ed602085016127bc565b9150604084013590509250925092565b60008060408385031215612a1057600080fd5b8235612a1b81612f58565b946020939093013593505050565b60008060408385031215612a3c57600080fd5b8235612a4781612f58565b91506020830135612a5781612f58565b809150509250929050565b600080600060608486031215612a7757600080fd5b8335612a8281612f58565b92506020840135612a9281612f58565b929592945050506040919091013590565b600080600080600080600060e0888a031215612abe57600080fd5b8735612ac981612f58565b96506020880135612ad981612f58565b95506040880135945060608801359350608088013560ff81168114612afd57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060208385031215612b2d57600080fd5b823567ffffffffffffffff80821115612b4557600080fd5b818501915085601f830112612b5957600080fd5b813581811115612b6857600080fd5b866020828501011115612b7a57600080fd5b60209290920196919550909350505050565b600060208284031215612b9e57600080fd5b5051919050565b60008060408385031215612bb857600080fd5b505080516020909101519092909150565b600080600080600060a08688031215612be157600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b6000815180845260005b81811015612c2a57602081850181015186830182015201612c0e565b81811115612c3c576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020808252825182820181905260009190848201906040850190845b81811015612cbd57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101612c8b565b50909695505050505050565b602080825282518282018190526000919060409081850190868401855b82811015612d21578151805173ffffffffffffffffffffffffffffffffffffffff168552860151868501529284019290850190600101612ce6565b5091979650505050505050565b604080825283519082018190526000906020906060840190828701845b82811015612d6757815184529284019290840190600101612d4b565b5050508381038285015284518082528583019183019060005b81811015612daf57835170ffffffffffffffffffffffffffffffffff1683529284019291840191600101612d80565b5090979650505050505050565b6020815260006126a06020830184612c04565b60008219821115612de257612de2612e9c565b500190565b600082612df657612df6612ecb565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612e3357612e33612e9c565b500290565b600082821015612e4a57612e4a612e9c565b500390565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612e8157612e81612e9c565b5060010190565b600082612e9757612e97612ecb565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81168114612f7a57600080fd5b5056fea26469706673582212207d77e32942c854d1f0755a6656e62b260b9a7965842bf811c05e09f5ae236ae564736f6c63430008070033a264697066735822122078669ba8994f0083a7f7f734a47e07cfb8d885f0f1d51c89e4892036e478a05d64736f6c63430008070033",
  "deployedBytecode": "0x60806040523480156200001157600080fd5b50600436106200007b5760003560e01c806371a25812116200005657806371a25812146200012e578063cf58879a1462000154578063f6ab6d99146200017c57600080fd5b8063169c4cef146200008057806327c3cae114620000c15780635bc93d6c14620000d8575b600080fd5b620000976200009136600462000848565b620001b5565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b62000097620000d2366004620009d6565b62000208565b6200011f620000e93660046200080a565b73ffffffffffffffffffffffffffffffffffffffff91821660009081526020818152604080832093909416825291909152205490565b604051908152602001620000b8565b620001456200013f3660046200088e565b620002d6565b604051620000b8919062000ae5565b620000977f000000000000000000000000000000000000000000000000000000000000000081565b620000976200018d366004620009bc565b60016020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60006020528260005260406000206020528160005260406000208181548110620001de57600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16925083915050565b60008060008084806020019051810190620002249190620008d9565b925092509250828282604051602001620002419392919062000b01565b604051602081830303815290604052945060008580519060200120905080867f00000000000000000000000000000000000000000000000000000000000000006040516200028f9062000761565b6200029c92919062000b78565b8190604051809103906000f5905080158015620002bd573d6000803e3d6000fd5b509450620002cd858583620003ff565b50505050919050565b60608167ffffffffffffffff811115620002f457620002f462000d3a565b6040519080825280602002602001820160405280156200031e578160200160208202803683370190505b50905060005b82811015620003f65773ffffffffffffffffffffffffffffffffffffffff80871660009081526020818152604080832093891683529290522062000369828662000c85565b815481106200037c576200037c62000d0b565b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828281518110620003bc57620003bc62000d0b565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015280620003ed8162000ca0565b91505062000324565b50949350505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146200046f576040517f03781a5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081815260016020526040812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86161790555b60018351038110156200075b57828160010181518110620004e157620004e162000d0b565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1683828151811062000514576200051462000d0b565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16106200056a576040517f3f06bf8100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600181015b8351811015620007515760008085848151811062000591576200059162000d0b565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858381518110620005ea57620005ea62000d0b565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff90811683528282019390935260409091016000908120805460018101825590825291812090910180547fffffffffffffffffffffffff000000000000000000000000000000000000000016928816929092179091558451819086908490811062000679576200067962000d0b565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858481518110620006d257620006d262000d0b565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff908116835282820193909352604090910160009081208054600180820183559183529290912090910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001692881692909217909155016200056f565b50600101620004bc565b50505050565b613bcf8062000d9083390190565b600082601f8301126200078157600080fd5b815160206200079a620007948362000c5e565b62000c0c565b80838252828201915082860187848660051b8901011115620007bb57600080fd5b6000805b86811015620007fc57825170ffffffffffffffffffffffffffffffffff81168114620007e9578283fd5b85529385019391850191600101620007bf565b509198975050505050505050565b600080604083850312156200081e57600080fd5b82356200082b8162000d69565b915060208301356200083d8162000d69565b809150509250929050565b6000806000606084860312156200085e57600080fd5b83356200086b8162000d69565b925060208401356200087d8162000d69565b929592945050506040919091013590565b60008060008060808587031215620008a557600080fd5b8435620008b28162000d69565b93506020850135620008c48162000d69565b93969395505050506040820135916060013590565b600080600060608486031215620008ef57600080fd5b835167ffffffffffffffff808211156200090857600080fd5b818601915086601f8301126200091d57600080fd5b8151602062000930620007948362000c5e565b8083825282820191508286018b848660051b89010111156200095157600080fd5b600096505b84871015620009815780516200096c8162000d69565b83526001969096019591830191830162000956565b50918901519197509093505050808211156200099c57600080fd5b50620009ab868287016200076f565b925050604084015190509250925092565b600060208284031215620009cf57600080fd5b5035919050565b60006020808385031215620009ea57600080fd5b823567ffffffffffffffff8082111562000a0357600080fd5b818501915085601f83011262000a1857600080fd5b81358181111562000a2d5762000a2d62000d3a565b62000a5f847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160162000c0c565b9150808252868482850101111562000a7657600080fd5b8084840185840137600090820190930192909252509392505050565b600081518084526020808501945080840160005b8381101562000ada57815173ffffffffffffffffffffffffffffffffffffffff168752958201959082019060010162000aa6565b509495945050505050565b60208152600062000afa602083018462000a92565b9392505050565b60608152600062000b16606083018662000a92565b82810360208481019190915285518083528682019282019060005b8181101562000b6257845170ffffffffffffffffffffffffffffffffff168352938301939183019160010162000b31565b5050809350505050826040830152949350505050565b604081526000835180604084015260005b8181101562000ba8576020818701810151606086840101520162000b89565b8181111562000bbb576000606083860101525b5073ffffffffffffffffffffffffffffffffffffffff93909316602083015250601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601606001919050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171562000c565762000c5662000d3a565b604052919050565b600067ffffffffffffffff82111562000c7b5762000c7b62000d3a565b5060051b60200190565b6000821982111562000c9b5762000c9b62000cdc565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562000cd55762000cd562000cdc565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff8116811462000d8c57600080fd5b5056fe6101406040523480156200001257600080fd5b5060405162003bcf38038062003bcf833981016040819052620000359162000966565b4660805262000112604080518082018252600e81526d29bab9b434902628102a37b5b2b760911b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527fc2bf45081e840722410522aa366600d7fe4da5bfb5a5b417f4d5125b4ed180a4818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a0808301919091528351808303909101815260c0909101909252815191012090565b60a0818152505060008060008480602001905181019062000134919062000886565b9250925092508151835114620001825760405162461bcd60e51b815260206004820152600e60248201526d494e56414c49445f41525241595360901b60448201526064015b60405180910390fd5b806200019a620f4240670de0b6b3a764000062000af4565b11158015620001bd5750620001b9600a670de0b6b3a764000062000af4565b8111155b620001fe5760405162461bcd60e51b815260206004820152601060248201526f494e56414c49445f535741505f46454560801b604482015260640162000179565b82516002111580156200021357506008835111155b620002615760405162461bcd60e51b815260206004820152601560248201527f494e56414c49445f544f4b454e535f4c454e4754480000000000000000000000604482015260640162000179565b60005b83518110156200050a5760006001600160a01b03168482815181106200028e576200028e62000b6d565b60200260200101516001600160a01b03161415620002de5760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b604482015260640162000179565b828181518110620002f357620002f362000b6d565b60200260200101516001600160881b0316670de0b6b3a7640000111580156200035557506200032c670de0b6b3a7640000603262000b17565b83828151811062000341576200034162000b6d565b60200260200101516001600160881b031611155b620003945760405162461bcd60e51b815260206004820152600e60248201526d1253959053125117d5d15251d21560921b604482015260640162000179565b604051806040016040528060006001600160781b03168152602001848381518110620003c457620003c462000b6d565b60200260200101516001600160881b031681525060086000868481518110620003f157620003f162000b6d565b6020908102919091018101516001600160a01b0316825281810192909252604001600020825192909101516001600160881b0316600160781b026001600160781b03909216919091179055835160059085908390811062000456576200045662000b6d565b60209081029190910181015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b039092169190911790558251839082908110620004a857620004a862000b6d565b602090810291909101015160048054600090620004d09084906001600160881b031662000aab565b92506101000a8154816001600160881b0302191690836001600160881b031602179055508080620005019062000b39565b91505062000264565b5062000520670de0b6b3a7640000603262000b17565b6004546001600160881b031611156200056f5760405162461bcd60e51b815260206004820152601060248201526f13505617d513d5105317d5d15251d21560821b604482015260640162000179565b6200059060006200058a670de0b6b3a7640000606462000b17565b62000747565b8060c08181525050836001600160a01b031663c14ad8026040518163ffffffff1660e01b815260040160206040518083038186803b158015620005d257600080fd5b505afa158015620005e7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200060d919062000a38565b600681905550836001600160a01b0316630c0a0cd26040518163ffffffff1660e01b815260040160206040518083038186803b1580156200064d57600080fd5b505afa15801562000662573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000688919062000861565b6001600160a01b031660e0816001600160a01b031660601b81525050836001600160a01b0316634da318276040518163ffffffff1660e01b815260040160206040518083038186803b158015620006de57600080fd5b505afa158015620006f3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000719919062000861565b6001600160601b0319606091821b81166101005294901b90931661012052505060016007555062000b999050565b806000808282546200075a919062000ad9565b90915550506001600160a01b0382166000818152600160209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b80516001600160a01b0381168114620007cb57600080fd5b919050565b600082601f830112620007e257600080fd5b81516020620007fb620007f58362000a85565b62000a52565b80838252828201915082860187848660051b89010111156200081c57600080fd5b6000805b86811015620008535782516001600160881b038116811462000840578283fd5b8552938501939185019160010162000820565b509198975050505050505050565b6000602082840312156200087457600080fd5b6200087f82620007b3565b9392505050565b6000806000606084860312156200089c57600080fd5b83516001600160401b0380821115620008b457600080fd5b818601915086601f830112620008c957600080fd5b81516020620008dc620007f58362000a85565b8083825282820191508286018b848660051b8901011115620008fd57600080fd5b600096505b848710156200092b576200091681620007b3565b83526001969096019591830191830162000902565b50918901519197509093505050808211156200094657600080fd5b506200095586828701620007d0565b925050604084015190509250925092565b600080604083850312156200097a57600080fd5b82516001600160401b03808211156200099257600080fd5b818501915085601f830112620009a757600080fd5b815181811115620009bc57620009bc62000b83565b60209150620009d4601f8201601f1916830162000a52565b8181528783838601011115620009e957600080fd5b60005b8281101562000a09578481018401518282018501528301620009ec565b8281111562000a1b5760008484840101525b50945062000a2d9050858201620007b3565b925050509250929050565b60006020828403121562000a4b57600080fd5b5051919050565b604051601f8201601f191681016001600160401b038111828210171562000a7d5762000a7d62000b83565b604052919050565b60006001600160401b0382111562000aa15762000aa162000b83565b5060051b60200190565b60006001600160881b0382811684821680830382111562000ad05762000ad062000b57565b01949350505050565b6000821982111562000aef5762000aef62000b57565b500190565b60008262000b1257634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161562000b345762000b3462000b57565b500290565b600060001982141562000b505762000b5062000b57565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b60805160a05160c05160e05160601c6101005160601c6101205160601c612fb362000c1c6000396000818161057a01526118ac0152600081816103ec01528181612100015281816121e301526122bf0152600061027601526000818161041301528181611b0a015261203f01526000610ff601526000610ecd0152612fb36000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c806367e4ac2c11610104578063a69840a8116100a2578063c14ad80211610071578063c14ad8021461056c578063cf58879a14610575578063d505accf1461059c578063dd62ed3e146105af57600080fd5b8063a69840a81461050c578063a8f1f52e14610533578063a9059cbb14610546578063af8c09bf1461055957600080fd5b80637ecebe00116100de5780637ecebe00146104905780638ae45441146104b057806392bc3219146104c657806395d89b41146104d057600080fd5b806367e4ac2c1461044857806370a082311461045d5780637ba0e2e71461047d57600080fd5b806330adf81f1161017c578063499a3c501161014b578063499a3c50146103d45780634da31827146103e757806354cf2aeb1461040e578063627dd56a1461043557600080fd5b806330adf81f146102f9578063313ce567146103205780633644e5151461033a578063469e90671461034257600080fd5b80630c0a0cd2116101b85780630c0a0cd21461027157806318160ddd146102bd57806323b872dd146102c65780632a07b6c7146102d957600080fd5b8063053da1c8146101df57806306fdde0314610205578063095ea7b31461024e575b600080fd5b6101f26101ed366004612b1a565b6105da565b6040519081526020015b60405180910390f35b6102416040518060400160405280600e81526020017f5375736869204c5020546f6b656e00000000000000000000000000000000000081525081565b6040516101fc9190612dbc565b61026161025c3660046129fd565b610982565b60405190151581526020016101fc565b6102987f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101fc565b6101f260005481565b6102616102d4366004612a62565b6109fc565b6102ec6102e7366004612b1a565b610b48565b6040516101fc9190612cc9565b6101f27f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b610328601281565b60405160ff90911681526020016101fc565b6101f2610ec9565b61039b6103503660046127d1565b6008602052600090815260409020546effffffffffffffffffffffffffffff8116906f01000000000000000000000000000000900470ffffffffffffffffffffffffffffffffff1682565b604080516effffffffffffffffffffffffffffff909316835270ffffffffffffffffffffffffffffffffff9091166020830152016101fc565b6101f26103e2366004612b1a565b611018565b6102987f000000000000000000000000000000000000000000000000000000000000000081565b6101f27f000000000000000000000000000000000000000000000000000000000000000081565b6101f2610443366004612b1a565b61101f565b610450611349565b6040516101fc9190612c6f565b6101f261046b3660046127d1565b60016020526000908152604090205481565b6101f261048b366004612b1a565b6113b8565b6101f261049e3660046127d1565b60036020526000908152604090205481565b6104b86116da565b6040516101fc929190612d2e565b6104ce6118aa565b005b6102416040518060400160405280600381526020017f534c50000000000000000000000000000000000000000000000000000000000081525081565b6101f27f54726964656e743a496e6465780000000000000000000000000000000000000081565b6101f2610541366004612b1a565b61194d565b6102616105543660046129fd565b611983565b6101f2610567366004612b1a565b611a08565b6101f260065481565b6102987f000000000000000000000000000000000000000000000000000000000000000081565b6104ce6105aa366004612aa3565b611c8b565b6101f26105bd366004612a29565b600260209081526000928352604080842090915290825290205481565b600060075460011461064d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f4c4f434b4544000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b600260075560008080808080610665888a018a612850565b73ffffffffffffffffffffffffffffffffffffffff808716600090815260086020526040808220928816825290208154979d50959b5093995091975095509350916106d3906effffffffffffffffffffffffffffff166106ce6002670de0b6b3a7640000612de7565b611fdd565b84111561073c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4d41585f494e5f524154494f00000000000000000000000000000000000000006044820152606401610644565b815481546107929186916effffffffffffffffffffffffffffff8083169270ffffffffffffffffffffffffffffffffff6f0100000000000000000000000000000091829004811693928316929190910416612028565b6040517fbd50c7b1000000000000000000000000000000000000000000000000000000008152909950339063bd50c7b1906107d1908690600401612dbc565b600060405180830381600087803b1580156107eb57600080fd5b505af11580156107ff573d6000803e3d6000fd5b505083546effffffffffffffffffffffffffffff16860191506108239050896120b2565b101561088b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4e4f545f524543454956454400000000000000000000000000000000000000006044820152606401610644565b81546effffffffffffffffffffffffffffff808216860181167fffffffffffffffffffffffffffffffffff00000000000000000000000000000092831617845582548082168c900390911691161781556108e7878a888861217c565b8673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fcd3829a3813dc3cdd188fd3d01dcf3268c16be2fdd2dd21d0665418816e46062878d604051610966929190918252602082015260400190565b60405180910390a4505060016007555094979650505050505050565b33600081815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906109ea9086815260200190565b60405180910390a35060015b92915050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526002602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14610a995773ffffffffffffffffffffffffffffffffffffffff8416600090815260026020908152604080832033845290915281208054849290610a93908490612e38565b90915550505b73ffffffffffffffffffffffffffffffffffffffff841660009081526001602052604081208054849290610ace908490612e38565b909155505073ffffffffffffffffffffffffffffffffffffffff808416600081815260016020526040908190208054860190555190918616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610b369086815260200190565b60405180910390a35060019392505050565b6060600754600114610bb6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f4c4f434b454400000000000000000000000000000000000000000000000000006044820152606401610644565b600260075560008080610bcb858701876129bf565b9250925092506000610bdf82600054612322565b60055490915067ffffffffffffffff811115610bfd57610bfd612f29565b604051908082528060200260200182016040528015610c4257816020015b6040805180820190915260008082526020820152815260200190600190039081610c1b5790505b509450610c4f308361235c565b60005b600554811015610eb857600060058281548110610c7157610c71612efa565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16808352600890915260408220549092506effffffffffffffffffffffffffffff1690610cc18583611fdd565b90506effffffffffffffffffffffffffffff8116610d3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f5a45524f5f4f55540000000000000000000000000000000000000000000000006044820152606401610644565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260086020526040902080547fffffffffffffffffffffffffffffffffff00000000000000000000000000000081166effffffffffffffffffffffffffffff918216849003821617909155610db090849083168a8a61217c565b60405180604001604052808473ffffffffffffffffffffffffffffffffffffffff168152602001826effffffffffffffffffffffffffffff16815250898581518110610dfe57610dfe612efa565b60200260200101819052508773ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f3dd1df88dc92e2788892542d81f999d720a44b4c127065d45c128f4f59fdc3738584604051610e9a92919073ffffffffffffffffffffffffffffffffffffffff9290921682526effffffffffffffffffffffffffffff16602082015260400190565b60405180910390a35050508080610eb090612e4f565b915050610c52565b505060016007555091949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610ff35750604080518082018252600e81527f5375736869204c5020546f6b656e00000000000000000000000000000000000060209182015281518083018352600181527f31000000000000000000000000000000000000000000000000000000000000009082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527fc2bf45081e840722410522aa366600d7fe4da5bfb5a5b417f4d5125b4ed180a4818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a0808301919091528351808303909101815260c0909101909252815191012090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6000806000fd5b600060075460011461108d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f4c4f434b454400000000000000000000000000000000000000000000000000006044820152606401610644565b60026007556000808080806110a4878901896127ee565b73ffffffffffffffffffffffffffffffffffffffff808616600090815260086020526040808220928716825290208154969b5094995092975090955093509161110b906effffffffffffffffffffffffffffff166106ce6002670de0b6b3a7640000612de7565b831115611174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4d41585f494e5f524154494f00000000000000000000000000000000000000006044820152606401610644565b815481546111ca9185916effffffffffffffffffffffffffffff8083169270ffffffffffffffffffffffffffffffffff6f0100000000000000000000000000000091829004811693928316929190910416612028565b82549098506effffffffffffffffffffffffffffff1683016111eb886120b2565b1015611253576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4e4f545f524543454956454400000000000000000000000000000000000000006044820152606401610644565b81546effffffffffffffffffffffffffffff808216850181167fffffffffffffffffffffffffffffffffff00000000000000000000000000000092831617845582548082168b900390911691161781556112af8689878761217c565b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fcd3829a3813dc3cdd188fd3d01dcf3268c16be2fdd2dd21d0665418816e46062868c60405161132e929190918252602082015260400190565b60405180910390a45050600160075550939695505050505050565b606060058054806020026020016040519081016040528092919081815260200182805480156113ae57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611383575b5050505050905090565b6000600754600114611426576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f4c4f434b454400000000000000000000000000000000000000000000000000006044820152606401610644565b600260075560008061143a848601866129fd565b91509150600061144c82600054612322565b905060005b6005548110156116c15760006005828154811061147057611470612efa565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16808352600890915260408220549092506effffffffffffffffffffffffffffff1690816114c157846114ed565b6114ed856effffffffffffffffffffffffffffff16836effffffffffffffffffffffffffffff16611fdd565b905061150664e8d4a51000670de0b6b3a7640000612de7565b816effffffffffffffffffffffffffffff161015611580576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f4d494e5f42414c414e43450000000000000000000000000000000000000000006044820152606401610644565b8181016effffffffffffffffffffffffffffff1661159d846120b2565b1015611605576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4e4f545f524543454956454400000000000000000000000000000000000000006044820152606401610644565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526008602090815260409182902080547fffffffffffffffffffffffffffffffffff00000000000000000000000000000081166effffffffffffffffffffffffffffff918216880182161790915582519384528516908301529189169133917ff9403b28cc8805935e0ce6943ed646d5fde3d1e14f6b398e85bfa2851d1b85f7910160405180910390a350505080806116b990612e4f565b915050611451565b506116cc83836123ef565b506001600755949350505050565b60055460609081908067ffffffffffffffff8111156116fb576116fb612f29565b604051908082528060200260200182016040528015611724578160200160208202803683370190505b5092508067ffffffffffffffff81111561174057611740612f29565b604051908082528060200260200182016040528015611769578160200160208202803683370190505b50915060005b818110156118a457600860006005838154811061178e5761178e612efa565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205484516effffffffffffffffffffffffffffff909116908590839081106117e8576117e8612efa565b602002602001018181525050600860006005838154811061180b5761180b612efa565b60009182526020808320919091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205483516f0100000000000000000000000000000090910470ffffffffffffffffffffffffffffffffff169084908390811061187a5761187a612efa565b70ffffffffffffffffffffffffffffffffff9092166020928302919091019091015260010161176f565b50509091565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c14ad8026040518163ffffffff1660e01b815260040160206040518083038186803b15801561191057600080fd5b505afa158015611924573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119489190612b8c565b600655565b6000808080808061196087890189612bc9565b945094509450945094506119778585858585612028565b98975050505050505050565b336000908152600160205260408120805483919083906119a4908490612e38565b909155505073ffffffffffffffffffffffffffffffffffffffff8316600081815260016020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906109ea9086815260200190565b6000600754600114611a76576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f4c4f434b454400000000000000000000000000000000000000000000000000006044820152606401610644565b60026007556000808080611a8c86880188612970565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260086020526040812080549154600454969a509498509296509094509092611b2e926effffffffffffffffffffffffffffff83169270ffffffffffffffffffffffffffffffffff6f0100000000000000000000000000000090910481169216867f000000000000000000000000000000000000000000000000000000000000000061245f565b8154909650611b66906effffffffffffffffffffffffffffff16611b5b6003670de0b6b3a7640000612de7565b6106ce906001612dcf565b861115611bcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4d41585f4f55545f524154494f000000000000000000000000000000000000006044820152606401610644565b80546effffffffffffffffffffffffffffff808216889003167fffffffffffffffffffffffffffffffffff000000000000000000000000000000909116178155611c19308361235c565b611c258587868661217c565b6040805173ffffffffffffffffffffffffffffffffffffffff87811682526020820189905286169133917f3dd1df88dc92e2788892542d81f999d720a44b4c127065d45c128f4f59fdc373910160405180910390a3505060016007555091949350505050565b42841015611cf5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5045524d49545f444541444c494e455f455850495245440000000000000000006044820152606401610644565b6000611cff610ec9565b73ffffffffffffffffffffffffffffffffffffffff8916600090815260036020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9928c928c928c92909190611d5a83612e4f565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810187905260e00160405160208183030381529060405280519060200120604051602001611dfb9291907f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015611e84573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590611eff57508873ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611f65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f494e56414c49445f5045524d49545f5349474e415455524500000000000000006044820152606401610644565b73ffffffffffffffffffffffffffffffffffffffff81811660009081526002602090815260408083208c8516808552908352928190208b9055518a815291928c16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050505050505050565b600080611fea8385612dfb565b905060006120016002670de0b6b3a7640000612de7565b61200b9083612dcf565b905061201f670de0b6b3a764000082612de7565b95945050505050565b6000806120358584612322565b9050600061206d887f0000000000000000000000000000000000000000000000000000000000000000670de0b6b3a764000003611fdd565b9050600061207d88838a01612322565b9050600061208b828561250e565b9050670de0b6b3a76400008190036120a38882611fdd565b9b9a5050505050505050505050565b6040517ff7888aec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301523060248301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063f7888aec9060440160206040518083038186803b15801561214457600080fd5b505afa158015612158573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f69190612b8c565b8015612265576040517f97da6d3000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152306024830152838116604483015260006064830152608482018590527f000000000000000000000000000000000000000000000000000000000000000016906397da6d309060a4016040805180830381600087803b15801561222657600080fd5b505af115801561223a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061225e9190612ba5565b505061231c565b6040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301523060248301528381166044830152606482018590527f0000000000000000000000000000000000000000000000000000000000000000169063f18d03cc90608401600060405180830381600087803b15801561230357600080fd5b505af1158015612317573d6000803e3d6000fd5b505050505b50505050565b600080612337670de0b6b3a764000085612dfb565b90506000612346600285612de7565b6123509083612dcf565b905061201f8482612de7565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604081208054839290612391908490612e38565b909155505060008054829003815560405182815273ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b806000808282546124009190612dcf565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000818152600160209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016123e3565b60008061246c8786612322565b9050600061247a8588612e38565b905060006124888289612322565b905060006124a7826124a2670de0b6b3a764000087612322565b612631565b905060006124b5828d611fdd565b905060006124c3828e612e38565b90506000886124da88670de0b6b3a7640000612e38565b6124e49190612dfb565b90506124fc826106ce83670de0b6b3a7640000612e38565b9e9d5050505050505050505050505050565b60008260011115801561253f57506001612531670de0b6b3a76400006002612dfb565b61253b9190612e38565b8311155b6125a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f494e56414c49445f4241534500000000000000000000000000000000000000006044820152606401610644565b6000670de0b6b3a76400006125ba8185612de7565b6125c49190612dfb565b905060006125d28285612e38565b905060006125ec866124a2670de0b6b3a764000086612de7565b9050816125f7578093505b600061261a87846126156402540be400670de0b6b3a7640000612de7565b6126a7565b90506126268282611fdd565b979650505050505050565b600061263e600283612e88565b61265057670de0b6b3a7640000612652565b825b905061265f600283612de7565b91505b8115612686576126728380612dfb565b925061267f600283612de7565b9150612662565b612691600283612e88565b156109f6576126a08382612dfb565b9392505050565b60008281806126be87670de0b6b3a7640000612797565b670de0b6b3a76400009550909250905083600060015b87831061278a5760006126ef670de0b6b3a764000083612dfb565b905060008061270f8961270a670de0b6b3a764000086612e38565b612797565b91509150612721866106ce848b611fdd565b955061272d8684612322565b95508561273c5750505061278a565b8615612746579315935b8015612750579315935b841561276757612760868b612e38565b9950612774565b612771868b612dcf565b99505b505050808061278290612e4f565b9150506126d4565b5050505050509392505050565b6000808284106127ad57505080820360006127b5565b505081810360015b9250929050565b803580151581146127cc57600080fd5b919050565b6000602082840312156127e357600080fd5b81356126a081612f58565b600080600080600060a0868803121561280657600080fd5b853561281181612f58565b9450602086013561282181612f58565b9350604086013561283181612f58565b925061283f606087016127bc565b949793965091946080013592915050565b60008060008060008060c0878903121561286957600080fd5b863561287481612f58565b9550602087013561288481612f58565b9450604087013561289481612f58565b93506128a2606088016127bc565b92506080870135915060a087013567ffffffffffffffff808211156128c657600080fd5b818901915089601f8301126128da57600080fd5b8135818111156128ec576128ec612f29565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561293257612932612f29565b816040528281528c602084870101111561294b57600080fd5b8260208601602083013760006020848301015280955050505050509295509295509295565b6000806000806080858703121561298657600080fd5b843561299181612f58565b935060208501356129a181612f58565b92506129af604086016127bc565b9396929550929360600135925050565b6000806000606084860312156129d457600080fd5b83356129df81612f58565b92506129ed602085016127bc565b9150604084013590509250925092565b60008060408385031215612a1057600080fd5b8235612a1b81612f58565b946020939093013593505050565b60008060408385031215612a3c57600080fd5b8235612a4781612f58565b91506020830135612a5781612f58565b809150509250929050565b600080600060608486031215612a7757600080fd5b8335612a8281612f58565b92506020840135612a9281612f58565b929592945050506040919091013590565b600080600080600080600060e0888a031215612abe57600080fd5b8735612ac981612f58565b96506020880135612ad981612f58565b95506040880135945060608801359350608088013560ff81168114612afd57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060208385031215612b2d57600080fd5b823567ffffffffffffffff80821115612b4557600080fd5b818501915085601f830112612b5957600080fd5b813581811115612b6857600080fd5b866020828501011115612b7a57600080fd5b60209290920196919550909350505050565b600060208284031215612b9e57600080fd5b5051919050565b60008060408385031215612bb857600080fd5b505080516020909101519092909150565b600080600080600060a08688031215612be157600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b6000815180845260005b81811015612c2a57602081850181015186830182015201612c0e565b81811115612c3c576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020808252825182820181905260009190848201906040850190845b81811015612cbd57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101612c8b565b50909695505050505050565b602080825282518282018190526000919060409081850190868401855b82811015612d21578151805173ffffffffffffffffffffffffffffffffffffffff168552860151868501529284019290850190600101612ce6565b5091979650505050505050565b604080825283519082018190526000906020906060840190828701845b82811015612d6757815184529284019290840190600101612d4b565b5050508381038285015284518082528583019183019060005b81811015612daf57835170ffffffffffffffffffffffffffffffffff1683529284019291840191600101612d80565b5090979650505050505050565b6020815260006126a06020830184612c04565b60008219821115612de257612de2612e9c565b500190565b600082612df657612df6612ecb565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612e3357612e33612e9c565b500290565b600082821015612e4a57612e4a612e9c565b500390565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612e8157612e81612e9c565b5060010190565b600082612e9757612e97612ecb565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81168114612f7a57600080fd5b5056fea26469706673582212207d77e32942c854d1f0755a6656e62b260b9a7965842bf811c05e09f5ae236ae564736f6c63430008070033a264697066735822122078669ba8994f0083a7f7f734a47e07cfb8d885f0f1d51c89e4892036e478a05d64736f6c63430008070033",
  "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": 11607,
        "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": 11611,
        "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"
      }
    }
  }
}