{
    "_format": "hh-sol-artifact-1",
    "contractName": "LimitPool",
    "sourceName": "contracts/LimitPool.sol",
    "abi": [
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "factory_",
            "type": "address"
          }
        ],
        "stateMutability": "nonpayable",
        "type": "constructor"
      },
      {
        "inputs": [],
        "name": "ReentrancyGuardInvalidState",
        "type": "error"
      },
      {
        "inputs": [],
        "name": "ReentrancyGuardReadOnlyReentrantCall",
        "type": "error"
      },
      {
        "inputs": [],
        "name": "ReentrancyGuardReentrantCall",
        "type": "error"
      },
      {
        "inputs": [
          {
            "components": [
              {
                "internalType": "address",
                "name": "to",
                "type": "address"
              },
              {
                "internalType": "uint128",
                "name": "burnPercent",
                "type": "uint128"
              },
              {
                "internalType": "uint32",
                "name": "positionId",
                "type": "uint32"
              },
              {
                "internalType": "int24",
                "name": "claim",
                "type": "int24"
              },
              {
                "internalType": "bool",
                "name": "zeroForOne",
                "type": "bool"
              }
            ],
            "internalType": "struct PoolsharkStructs.BurnLimitParams",
            "name": "params",
            "type": "tuple"
          }
        ],
        "name": "burnLimit",
        "outputs": [
          {
            "internalType": "int256",
            "name": "",
            "type": "int256"
          },
          {
            "internalType": "int256",
            "name": "",
            "type": "int256"
          }
        ],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [
          {
            "components": [
              {
                "internalType": "address",
                "name": "to",
                "type": "address"
              },
              {
                "internalType": "uint32",
                "name": "positionId",
                "type": "uint32"
              },
              {
                "internalType": "uint128",
                "name": "burnPercent",
                "type": "uint128"
              }
            ],
            "internalType": "struct PoolsharkStructs.BurnRangeParams",
            "name": "params",
            "type": "tuple"
          }
        ],
        "name": "burnRange",
        "outputs": [
          {
            "internalType": "int256",
            "name": "",
            "type": "int256"
          },
          {
            "internalType": "int256",
            "name": "",
            "type": "int256"
          }
        ],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [],
        "name": "factory",
        "outputs": [
          {
            "internalType": "address",
            "name": "",
            "type": "address"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [
          {
            "components": [
              {
                "internalType": "uint16",
                "name": "protocolSwapFee0",
                "type": "uint16"
              },
              {
                "internalType": "uint16",
                "name": "protocolSwapFee1",
                "type": "uint16"
              },
              {
                "internalType": "uint16",
                "name": "protocolFillFee0",
                "type": "uint16"
              },
              {
                "internalType": "uint16",
                "name": "protocolFillFee1",
                "type": "uint16"
              },
              {
                "internalType": "uint8",
                "name": "setFeesFlags",
                "type": "uint8"
              }
            ],
            "internalType": "struct PoolsharkStructs.FeesParams",
            "name": "params",
            "type": "tuple"
          }
        ],
        "name": "fees",
        "outputs": [
          {
            "internalType": "uint128",
            "name": "token0Fees",
            "type": "uint128"
          },
          {
            "internalType": "uint128",
            "name": "token1Fees",
            "type": "uint128"
          }
        ],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [],
        "name": "genesisTime",
        "outputs": [
          {
            "internalType": "uint32",
            "name": "",
            "type": "uint32"
          }
        ],
        "stateMutability": "pure",
        "type": "function"
      },
      {
        "inputs": [],
        "name": "globalState",
        "outputs": [
          {
            "components": [
              {
                "components": [
                  {
                    "internalType": "uint16",
                    "name": "index",
                    "type": "uint16"
                  },
                  {
                    "internalType": "uint16",
                    "name": "count",
                    "type": "uint16"
                  },
                  {
                    "internalType": "uint16",
                    "name": "countMax",
                    "type": "uint16"
                  }
                ],
                "internalType": "struct PoolsharkStructs.SampleState",
                "name": "samples",
                "type": "tuple"
              },
              {
                "internalType": "uint200",
                "name": "feeGrowthGlobal0",
                "type": "uint200"
              },
              {
                "internalType": "uint200",
                "name": "feeGrowthGlobal1",
                "type": "uint200"
              },
              {
                "internalType": "uint160",
                "name": "secondsPerLiquidityAccum",
                "type": "uint160"
              },
              {
                "internalType": "uint160",
                "name": "price",
                "type": "uint160"
              },
              {
                "internalType": "uint128",
                "name": "liquidity",
                "type": "uint128"
              },
              {
                "internalType": "int56",
                "name": "tickSecondsAccum",
                "type": "int56"
              },
              {
                "internalType": "int24",
                "name": "tickAtPrice",
                "type": "int24"
              },
              {
                "internalType": "uint16",
                "name": "protocolSwapFee0",
                "type": "uint16"
              },
              {
                "internalType": "uint16",
                "name": "protocolSwapFee1",
                "type": "uint16"
              }
            ],
            "internalType": "struct PoolsharkStructs.RangePoolState",
            "name": "pool",
            "type": "tuple"
          },
          {
            "components": [
              {
                "internalType": "uint160",
                "name": "price",
                "type": "uint160"
              },
              {
                "internalType": "uint128",
                "name": "liquidity",
                "type": "uint128"
              },
              {
                "internalType": "uint128",
                "name": "protocolFees",
                "type": "uint128"
              },
              {
                "internalType": "uint16",
                "name": "protocolFillFee",
                "type": "uint16"
              },
              {
                "internalType": "int24",
                "name": "tickAtPrice",
                "type": "int24"
              }
            ],
            "internalType": "struct PoolsharkStructs.LimitPoolState",
            "name": "pool0",
            "type": "tuple"
          },
          {
            "components": [
              {
                "internalType": "uint160",
                "name": "price",
                "type": "uint160"
              },
              {
                "internalType": "uint128",
                "name": "liquidity",
                "type": "uint128"
              },
              {
                "internalType": "uint128",
                "name": "protocolFees",
                "type": "uint128"
              },
              {
                "internalType": "uint16",
                "name": "protocolFillFee",
                "type": "uint16"
              },
              {
                "internalType": "int24",
                "name": "tickAtPrice",
                "type": "int24"
              }
            ],
            "internalType": "struct PoolsharkStructs.LimitPoolState",
            "name": "pool1",
            "type": "tuple"
          },
          {
            "internalType": "uint128",
            "name": "liquidityGlobal",
            "type": "uint128"
          },
          {
            "internalType": "uint32",
            "name": "positionIdNext",
            "type": "uint32"
          },
          {
            "internalType": "uint32",
            "name": "epoch",
            "type": "uint32"
          },
          {
            "internalType": "uint8",
            "name": "unlocked",
            "type": "uint8"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [],
        "name": "immutables",
        "outputs": [
          {
            "components": [
              {
                "internalType": "address",
                "name": "owner",
                "type": "address"
              },
              {
                "internalType": "address",
                "name": "poolImpl",
                "type": "address"
              },
              {
                "internalType": "address",
                "name": "factory",
                "type": "address"
              },
              {
                "components": [
                  {
                    "internalType": "uint160",
                    "name": "min",
                    "type": "uint160"
                  },
                  {
                    "internalType": "uint160",
                    "name": "max",
                    "type": "uint160"
                  }
                ],
                "internalType": "struct PoolsharkStructs.PriceBounds",
                "name": "bounds",
                "type": "tuple"
              },
              {
                "internalType": "address",
                "name": "token0",
                "type": "address"
              },
              {
                "internalType": "address",
                "name": "token1",
                "type": "address"
              },
              {
                "internalType": "address",
                "name": "poolToken",
                "type": "address"
              },
              {
                "internalType": "uint32",
                "name": "genesisTime",
                "type": "uint32"
              },
              {
                "internalType": "int16",
                "name": "tickSpacing",
                "type": "int16"
              },
              {
                "internalType": "uint16",
                "name": "swapFee",
                "type": "uint16"
              }
            ],
            "internalType": "struct PoolsharkStructs.LimitImmutables",
            "name": "",
            "type": "tuple"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "uint16",
            "name": "newSampleCountMax",
            "type": "uint16"
          }
        ],
        "name": "increaseSampleCount",
        "outputs": [],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "uint160",
            "name": "startPrice",
            "type": "uint160"
          }
        ],
        "name": "initialize",
        "outputs": [],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [],
        "name": "limitTickMap",
        "outputs": [
          {
            "internalType": "uint256",
            "name": "blocks",
            "type": "uint256"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [],
        "name": "maxPrice",
        "outputs": [
          {
            "internalType": "uint160",
            "name": "",
            "type": "uint160"
          }
        ],
        "stateMutability": "pure",
        "type": "function"
      },
      {
        "inputs": [],
        "name": "minPrice",
        "outputs": [
          {
            "internalType": "uint160",
            "name": "",
            "type": "uint160"
          }
        ],
        "stateMutability": "pure",
        "type": "function"
      },
      {
        "inputs": [
          {
            "components": [
              {
                "internalType": "address",
                "name": "to",
                "type": "address"
              },
              {
                "internalType": "uint128",
                "name": "amount",
                "type": "uint128"
              },
              {
                "internalType": "uint96",
                "name": "mintPercent",
                "type": "uint96"
              },
              {
                "internalType": "uint32",
                "name": "positionId",
                "type": "uint32"
              },
              {
                "internalType": "int24",
                "name": "lower",
                "type": "int24"
              },
              {
                "internalType": "int24",
                "name": "upper",
                "type": "int24"
              },
              {
                "internalType": "bool",
                "name": "zeroForOne",
                "type": "bool"
              },
              {
                "internalType": "bytes",
                "name": "callbackData",
                "type": "bytes"
              }
            ],
            "internalType": "struct PoolsharkStructs.MintLimitParams",
            "name": "params",
            "type": "tuple"
          }
        ],
        "name": "mintLimit",
        "outputs": [
          {
            "internalType": "int256",
            "name": "",
            "type": "int256"
          },
          {
            "internalType": "int256",
            "name": "",
            "type": "int256"
          }
        ],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [
          {
            "components": [
              {
                "internalType": "address",
                "name": "to",
                "type": "address"
              },
              {
                "internalType": "int24",
                "name": "lower",
                "type": "int24"
              },
              {
                "internalType": "int24",
                "name": "upper",
                "type": "int24"
              },
              {
                "internalType": "uint32",
                "name": "positionId",
                "type": "uint32"
              },
              {
                "internalType": "uint128",
                "name": "amount0",
                "type": "uint128"
              },
              {
                "internalType": "uint128",
                "name": "amount1",
                "type": "uint128"
              },
              {
                "internalType": "bytes",
                "name": "callbackData",
                "type": "bytes"
              }
            ],
            "internalType": "struct PoolsharkStructs.MintRangeParams",
            "name": "params",
            "type": "tuple"
          }
        ],
        "name": "mintRange",
        "outputs": [
          {
            "internalType": "int256",
            "name": "",
            "type": "int256"
          },
          {
            "internalType": "int256",
            "name": "",
            "type": "int256"
          }
        ],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [],
        "name": "original",
        "outputs": [
          {
            "internalType": "address",
            "name": "",
            "type": "address"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [],
        "name": "owner",
        "outputs": [
          {
            "internalType": "address",
            "name": "",
            "type": "address"
          }
        ],
        "stateMutability": "pure",
        "type": "function"
      },
      {
        "inputs": [],
        "name": "poolToken",
        "outputs": [
          {
            "internalType": "address",
            "name": "",
            "type": "address"
          }
        ],
        "stateMutability": "pure",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "uint256",
            "name": "",
            "type": "uint256"
          }
        ],
        "name": "positions",
        "outputs": [
          {
            "internalType": "uint256",
            "name": "feeGrowthInside0Last",
            "type": "uint256"
          },
          {
            "internalType": "uint256",
            "name": "feeGrowthInside1Last",
            "type": "uint256"
          },
          {
            "internalType": "uint128",
            "name": "liquidity",
            "type": "uint128"
          },
          {
            "internalType": "int24",
            "name": "lower",
            "type": "int24"
          },
          {
            "internalType": "int24",
            "name": "upper",
            "type": "int24"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "uint256",
            "name": "",
            "type": "uint256"
          }
        ],
        "name": "positions0",
        "outputs": [
          {
            "internalType": "uint128",
            "name": "liquidity",
            "type": "uint128"
          },
          {
            "internalType": "uint32",
            "name": "epochLast",
            "type": "uint32"
          },
          {
            "internalType": "int24",
            "name": "lower",
            "type": "int24"
          },
          {
            "internalType": "int24",
            "name": "upper",
            "type": "int24"
          },
          {
            "internalType": "bool",
            "name": "crossedInto",
            "type": "bool"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "uint256",
            "name": "",
            "type": "uint256"
          }
        ],
        "name": "positions1",
        "outputs": [
          {
            "internalType": "uint128",
            "name": "liquidity",
            "type": "uint128"
          },
          {
            "internalType": "uint32",
            "name": "epochLast",
            "type": "uint32"
          },
          {
            "internalType": "int24",
            "name": "lower",
            "type": "int24"
          },
          {
            "internalType": "int24",
            "name": "upper",
            "type": "int24"
          },
          {
            "internalType": "bool",
            "name": "crossedInto",
            "type": "bool"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "int16",
            "name": "tickSpacing",
            "type": "int16"
          }
        ],
        "name": "priceBounds",
        "outputs": [
          {
            "internalType": "uint160",
            "name": "",
            "type": "uint160"
          },
          {
            "internalType": "uint160",
            "name": "",
            "type": "uint160"
          }
        ],
        "stateMutability": "pure",
        "type": "function"
      },
      {
        "inputs": [
          {
            "components": [
              {
                "internalType": "uint160",
                "name": "priceLimit",
                "type": "uint160"
              },
              {
                "internalType": "uint128",
                "name": "amount",
                "type": "uint128"
              },
              {
                "internalType": "bool",
                "name": "exactIn",
                "type": "bool"
              },
              {
                "internalType": "bool",
                "name": "zeroForOne",
                "type": "bool"
              }
            ],
            "internalType": "struct PoolsharkStructs.QuoteParams",
            "name": "params",
            "type": "tuple"
          }
        ],
        "name": "quote",
        "outputs": [
          {
            "internalType": "uint256",
            "name": "",
            "type": "uint256"
          },
          {
            "internalType": "uint256",
            "name": "",
            "type": "uint256"
          },
          {
            "internalType": "uint160",
            "name": "",
            "type": "uint160"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [],
        "name": "rangeTickMap",
        "outputs": [
          {
            "internalType": "uint256",
            "name": "blocks",
            "type": "uint256"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "uint32[]",
            "name": "secondsAgo",
            "type": "uint32[]"
          }
        ],
        "name": "sample",
        "outputs": [
          {
            "internalType": "int56[]",
            "name": "tickSecondsAccum",
            "type": "int56[]"
          },
          {
            "internalType": "uint160[]",
            "name": "secondsPerLiquidityAccum",
            "type": "uint160[]"
          },
          {
            "internalType": "uint160",
            "name": "averagePrice",
            "type": "uint160"
          },
          {
            "internalType": "uint128",
            "name": "averageLiquidity",
            "type": "uint128"
          },
          {
            "internalType": "int24",
            "name": "averageTick",
            "type": "int24"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "uint256",
            "name": "",
            "type": "uint256"
          }
        ],
        "name": "samples",
        "outputs": [
          {
            "internalType": "uint32",
            "name": "blockTimestamp",
            "type": "uint32"
          },
          {
            "internalType": "int56",
            "name": "tickSecondsAccum",
            "type": "int56"
          },
          {
            "internalType": "uint160",
            "name": "secondsPerLiquidityAccum",
            "type": "uint160"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [
          {
            "components": [
              {
                "internalType": "address",
                "name": "owner",
                "type": "address"
              },
              {
                "internalType": "uint128",
                "name": "burnPercent",
                "type": "uint128"
              },
              {
                "internalType": "uint32",
                "name": "positionId",
                "type": "uint32"
              },
              {
                "internalType": "int24",
                "name": "claim",
                "type": "int24"
              },
              {
                "internalType": "bool",
                "name": "zeroForOne",
                "type": "bool"
              }
            ],
            "internalType": "struct PoolsharkStructs.SnapshotLimitParams",
            "name": "params",
            "type": "tuple"
          }
        ],
        "name": "snapshotLimit",
        "outputs": [
          {
            "internalType": "uint128",
            "name": "",
            "type": "uint128"
          },
          {
            "internalType": "uint128",
            "name": "",
            "type": "uint128"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "uint32",
            "name": "positionId",
            "type": "uint32"
          }
        ],
        "name": "snapshotRange",
        "outputs": [
          {
            "internalType": "int56",
            "name": "tickSecondsAccum",
            "type": "int56"
          },
          {
            "internalType": "uint160",
            "name": "secondsPerLiquidityAccum",
            "type": "uint160"
          },
          {
            "internalType": "uint128",
            "name": "feesOwed0",
            "type": "uint128"
          },
          {
            "internalType": "uint128",
            "name": "feesOwed1",
            "type": "uint128"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [
          {
            "components": [
              {
                "internalType": "address",
                "name": "to",
                "type": "address"
              },
              {
                "internalType": "uint160",
                "name": "priceLimit",
                "type": "uint160"
              },
              {
                "internalType": "uint128",
                "name": "amount",
                "type": "uint128"
              },
              {
                "internalType": "bool",
                "name": "exactIn",
                "type": "bool"
              },
              {
                "internalType": "bool",
                "name": "zeroForOne",
                "type": "bool"
              },
              {
                "internalType": "bytes",
                "name": "callbackData",
                "type": "bytes"
              }
            ],
            "internalType": "struct PoolsharkStructs.SwapParams",
            "name": "params",
            "type": "tuple"
          }
        ],
        "name": "swap",
        "outputs": [
          {
            "internalType": "int256",
            "name": "",
            "type": "int256"
          },
          {
            "internalType": "int256",
            "name": "",
            "type": "int256"
          }
        ],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [],
        "name": "swapFee",
        "outputs": [
          {
            "internalType": "uint16",
            "name": "",
            "type": "uint16"
          }
        ],
        "stateMutability": "pure",
        "type": "function"
      },
      {
        "inputs": [],
        "name": "tickSpacing",
        "outputs": [
          {
            "internalType": "int16",
            "name": "",
            "type": "int16"
          }
        ],
        "stateMutability": "pure",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "int24",
            "name": "",
            "type": "int24"
          }
        ],
        "name": "ticks",
        "outputs": [
          {
            "components": [
              {
                "internalType": "uint200",
                "name": "feeGrowthOutside0",
                "type": "uint200"
              },
              {
                "internalType": "uint200",
                "name": "feeGrowthOutside1",
                "type": "uint200"
              },
              {
                "internalType": "uint160",
                "name": "secondsPerLiquidityAccumOutside",
                "type": "uint160"
              },
              {
                "internalType": "int56",
                "name": "tickSecondsAccumOutside",
                "type": "int56"
              },
              {
                "internalType": "int128",
                "name": "liquidityDelta",
                "type": "int128"
              },
              {
                "internalType": "uint128",
                "name": "liquidityAbsolute",
                "type": "uint128"
              }
            ],
            "internalType": "struct PoolsharkStructs.RangeTick",
            "name": "range",
            "type": "tuple"
          },
          {
            "components": [
              {
                "internalType": "uint160",
                "name": "priceAt",
                "type": "uint160"
              },
              {
                "internalType": "int128",
                "name": "liquidityDelta",
                "type": "int128"
              },
              {
                "internalType": "uint128",
                "name": "liquidityAbsolute",
                "type": "uint128"
              }
            ],
            "internalType": "struct PoolsharkStructs.LimitTick",
            "name": "limit",
            "type": "tuple"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [],
        "name": "token0",
        "outputs": [
          {
            "internalType": "address",
            "name": "",
            "type": "address"
          }
        ],
        "stateMutability": "pure",
        "type": "function"
      },
      {
        "inputs": [],
        "name": "token1",
        "outputs": [
          {
            "internalType": "address",
            "name": "",
            "type": "address"
          }
        ],
        "stateMutability": "pure",
        "type": "function"
      }
    ],
    "bytecode": "0x60c06040523480156200001157600080fd5b50604051620044b1380380620044b183398101604081905262000034916200004a565b306080526001600160a01b031660a0526200007c565b6000602082840312156200005d57600080fd5b81516001600160a01b03811681146200007557600080fd5b9392505050565b60805160a0516143e5620000cc600039600081816105b201528181611583015281816118670152611aa30152600081816103b701528181611554015281816116e4015261176a01526143e56000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c8063a99c9dd51161011a578063e38d6b5c116100ad578063f30dba931161007c578063f30dba93146107df578063f62167fc146108b2578063f637731d146108d6578063fadd58a2146108e9578063fdf53665146108fc57600080fd5b8063e38d6b5c14610627578063e45be8eb1461062f578063e76c01e414610637578063f0a20aec146107cc57600080fd5b8063d0c93a7c116100e9578063d0c93a7c146105dc578063d21220a7146105f7578063d468e71f146105ff578063e323eb0e1461061457600080fd5b8063a99c9dd514610546578063aedb419714610550578063c45a0155146105ad578063cbdf382c146105d457600080fd5b806354cf2aeb11610192578063810b1d0911610161578063810b1d091461046e5780638a5ee2c3146104a15780638da5cb5b146104b457806399fbab88146104bc57600080fd5b806354cf2aeb146103d95780635cbb18d1146103f457806360f9b0d31461044357806363aca53c1461045b57600080fd5b8063270ffd7d116101ce578063270ffd7d1461033657806342c6498a1461035e57806343865d4e1461037b57806346c715fa146103b257600080fd5b806307e72129146102005780630dfe168114610246578063240dda1f14610266578063256b9f3914610299575b600080fd5b61021361020e366004612449565b610911565b6040805163ffffffff909416845260069290920b60208401526001600160a01b0316908201526060015b60405180910390f35b61024e61094c565b6040516001600160a01b03909116815260200161023d565b610279610274366004612462565b61095d565b604080516001600160a01b0393841681529290911660208301520161023d565b6102f66102a7366004612449565b62010019602052600090815260409020546001600160801b03811690600160801b810463ffffffff1690600160a01b8104600290810b91600160b81b810490910b90600160d01b900460ff1685565b604080516001600160801b03909616865263ffffffff9094166020860152600292830b93850193909352900b60608301521515608082015260a00161023d565b6103496103443660046126b9565b610972565b6040805192835260208301919091520161023d565b610366610a55565b60405163ffffffff909116815260200161023d565b61038e61038936600461279d565b610a61565b6040805193845260208401929092526001600160a01b03169082015260600161023d565b61024e7f000000000000000000000000000000000000000000000000000000000000000081565b6103e1610b11565b60405161ffff909116815260200161023d565b61040761040236600461281d565b610b1d565b6040805160069590950b85526001600160a01b0390931660208501526001600160801b039182169284019290925216606082015260800161023d565b60125461044d9081565b60405190815260200161023d565b6103496104693660046128b3565b610bc0565b61048161047c3660046128ee565b610c4a565b604080516001600160801b0393841681529290911660208301520161023d565b6104816104af3660046128b3565b610cf8565b61024e610d9e565b61050c6104ca366004612449565b6201001760205260009081526040902080546001820154600292830154919290916001600160801b03811691600160801b8204810b91600160981b9004900b85565b6040805195865260208601949094526001600160801b0390921692840192909252600291820b6060840152900b608082015260a00161023d565b600d5461044d9081565b6102f661055e366004612449565b62010018602052600090815260409020546001600160801b03811690600160801b810463ffffffff1690600160a01b8104600290810b91600160b81b810490910b90600160d01b900460ff1685565b61024e7f000000000000000000000000000000000000000000000000000000000000000081565b61024e610daa565b6105e4610db6565b60405160019190910b815260200161023d565b61024e610dc2565b61061261060d366004612968565b610dce565b005b610349610622366004612985565b610dfb565b61024e610e70565b61024e610e7c565b604080516101a08101825260005461ffff8082166101408401908152620100008084048316610160860152640100000000909304821661018085015283526001546001600160c81b0390811660208086019190915260028054909216858701526003546001600160a01b0390811660608088019190915260045482166080808901919091526005546001600160801b0380821660a0808c0191909152600160801b808404600690810b60c08e0152600160b81b85048a0b60e08e0152600160d01b85048b166101008e0152600160e01b9094048a166101208d01528c518083018e52935487168452600754808416858a01528190048316848e0152600854808b16858801528b9004890b848601528c519182018d526009549096168152600a54808316978201979097529585900481169a86019a909a52600b54968716928501929092529590940490920b93810193909352600c546107b995929392811691810463ffffffff90811691600160a01b810490911690600160c01b900460ff1687565b60405161023d9796959493929190612a9a565b6103496107da366004612bd2565b610e88565b6108a46107ed366004612ca4565b6201001660209081526000918252604091829020825160c08101845281546001600160c81b0390811682526001830154168184015260028201546001600160a01b0380821683870152600160a01b90910460060b6060808401919091526003840154600f81810b60808601526001600160801b03600160801b92839004811660a087015288519384018952600487015490941683526005909501549485900b95820195909552939092049091169282019290925282565b60405161023d929190612cef565b6108c56108c0366004612d80565b610f01565b60405161023d959493929190612e1e565b6106126108e4366004612ed1565b610fa3565b6103496108f7366004612eee565b6114af565b610904611528565b60405161023d9190612f42565b60178161ffff811061092257600080fd5b015463ffffffff81169150640100000000810460060b90600160581b90046001600160a01b031683565b60006109586014611661565b905090565b60008061096983611684565b91509150915091565b600080600061098081611699565b6109886116e0565b610990611feb565b610998611528565b604082015260c085015173__$6dea53a5b1a3c14df3d68f8a290554c5af$__9063a07aea75906109cb57620100196109d0565b620100185b620100166017600d601260008c896040518963ffffffff1660e01b8152600401610a019897969594939291906134ca565b6040805180830381865af4158015610a1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4191906135ae565b9350935050610a4f816118dd565b50915091565b60006109586078611922565b6000806000610a6e612095565b610a76611528565b6020820152604051635fdf9d5560e01b815273__$9e4c229d336278bda7a6b638eb4f56779a$__90635fdf9d5590610ac2906201001690600d906012906000908c9089906004016135d2565b606060405180830381865af4158015610adf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b039190613641565b935093509350509193909250565b6000610958607e611945565b60008060008073__$286c9a6ab289b16a925f6a63d27fed5f3d$__6368b3fe3062010017620100166000610b4f611528565b8a6040518663ffffffff1660e01b8152600401610b709594939291906137e5565b608060405180830381865af4158015610b8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb19190613843565b93509350935093509193509193565b6000806000610bce81611699565b610bd66116e0565b610bde612135565b610be6611528565b816080018190525073__$1214492daac452055e29b230bdd72e484d$__63f15bc8cc8660800151610c1a5762010019610c1f565b620100185b62010016601260008a876040518763ffffffff1660e01b8152600401610a01969594939291906138e9565b600080610c55611968565b6000610c6081611699565b610c686116e0565b73__$f0f62380d12e0e837b46ba5507a2cc3702$__632322cded600086610c8d611528565b6040518463ffffffff1660e01b8152600401610cab93929190613a17565b6040805180830381865af4158015610cc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ceb9190613a76565b92509250610a4f816118dd565b60008073__$06f006a50281b95ada637fcca2c3169e65$__6363fbcd438460800151610d275762010019610d2c565b620100185b6201001660126000610d3c611528565b896040518763ffffffff1660e01b8152600401610d5e96959493929190613ab0565b6040805180830381865af4158015610d7a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109699190613a76565b60006109586000611661565b6000610958603c611661565b6000610958607c611945565b60006109586028611661565b6000610dd981611699565b610de16116e0565b610dee60176000846119c0565b610df7816118dd565b5050565b6000806000610e0981611699565b610e116116e0565b610e19612095565b610e21611528565b602082015260405163a835b0a360e01b815273__$8397ab196537c2cfcd89b6140849e98c7e$__9063a835b0a390610a01906201001690601790600d906012906000908d908a90600401613aef565b60006109586064611661565b60006109586050611661565b6000806000610e9681611699565b610e9e6116e0565b610ea6612200565b610eae611528565b6040808301919091525163bccd276b60e01b815273__$14b14c61645669b42e011afd470eeccf72$__9063bccd276b90610a019062010017906201001690600d9060179060009089908e90600401613c3f565b606080600080600073__$82e69f90fc4689a77ae11a0614a00f0cb8$__631fb854c06000610f2d611528565b896040518463ffffffff1660e01b8152600401610f4c93929190613d2b565b600060405180830381865af4158015610f69573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f919190810190613e13565b939a9299509097509550909350915050565b6000610fae81611699565b610fb6611a98565b610fbe6116e0565b73__$dc25dd3a5fe6a540f35c01c335c2ccfd23$__63d9195ff2600d601260176000610fe8611528565b886040518763ffffffff1660e01b815260040161100a96959493929190613f07565b61034060405180830381865af4158015611028573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104c9190614052565b6000808201518160000160008201518160000160008201518160000160006101000a81548161ffff021916908361ffff16021790555060208201518160000160026101000a81548161ffff021916908361ffff16021790555060408201518160000160046101000a81548161ffff021916908361ffff160217905550505060208201518160010160006101000a8154816001600160c81b0302191690836001600160c81b0316021790555060408201518160020160006101000a8154816001600160c81b0302191690836001600160c81b0316021790555060608201518160030160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060808201518160040160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060a08201518160050160006101000a8154816001600160801b0302191690836001600160801b0316021790555060c08201518160050160106101000a81548166ffffffffffffff021916908360060b66ffffffffffffff16021790555060e08201518160050160176101000a81548162ffffff021916908360020b62ffffff16021790555061010082015181600501601a6101000a81548161ffff021916908361ffff16021790555061012082015181600501601c6101000a81548161ffff021916908361ffff160217905550505060208201518160060160008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160801b0302191690836001600160801b0316021790555060408201518160010160106101000a8154816001600160801b0302191690836001600160801b0316021790555060608201518160020160006101000a81548161ffff021916908361ffff16021790555060808201518160020160026101000a81548162ffffff021916908360020b62ffffff160217905550505060408201518160090160008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160801b0302191690836001600160801b0316021790555060408201518160010160106101000a8154816001600160801b0302191690836001600160801b0316021790555060608201518160020160006101000a81548161ffff021916908361ffff16021790555060808201518160020160026101000a81548162ffffff021916908360020b62ffffff1602179055505050606082015181600c0160006101000a8154816001600160801b0302191690836001600160801b03160217905550608082015181600c0160106101000a81548163ffffffff021916908363ffffffff16021790555060a082015181600c0160146101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600c0160186101000a81548160ff021916908360ff160217905550905050610df7816118dd565b60008060006114bd81611699565b6114c56116e0565b6114cd61228e565b6114d5611528565b6040808301919091525163b04d4a4960e01b815273__$16f93f2e1504eec0c942977e18129be78e$__9063b04d4a4990610a019062010017906201001690600d9060179060009089908e906004016141aa565b611530612306565b604051806101400160405280611544610d9e565b6001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815260200160405180604001604052806115c3610e7c565b6001600160a01b031681526020016115d9610e70565b6001600160a01b0316905281526020016115f161094c565b6001600160a01b03168152602001611607610dc2565b6001600160a01b0316815260200161161d610daa565b6001600160a01b03168152602001611633610a55565b63ffffffff168152602001611646610db6565b60010b8152602001611656610b11565b61ffff169052919050565b6000806116763660011981013560f01c900390565b929092013560601c92915050565b60008061169083611b00565b61096984611b2e565b600c810154600119600160c01b90910460ff16016116ca57604051633ee5aeb560e01b815260040160405180910390fd5b600c01805460ff60c01b1916600160c11b179055565b60007f000000000000000000000000000000000000000000000000000000000000000061170b61094c565b611713610dc2565b61171b610b11565b604080516001600160a01b039586166020820152938516908401529216606082015261ffff909116608082015260a001604051602081830303815290604052805190602001209050600061188b7f0000000000000000000000000000000000000000000000000000000000000000611791610d9e565b61179961094c565b6117a1610dc2565b6117a9610daa565b6117b1610e7c565b6117b9610e70565b6117c1610a55565b6117c9610db6565b6117d1610b11565b6040516060998a1b6bffffffffffffffffffffffff199081166020830152988a1b8916603482015296891b8816604888015294881b8716605c87015292871b86166070860152951b909316608483015260e09390931b6001600160e01b031916609882015260f091821b609c82015291901b6001600160f01b031916609e82015260a001604051602081830303815290604052847f0000000000000000000000000000000000000000000000000000000000000000611b4f565b9050306001600160a01b03821614610df75760405162461bcd60e51b815260206004820152601060248201526f4e6f44656c656761746543616c6c282960801b60448201526064015b60405180910390fd5b600c810154600160c01b900460ff1660021461190c57604051631305d1b560e21b815260040160405180910390fd5b600c01805460ff60c01b1916600160c01b179055565b6000806119373660011981013560f01c900390565b929092013560e01c92915050565b60008061195a3660011981013560f01c900390565b929092013560f01c92915050565b611970610d9e565b6001600160a01b0316336001600160a01b0316146119be5760405162461bcd60e51b815260206004820152600b60248201526a4f776e65724f6e6c79282960a81b60448201526064016118d4565b565b815461ffff6401000000009091048116908216116119dd57505050565b8154640100000000900461ffff165b8161ffff168161ffff161015611a40576001848261ffff1661ffff8110611a1557611a156142a6565b01805463ffffffff191663ffffffff9290921691909117905580611a38816142d2565b9150506119ec565b50815465ffff00000000191664010000000061ffff83169081029190911783556040519081527f7597a28d85943b1c3514bc536ff16e437623b69613f58f63b961fca559df291d9060200160405180910390a1505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146119be5760405162461bcd60e51b815260206004820152600d60248201526c466163746f72794f6e6c79282960981b60448201526064016118d4565b6000611b0a612306565b600183900b610100820152611b27611b2184611c2a565b82611c4f565b9392505050565b6000611b38612306565b600183900b610100820152611b27611b2184611faa565b605f1983018051603f1985018051601f19870180518851808a0160200180516c5af43d3d93803e606057fd5bf38c52600c198c018d905260028301604881901b78593da1005b363d3d373d3d3d3d610000806062363936013d73176020198e01527f9e4ac34f21c619cefc926c8bd93b54bf5a39c7ab2127a895af1cc0691d7e3dff6039198e01526064840160781b716100003d81600a3d39f336602c57343d527f176059198e015260f01b8252606e8301604b198d01209152908a52915291529152600090611c20818585611fc9565b9695505050505050565b6000600182900b611c3f81620d89e719614309565b611c499190614351565b92915050565b60008060008460020b12611c66578360020b611c73565b8360020b611c7390614371565b9050611c83836101000151611faa565b62ffffff16811115611ccb5760405162461bcd60e51b81526020600482015260116024820152705469636b4f75744f66426f756e6473282960781b60448201526064016118d4565b600081600116600003611ce257600160801b611cf4565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615611d28576ffff97272373d413259a46990580e213a0260801c5b6004821615611d47576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615611d66576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615611d85576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615611da4576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615611dc3576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615611de2576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615611e02576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615611e22576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615611e42576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615611e62576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615611e82576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615611ea2576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615611ec2576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615611ee2576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615611f03576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615611f23576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615611f42576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615611f5f576b048a170391f7dc42444e8fa20260801c5b60008560020b1315611f80578060001981611f7c57611f7c6142f3565b0490505b640100000000810615611f94576001611f97565b60005b60ff16602082901c019250505092915050565b6000600182900b80611fbf620d89e71961438d565b611c3f9190614309565b600060ff60005350603592835260601b60015260155260556000908120915290565b604051806101a00160405280611fff612368565b81526040805160a08101825260008082526020828101829052928201819052606082018190526080820152910190815260200161203a612306565b815260200161204761241b565b8152602001612054612095565b815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600060020b81525090565b6040518061024001604052806120a9612368565b81526020016120b6612306565b815260006020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e08201819052610100820181905261012082018190526101408201819052610160820181905261018082018190526101a082018190526101c082018190526101e082018190526102009091015290565b604051806101e00160405280612149612368565b815260200161215661241b565b815260408051606081018252600080825260208281018290529282015291019081526040805160a0810182526000808252602082810182905292820181905260608201819052608082015291019081526020016121b1612306565b815260006020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e08201819052610100820181905261012082018190526101409091015290565b604051806101600160405280612214612368565b81526040805160a08101825260008082526020828101829052928201819052606082018190526080820152910190815260200161224f612306565b815260006020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e082018190526101009091015290565b6040518061010001604052806122a2612368565b81526040805160a0810182526000808252602082810182905292820181905260608201819052608082015291019081526020016122dd612306565b815260006020820181905260408201819052606082018190526080820181905260a09091015290565b6040805161014081018252600080825260208083018290528284018290528351808501909452818452830152906060820190815260006020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b604080516102808101909152600061022082018181526102408301829052610260830182905260e08301908152610100830182905261012083018290526101408301829052610160830182905261018083018290526101a083018290526101c083018290526101e083018290526102008301919091528152602081016123ec61241b565b81526020016123f961241b565b8152600060208201819052604082018190526060820181905260809091015290565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915290565b60006020828403121561245b57600080fd5b5035919050565b60006020828403121561247457600080fd5b81358060010b8114611b2757600080fd5b634e487b7160e01b600052604160045260246000fd5b60405161010081016001600160401b03811182821017156124be576124be612485565b60405290565b60405160a081016001600160401b03811182821017156124be576124be612485565b60405160c081016001600160401b03811182821017156124be576124be612485565b60405160e081016001600160401b03811182821017156124be576124be612485565b604051606081016001600160401b03811182821017156124be576124be612485565b60405161014081016001600160401b03811182821017156124be576124be612485565b604051601f8201601f191681016001600160401b038111828210171561259757612597612485565b604052919050565b6001600160a01b03811681146125b457600080fd5b50565b80356125c28161259f565b919050565b6001600160801b03811681146125b457600080fd5b80356125c2816125c7565b80356bffffffffffffffffffffffff811681146125c257600080fd5b63ffffffff811681146125b457600080fd5b80356125c281612603565b8060020b81146125b457600080fd5b80356125c281612620565b803580151581146125c257600080fd5b600082601f83011261265b57600080fd5b81356001600160401b0381111561267457612674612485565b612687601f8201601f191660200161256f565b81815284602083860101111561269c57600080fd5b816020850160208301376000918101602001919091529392505050565b6000602082840312156126cb57600080fd5b81356001600160401b03808211156126e257600080fd5b9083019061010082860312156126f757600080fd5b6126ff61249b565b612708836125b7565b8152612716602084016125dc565b6020820152612727604084016125e7565b604082015261273860608401612615565b60608201526127496080840161262f565b608082015261275a60a0840161262f565b60a082015261276b60c0840161263a565b60c082015260e08301358281111561278257600080fd5b61278e8782860161264a565b60e08301525095945050505050565b6000608082840312156127af57600080fd5b604051608081018181106001600160401b03821117156127d1576127d1612485565b60405282356127df8161259f565b815260208301356127ef816125c7565b60208201526128006040840161263a565b60408201526128116060840161263a565b60608201529392505050565b60006020828403121561282f57600080fd5b8135611b2781612603565b600060a0828403121561284c57600080fd5b6128546124c4565b905081356128618161259f565b81526020820135612871816125c7565b6020820152604082013561288481612603565b6040820152606082013561289781612620565b60608201526128a86080830161263a565b608082015292915050565b600060a082840312156128c557600080fd5b611b27838361283a565b61ffff811681146125b457600080fd5b60ff811681146125b457600080fd5b600060a0828403121561290057600080fd5b6129086124c4565b8235612913816128cf565b81526020830135612923816128cf565b60208201526040830135612936816128cf565b60408201526060830135612949816128cf565b6060820152608083013561295c816128df565b60808201529392505050565b60006020828403121561297a57600080fd5b8135611b27816128cf565b60006020828403121561299757600080fd5b81356001600160401b03808211156129ae57600080fd5b9083019060c082860312156129c257600080fd5b6129ca6124e6565b82356129d58161259f565b815260208301356129e58161259f565b602082015260408301356129f8816125c7565b6040820152612a096060840161263a565b6060820152612a1a6080840161263a565b608082015260a083013582811115612a3157600080fd5b612a3d8782860161264a565b60a08301525095945050505050565b80516001600160a01b031682526020808201516001600160801b03908116918401919091526040808301519091169083015260608082015161ffff169083015260809081015160020b910152565b8751805161ffff90811683526020808301518216908401526040918201511690820152610340810160208901516001600160c81b03811660608401525060408901516001600160c81b03811660808401525060608901516001600160a01b03811660a08401525060808901516001600160a01b03811660c08401525060a08901516001600160801b03811660e08401525060c0890151610100612b418185018360060b9052565b60e08b01519150610120612b598186018460020b9052565b908b015161ffff908116610140860152908b01511661016084015250612b83610180830189612a4c565b612b91610220830188612a4c565b6001600160801b0386166102c083015263ffffffff85166102e083015263ffffffff841661030083015260ff83166103208301525b98975050505050505050565b600060208284031215612be457600080fd5b81356001600160401b0380821115612bfb57600080fd5b9083019060e08286031215612c0f57600080fd5b612c17612508565b612c20836125b7565b8152612c2e6020840161262f565b6020820152612c3f6040840161262f565b6040820152612c5060608401612615565b6060820152612c61608084016125dc565b6080820152612c7260a084016125dc565b60a082015260c083013582811115612c8957600080fd5b612c958782860161264a565b60c08301525095945050505050565b600060208284031215612cb657600080fd5b8135611b2781612620565b80516001600160a01b03168252602080820151600f0b908301526040908101516001600160801b0316910152565b82516001600160c81b039081168252602080850151909116908201526040808401516001600160a01b03169082015260608084015160060b90820152608080840151600f0b9082015260a0808401516001600160801b0316908201526101208101611b2760c0830184612cc1565b60006001600160401b03821115612d7657612d76612485565b5060051b60200190565b60006020808385031215612d9357600080fd5b82356001600160401b03811115612da957600080fd5b8301601f81018513612dba57600080fd5b8035612dcd612dc882612d5d565b61256f565b81815260059190911b82018301908381019087831115612dec57600080fd5b928401925b82841015612e13578335612e0481612603565b82529284019290840190612df1565b979650505050505050565b60a0808252865190820181905260009060209060c0840190828a01845b82811015612e5a57815160060b84529284019290840190600101612e3b565b5050508381038285015287518082528883019183019060005b81811015612e985783516001600160a01b031683529284019291840191600101612e73565b50506001600160a01b03881660408601529250612eb3915050565b6001600160801b0384166060830152611c20608083018460020b9052565b600060208284031215612ee357600080fd5b8135611b278161259f565b600060608284031215612f0057600080fd5b612f0861252a565b8235612f138161259f565b81526020830135612f2381612603565b60208201526040830135612f36816125c7565b60408201529392505050565b81516001600160a01b0316815261016081016020830151612f6e60208401826001600160a01b03169052565b506040830151612f8960408401826001600160a01b03169052565b506060830151612fb2606084018280516001600160a01b03908116835260209182015116910152565b5060808301516001600160a01b03811660a08401525060a08301516001600160a01b03811660c08401525060c08301516001600160a01b03811660e08401525060e083015161010061300b8185018363ffffffff169052565b84015190506101206130218482018360010b9052565b84015161ffff811661014085015290505b5092915050565b6000815180845260005b8181101561305f57602081850181015186830182015201613043565b506000602082860101526020601f19601f83011685010191505092915050565b80516130a9838251805161ffff908116835260208083015182169084015260409182015116910152565b60208101516001600160c81b03811660608501525060408101516001600160c81b03811660808501525060608101516001600160a01b03811660a08501525060808101516001600160a01b03811660c08501525060a08101516001600160801b03811660e08501525060c08101516101006131288186018360060b9052565b60e083015191506101206131408187018460020b9052565b9083015161ffff908116610140870152920151909116610160840152506020810151613170610180840182612a4c565b506040810151613184610220840182612a4c565b5060608101516001600160801b03166102c0830152608081015163ffffffff9081166102e084015260a08201511661030083015260c0015160ff1661032090910152565b505050565b6001600160801b03815116825263ffffffff6020820151166020830152604081015160020b6040830152606081015160020b60608301526080810151151560808301525050565b80516001600160a01b03168252602081015161323b60208401826001600160a01b03169052565b50604081015161325660408401826001600160a01b03169052565b50606081015161327f606084018280516001600160a01b03908116835260209182015116910152565b5060808101516001600160a01b03811660a08401525060a08101516001600160a01b03811660c08401525060c08101516001600160a01b03811660e08401525060e08101516101006132d88185018363ffffffff169052565b82015190506101206132ee8482018360010b9052565b82015161ffff81166101408501529050505050565b61330e82825161307f565b6020810151613321610340840182613214565b5060408101516104a083015260608101516104c083015260808101516104e083015260a081015161050083015260c081015161052083015260e08101516001600160a01b039081166105408401526101008201518116610560840152610120820151166105808301526101408101516001600160801b03166105a0830152610160810151600690810b6105c0840152610180820151900b6105e08301526101a081015160020b6106008301526101c081015160ff166106208301526101e0810151151561064083015261020081015115156106608301526102200151151561068090910152565b61341382825161307f565b60208101516134266103408401826131cd565b50604081015161343a6103e0840182613214565b50606081015161344e610540840182612a4c565b5060808101516134626105e0840182613303565b5060a0810151610c8083015260c0810151610ca083015260e0810151610cc0830152610100810151610ce0830152610120810151610d00830152610140810151610d20830152610160810151610d408301526101808101516131c8610d6084018260020b9052565b6000610e608a83528960208401528860408401528760608401528660808401528560a08401528060c084015260018060a01b0385511681840152506001600160801b03602085015116610e808301526040840151613539610ea08401826bffffffffffffffffffffffff169052565b50606084015163ffffffff16610ec08301526080840151600290810b610ee084015260a0850151900b610f0083015260c08401511515610f2083015260e0840151610100610f40840152613591610f60840182613039565b9150506135a160e0830184613408565b9998505050505050505050565b600080604083850312156135c157600080fd5b505080516020909101519092909150565b86815260208082018790526040808301879052606080840187905285516001600160a01b03166080850152918501516001600160801b031660a0840152840151151560c0830152830151151560e08201526107a08101612e13610100830184613303565b80516125c28161259f565b60008060006060848603121561365657600080fd5b8351925060208401519150604084015161366f8161259f565b809150509250925092565b80546001600160a01b0316825260018101546001600160801b0381166020840152608090811c604084015260029182015461ffff8116606085015260101c90910b910152565b805461ffff8082168452601082901c81166020808601919091529190911c8116604084015260018201546001600160c81b03908116606085015260028084015490911660808086019190915260038401546001600160a01b0390811660a087015260048501541660c086015260058401546001600160801b0380821660e0808901919091529282901c60060b61010088015260b882901c90930b61012087015260d081901c84166101408701529081901c8316610160860152915061378c61018085016006850161367a565b61379d61022085016009850161367a565b600c92909201549182166001600160801b03166102c084015250608081901c63ffffffff9081166102e084015260a082901c1661030083015260c01c60ff1661032090910152565b85815260208101859052610500810161380160408301866136c0565b61380f610380830185613214565b63ffffffff83166104e08301529695505050505050565b8051600681900b81146125c257600080fd5b80516125c2816125c7565b6000806000806080858703121561385957600080fd5b61386285613826565b935060208501516138728161259f565b6040860151909350613883816125c7565b6060860151909250613894816125c7565b939692955090935050565b80516001600160a01b031682526020808201516001600160801b03169083015260408082015163ffffffff169083015260608082015160020b908301526080908101511515910152565b60006108a082019050878252866020830152856040830152846060830152613914608083018561389f565b610120613924818401855161307f565b6020840151613937610460850182612a4c565b50604084015161394b610500850182612cc1565b50606084015161395f6105608501826131cd565b506080840151613973610600850182613214565b5060a08401516001600160a01b0390811661076085015260c0850151811661078085015260e0850151166107a08401526101008401516001600160801b039081166107c08501529084015181166107e08401526101408401511661080083015261016083015160020b61082083015261018083015115156108408301526101a083015115156108608301526101c09092015115156108809091015295945050505050565b60006102208201905084825261ffff8085511660208401528060208601511660408401528060408601511660608401528060608601511660808401525060ff60808501511660a0830152613a6e60c0830184613214565b949350505050565b60008060408385031215613a8957600080fd5b8251613a94816125c7565b6020840151909250613aa5816125c7565b809150509250929050565b86815260208101869052604081018590526105a08101613ad360608301866136c0565b613ae16103a0830185613214565b612e1361050083018461389f565b60006107608983528860208401528760408401528660608401528560808401528060a084015260018060a01b0380865116828501528060208701511661078085015250506001600160801b036040850151166107a0830152606084015115156107c0830152608084015115156107e083015260a084015160c0610800840152613b7c610820840182613039565b915050612bc660c0830184613303565b80518252602081015160208301526001600160801b036040820151166040830152606081015160020b6060830152608081015160020b60808301525050565b60018060a01b038151168252602081015160020b6020830152604081015160020b604083015263ffffffff6060820151166060830152600060808201516001600160801b0380821660808601528060a08501511660a0860152505060c082015160e060c0850152613a6e60e0850182613039565b6000610700898352886020840152876040840152866060840152856080840152613c6d60a08401865161307f565b6020850151613c806103e0850182613b8c565b506040850151613c94610480850182613214565b5060608501516001600160a01b039081166105e0850152608086015161060085015260a0860151811661062085015260c08601511661064084015260e0850151600f90810b610660850152610100860151810b610680850152610120860151810b6106a0850152610140860151900b6106c08401526106e08301819052613d1d81840185613bcb565b9a9950505050505050505050565b60006104c0808301613d3d84886136c0565b613d4b610340850187613214565b6104a08401919091528351908190526104e083019060209081860160005b82811015613d8b57815163ffffffff1685529383019390830190600101613d69565b509298975050505050505050565b600082601f830112613daa57600080fd5b81516020613dba612dc883612d5d565b82815260059290921b84018101918181019086841115613dd957600080fd5b8286015b84811015613dfd578051613df08161259f565b8352918301918301613ddd565b509695505050505050565b80516125c281612620565b600080600080600060a08688031215613e2b57600080fd5b85516001600160401b0380821115613e4257600080fd5b818801915088601f830112613e5657600080fd5b81516020613e66612dc883612d5d565b82815260059290921b8401810191818101908c841115613e8557600080fd5b948201945b83861015613eaa57613e9b86613826565b82529482019490820190613e8a565b918b0151919950909350505080821115613ec357600080fd5b50613ed088828901613d99565b945050613edf60408701613636565b9250613eed60608701613838565b9150613efb60808701613e08565b90509295509295909350565b86815260208101869052604081018590526105208101613f2a60608301866136c0565b613f386103a0830185613214565b6001600160a01b0392909216610500919091015295945050505050565b80516125c2816128cf565b600060608284031215613f7257600080fd5b613f7a61252a565b90508151613f87816128cf565b81526020820151613f97816128cf565b60208201526040820151613faa816128cf565b604082015292915050565b80516001600160c81b03811681146125c257600080fd5b600060a08284031215613fde57600080fd5b613fe66124c4565b90508151613ff38161259f565b81526020820151614003816125c7565b60208201526040820151614016816125c7565b60408201526060820151614029816128cf565b606082015260808201516128a881612620565b80516125c281612603565b80516125c2816128df565b600081830361034081121561406657600080fd5b61406e612508565b6101808083121561407e57600080fd5b61408661254c565b92506140928686613f60565b83526140a060608601613fb5565b60208401526140b160808601613fb5565b60408401526140c260a08601613636565b60608401526140d360c08601613636565b60808401526140e460e08601613838565b60a08401526101006140f7818701613826565b60c085015261012061410a818801613e08565b60e086015261411c6101408801613f55565b8286015261412d6101608801613f55565b908501525082825261414186868301613fcc565b602083015250614155856102208601613fcc565b60408201526141676102c08501613838565b60608201526141796102e0850161403c565b608082015261418b610300850161403c565b60a082015261419d6103208501614047565b60c0820152949350505050565b60006106e0820190508882528760208301528660408301528560608301528460808301526141dc60a08301855161307f565b60208401516141ef6103e0840182613b8c565b506040840151614203610480840182613214565b5060608401516105e083015260808401516001600160a01b031661060083015260a084015161423e6106208401826001600160a01b03169052565b5060c0840151614254610640840182600f0b9052565b5060e084015161426a610660840182600f0b9052565b5082516001600160a01b0316610680830152602083015163ffffffff166106a083015260408301516001600160801b03166106c0830152612bc6565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600061ffff8083168181036142e9576142e96142bc565b6001019392505050565b634e487b7160e01b600052601260045260246000fd5b60008160020b8360020b8061432e57634e487b7160e01b600052601260045260246000fd5b627fffff19821460001982141615614348576143486142bc565b90059392505050565b60008260020b8260020b028060020b9150808214613032576130326142bc565b6000600160ff1b8201614386576143866142bc565b5060000390565b60008160020b627fffff1981036143a6576143a66142bc565b6000039291505056fea2646970667358221220d09fc8b7403608b95aa59a254ef1d051687a290c50cde2530a7c918db54e082764736f6c63430008120033",
    "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101fb5760003560e01c8063a99c9dd51161011a578063e38d6b5c116100ad578063f30dba931161007c578063f30dba93146107df578063f62167fc146108b2578063f637731d146108d6578063fadd58a2146108e9578063fdf53665146108fc57600080fd5b8063e38d6b5c14610627578063e45be8eb1461062f578063e76c01e414610637578063f0a20aec146107cc57600080fd5b8063d0c93a7c116100e9578063d0c93a7c146105dc578063d21220a7146105f7578063d468e71f146105ff578063e323eb0e1461061457600080fd5b8063a99c9dd514610546578063aedb419714610550578063c45a0155146105ad578063cbdf382c146105d457600080fd5b806354cf2aeb11610192578063810b1d0911610161578063810b1d091461046e5780638a5ee2c3146104a15780638da5cb5b146104b457806399fbab88146104bc57600080fd5b806354cf2aeb146103d95780635cbb18d1146103f457806360f9b0d31461044357806363aca53c1461045b57600080fd5b8063270ffd7d116101ce578063270ffd7d1461033657806342c6498a1461035e57806343865d4e1461037b57806346c715fa146103b257600080fd5b806307e72129146102005780630dfe168114610246578063240dda1f14610266578063256b9f3914610299575b600080fd5b61021361020e366004612449565b610911565b6040805163ffffffff909416845260069290920b60208401526001600160a01b0316908201526060015b60405180910390f35b61024e61094c565b6040516001600160a01b03909116815260200161023d565b610279610274366004612462565b61095d565b604080516001600160a01b0393841681529290911660208301520161023d565b6102f66102a7366004612449565b62010019602052600090815260409020546001600160801b03811690600160801b810463ffffffff1690600160a01b8104600290810b91600160b81b810490910b90600160d01b900460ff1685565b604080516001600160801b03909616865263ffffffff9094166020860152600292830b93850193909352900b60608301521515608082015260a00161023d565b6103496103443660046126b9565b610972565b6040805192835260208301919091520161023d565b610366610a55565b60405163ffffffff909116815260200161023d565b61038e61038936600461279d565b610a61565b6040805193845260208401929092526001600160a01b03169082015260600161023d565b61024e7f000000000000000000000000000000000000000000000000000000000000000081565b6103e1610b11565b60405161ffff909116815260200161023d565b61040761040236600461281d565b610b1d565b6040805160069590950b85526001600160a01b0390931660208501526001600160801b039182169284019290925216606082015260800161023d565b60125461044d9081565b60405190815260200161023d565b6103496104693660046128b3565b610bc0565b61048161047c3660046128ee565b610c4a565b604080516001600160801b0393841681529290911660208301520161023d565b6104816104af3660046128b3565b610cf8565b61024e610d9e565b61050c6104ca366004612449565b6201001760205260009081526040902080546001820154600292830154919290916001600160801b03811691600160801b8204810b91600160981b9004900b85565b6040805195865260208601949094526001600160801b0390921692840192909252600291820b6060840152900b608082015260a00161023d565b600d5461044d9081565b6102f661055e366004612449565b62010018602052600090815260409020546001600160801b03811690600160801b810463ffffffff1690600160a01b8104600290810b91600160b81b810490910b90600160d01b900460ff1685565b61024e7f000000000000000000000000000000000000000000000000000000000000000081565b61024e610daa565b6105e4610db6565b60405160019190910b815260200161023d565b61024e610dc2565b61061261060d366004612968565b610dce565b005b610349610622366004612985565b610dfb565b61024e610e70565b61024e610e7c565b604080516101a08101825260005461ffff8082166101408401908152620100008084048316610160860152640100000000909304821661018085015283526001546001600160c81b0390811660208086019190915260028054909216858701526003546001600160a01b0390811660608088019190915260045482166080808901919091526005546001600160801b0380821660a0808c0191909152600160801b808404600690810b60c08e0152600160b81b85048a0b60e08e0152600160d01b85048b166101008e0152600160e01b9094048a166101208d01528c518083018e52935487168452600754808416858a01528190048316848e0152600854808b16858801528b9004890b848601528c519182018d526009549096168152600a54808316978201979097529585900481169a86019a909a52600b54968716928501929092529590940490920b93810193909352600c546107b995929392811691810463ffffffff90811691600160a01b810490911690600160c01b900460ff1687565b60405161023d9796959493929190612a9a565b6103496107da366004612bd2565b610e88565b6108a46107ed366004612ca4565b6201001660209081526000918252604091829020825160c08101845281546001600160c81b0390811682526001830154168184015260028201546001600160a01b0380821683870152600160a01b90910460060b6060808401919091526003840154600f81810b60808601526001600160801b03600160801b92839004811660a087015288519384018952600487015490941683526005909501549485900b95820195909552939092049091169282019290925282565b60405161023d929190612cef565b6108c56108c0366004612d80565b610f01565b60405161023d959493929190612e1e565b6106126108e4366004612ed1565b610fa3565b6103496108f7366004612eee565b6114af565b610904611528565b60405161023d9190612f42565b60178161ffff811061092257600080fd5b015463ffffffff81169150640100000000810460060b90600160581b90046001600160a01b031683565b60006109586014611661565b905090565b60008061096983611684565b91509150915091565b600080600061098081611699565b6109886116e0565b610990611feb565b610998611528565b604082015260c085015173__$6dea53a5b1a3c14df3d68f8a290554c5af$__9063a07aea75906109cb57620100196109d0565b620100185b620100166017600d601260008c896040518963ffffffff1660e01b8152600401610a019897969594939291906134ca565b6040805180830381865af4158015610a1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4191906135ae565b9350935050610a4f816118dd565b50915091565b60006109586078611922565b6000806000610a6e612095565b610a76611528565b6020820152604051635fdf9d5560e01b815273__$9e4c229d336278bda7a6b638eb4f56779a$__90635fdf9d5590610ac2906201001690600d906012906000908c9089906004016135d2565b606060405180830381865af4158015610adf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b039190613641565b935093509350509193909250565b6000610958607e611945565b60008060008073__$286c9a6ab289b16a925f6a63d27fed5f3d$__6368b3fe3062010017620100166000610b4f611528565b8a6040518663ffffffff1660e01b8152600401610b709594939291906137e5565b608060405180830381865af4158015610b8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb19190613843565b93509350935093509193509193565b6000806000610bce81611699565b610bd66116e0565b610bde612135565b610be6611528565b816080018190525073__$1214492daac452055e29b230bdd72e484d$__63f15bc8cc8660800151610c1a5762010019610c1f565b620100185b62010016601260008a876040518763ffffffff1660e01b8152600401610a01969594939291906138e9565b600080610c55611968565b6000610c6081611699565b610c686116e0565b73__$f0f62380d12e0e837b46ba5507a2cc3702$__632322cded600086610c8d611528565b6040518463ffffffff1660e01b8152600401610cab93929190613a17565b6040805180830381865af4158015610cc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ceb9190613a76565b92509250610a4f816118dd565b60008073__$06f006a50281b95ada637fcca2c3169e65$__6363fbcd438460800151610d275762010019610d2c565b620100185b6201001660126000610d3c611528565b896040518763ffffffff1660e01b8152600401610d5e96959493929190613ab0565b6040805180830381865af4158015610d7a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109699190613a76565b60006109586000611661565b6000610958603c611661565b6000610958607c611945565b60006109586028611661565b6000610dd981611699565b610de16116e0565b610dee60176000846119c0565b610df7816118dd565b5050565b6000806000610e0981611699565b610e116116e0565b610e19612095565b610e21611528565b602082015260405163a835b0a360e01b815273__$8397ab196537c2cfcd89b6140849e98c7e$__9063a835b0a390610a01906201001690601790600d906012906000908d908a90600401613aef565b60006109586064611661565b60006109586050611661565b6000806000610e9681611699565b610e9e6116e0565b610ea6612200565b610eae611528565b6040808301919091525163bccd276b60e01b815273__$14b14c61645669b42e011afd470eeccf72$__9063bccd276b90610a019062010017906201001690600d9060179060009089908e90600401613c3f565b606080600080600073__$82e69f90fc4689a77ae11a0614a00f0cb8$__631fb854c06000610f2d611528565b896040518463ffffffff1660e01b8152600401610f4c93929190613d2b565b600060405180830381865af4158015610f69573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f919190810190613e13565b939a9299509097509550909350915050565b6000610fae81611699565b610fb6611a98565b610fbe6116e0565b73__$dc25dd3a5fe6a540f35c01c335c2ccfd23$__63d9195ff2600d601260176000610fe8611528565b886040518763ffffffff1660e01b815260040161100a96959493929190613f07565b61034060405180830381865af4158015611028573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104c9190614052565b6000808201518160000160008201518160000160008201518160000160006101000a81548161ffff021916908361ffff16021790555060208201518160000160026101000a81548161ffff021916908361ffff16021790555060408201518160000160046101000a81548161ffff021916908361ffff160217905550505060208201518160010160006101000a8154816001600160c81b0302191690836001600160c81b0316021790555060408201518160020160006101000a8154816001600160c81b0302191690836001600160c81b0316021790555060608201518160030160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060808201518160040160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060a08201518160050160006101000a8154816001600160801b0302191690836001600160801b0316021790555060c08201518160050160106101000a81548166ffffffffffffff021916908360060b66ffffffffffffff16021790555060e08201518160050160176101000a81548162ffffff021916908360020b62ffffff16021790555061010082015181600501601a6101000a81548161ffff021916908361ffff16021790555061012082015181600501601c6101000a81548161ffff021916908361ffff160217905550505060208201518160060160008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160801b0302191690836001600160801b0316021790555060408201518160010160106101000a8154816001600160801b0302191690836001600160801b0316021790555060608201518160020160006101000a81548161ffff021916908361ffff16021790555060808201518160020160026101000a81548162ffffff021916908360020b62ffffff160217905550505060408201518160090160008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160801b0302191690836001600160801b0316021790555060408201518160010160106101000a8154816001600160801b0302191690836001600160801b0316021790555060608201518160020160006101000a81548161ffff021916908361ffff16021790555060808201518160020160026101000a81548162ffffff021916908360020b62ffffff1602179055505050606082015181600c0160006101000a8154816001600160801b0302191690836001600160801b03160217905550608082015181600c0160106101000a81548163ffffffff021916908363ffffffff16021790555060a082015181600c0160146101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600c0160186101000a81548160ff021916908360ff160217905550905050610df7816118dd565b60008060006114bd81611699565b6114c56116e0565b6114cd61228e565b6114d5611528565b6040808301919091525163b04d4a4960e01b815273__$16f93f2e1504eec0c942977e18129be78e$__9063b04d4a4990610a019062010017906201001690600d9060179060009089908e906004016141aa565b611530612306565b604051806101400160405280611544610d9e565b6001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815260200160405180604001604052806115c3610e7c565b6001600160a01b031681526020016115d9610e70565b6001600160a01b0316905281526020016115f161094c565b6001600160a01b03168152602001611607610dc2565b6001600160a01b0316815260200161161d610daa565b6001600160a01b03168152602001611633610a55565b63ffffffff168152602001611646610db6565b60010b8152602001611656610b11565b61ffff169052919050565b6000806116763660011981013560f01c900390565b929092013560601c92915050565b60008061169083611b00565b61096984611b2e565b600c810154600119600160c01b90910460ff16016116ca57604051633ee5aeb560e01b815260040160405180910390fd5b600c01805460ff60c01b1916600160c11b179055565b60007f000000000000000000000000000000000000000000000000000000000000000061170b61094c565b611713610dc2565b61171b610b11565b604080516001600160a01b039586166020820152938516908401529216606082015261ffff909116608082015260a001604051602081830303815290604052805190602001209050600061188b7f0000000000000000000000000000000000000000000000000000000000000000611791610d9e565b61179961094c565b6117a1610dc2565b6117a9610daa565b6117b1610e7c565b6117b9610e70565b6117c1610a55565b6117c9610db6565b6117d1610b11565b6040516060998a1b6bffffffffffffffffffffffff199081166020830152988a1b8916603482015296891b8816604888015294881b8716605c87015292871b86166070860152951b909316608483015260e09390931b6001600160e01b031916609882015260f091821b609c82015291901b6001600160f01b031916609e82015260a001604051602081830303815290604052847f0000000000000000000000000000000000000000000000000000000000000000611b4f565b9050306001600160a01b03821614610df75760405162461bcd60e51b815260206004820152601060248201526f4e6f44656c656761746543616c6c282960801b60448201526064015b60405180910390fd5b600c810154600160c01b900460ff1660021461190c57604051631305d1b560e21b815260040160405180910390fd5b600c01805460ff60c01b1916600160c01b179055565b6000806119373660011981013560f01c900390565b929092013560e01c92915050565b60008061195a3660011981013560f01c900390565b929092013560f01c92915050565b611970610d9e565b6001600160a01b0316336001600160a01b0316146119be5760405162461bcd60e51b815260206004820152600b60248201526a4f776e65724f6e6c79282960a81b60448201526064016118d4565b565b815461ffff6401000000009091048116908216116119dd57505050565b8154640100000000900461ffff165b8161ffff168161ffff161015611a40576001848261ffff1661ffff8110611a1557611a156142a6565b01805463ffffffff191663ffffffff9290921691909117905580611a38816142d2565b9150506119ec565b50815465ffff00000000191664010000000061ffff83169081029190911783556040519081527f7597a28d85943b1c3514bc536ff16e437623b69613f58f63b961fca559df291d9060200160405180910390a1505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146119be5760405162461bcd60e51b815260206004820152600d60248201526c466163746f72794f6e6c79282960981b60448201526064016118d4565b6000611b0a612306565b600183900b610100820152611b27611b2184611c2a565b82611c4f565b9392505050565b6000611b38612306565b600183900b610100820152611b27611b2184611faa565b605f1983018051603f1985018051601f19870180518851808a0160200180516c5af43d3d93803e606057fd5bf38c52600c198c018d905260028301604881901b78593da1005b363d3d373d3d3d3d610000806062363936013d73176020198e01527f9e4ac34f21c619cefc926c8bd93b54bf5a39c7ab2127a895af1cc0691d7e3dff6039198e01526064840160781b716100003d81600a3d39f336602c57343d527f176059198e015260f01b8252606e8301604b198d01209152908a52915291529152600090611c20818585611fc9565b9695505050505050565b6000600182900b611c3f81620d89e719614309565b611c499190614351565b92915050565b60008060008460020b12611c66578360020b611c73565b8360020b611c7390614371565b9050611c83836101000151611faa565b62ffffff16811115611ccb5760405162461bcd60e51b81526020600482015260116024820152705469636b4f75744f66426f756e6473282960781b60448201526064016118d4565b600081600116600003611ce257600160801b611cf4565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615611d28576ffff97272373d413259a46990580e213a0260801c5b6004821615611d47576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615611d66576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615611d85576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615611da4576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615611dc3576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615611de2576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615611e02576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615611e22576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615611e42576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615611e62576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615611e82576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615611ea2576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615611ec2576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615611ee2576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615611f03576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615611f23576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615611f42576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615611f5f576b048a170391f7dc42444e8fa20260801c5b60008560020b1315611f80578060001981611f7c57611f7c6142f3565b0490505b640100000000810615611f94576001611f97565b60005b60ff16602082901c019250505092915050565b6000600182900b80611fbf620d89e71961438d565b611c3f9190614309565b600060ff60005350603592835260601b60015260155260556000908120915290565b604051806101a00160405280611fff612368565b81526040805160a08101825260008082526020828101829052928201819052606082018190526080820152910190815260200161203a612306565b815260200161204761241b565b8152602001612054612095565b815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600060020b81525090565b6040518061024001604052806120a9612368565b81526020016120b6612306565b815260006020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e08201819052610100820181905261012082018190526101408201819052610160820181905261018082018190526101a082018190526101c082018190526101e082018190526102009091015290565b604051806101e00160405280612149612368565b815260200161215661241b565b815260408051606081018252600080825260208281018290529282015291019081526040805160a0810182526000808252602082810182905292820181905260608201819052608082015291019081526020016121b1612306565b815260006020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e08201819052610100820181905261012082018190526101409091015290565b604051806101600160405280612214612368565b81526040805160a08101825260008082526020828101829052928201819052606082018190526080820152910190815260200161224f612306565b815260006020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e082018190526101009091015290565b6040518061010001604052806122a2612368565b81526040805160a0810182526000808252602082810182905292820181905260608201819052608082015291019081526020016122dd612306565b815260006020820181905260408201819052606082018190526080820181905260a09091015290565b6040805161014081018252600080825260208083018290528284018290528351808501909452818452830152906060820190815260006020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b604080516102808101909152600061022082018181526102408301829052610260830182905260e08301908152610100830182905261012083018290526101408301829052610160830182905261018083018290526101a083018290526101c083018290526101e083018290526102008301919091528152602081016123ec61241b565b81526020016123f961241b565b8152600060208201819052604082018190526060820181905260809091015290565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915290565b60006020828403121561245b57600080fd5b5035919050565b60006020828403121561247457600080fd5b81358060010b8114611b2757600080fd5b634e487b7160e01b600052604160045260246000fd5b60405161010081016001600160401b03811182821017156124be576124be612485565b60405290565b60405160a081016001600160401b03811182821017156124be576124be612485565b60405160c081016001600160401b03811182821017156124be576124be612485565b60405160e081016001600160401b03811182821017156124be576124be612485565b604051606081016001600160401b03811182821017156124be576124be612485565b60405161014081016001600160401b03811182821017156124be576124be612485565b604051601f8201601f191681016001600160401b038111828210171561259757612597612485565b604052919050565b6001600160a01b03811681146125b457600080fd5b50565b80356125c28161259f565b919050565b6001600160801b03811681146125b457600080fd5b80356125c2816125c7565b80356bffffffffffffffffffffffff811681146125c257600080fd5b63ffffffff811681146125b457600080fd5b80356125c281612603565b8060020b81146125b457600080fd5b80356125c281612620565b803580151581146125c257600080fd5b600082601f83011261265b57600080fd5b81356001600160401b0381111561267457612674612485565b612687601f8201601f191660200161256f565b81815284602083860101111561269c57600080fd5b816020850160208301376000918101602001919091529392505050565b6000602082840312156126cb57600080fd5b81356001600160401b03808211156126e257600080fd5b9083019061010082860312156126f757600080fd5b6126ff61249b565b612708836125b7565b8152612716602084016125dc565b6020820152612727604084016125e7565b604082015261273860608401612615565b60608201526127496080840161262f565b608082015261275a60a0840161262f565b60a082015261276b60c0840161263a565b60c082015260e08301358281111561278257600080fd5b61278e8782860161264a565b60e08301525095945050505050565b6000608082840312156127af57600080fd5b604051608081018181106001600160401b03821117156127d1576127d1612485565b60405282356127df8161259f565b815260208301356127ef816125c7565b60208201526128006040840161263a565b60408201526128116060840161263a565b60608201529392505050565b60006020828403121561282f57600080fd5b8135611b2781612603565b600060a0828403121561284c57600080fd5b6128546124c4565b905081356128618161259f565b81526020820135612871816125c7565b6020820152604082013561288481612603565b6040820152606082013561289781612620565b60608201526128a86080830161263a565b608082015292915050565b600060a082840312156128c557600080fd5b611b27838361283a565b61ffff811681146125b457600080fd5b60ff811681146125b457600080fd5b600060a0828403121561290057600080fd5b6129086124c4565b8235612913816128cf565b81526020830135612923816128cf565b60208201526040830135612936816128cf565b60408201526060830135612949816128cf565b6060820152608083013561295c816128df565b60808201529392505050565b60006020828403121561297a57600080fd5b8135611b27816128cf565b60006020828403121561299757600080fd5b81356001600160401b03808211156129ae57600080fd5b9083019060c082860312156129c257600080fd5b6129ca6124e6565b82356129d58161259f565b815260208301356129e58161259f565b602082015260408301356129f8816125c7565b6040820152612a096060840161263a565b6060820152612a1a6080840161263a565b608082015260a083013582811115612a3157600080fd5b612a3d8782860161264a565b60a08301525095945050505050565b80516001600160a01b031682526020808201516001600160801b03908116918401919091526040808301519091169083015260608082015161ffff169083015260809081015160020b910152565b8751805161ffff90811683526020808301518216908401526040918201511690820152610340810160208901516001600160c81b03811660608401525060408901516001600160c81b03811660808401525060608901516001600160a01b03811660a08401525060808901516001600160a01b03811660c08401525060a08901516001600160801b03811660e08401525060c0890151610100612b418185018360060b9052565b60e08b01519150610120612b598186018460020b9052565b908b015161ffff908116610140860152908b01511661016084015250612b83610180830189612a4c565b612b91610220830188612a4c565b6001600160801b0386166102c083015263ffffffff85166102e083015263ffffffff841661030083015260ff83166103208301525b98975050505050505050565b600060208284031215612be457600080fd5b81356001600160401b0380821115612bfb57600080fd5b9083019060e08286031215612c0f57600080fd5b612c17612508565b612c20836125b7565b8152612c2e6020840161262f565b6020820152612c3f6040840161262f565b6040820152612c5060608401612615565b6060820152612c61608084016125dc565b6080820152612c7260a084016125dc565b60a082015260c083013582811115612c8957600080fd5b612c958782860161264a565b60c08301525095945050505050565b600060208284031215612cb657600080fd5b8135611b2781612620565b80516001600160a01b03168252602080820151600f0b908301526040908101516001600160801b0316910152565b82516001600160c81b039081168252602080850151909116908201526040808401516001600160a01b03169082015260608084015160060b90820152608080840151600f0b9082015260a0808401516001600160801b0316908201526101208101611b2760c0830184612cc1565b60006001600160401b03821115612d7657612d76612485565b5060051b60200190565b60006020808385031215612d9357600080fd5b82356001600160401b03811115612da957600080fd5b8301601f81018513612dba57600080fd5b8035612dcd612dc882612d5d565b61256f565b81815260059190911b82018301908381019087831115612dec57600080fd5b928401925b82841015612e13578335612e0481612603565b82529284019290840190612df1565b979650505050505050565b60a0808252865190820181905260009060209060c0840190828a01845b82811015612e5a57815160060b84529284019290840190600101612e3b565b5050508381038285015287518082528883019183019060005b81811015612e985783516001600160a01b031683529284019291840191600101612e73565b50506001600160a01b03881660408601529250612eb3915050565b6001600160801b0384166060830152611c20608083018460020b9052565b600060208284031215612ee357600080fd5b8135611b278161259f565b600060608284031215612f0057600080fd5b612f0861252a565b8235612f138161259f565b81526020830135612f2381612603565b60208201526040830135612f36816125c7565b60408201529392505050565b81516001600160a01b0316815261016081016020830151612f6e60208401826001600160a01b03169052565b506040830151612f8960408401826001600160a01b03169052565b506060830151612fb2606084018280516001600160a01b03908116835260209182015116910152565b5060808301516001600160a01b03811660a08401525060a08301516001600160a01b03811660c08401525060c08301516001600160a01b03811660e08401525060e083015161010061300b8185018363ffffffff169052565b84015190506101206130218482018360010b9052565b84015161ffff811661014085015290505b5092915050565b6000815180845260005b8181101561305f57602081850181015186830182015201613043565b506000602082860101526020601f19601f83011685010191505092915050565b80516130a9838251805161ffff908116835260208083015182169084015260409182015116910152565b60208101516001600160c81b03811660608501525060408101516001600160c81b03811660808501525060608101516001600160a01b03811660a08501525060808101516001600160a01b03811660c08501525060a08101516001600160801b03811660e08501525060c08101516101006131288186018360060b9052565b60e083015191506101206131408187018460020b9052565b9083015161ffff908116610140870152920151909116610160840152506020810151613170610180840182612a4c565b506040810151613184610220840182612a4c565b5060608101516001600160801b03166102c0830152608081015163ffffffff9081166102e084015260a08201511661030083015260c0015160ff1661032090910152565b505050565b6001600160801b03815116825263ffffffff6020820151166020830152604081015160020b6040830152606081015160020b60608301526080810151151560808301525050565b80516001600160a01b03168252602081015161323b60208401826001600160a01b03169052565b50604081015161325660408401826001600160a01b03169052565b50606081015161327f606084018280516001600160a01b03908116835260209182015116910152565b5060808101516001600160a01b03811660a08401525060a08101516001600160a01b03811660c08401525060c08101516001600160a01b03811660e08401525060e08101516101006132d88185018363ffffffff169052565b82015190506101206132ee8482018360010b9052565b82015161ffff81166101408501529050505050565b61330e82825161307f565b6020810151613321610340840182613214565b5060408101516104a083015260608101516104c083015260808101516104e083015260a081015161050083015260c081015161052083015260e08101516001600160a01b039081166105408401526101008201518116610560840152610120820151166105808301526101408101516001600160801b03166105a0830152610160810151600690810b6105c0840152610180820151900b6105e08301526101a081015160020b6106008301526101c081015160ff166106208301526101e0810151151561064083015261020081015115156106608301526102200151151561068090910152565b61341382825161307f565b60208101516134266103408401826131cd565b50604081015161343a6103e0840182613214565b50606081015161344e610540840182612a4c565b5060808101516134626105e0840182613303565b5060a0810151610c8083015260c0810151610ca083015260e0810151610cc0830152610100810151610ce0830152610120810151610d00830152610140810151610d20830152610160810151610d408301526101808101516131c8610d6084018260020b9052565b6000610e608a83528960208401528860408401528760608401528660808401528560a08401528060c084015260018060a01b0385511681840152506001600160801b03602085015116610e808301526040840151613539610ea08401826bffffffffffffffffffffffff169052565b50606084015163ffffffff16610ec08301526080840151600290810b610ee084015260a0850151900b610f0083015260c08401511515610f2083015260e0840151610100610f40840152613591610f60840182613039565b9150506135a160e0830184613408565b9998505050505050505050565b600080604083850312156135c157600080fd5b505080516020909101519092909150565b86815260208082018790526040808301879052606080840187905285516001600160a01b03166080850152918501516001600160801b031660a0840152840151151560c0830152830151151560e08201526107a08101612e13610100830184613303565b80516125c28161259f565b60008060006060848603121561365657600080fd5b8351925060208401519150604084015161366f8161259f565b809150509250925092565b80546001600160a01b0316825260018101546001600160801b0381166020840152608090811c604084015260029182015461ffff8116606085015260101c90910b910152565b805461ffff8082168452601082901c81166020808601919091529190911c8116604084015260018201546001600160c81b03908116606085015260028084015490911660808086019190915260038401546001600160a01b0390811660a087015260048501541660c086015260058401546001600160801b0380821660e0808901919091529282901c60060b61010088015260b882901c90930b61012087015260d081901c84166101408701529081901c8316610160860152915061378c61018085016006850161367a565b61379d61022085016009850161367a565b600c92909201549182166001600160801b03166102c084015250608081901c63ffffffff9081166102e084015260a082901c1661030083015260c01c60ff1661032090910152565b85815260208101859052610500810161380160408301866136c0565b61380f610380830185613214565b63ffffffff83166104e08301529695505050505050565b8051600681900b81146125c257600080fd5b80516125c2816125c7565b6000806000806080858703121561385957600080fd5b61386285613826565b935060208501516138728161259f565b6040860151909350613883816125c7565b6060860151909250613894816125c7565b939692955090935050565b80516001600160a01b031682526020808201516001600160801b03169083015260408082015163ffffffff169083015260608082015160020b908301526080908101511515910152565b60006108a082019050878252866020830152856040830152846060830152613914608083018561389f565b610120613924818401855161307f565b6020840151613937610460850182612a4c565b50604084015161394b610500850182612cc1565b50606084015161395f6105608501826131cd565b506080840151613973610600850182613214565b5060a08401516001600160a01b0390811661076085015260c0850151811661078085015260e0850151166107a08401526101008401516001600160801b039081166107c08501529084015181166107e08401526101408401511661080083015261016083015160020b61082083015261018083015115156108408301526101a083015115156108608301526101c09092015115156108809091015295945050505050565b60006102208201905084825261ffff8085511660208401528060208601511660408401528060408601511660608401528060608601511660808401525060ff60808501511660a0830152613a6e60c0830184613214565b949350505050565b60008060408385031215613a8957600080fd5b8251613a94816125c7565b6020840151909250613aa5816125c7565b809150509250929050565b86815260208101869052604081018590526105a08101613ad360608301866136c0565b613ae16103a0830185613214565b612e1361050083018461389f565b60006107608983528860208401528760408401528660608401528560808401528060a084015260018060a01b0380865116828501528060208701511661078085015250506001600160801b036040850151166107a0830152606084015115156107c0830152608084015115156107e083015260a084015160c0610800840152613b7c610820840182613039565b915050612bc660c0830184613303565b80518252602081015160208301526001600160801b036040820151166040830152606081015160020b6060830152608081015160020b60808301525050565b60018060a01b038151168252602081015160020b6020830152604081015160020b604083015263ffffffff6060820151166060830152600060808201516001600160801b0380821660808601528060a08501511660a0860152505060c082015160e060c0850152613a6e60e0850182613039565b6000610700898352886020840152876040840152866060840152856080840152613c6d60a08401865161307f565b6020850151613c806103e0850182613b8c565b506040850151613c94610480850182613214565b5060608501516001600160a01b039081166105e0850152608086015161060085015260a0860151811661062085015260c08601511661064084015260e0850151600f90810b610660850152610100860151810b610680850152610120860151810b6106a0850152610140860151900b6106c08401526106e08301819052613d1d81840185613bcb565b9a9950505050505050505050565b60006104c0808301613d3d84886136c0565b613d4b610340850187613214565b6104a08401919091528351908190526104e083019060209081860160005b82811015613d8b57815163ffffffff1685529383019390830190600101613d69565b509298975050505050505050565b600082601f830112613daa57600080fd5b81516020613dba612dc883612d5d565b82815260059290921b84018101918181019086841115613dd957600080fd5b8286015b84811015613dfd578051613df08161259f565b8352918301918301613ddd565b509695505050505050565b80516125c281612620565b600080600080600060a08688031215613e2b57600080fd5b85516001600160401b0380821115613e4257600080fd5b818801915088601f830112613e5657600080fd5b81516020613e66612dc883612d5d565b82815260059290921b8401810191818101908c841115613e8557600080fd5b948201945b83861015613eaa57613e9b86613826565b82529482019490820190613e8a565b918b0151919950909350505080821115613ec357600080fd5b50613ed088828901613d99565b945050613edf60408701613636565b9250613eed60608701613838565b9150613efb60808701613e08565b90509295509295909350565b86815260208101869052604081018590526105208101613f2a60608301866136c0565b613f386103a0830185613214565b6001600160a01b0392909216610500919091015295945050505050565b80516125c2816128cf565b600060608284031215613f7257600080fd5b613f7a61252a565b90508151613f87816128cf565b81526020820151613f97816128cf565b60208201526040820151613faa816128cf565b604082015292915050565b80516001600160c81b03811681146125c257600080fd5b600060a08284031215613fde57600080fd5b613fe66124c4565b90508151613ff38161259f565b81526020820151614003816125c7565b60208201526040820151614016816125c7565b60408201526060820151614029816128cf565b606082015260808201516128a881612620565b80516125c281612603565b80516125c2816128df565b600081830361034081121561406657600080fd5b61406e612508565b6101808083121561407e57600080fd5b61408661254c565b92506140928686613f60565b83526140a060608601613fb5565b60208401526140b160808601613fb5565b60408401526140c260a08601613636565b60608401526140d360c08601613636565b60808401526140e460e08601613838565b60a08401526101006140f7818701613826565b60c085015261012061410a818801613e08565b60e086015261411c6101408801613f55565b8286015261412d6101608801613f55565b908501525082825261414186868301613fcc565b602083015250614155856102208601613fcc565b60408201526141676102c08501613838565b60608201526141796102e0850161403c565b608082015261418b610300850161403c565b60a082015261419d6103208501614047565b60c0820152949350505050565b60006106e0820190508882528760208301528660408301528560608301528460808301526141dc60a08301855161307f565b60208401516141ef6103e0840182613b8c565b506040840151614203610480840182613214565b5060608401516105e083015260808401516001600160a01b031661060083015260a084015161423e6106208401826001600160a01b03169052565b5060c0840151614254610640840182600f0b9052565b5060e084015161426a610660840182600f0b9052565b5082516001600160a01b0316610680830152602083015163ffffffff166106a083015260408301516001600160801b03166106c0830152612bc6565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600061ffff8083168181036142e9576142e96142bc565b6001019392505050565b634e487b7160e01b600052601260045260246000fd5b60008160020b8360020b8061432e57634e487b7160e01b600052601260045260246000fd5b627fffff19821460001982141615614348576143486142bc565b90059392505050565b60008260020b8260020b028060020b9150808214613032576130326142bc565b6000600160ff1b8201614386576143866142bc565b5060000390565b60008160020b627fffff1981036143a6576143a66142bc565b6000039291505056fea2646970667358221220d09fc8b7403608b95aa59a254ef1d051687a290c50cde2530a7c918db54e082764736f6c63430008120033",
    "linkReferences": {
      "contracts/libraries/Ticks.sol": {
        "Ticks": [
          {
            "length": 20,
            "start": 4236
          }
        ]
      },
      "contracts/libraries/limit/pool/BurnLimitCall.sol": {
        "BurnLimitCall": [
          {
            "length": 20,
            "start": 3260
          }
        ]
      },
      "contracts/libraries/limit/pool/MintLimitCall.sol": {
        "MintLimitCall": [
          {
            "length": 20,
            "start": 2672
          }
        ]
      },
      "contracts/libraries/limit/pool/SnapshotLimitCall.sol": {
        "SnapshotLimitCall": [
          {
            "length": 20,
            "start": 3529
          }
        ]
      },
      "contracts/libraries/pool/FeesCall.sol": {
        "FeesCall": [
          {
            "length": 20,
            "start": 3382
          }
        ]
      },
      "contracts/libraries/pool/QuoteCall.sol": {
        "QuoteCall": [
          {
            "length": 20,
            "start": 2902
          }
        ]
      },
      "contracts/libraries/pool/SampleCall.sol": {
        "SampleCall": [
          {
            "length": 20,
            "start": 4055
          }
        ]
      },
      "contracts/libraries/pool/SwapCall.sol": {
        "SwapCall": [
          {
            "length": 20,
            "start": 3841
          }
        ]
      },
      "contracts/libraries/range/pool/BurnRangeCall.sol": {
        "BurnRangeCall": [
          {
            "length": 20,
            "start": 5559
          }
        ]
      },
      "contracts/libraries/range/pool/MintRangeCall.sol": {
        "MintRangeCall": [
          {
            "length": 20,
            "start": 3984
          }
        ]
      },
      "contracts/libraries/range/pool/SnapshotRangeCall.sol": {
        "SnapshotRangeCall": [
          {
            "length": 20,
            "start": 3057
          }
        ]
      }
    },
    "deployedLinkReferences": {
      "contracts/libraries/Ticks.sol": {
        "Ticks": [
          {
            "length": 20,
            "start": 4032
          }
        ]
      },
      "contracts/libraries/limit/pool/BurnLimitCall.sol": {
        "BurnLimitCall": [
          {
            "length": 20,
            "start": 3056
          }
        ]
      },
      "contracts/libraries/limit/pool/MintLimitCall.sol": {
        "MintLimitCall": [
          {
            "length": 20,
            "start": 2468
          }
        ]
      },
      "contracts/libraries/limit/pool/SnapshotLimitCall.sol": {
        "SnapshotLimitCall": [
          {
            "length": 20,
            "start": 3325
          }
        ]
      },
      "contracts/libraries/pool/FeesCall.sol": {
        "FeesCall": [
          {
            "length": 20,
            "start": 3178
          }
        ]
      },
      "contracts/libraries/pool/QuoteCall.sol": {
        "QuoteCall": [
          {
            "length": 20,
            "start": 2698
          }
        ]
      },
      "contracts/libraries/pool/SampleCall.sol": {
        "SampleCall": [
          {
            "length": 20,
            "start": 3851
          }
        ]
      },
      "contracts/libraries/pool/SwapCall.sol": {
        "SwapCall": [
          {
            "length": 20,
            "start": 3637
          }
        ]
      },
      "contracts/libraries/range/pool/BurnRangeCall.sol": {
        "BurnRangeCall": [
          {
            "length": 20,
            "start": 5355
          }
        ]
      },
      "contracts/libraries/range/pool/MintRangeCall.sol": {
        "MintRangeCall": [
          {
            "length": 20,
            "start": 3780
          }
        ]
      },
      "contracts/libraries/range/pool/SnapshotRangeCall.sol": {
        "SnapshotRangeCall": [
          {
            "length": 20,
            "start": 2853
          }
        ]
      }
    }
  }
  