// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import {Ownable} from "openzeppelin-contracts/contracts/access/Ownable.sol";
import {ReentrancyGuard} from "openzeppelin-contracts/contracts/utils/ReentrancyGuard.sol";
import {ECDSA} from "openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol";
import {MessageHashUtils} from "openzeppelin-contracts/contracts/utils/cryptography/MessageHashUtils.sol";
import {IERC20} from "openzeppelin-contracts/contracts/token/ERC20/IERC20.sol";
import {SafeERC20} from "openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol";
import {PluckToken} from "../PluckToken.sol";
import {PluckTokenV2} from "../v5/PluckTokenV2.sol";
import {HoodieHolderTokenV3} from "./HoodieHolderTokenV3.sol";
import {IUniswapV3Factory, INonfungiblePositionManager, IUniswapV3Pool, IWETH9} from "../v3/IUniV3.sol";
/// @dev Minimal read-only interface shared by PluckTokenV2 and HoodieHolderTokenV3's
/// anti-snipe immutables (UNCHANGED from V5).
interface IAntiSnipeToken {
function limitEndsAt() external view returns (uint64);
function tradeStartsAt() external view returns (uint64);
}
/// @dev Minimal ERC-721 transfer surface used ONLY to burn the just-minted LP position to
/// 0xdEaD at launch. Declared locally (NOT added to the shared v3/IUniV3.sol) so V3/V4/V5 stay
/// byte-for-byte untouched; INonfungiblePositionManager itself does not need `transferFrom` /
/// `ownerOf` for any of the earlier launchers, which never burn the LP.
interface INpmBurn {
function ownerOf(uint256 tokenId) external view returns (address);
function transferFrom(address from, address to, uint256 tokenId) external;
}
/// @title HoodieLaunchV6
/// @notice Fork of HoodieLaunchV5 (Ownable/ReentrancyGuard, LaunchParams + bounds, anti-snipe
/// token branching, CREATE2 vanity salt, slot0 price assertion, per-coin gradWeth, handle
/// escrow, voucher claim, keeper crank gating: ALL UNCHANGED) built around one structural
/// change: the launcher IS the router.
///
/// 1. The single-sided LP is minted and IMMEDIATELY burned to 0xdEaD in the same transaction
/// (`_seedSingleSided`), at the 0.01% (fee=100) tier instead of V3/V4/V5's 1% (fee=10000)
/// tier. A burned LP means the pool can never be rugged or re-concentrated and reads clean
/// on scanners; the 0.01% tier keeps the (now permanently dead-weight, un-collectable) pool
/// fee negligible.
///
/// 2. Because nobody can ever collect from a burned position, the launcher's own `buy()` /
/// `sell()` functions take over as the ONLY sanctioned trading surface for V6 coins: they
/// take a flat 1% protocol fee on the ETH leg of every trade (accrued as WETH per-coin in
/// `pendingWeth`), then swap the remainder directly against the pool with the launcher
/// acting as the payer/receiver of the pool's callback. Dev-buys at launch route through
/// the exact same internal path, so the fee is uniform across every trade a coin ever sees,
/// with no separate carve-out. `claimFees` / the holders-mode keeper crank / voucher claims
/// all move to reading and zeroing `pendingWeth` instead of calling `npm.collect`; the
/// downstream 80/20 split and payout/escrow mechanics are otherwise unchanged from V5.
///
/// 3. The token-side fee stream is gone entirely (there is no token-side fee to collect: V3
/// pool fees would have accrued in the burned position, uncollectable, so V6 never lets them
/// accrue there in the first place). `claimWithVoucher` is WETH-only; holders-mode no longer
/// burns a token-side fee share (only WETH is ever collected and split).
contract HoodieLaunchV6 is Ownable, ReentrancyGuard {
using ECDSA for bytes32;
using SafeERC20 for IERC20;
// ---- Uniswap V3 infra (set per chain) ----
IUniswapV3Factory public immutable factory;
INonfungiblePositionManager public immutable npm;
address public immutable WETH;
address public immutable router; // SwapRouter02; kept only for hooked-token exclusion sets
bytes32 public immutable poolInitCodeHash; // factory pool init code hash (hooked tokens self-derive pool)
uint160 private constant MIN_SQRT = 4295128739;
uint160 private constant MAX_SQRT = 1461446703485210103287273052203988822378723970342;
address private _swapPool; // pool authorized to call back during a buy/sell/dev-buy (set within the call)
// ---- launch params (match V3 / V4 / V5, except FEE tier) ----
uint256 public constant SUPPLY = 1_000_000_000 ether; // 1B, all into the single-sided LP
uint24 public constant FEE = 100; // V6: 0.01% tier (LP is burned; dead-weight fee negligible)
int24 public constant BOUNDARY = 204200; // start tick (~1.4 ETH mcap); tick-derived, tier-independent
int24 public constant MIN_TICK = -887200; // aligned to spacing 200
int24 public constant MAX_TICK = 887200;
uint160 public constant SQRT_AT_POS = 2151813121295408910812139624586144; // tick +204200
uint160 public constant SQRT_AT_NEG = 2917122157712197017744680; // tick -204200
uint256 public constant LAUNCH_FEE = 0.0005 ether;
// ---- per-coin LaunchParams bounds (UNCHANGED from V5) ----
uint96 public constant MIN_GRAD_WETH = 1 ether;
uint96 public constant MAX_GRAD_WETH = 100 ether;
uint16 public constant MIN_CAP_BPS = 50; // 0.5%
uint16 public constant MAX_CAP_BPS = 1000; // 10%
uint32 public constant MAX_LIMIT_SECS = 3600; // 1 hour
uint32 public constant MAX_GATE_SECS = 60; // 1 minute
// ---- fee split (UNCHANGED semantics from V5, now sourced from pendingWeth) ----
uint256 public protocolBps = 2000; // 20% of collected fees to protocol, 80% to creator/holders
uint256 public constant BPS = 10_000;
address public protocolWallet;
address public voucherSigner;
address private constant DEAD = 0x000000000000000000000000000000000000dEaD;
// ---- V6: launcher-as-router trading + fee accrual ----
/// @notice Flat protocol trade fee, in bps of the ETH leg of every buy/sell. Immutable,
/// no setter, ever: unlike `protocolBps` (the accrued-fee SPLIT, still owner-adjustable
/// within a hard cap), the trade fee itself is fixed at deploy time forever.
uint256 public constant TRADE_FEE_BPS = 100; // 1%
/// @notice WETH accrued per coin from buy/sell fees, awaiting `claimFees` / the keeper
/// crank. This (plus `handleWeth`) is the ONLY source of truth for what the launcher owes;
/// see the solvency invariant on `claimFees` / `buy` / `sell` below.
mapping(address => uint256) public pendingWeth;
// ---- holder-mode crank controls (UNCHANGED from V5) ----
address public keeper;
mapping(address => uint64) public lastCrank;
uint256 public constant STALE_AFTER = 1 hours;
uint256 public constant MIN_CRANK_INTERVAL = 5 minutes;
uint256 public crankBountyBps;
uint256 public constant MAX_CRANK_BOUNTY_BPS = 100; // 1%
enum FeeMode { CreatorWallet, CreatorHandle, Holders }
struct LaunchParams {
uint96 gradWeth;
uint16 capBps;
uint32 limitSecs;
uint32 gateSecs;
}
struct Coin {
address creator;
address payout; // wallet-mode fee recipient (0 for handle/holders mode)
bytes32 handleHash; // keccak256(lowercase X handle), 0 for wallet/holders mode
address pool;
uint256 positionId; // the BURNED single-sided LP NFT (kept for the frontend badge)
bool tokenIsToken0;
uint64 createdBlock;
uint8 mode; // FeeMode
uint96 gradWeth; // per-coin graduation milestone (WETH accumulated in pool)
uint16 capBps; // per-coin hold cap, for launchConfig() / indexers
bool antiSnipe; // false only for the opted-out plain-PluckToken branch
}
mapping(address => Coin) public coins; // token => Coin
address[] public allTokens;
// X-handle fee escrow. V6: WETH-only (no token-side escrow; see contract-level docs).
mapping(bytes32 => uint256) public handleWeth;
mapping(bytes32 => uint256) public handleNonce;
event Launched(address indexed token, address indexed creator, string name, string symbol,
bytes32 handleHash, address payout, address pool, uint256 positionId, bool tokenIsToken0,
uint8 mode, string metaURI, LaunchParams params);
event LpBurned(address indexed token, uint256 positionId);
event DevBuy(address indexed token, address indexed buyer, uint256 ethIn);
event Bought(address indexed token, address indexed buyer, uint256 ethIn, uint256 fee, uint256 tokenOut);
event Sold(address indexed token, address indexed seller, uint256 tokenIn, uint256 fee, uint256 ethOut);
event FeesClaimed(address indexed token, uint256 wethToCreator, uint256 wethToProtocol);
event HolderFeesDistributed(address indexed token, uint256 wethToHolders, uint256 wethToProtocol, uint256 bountyPaid);
event HandleClaimed(bytes32 indexed handleHash, address indexed recipient, uint256 weth);
event KeeperSet(address indexed keeper);
event CrankBountySet(uint256 bps);
error BadValue(); error UnknownToken(); error NothingToClaim(); error BadVoucher();
error HolderModeParams(); error CrankGated(); error CrankTooSoon(); error EmptyHandle();
error BadParams(); error PoolPriceMismatch(); error SlippageExceeded();
constructor(
address factory_, address npm_, address weth_, address router_,
bytes32 poolInitCodeHash_, address protocolWallet_, address signer_
) Ownable(msg.sender) {
factory = IUniswapV3Factory(factory_);
npm = INonfungiblePositionManager(npm_);
WETH = weth_;
router = router_;
poolInitCodeHash = poolInitCodeHash_;
protocolWallet = protocolWallet_;
voucherSigner = signer_;
}
// =========================================================
// LAUNCH (fork of V5; single-sided seed now burns the LP, see _seedSingleSided)
// =========================================================
/// @param metaURI off-chain metadata (image, description)
/// @param mode CreatorWallet | CreatorHandle | Holders
/// @param p per-coin graduation + anti-snipe params (see `LaunchParams`)
/// @param userSalt creator-chosen salt; the actual CREATE2 salt is bound to msg.sender
/// @dev Send `LAUNCH_FEE + devBuyEth` as msg.value; anything above the fee is spent on an
/// atomic dev-buy through the SAME internal buy path `buy()` uses (same 1% fee, same
/// anti-snipe recipient semantics). Holders mode is mutually exclusive with a handle/payout.
function launch(
string calldata name,
string calldata symbol,
string calldata handle,
address payout,
string calldata metaURI,
FeeMode mode,
LaunchParams calldata p,
bytes32 userSalt
) external payable nonReentrant returns (address token) {
if (msg.value < LAUNCH_FEE) revert BadValue();
(bool ok,) = protocolWallet.call{value: LAUNCH_FEE}("");
require(ok, "fee xfer");
if (mode == FeeMode.CreatorHandle && bytes(handle).length == 0) revert EmptyHandle();
if (mode == FeeMode.Holders && (bytes(handle).length != 0 || payout != address(0))) {
revert HolderModeParams();
}
_validateParams(p);
bytes32 salt = keccak256(abi.encodePacked(msg.sender, userSalt));
bool antiSnipe;
if (mode == FeeMode.Holders) {
token = address(new HoodieHolderTokenV3{salt: salt}(
name, symbol, SUPPLY, WETH, protocolWallet, router, address(factory), poolInitCodeHash,
FEE, msg.sender, p.capBps, p.limitSecs, p.gateSecs
));
antiSnipe = true;
} else if (p.capBps == 0 && p.gateSecs == 0) {
// Full opt-out: byte-identical to the existing V3/V4/V5 PluckToken, no hook at all.
token = address(new PluckToken{salt: salt}(name, symbol, SUPPLY, address(this)));
antiSnipe = false;
} else {
token = address(new PluckTokenV2{salt: salt}(
name, symbol, SUPPLY, address(this), msg.sender, p.capBps, p.limitSecs, p.gateSecs,
address(factory), WETH, router, protocolWallet, poolInitCodeHash, FEE
));
antiSnipe = true;
}
_register(token, name, symbol, handle, payout, metaURI, mode, p, antiSnipe);
if (msg.value > LAUNCH_FEE) {
_devBuy(token, coins[token], msg.value - LAUNCH_FEE, msg.sender);
}
}
/// @dev Hard bounds on creator-supplied LaunchParams (UNCHANGED from V5, incl. the F1
/// guard: a hold-cap duration with nothing to cap, or a cap with no window, is rejected).
function _validateParams(LaunchParams calldata p) internal pure {
if (p.gradWeth < MIN_GRAD_WETH || p.gradWeth > MAX_GRAD_WETH) revert BadParams();
if (p.capBps != 0 && (p.capBps < MIN_CAP_BPS || p.capBps > MAX_CAP_BPS)) revert BadParams();
if (p.capBps == 0 && p.limitSecs != 0) revert BadParams();
if (p.capBps != 0 && p.limitSecs == 0) revert BadParams();
if (p.limitSecs > MAX_LIMIT_SECS) revert BadParams();
if (p.gateSecs > MAX_GATE_SECS) revert BadParams();
}
/// Seeds the (burned) single-sided pool, records the coin, emits Launched. Split out of
/// `launch` to keep the stack shallow (matches V5's shape).
function _register(
address token, string calldata name, string calldata symbol,
string calldata handle, address payout, string calldata metaURI, FeeMode mode,
LaunchParams calldata p, bool antiSnipe
) internal {
bytes32 hh = bytes(handle).length > 0 ? keccak256(bytes(handle)) : bytes32(0);
if (mode == FeeMode.CreatorWallet && hh == bytes32(0) && payout == address(0)) {
payout = msg.sender;
}
(address pool, uint256 positionId, bool t0) = _seedSingleSided(token);
coins[token] = Coin({
creator: msg.sender,
payout: (mode == FeeMode.CreatorWallet) ? payout : address(0),
handleHash: hh,
pool: pool, positionId: positionId, tokenIsToken0: t0,
createdBlock: uint64(block.number), mode: uint8(mode),
gradWeth: p.gradWeth, capBps: p.capBps, antiSnipe: antiSnipe
});
allTokens.push(token);
if (mode == FeeMode.Holders) {
lastCrank[token] = uint64(block.timestamp - MIN_CRANK_INTERVAL);
}
emit Launched(token, msg.sender, name, symbol, hh, payout, pool, positionId, t0, uint8(mode), metaURI, p);
}
// =========================================================
// LAUNCHER-AS-ROUTER (V6 core change)
// =========================================================
/// @notice Buy `token` with ETH. Takes a flat 1% protocol fee on the ETH input (accrued as
/// WETH into `pendingWeth[token]`), swaps the remainder against the pool with the OUTPUT
/// going straight to `msg.sender` (never routed through the launcher: the launcher is in
/// every hooked token's exclusion set, so if it ever received the output, the anti-snipe
/// cap/gate would silently never apply to it).
function buy(address token, uint256 minOut) external payable nonReentrant returns (uint256 out) {
Coin storage c = coins[token];
if (c.creator == address(0)) revert UnknownToken();
uint256 fee;
(out, fee) = _executeBuy(token, c, msg.value, msg.sender, minOut);
emit Bought(token, msg.sender, msg.value, fee, out);
}
/// @notice Sell `amountIn` of `token` for ETH. Pulls the tokens from the caller, swaps them
/// against the pool with the WETH output landing on the launcher, takes a flat 1% protocol
/// fee on that WETH output (accrued into `pendingWeth[token]`), then unwraps and sends the
/// remainder to the caller LAST (effects, i.e. the fee accrual, happen before this final
/// interaction; `nonReentrant` additionally blocks any reentry into buy/sell/launch/claim
/// during the ETH send).
function sell(address token, uint256 amountIn, uint256 minEthOut) external nonReentrant returns (uint256 ethOut) {
Coin storage c = coins[token];
if (c.creator == address(0)) revert UnknownToken();
IERC20(token).safeTransferFrom(msg.sender, address(this), amountIn);
bool tokenIsToken0 = c.tokenIsToken0;
_swapPool = c.pool;
(int256 amount0, int256 amount1) = IUniswapV3Pool(c.pool).swap(
address(this), tokenIsToken0, int256(amountIn),
tokenIsToken0 ? MIN_SQRT + 1 : MAX_SQRT - 1, abi.encode(token)
);
_swapPool = address(0);
uint256 wethOut = tokenIsToken0 ? uint256(-amount1) : uint256(-amount0);
uint256 fee = wethOut * TRADE_FEE_BPS / BPS;
// Effect: accrue the fee BEFORE the external unwrap + ETH send below.
pendingWeth[token] += fee;
ethOut = wethOut - fee;
if (ethOut < minEthOut) revert SlippageExceeded();
// Interaction last.
IWETH9(WETH).withdraw(ethOut);
(bool ok,) = msg.sender.call{value: ethOut}("");
require(ok, "eth xfer");
emit Sold(token, msg.sender, amountIn, fee, ethOut);
}
/// @dev Shared internal buy path for both the external `buy()` and the atomic launch-time
/// dev-buy, so the 1% fee is a uniform invariant with no separate carve-out for either
/// caller. `to` receives the swap output directly (see `buy()` docs for why this MUST be
/// the real end recipient and never the launcher itself).
function _executeBuy(address token, Coin storage c, uint256 ethAmount, address to, uint256 minOut)
internal returns (uint256 out, uint256 fee)
{
fee = ethAmount * TRADE_FEE_BPS / BPS;
IWETH9(WETH).deposit{value: ethAmount}();
pendingWeth[token] += fee;
uint256 swapIn = ethAmount - fee;
bool wethIsToken0 = !c.tokenIsToken0;
_swapPool = c.pool;
(int256 amount0, int256 amount1) = IUniswapV3Pool(c.pool).swap(
to, wethIsToken0, int256(swapIn),
wethIsToken0 ? MIN_SQRT + 1 : MAX_SQRT - 1, abi.encode(token)
);
_swapPool = address(0);
out = c.tokenIsToken0 ? uint256(-amount0) : uint256(-amount1);
if (out < minOut) revert SlippageExceeded();
}
/// Atomic initial buy, routed through the same internal path as `buy()` (same 1% fee, same
/// no-minOut-at-launch semantics as V3/V4/V5's dev-buy: if the output would push the
/// creator over their own cap, the WHOLE launch tx reverts; the creator is exempt from the
/// gate, never from the cap).
function _devBuy(address token, Coin storage c, uint256 ethAmount, address to) internal {
_executeBuy(token, c, ethAmount, to, 0);
emit DevBuy(token, to, ethAmount);
}
/// @notice Pool swap callback, generalized (V5's only ever paid WETH; V6 must pay whichever
/// side the pool is actually owed: WETH on a buy, `token` on a sell's input leg). Auth is
/// the SAME transient `_swapPool` pattern as V5: only the pool address we just set
/// immediately before calling `.swap()` (and clear immediately after) may call back, and
/// `_swapPool` is only ever non-zero for the duration of that single call, inside a
/// `nonReentrant`-guarded top-level function, so no interleaving is possible. The decoded
/// `token` is additionally checked against the registered coin's own `pool` as
/// defense-in-depth (redundant with the `_swapPool` check by construction, since `_swapPool`
/// is always set FROM `coins[token].pool`, but cheap and explicit).
function uniswapV3SwapCallback(int256 amount0, int256 amount1, bytes calldata data) external {
require(msg.sender == _swapPool, "unexpected pool");
address token = abi.decode(data, (address));
Coin storage c = coins[token];
require(c.pool == msg.sender, "pool mismatch");
address t0 = c.tokenIsToken0 ? token : WETH;
address t1 = c.tokenIsToken0 ? WETH : token;
if (amount0 > 0) IERC20(t0).safeTransfer(msg.sender, uint256(amount0));
if (amount1 > 0) IERC20(t1).safeTransfer(msg.sender, uint256(amount1));
}
/// Creates the 0.01% V3 pool, initializes it at the boundary tick, mints the whole supply
/// as a single-sided position held here, asserts the post-creation price (UNCHANGED
/// mechanics from V5), then IMMEDIATELY burns that position to 0xdEaD in the same
/// transaction: there is no block in which a live position is held by anyone but this
/// mint -> burn sequence.
function _seedSingleSided(address token)
internal returns (address pool, uint256 positionId, bool tokenIsToken0)
{
tokenIsToken0 = token < WETH;
address t0 = tokenIsToken0 ? token : WETH;
address t1 = tokenIsToken0 ? WETH : token;
uint160 sqrtP = tokenIsToken0 ? SQRT_AT_NEG : SQRT_AT_POS;
pool = npm.createAndInitializePoolIfNecessary(t0, t1, FEE, sqrtP);
(uint160 actualSqrt,,,,,,) = IUniswapV3Pool(pool).slot0();
if (actualSqrt != sqrtP) revert PoolPriceMismatch();
positionId = _mintPosition(token, t0, t1, tokenIsToken0);
// Burn in the SAME transaction, immediately after mint: no block in which a live
// position is held by anyone but this mint -> burn sequence. Split into its own tiny
// internal call (rather than inlined here) purely to relieve Yul stack-depth pressure
// from the MintParams struct literal above sharing a frame with the burn call; via-ir
// still hit a "stack too deep" on the combined function despite the optimizer being on,
// and this is the standard workaround (verified: this split compiles clean).
_burnPosition(positionId);
emit LpBurned(token, positionId);
}
/// @dev Mints the whole supply as a single-sided position to this contract. Split out of
/// `_seedSingleSided` to keep the caller's stack shallow (see docs above `_burnPosition`).
function _mintPosition(address token, address t0, address t1, bool tokenIsToken0)
internal returns (uint256 positionId)
{
int24 tickLower = tokenIsToken0 ? -BOUNDARY : MIN_TICK;
int24 tickUpper = tokenIsToken0 ? MAX_TICK : BOUNDARY;
IERC20(token).forceApprove(address(npm), SUPPLY);
(positionId,,,) = npm.mint(INonfungiblePositionManager.MintParams({
token0: t0, token1: t1, fee: FEE, tickLower: tickLower, tickUpper: tickUpper,
amount0Desired: tokenIsToken0 ? SUPPLY : 0,
amount1Desired: tokenIsToken0 ? 0 : SUPPLY,
amount0Min: 0, amount1Min: 0,
recipient: address(this), deadline: block.timestamp
}));
}
/// @dev Burns the just-minted LP position to 0xdEaD. Plain transferFrom (not
/// safeTransferFrom) since 0xdEaD is a codeless EOA-shaped sink, not a contract that could
/// reject/mis-handle the callback safeTransferFrom would attempt.
function _burnPosition(uint256 positionId) internal {
(bool ok, ) = address(npm).call(
abi.encodeWithSelector(INpmBurn.transferFrom.selector, address(this), DEAD, positionId)
);
require(ok, "burn xfer");
}
// =========================================================
// FEES + CLAIM (V5 mechanics preserved; source of funds is now pendingWeth, not npm.collect)
// =========================================================
/// @notice Route accrued `pendingWeth[token]` per this coin's FeeMode.
/// - CreatorWallet / CreatorHandle: 80% to payout (wallet) or escrowed to handleWeth
/// (handle), 20% to protocol. Permissionless.
/// - Holders: 80% WETH streamed to the holder token + `distribute()` in the same tx, 20%
/// to protocol. Gated to the keeper (or anyone once stale > 1h), rate-limited.
function claimFees(address token) public nonReentrant {
Coin storage c = coins[token];
if (c.creator == address(0)) revert UnknownToken();
if (FeeMode(c.mode) == FeeMode.Holders) {
_claimFeesHolders(token, c);
} else {
_claimFeesCreator(token, c);
}
}
/// WETH-only claim: 20% protocol, 80% payout (wallet) or escrowed (handle).
function _claimFeesCreator(address token, Coin storage c) internal {
uint256 wethAmt = pendingWeth[token];
pendingWeth[token] = 0;
uint256 pWeth = wethAmt * protocolBps / BPS;
uint256 cWeth = wethAmt - pWeth;
if (pWeth > 0) IERC20(WETH).safeTransfer(protocolWallet, pWeth);
if (c.handleHash != bytes32(0)) {
if (cWeth > 0) handleWeth[c.handleHash] += cWeth;
} else {
if (cWeth > 0) IERC20(WETH).safeTransfer(c.payout, cWeth);
}
emit FeesClaimed(token, cWeth, pWeth);
}
/// Holders mode: gated crank. WETH 20% protocol (minus optional stale-fallback bounty) /
/// 80% -> token.distribute(). No token-side leg (WETH-only fees; nothing to burn).
function _claimFeesHolders(address token, Coin storage c) internal {
// ---- crank gate (UNCHANGED from V5) ----
uint64 last = lastCrank[token];
bool isKeeper = msg.sender == keeper;
bool stale = block.timestamp > uint256(last) + STALE_AFTER;
if (!isKeeper && !stale) revert CrankGated();
if (last != 0 && block.timestamp < uint256(last) + MIN_CRANK_INTERVAL) revert CrankTooSoon();
lastCrank[token] = uint64(block.timestamp);
uint256 wethAmt = pendingWeth[token];
pendingWeth[token] = 0;
uint256 pWeth = wethAmt * protocolBps / BPS;
uint256 hWeth = wethAmt - pWeth;
uint256 bounty;
if (stale && !isKeeper && crankBountyBps > 0 && pWeth > 0) {
bounty = pWeth * crankBountyBps / BPS;
pWeth -= bounty;
}
if (bounty > 0) IERC20(WETH).safeTransfer(msg.sender, bounty);
if (pWeth > 0) IERC20(WETH).safeTransfer(protocolWallet, pWeth);
if (hWeth > 0) {
IERC20(WETH).safeTransfer(token, hWeth);
HoodieHolderTokenV3(token).distribute();
}
emit HolderFeesDistributed(token, hWeth, pWeth, bounty);
}
/// @notice X-mode voucher claim. V6: WETH-only (the token-side handleToken escrow leg is
/// gone entirely, see contract-level docs). Digest shape is otherwise identical to V3/V4/V5
/// (chainid + nonce + deadline + handleHash + recipient; it never included a token address
/// even in the earlier versions, since the WETH escrow was never per-token to begin with).
function claimWithVoucher(
bytes32 handleHash, address recipient, uint256 deadline, bytes calldata sig
) external nonReentrant {
if (block.timestamp > deadline) revert BadVoucher();
bytes32 digest = MessageHashUtils.toEthSignedMessageHash(
keccak256(abi.encode(address(this), block.chainid, handleHash, recipient, deadline, handleNonce[handleHash])));
if (digest.recover(sig) != voucherSigner) revert BadVoucher();
uint256 w = handleWeth[handleHash];
if (w == 0) revert NothingToClaim();
handleNonce[handleHash] += 1;
handleWeth[handleHash] = 0;
IERC20(WETH).safeTransfer(recipient, w);
emit HandleClaimed(handleHash, recipient, w);
}
// =========================================================
// ETH RECEIPT
// =========================================================
/// @notice Accepts ETH ONLY from WETH unwrapping (via `sell`'s `IWETH9.withdraw`). Nothing
/// else should ever send this contract raw ETH.
receive() external payable {
require(msg.sender == WETH, "eth only from weth");
}
// =========================================================
// VIEWS
// =========================================================
/// @notice True once the pool's WETH balance reaches this coin's own gradWeth milestone.
/// Fees no longer accrue inside the (burned) pool at all now, so this reads slightly
/// "cleaner" than V5 (no fee dust ever sits in the pool); the logic itself is unchanged.
function graduated(address token) external view returns (bool) {
Coin storage c = coins[token];
if (c.creator == address(0)) return false;
return IERC20(WETH).balanceOf(c.pool) >= c.gradWeth;
}
function poolWeth(address token) external view returns (uint256) {
return IERC20(WETH).balanceOf(coins[token].pool);
}
function tokenCount() external view returns (uint256) { return allTokens.length; }
/// @notice One-shot read for indexers/frontends (UNCHANGED from V5).
function launchConfig(address token)
external view returns (uint256 gradWeth, uint16 capBps, uint64 limitEndsAt, uint64 tradeStartsAt)
{
Coin storage c = coins[token];
gradWeth = c.gradWeth;
capBps = c.capBps;
if (c.antiSnipe) {
limitEndsAt = IAntiSnipeToken(token).limitEndsAt();
tradeStartsAt = IAntiSnipeToken(token).tradeStartsAt();
}
}
// =========================================================
// ADMIN (UNCHANGED from V5)
// =========================================================
function setProtocolBps(uint256 bps) external onlyOwner { require(bps <= 5000, "max 50%"); protocolBps = bps; }
function setProtocolWallet(address w) external onlyOwner { protocolWallet = w; }
function setVoucherSigner(address s) external onlyOwner { voucherSigner = s; }
function setKeeper(address k) external onlyOwner { keeper = k; emit KeeperSet(k); }
function setCrankBountyBps(uint256 bps) external onlyOwner {
require(bps <= MAX_CRANK_BOUNTY_BPS, "max 1%");
crankBountyBps = bps;
emit CrankBountySet(bps);
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "factory_",
"type": "address",
"internalType": "address"
},
{
"name": "npm_",
"type": "address",
"internalType": "address"
},
{
"name": "weth_",
"type": "address",
"internalType": "address"
},
{
"name": "router_",
"type": "address",
"internalType": "address"
},
{
"name": "poolInitCodeHash_",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "protocolWallet_",
"type": "address",
"internalType": "address"
},
{
"name": "signer_",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "nonpayable"
},
{
"name": "BadParams",
"type": "error",
"inputs": []
},
{
"name": "BadValue",
"type": "error",
"inputs": []
},
{
"name": "BadVoucher",
"type": "error",
"inputs": []
},
{
"name": "CrankGated",
"type": "error",
"inputs": []
},
{
"name": "CrankTooSoon",
"type": "error",
"inputs": []
},
{
"name": "ECDSAInvalidSignature",
"type": "error",
"inputs": []
},
{
"name": "ECDSAInvalidSignatureLength",
"type": "error",
"inputs": [
{
"name": "length",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "ECDSAInvalidSignatureS",
"type": "error",
"inputs": [
{
"name": "s",
"type": "bytes32",
"internalType": "bytes32"
}
]
},
{
"name": "EmptyHandle",
"type": "error",
"inputs": []
},
{
"name": "HolderModeParams",
"type": "error",
"inputs": []
},
{
"name": "NothingToClaim",
"type": "error",
"inputs": []
},
{
"name": "OwnableInvalidOwner",
"type": "error",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "OwnableUnauthorizedAccount",
"type": "error",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "PoolPriceMismatch",
"type": "error",
"inputs": []
},
{
"name": "ReentrancyGuardReentrantCall",
"type": "error",
"inputs": []
},
{
"name": "SafeERC20FailedOperation",
"type": "error",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "SlippageExceeded",
"type": "error",
"inputs": []
},
{
"name": "UnknownToken",
"type": "error",
"inputs": []
},
{
"name": "Bought",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "buyer",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "ethIn",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "fee",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "tokenOut",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "CrankBountySet",
"type": "event",
"inputs": [
{
"name": "bps",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "DevBuy",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "buyer",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "ethIn",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "FeesClaimed",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "wethToCreator",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "wethToProtocol",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "HandleClaimed",
"type": "event",
"inputs": [
{
"name": "handleHash",
"type": "bytes32",
"indexed": true,
"internalType": "bytes32"
},
{
"name": "recipient",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "weth",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "HolderFeesDistributed",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "wethToHolders",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "wethToProtocol",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "bountyPaid",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "KeeperSet",
"type": "event",
"inputs": [
{
"name": "keeper",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "Launched",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "creator",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "name",
"type": "string",
"indexed": false,
"internalType": "string"
},
{
"name": "symbol",
"type": "string",
"indexed": false,
"internalType": "string"
},
{
"name": "handleHash",
"type": "bytes32",
"indexed": false,
"internalType": "bytes32"
},
{
"name": "payout",
"type": "address",
"indexed": false,
"internalType": "address"
},
{
"name": "pool",
"type": "address",
"indexed": false,
"internalType": "address"
},
{
"name": "positionId",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "tokenIsToken0",
"type": "bool",
"indexed": false,
"internalType": "bool"
},
{
"name": "mode",
"type": "uint8",
"indexed": false,
"internalType": "uint8"
},
{
"name": "metaURI",
"type": "string",
"indexed": false,
"internalType": "string"
},
{
"name": "params",
"type": "tuple",
"indexed": false,
"components": [
{
"name": "gradWeth",
"type": "uint96",
"internalType": "uint96"
},
{
"name": "capBps",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "limitSecs",
"type": "uint32",
"internalType": "uint32"
},
{
"name": "gateSecs",
"type": "uint32",
"internalType": "uint32"
}
],
"internalType": "struct HoodieLaunchV6.LaunchParams"
}
],
"anonymous": false
},
{
"name": "LpBurned",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "positionId",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "OwnershipTransferred",
"type": "event",
"inputs": [
{
"name": "previousOwner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newOwner",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "Sold",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "seller",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "tokenIn",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "fee",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "ethOut",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "BOUNDARY",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "int24",
"internalType": "int24"
}
],
"stateMutability": "view"
},
{
"name": "BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "FEE",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint24",
"internalType": "uint24"
}
],
"stateMutability": "view"
},
{
"name": "LAUNCH_FEE",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "MAX_CAP_BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "MAX_CRANK_BOUNTY_BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "MAX_GATE_SECS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint32",
"internalType": "uint32"
}
],
"stateMutability": "view"
},
{
"name": "MAX_GRAD_WETH",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint96",
"internalType": "uint96"
}
],
"stateMutability": "view"
},
{
"name": "MAX_LIMIT_SECS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint32",
"internalType": "uint32"
}
],
"stateMutability": "view"
},
{
"name": "MAX_TICK",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "int24",
"internalType": "int24"
}
],
"stateMutability": "view"
},
{
"name": "MIN_CAP_BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "MIN_CRANK_INTERVAL",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "MIN_GRAD_WETH",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint96",
"internalType": "uint96"
}
],
"stateMutability": "view"
},
{
"name": "MIN_TICK",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "int24",
"internalType": "int24"
}
],
"stateMutability": "view"
},
{
"name": "SQRT_AT_NEG",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint160",
"internalType": "uint160"
}
],
"stateMutability": "view"
},
{
"name": "SQRT_AT_POS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint160",
"internalType": "uint160"
}
],
"stateMutability": "view"
},
{
"name": "STALE_AFTER",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "SUPPLY",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "TRADE_FEE_BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "WETH",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "allTokens",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "buy",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "minOut",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "out",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "payable"
},
{
"name": "claimFees",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "claimWithVoucher",
"type": "function",
"inputs": [
{
"name": "handleHash",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "recipient",
"type": "address",
"internalType": "address"
},
{
"name": "deadline",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "sig",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "coins",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "creator",
"type": "address",
"internalType": "address"
},
{
"name": "payout",
"type": "address",
"internalType": "address"
},
{
"name": "handleHash",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "pool",
"type": "address",
"internalType": "address"
},
{
"name": "positionId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "tokenIsToken0",
"type": "bool",
"internalType": "bool"
},
{
"name": "createdBlock",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "mode",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "gradWeth",
"type": "uint96",
"internalType": "uint96"
},
{
"name": "capBps",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "antiSnipe",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "crankBountyBps",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "factory",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IUniswapV3Factory"
}
],
"stateMutability": "view"
},
{
"name": "graduated",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "handleNonce",
"type": "function",
"inputs": [
{
"name": "",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "handleWeth",
"type": "function",
"inputs": [
{
"name": "",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "keeper",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "lastCrank",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint64",
"internalType": "uint64"
}
],
"stateMutability": "view"
},
{
"name": "launch",
"type": "function",
"inputs": [
{
"name": "name",
"type": "string",
"internalType": "string"
},
{
"name": "symbol",
"type": "string",
"internalType": "string"
},
{
"name": "handle",
"type": "string",
"internalType": "string"
},
{
"name": "payout",
"type": "address",
"internalType": "address"
},
{
"name": "metaURI",
"type": "string",
"internalType": "string"
},
{
"name": "mode",
"type": "uint8",
"internalType": "enum HoodieLaunchV6.FeeMode"
},
{
"name": "p",
"type": "tuple",
"components": [
{
"name": "gradWeth",
"type": "uint96",
"internalType": "uint96"
},
{
"name": "capBps",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "limitSecs",
"type": "uint32",
"internalType": "uint32"
},
{
"name": "gateSecs",
"type": "uint32",
"internalType": "uint32"
}
],
"internalType": "struct HoodieLaunchV6.LaunchParams"
},
{
"name": "userSalt",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "payable"
},
{
"name": "launchConfig",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "gradWeth",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "capBps",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "limitEndsAt",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "tradeStartsAt",
"type": "uint64",
"internalType": "uint64"
}
],
"stateMutability": "view"
},
{
"name": "npm",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract INonfungiblePositionManager"
}
],
"stateMutability": "view"
},
{
"name": "owner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "pendingWeth",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "poolInitCodeHash",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bytes32",
"internalType": "bytes32"
}
],
"stateMutability": "view"
},
{
"name": "poolWeth",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "protocolBps",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "protocolWallet",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "renounceOwnership",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "router",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "sell",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "amountIn",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "minEthOut",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "ethOut",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "setCrankBountyBps",
"type": "function",
"inputs": [
{
"name": "bps",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setKeeper",
"type": "function",
"inputs": [
{
"name": "k",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setProtocolBps",
"type": "function",
"inputs": [
{
"name": "bps",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setProtocolWallet",
"type": "function",
"inputs": [
{
"name": "w",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setVoucherSigner",
"type": "function",
"inputs": [
{
"name": "s",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "tokenCount",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "transferOwnership",
"type": "function",
"inputs": [
{
"name": "newOwner",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "uniswapV3SwapCallback",
"type": "function",
"inputs": [
{
"name": "amount0",
"type": "int256",
"internalType": "int256"
},
{
"name": "amount1",
"type": "int256",
"internalType": "int256"
},
{
"name": "data",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "voucherSigner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"type": "receive",
"stateMutability": "payable"
}
]0x6101203461026457601f6172a138819003918201601f19168301916001600160401b038311848410176102685780849260e094604052833981010312610264576100488161027c565b906100556020820161027c565b906100626040820161027c565b61006e6060830161027c565b60808301519161008c60c061008560a0870161027c565b950161027c565b943315610251575f8054336001600160a01b0319821681178355604051999290916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a360017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556107d06002556001600160a01b0390811660805290811660a05260c09190915260e09190915261010091909152600380546001600160a01b03199081169383169390931790556004805490921692169190911790556170109081610291823960805181818161096901528181611ed60152612e80015260a051818181610b740152818161206a0152818161212d015281816122dd0152818161234a01528181612a980152612b01015260c051818181601b01528181610379015281816103ec0152818161068b015281816109ee01528181610edc015281816110ec015281816114930152818161180301528181611890015281816118c101528181611a4801528181611a8b01528181611e7e01528181611f9e01528181612ea9015261331b015260e0518181816104dd01528181611eae0152612ed201526101005181818161060d01528181611eff0152612f000152f35b631e4fbdf760e01b5f525f60045260245ffd5b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b03821682036102645756fe6101206040526004361015610085575b3615610019575f80fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361004b57005b60405162461bcd60e51b81526020600482015260126024820152710cae8d040dedcd8f240cce4deda40eecae8d60731b6044820152606490fd5b5f5f3560e01c8063024d11e914611bf157806306d6e63f14611bc857806307e152b414611b8f57806308ccb24f1461128157806309197a8114611b6d5780630aff01fe14611b435780630fe9d73314611b255780631043c81614611b015780631471320614611ad857806315a0ea6a14611664578063249d39e91461164757806324f33ce714611510578063283d6fef146114365780633b151b56146113db57806342275ce1146113565780634db2624f14610b0957806358a4251c1461133a5780635ecd1f201461131d5780635ef37d1514611300578063634282af146112bc5780636882a8881461129e578063692e5b9a146112815780636a27246214610f695780636a97c4c514610d6a578063715018a614610d10578063748747e614610ca85780637d0f7a8814610bcd5780637e42589514610ba35780637f1e9ef614610b5e57806388f4c13714610b355780638da5cb5b14610b0e5780639185f59814610b095780639496700514610aeb5780639818739b14610acd5780639b083ec914610a9f5780639b47c69d14610a835780639f181b5e14610a65578063a1634b1414610a46578063aced166114610a1d578063ad5c4648146109d8578063af6e40d014610998578063c45a015514610953578063c50497ae1461092d578063c57981b514610911578063c6d99bd8146108eb578063cce7ec1314610630578063d64efe91146105f5578063efc24b8c146105d2578063f01e9a8b14610592578063f2fde38b1461050c578063f887ea40146104c7578063f8be4abc146104845763fa461e33146102d7575061000f565b34610481576060366003190112610481576004356024356044356001600160401b0381116104465761030d903690600401613061565b6001546001600160a01b0316330361044a57816020918101031261044657356001600160a01b03811690819003610446578084526009602052604084206003810154336001600160a01b0390911603610411576005015460ff169081156103ea5780915b156103e457507f0000000000000000000000000000000000000000000000000000000000000000925b8481136103c9575b50508281136103af578280f35b6103c39133906001600160a01b031661340f565b5f808280f35b6103dd9133906001600160a01b031661340f565b5f806103a2565b9261039a565b7f000000000000000000000000000000000000000000000000000000000000000091610371565b60405162461bcd60e51b815260206004820152600d60248201526c0e0deded840dad2e6dac2e8c6d609b1b6044820152606490fd5b8380fd5b60405162461bcd60e51b815260206004820152600f60248201526e1d5b995e1c1958dd1959081c1bdbdb608a1b6044820152606490fd5b80fd5b5034610481576020366003190112610481576020906001600160401b03906040906001600160a01b036104b561308e565b16815260078452205416604051908152f35b50346104815780600319360112610481576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346104815760203660031901126104815761052661308e565b61052e6133e9565b6001600160a01b0316801561057e5781546001600160a01b03198116821783556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b631e4fbdf760e01b82526004829052602482fd5b5034610481576020366003190112610481576105ac61308e565b6105b46133e9565b60018060a01b03166001600160601b0360a01b600354161760035580f35b50346104815780600319360112610481576020604051670de0b6b3a76400008152f35b503461048157806003193601126104815760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b5060403660031901126104815761064561308e565b61064d61339b565b6001600160a01b0390811680835260096020526040832080549192909116156108dc5760643402348104606414341517156108c857612710900490837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156108c4578160049160405192838092630d0e30db60e41b825234905af180156108b9576108a4575b508390526005602052604084206106f6838254613286565b905561070282346131cb565b60406005830191600360ff84541615940160018060a01b038154166001600160601b0360a01b600154161760015560018060a01b03905416845f14610889576401000276a4915b88845196896020890152602088526107618689613107565b610781865198899687958694630251596160e31b8652336004870161320d565b03925af190811561087e5785928692610846575b50600180546001600160a01b03191690555460ff161561083657506107b990613263565b915b602435831061082757602093507f7ce543d1780f3bdc3dac42da06c95da802653cd1b212b8d74ec3e3c33ad7095c6040518061080b86339634846040919493926060820195825260208201520152565b0390a360015f516020616fbb5f395f51905f5255604051908152f35b638199f5f360e01b8452600484fd5b6108409150613263565b916107bb565b60ff935061086d91925060403d604011610877575b6108658183613107565b8101906131f7565b9290929190610795565b503d61085b565b6040513d87823e3d90fd5b73fffd8963efd1fc6a506488495d951d5263988d2591610749565b816108ae91613107565b61044657835f6106de565b6040513d84823e3d90fd5b5080fd5b634e487b7160e01b84526011600452602484fd5b638698bf3760e01b8352600483fd5b503461048157806003193601126104815760206040516a0269b982506fa7d2c535288152f35b5034610481578060031936011261048157602060405160648152f35b50346104815780600319360112610481576020604051676765c793fa10079d601b1b8152f35b50346104815780600319360112610481576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5034610481576020366003190112610481576109b261308e565b6109ba6133e9565b60018060a01b03166001600160601b0360a01b600454161760045580f35b50346104815780600319360112610481576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346104815780600319360112610481576006546040516001600160a01b039091168152602090f35b50346104815780600319360112610481576020604051620d899f198152f35b50346104815780600319360112610481576020600a54604051908152f35b50346104815780600319360112610481576020604051603c8152f35b5034610481576020366003190112610481576020610ac3610abe61308e565b6132c9565b6040519015158152f35b5034610481578060031936011261048157602060405162031da88152f35b50346104815780600319360112610481576020600254604051908152f35b6130a4565b5034610481578060031936011261048157546040516001600160a01b039091168152602090f35b50346104815780600319360112610481576004546040516001600160a01b039091168152602090f35b50346104815780600319360112610481576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346104815760203660031901126104815760406020916004358152600b83522054604051908152f35b503461048157602036600319011261048157610160906040906001600160a01b03610bf661308e565b16815260096020522060ff60018060a01b038254169160018060a01b0360018201541690600281015460018060a01b036003830154169060056004840154930154936040519687526020870152604086015260608501526080840152818116151560a08401526001600160401b038160081c1660c0840152818160481c1660e08401526001600160601b038160501c1661010084015261ffff8160b01c1661012084015260c01c161515610140820152f35b503461048157602036600319011261048157610cc261308e565b610cca6133e9565b600680546001600160a01b0319166001600160a01b039290921691821790557fdc3dba1d64dd67c0dc8b12621edd0c6ca4303a9073c3a8fcac38115e73d67b6b8280a280f35b5034610481578060031936011261048157610d296133e9565b80546001600160a01b03198116825581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b5034610481576080366003190112610481576024356001600160a01b0381169060043590828103610446576044356064356001600160401b038111610f6557610db7903690600401613061565b91610dc061339b565b804211610f565791610e4c610e5292610e5b94878a52600c60205260408a20546040519060208201923084524660408401528a60608401528b608084015260a083015260c082015260c08152610e1760e082613107565b5190207f19457468657265756d205369676e6564204d6573736167653a0a3332000000008a52601c52603c8920923691613293565b90613496565b909291926134d0565b6004546001600160a01b03908116911603610f4757818452600b6020526040842054908115610f3857828552600c6020526040852080549060018201809211610f245755828552600b6020908152604086208690557fcc2cd38d2704f26cf3668967a7669231ee3c13ffa672e1f5b5daf943ab7dd7b4929091610f099082907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661340f565b604051908152a360015f516020616fbb5f395f51905f525580f35b634e487b7160e01b87526011600452602487fd5b6312d37ee560e31b8552600485fd5b630de54e5d60e31b8452600484fd5b630de54e5d60e31b8752600487fd5b8580fd5b503461048157606036600319011261048157610f8361308e565b9060243591610f9061339b565b6001600160a01b039081168083526009602052604083208054919492909116156108dc576040516323b872dd60e01b84523360045230602452604483905260208460648180895af1906001855114821615611260575b604052836060521561124c5760058101546003919091018054600180546001600160a01b0319166001600160a01b03928316179055905460ff929092169161107091604091168315611231576401000276a4905b825191886020840152602083526110518484613107565b878451809681958294630251596160e31b84528b8b306004870161320d565b03925af19182156112265784918593611203575b50600180546001600160a01b0319169055156111f357506110a490613263565b925b60648402848104606414851517156108c8576127106110e0910480958386526005602052604086206110d9838254613286565b90556131cb565b9260443584106111e4577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156108c457818091602460405180948193632e1a7d4d60e01b83528a60048401525af180156108b9579082916111cf575b50808086335af1611156613143565b501561119f5760408051928352602083810195909552820183905233917f9be8a5ca22b7e6e81f04b5879f0248227bb770114291bd47dfaee4c3a82ad60e90806060810161080b565b60405162461bcd60e51b815260206004820152600860248201526732ba34103c3332b960c11b6044820152606490fd5b816111d991613107565b61048157805f611147565b638199f5f360e01b8152600490fd5b6111fd9150613263565b926110a6565b90925061121f915060403d604011610877576108658183613107565b915f611084565b6040513d86823e3d90fd5b73fffd8963efd1fc6a506488495d951d5263988d259061103a565b635274afe760e01b83526004849052602483fd5b90600181151661127857853b15153d15161690610fe6565b503d84823e3d90fd5b50346104815780600319360112610481576020604051610e108152f35b50346104815780600319360112610481576020604051620d89a08152f35b50346104815760203660031901126104815760043590600a548210156104815760206112e7836130bf565b905460405160039290921b1c6001600160a01b03168152f35b5034610481578060031936011261048157602060405161012c8152f35b503461048157806003193601126104815760206040516103e88152f35b5034610481578060031936011261048157602060405160328152f35b5034610481576020366003190112610481576004356113736133e9565b606481116113ad576020817fad26ff82091c6400b17a1f43f0e737a6a0767dae08becc02811765dfeef14b2592600855604051908152a180f35b60405162461bcd60e51b81526020600482015260066024820152656d617820312560d01b6044820152606490fd5b5034610481576020366003190112610481576004356113f86133e9565b61138881116114075760025580f35b60405162461bcd60e51b81526020600482015260076024820152666d61782035302560c81b6044820152606490fd5b5034610481576020366003190112610481576001600160a01b0361145861308e565b1681526009602090815260408083206003015490516370a0823160e01b81526001600160a01b039182166004820152929190839060249082907f0000000000000000000000000000000000000000000000000000000000000000165afa90811561150457906114cd575b602090604051908152f35b506020813d6020116114fc575b816114e760209383613107565b810103126114f857602090516114c2565b5f80fd5b3d91506114da565b604051903d90823e3d90fd5b50346104815760203660031901126104815761152a61308e565b6001600160a01b031680825260096020526040822060050154908290819060c084901c60ff16611590575b6080846001600160401b0387818761ffff604051956001600160601b038160501c16875260b01c166020860152166040840152166060820152f35b60405163fe2a615160e01b81529194509150602081600481855afa90811561122657600491602091869161162a575b509260405192838092632d45aaa560e11b82525afa908115611226576001600160401b0392918391608096916115fb575b509450819250611555565b61161d915060203d602011611623575b6116158183613107565b8101906131d8565b5f6115f0565b503d61160b565b6116419150823d8411611623576116158183613107565b5f6115bf565b503461048157806003193601126104815760206040516127108152f35b50346104815760203660031901126104815761167e61308e565b61168661339b565b6001600160a01b03818116808452600960205260408420805491939290911615611ac95760ff600582015460481c166003811015611ab55760020361197a575081835260076020526001600160401b036040842054169060018060a01b03600654163314610e10830180841161194f574211901592838094611972575b611963578015159081611939575b5061192a578385526007602052604085206001600160401b03804216166001600160401b03198254161790558385526005602052604085205491848652600560205285604081205561177361271061176b60025486613273565b0480946131cb565b91869481611922575b5080611917575b8061190e575b6118f3575b836118ba575b82611879575b816117fb575b506117e37fb46ceabe7d0b214c64aca2326316e0baa0fb2623ab086ec6eb69b6deaa13d41993604051938493846040919493926060820195825260208201520152565b0390a25b60015f516020616fbb5f395f51905f525580f35b6118309082907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661340f565b833b156118755760405163e4fc6b6d60e01b815285908181600481838a5af180156108b957611860575b506117a0565b8161186a91613107565b61187557845f61185a565b8480fd5b6003546118b59084906001600160a01b03908116907f00000000000000000000000000000000000000000000000000000000000000001661340f565b61179a565b6118ee84337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661340f565b611794565b91925061190861271061176b60085486613273565b9161178e565b50821515611789565b506008541515611783565b90505f61177c565b631a44723960e01b8552600485fd5b905061012c810180911161194f5742105f611711565b634e487b7160e01b86526011600452602486fd5b637cdcdc8f60e01b8652600486fd5b508115611703565b7f1ac537f0ad67b64ac68a04587ff3a4cb6977de22eb2c37ee560897a92c6d07c79150604090838552600560205281852054848652600560205285838120556119d36127106119cb60025484613273565b0480926131cb565b9181611a74575b60028101805490919015611a1f575082611a01575b505b82519182526020820152a26117e7565b548652600b602052828620611a17838254613286565b90555f6119ef565b90508280611a2f575b50506119f1565b600190910154611a6d91906001600160a01b03908116907f00000000000000000000000000000000000000000000000000000000000000001661340f565b5f82611a28565b600354611ab09083906001600160a01b03908116907f00000000000000000000000000000000000000000000000000000000000000001661340f565b6119da565b634e487b7160e01b85526021600452602485fd5b638698bf3760e01b8452600484fd5b503461048157806003193601126104815760206040516d6a17b32fc5d4d48f7124aa2fdba08152f35b5034610481578060031936011261048157602060405168056bc75e2d631000008152f35b50346104815780600319360112610481576020600854604051908152f35b50346104815760203660031901126104815760406020916004358152600c83522054604051908152f35b503461048157806003193601126104815760206040516601c6bf526340008152f35b5034610481576020366003190112610481576020906040906001600160a01b03611bb761308e565b168152600583522054604051908152f35b50346104815780600319360112610481576003546040516001600160a01b039091168152602090f35b506101603660031901126114f8576004356001600160401b0381116114f857611c1e903690600401613061565b9060e0526024356001600160401b0381116114f857611c41903690600401613061565b610100526044356001600160401b0381116114f857611c64903690600401613061565b6064356001600160a01b03811681036114f8576084356001600160401b0381116114f857611c96903690600401613061565b929091600360a43510156114f85760803660c31901126114f857611cb861339b565b5f60c0526601c6bf526340003410613052575f8080806601c6bf5263400060018060a01b03600354165af1611ceb613143565b501561302257600160a435148061301a575b61300b5760a4356002148080612ff0575b612fe157670de0b6b3a76400006001600160601b03611d2b6133d3565b16108015612fbf575b612f5a5761ffff611d43613172565b16151580612f94575b612f5a5761ffff611d5b613172565b161580612f7e575b612f5a5761ffff611d72613172565b16151580612f69575b612f5a57610e1063ffffffff611d8f613183565b1611612f5a57603c63ffffffff611da4613197565b1611612f5a5760405160208101903360601b825261014435603482015260348152611dd0605482613107565b5190208115612d33576003546001600160a01b0316611ded613172565b90611df6613183565b90611dff613197565b60405193611cd993848601928684106001600160401b038511176129c8578f8f9261ffff61018095611e6363ffffffff96611e5088968e9d8e6152e290396101a08c526101a08c019060e0516131ab565b908a820360208c015261010051906131ab565b676765c793fa10079d601b1b60408a01526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660608b015260808a019a909a527f00000000000000000000000000000000000000000000000000000000000000008a1660a08a01527f000000000000000000000000000000000000000000000000000000000000000090991660c08901527f000000000000000000000000000000000000000000000000000000000000000060e089015260646101008901523361012089015216610140870152166101608501521691015203905ff58015612960576001600160a01b031660c0526001925b82965f6080528115155f14612d2857611f78913691613293565b602081519101206080525b60a4351580928193612d1d575b81612d0b575b50612d03575b7f000000000000000000000000000000000000000000000000000000000000000060a081905260c0516001600160a01b0391821691161015612cfa5760c051925b60a05160c0516001600160a01b0391821691161015612cf15760a051925b60a05160c0516001600160a01b0391821691161015612cdc576a0269b982506fa7d2c53528935b6040516309f56ab160e11b81526001600160a01b0387811660048301528281166024830152606460448301819052968116968201879052909590602090879060849082905f907f0000000000000000000000000000000000000000000000000000000000000000165af1958615612960575f96612c98575b50604051633850c7bd60e01b815260e0816004816001600160a01b038b165afa908115612960575f91612c05575b506001600160a01b031603612bf65760a05160c0516001600160a01b0391821691161015612bec5762031da7195b60a05160c0516001600160a01b0391821691161015612be357620d89a05b60405163095ea7b360e01b5f9081526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600452676765c793fa10079d601b1b60245260c0516020929160449183918291165af19060015f5114821615612bca575b60405215612a7f575b60a05160c0516001600160a01b0391821691161015612a7857676765c793fa10079d601b1b915b60a05160c0516001600160a01b0391821691161015612a66575f935b604051996121d88b6130eb565b60018060a01b03168a5260018060a01b031660208a0152606460408a015260020b606089015260020b608088015260a087015260c08601525f60e08601525f610100860152306101208601524261014086015261014060405195634418b22b60e11b875260018060a01b03815116600488015260018060a01b03602082015116602488015262ffffff6040820151166044880152606081015160020b6064880152608081015160020b608488015260a081015160a488015260c081015160c488015260e081015160e488015261010081015161010488015260018060a01b03610120820151166101248801520151610144860152608085610164815f60018060a01b037f0000000000000000000000000000000000000000000000000000000000000000165af1948515612960575f95612a14575b505f8060405160208101906323b872dd60e01b825230602482015261dead604482015288606482015260648152612345608482613107565b5190827f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af161237c613143565b50156129e35760405185815260c0516001600160a01b0316907f0a6164dbc83f96b63add7bc06e3302e5e94b0d0f70d860b260fa44fa79fd466e90602090a2156129dc5786905b6123cb6133d3565b906123d4613172565b604051936123e1856130eb565b338552602085019060018060a01b031681526040850193608051855260a060056060880193600180841b038b168552608089018c8152600180851b03845116600180861b0360c0511610848b015260c08a01956001600160401b034316875260e08b019960ff60a435168b526001600160601b036101008d019716875261ffff6101208d01991689526101408c019915158a52600180871b0360c051165f52600960205260405f2093600180881b038d6001808a1b03905116166001600160601b03881b865416178555600180881b039051166001850190600180891b03166001600160601b03881b825416179055516002840155600180861b039051166003830190600180871b03166001600160601b03861b8254161790555160048201550196015115159169ff00000000000000000068ffffffffffffffff008854925160081b16965160481b16916001600160601b0360501b905160501b169361ffff60b01b905160b01b169460ff60c01b9051151560c01b169560ff60c01b199361ffff60b01b199260ff6001600160601b0360501b1992169069ffffffffffffffffffff19161716171617161717179055600a54680100000000000000008110156129c8578060016125b59201600a556130bf565b815460c0516001600160a01b0390811660039390931b92831b921b191617905561297f575b61260e61266b966125fb604051996101a08b526101a08b019060e0516131ab565b9089820360208b015261010051906131ab565b94608051604089015260018060a01b0316606088015260018060a01b0316608087015260a086015260018060a01b0360a0511660018060a01b0360c051161060c086015260ff60a4351660e08601528483036101008601526131ab565b60c4356001600160601b0381168091036114f85761012083015260e43561ffff81168091036114f8576101408301526101043563ffffffff81168091036114f8576101608301526101243563ffffffff81168091036114f8576101808301527f65eee5d43c73752f824fd2c5152f1c850434e9b514d3b66f2330d03a7c49598933928060018060a01b0360c05116930390a36601c6bf526340003411612733575b60015f516020616fbb5f395f51905f525560405160c0516001600160a01b03168152602090f35b60c0516001600160a01b03165f908152600960205260409020346601c6bf52633fff198101929190831161296b57606483028381046064148415171561296b5760a051612710909104906001600160a01b03163b156114f857604051630d0e30db60e41b815260a0515f908290600490829089906001600160a01b03165af1801561296057612949575b506127eb9060018060a01b0360c0511684526005602052604084206127e3828254613286565b9055846131cb565b60406005830191600360ff84541615940160018060a01b038154166001600160601b0360a01b600154161760015560018060a01b03905416845f1461292e576401000276a4915b8684519660018060a01b0360c051166020890152602088526128548689613107565b612874865198899687958694630251596160e31b8652336004870161320d565b03925af190811561292357839284926128fb575b50600180546001600160a01b03191690555460ff16156128ec57506128ac90613263565b505060405190815233907f643bfd7dd70fce7d617c64985256278e07a766c14fcb4b84005ec0ff84bbf543602060018060a01b0360c0511692a35f61270c565b6128f69150613263565b6128ac565b60ff935061291991925060403d604011610877576108658183613107565b9290929190612888565b6040513d85823e3d90fd5b73fffd8963efd1fc6a506488495d951d5263988d2591612832565b6129569193505f90613107565b5f916127eb6127bd565b6040513d5f823e3d90fd5b634e487b7160e01b5f52601160045260245ffd5b61012b19420142811161296b5760c0516001600160a01b03165f908152600760205260409020805467ffffffffffffffff19166001600160401b039092169190911790556125da565b634e487b7160e01b5f52604160045260245ffd5b5f906123c3565b60405162461bcd60e51b8152602060048201526009602482015268313ab937103c3332b960b91b6044820152606490fd5b9094506080813d608011612a5e575b81612a3060809383613107565b810103126114f857602081519101516fffffffffffffffffffffffffffffffff8116036114f857935f61230d565b3d9150612a23565b676765c793fa10079d601b1b936121cb565b5f916121af565b60405163095ea7b360e01b5f9081526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600452602482905260c0516020929160449183918291165af19060015f5114821615612ba7575b60405215612b5b5760405163095ea7b360e01b5f9081526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600452676765c793fa10079d601b1b60245260c0516020929160449183918291165af19060015f5114821615612b7b575b604052612188575b635274afe760e01b5f90815260c0516001600160a01b0316600452602490fd5b906001811516612b9e5760c0516001600160a01b03163b15153d15161690612b53565b503d5f823e3d90fd5b906001811516612b9e5760c0516001600160a01b03163b15153d15161690612ae0565b9060018060a01b0360c051163b15153d1516169061217f565b62031da8612114565b620d899f196120f6565b6334c4589960e01b5f5260045ffd5b905060e0813d60e011612c90575b81612c2060e09383613107565b810103126114f8578051906001600160a01b03821682036114f85760208101518060020b036114f857612c5560408201613487565b50612c6260608201613487565b50612c6f60808201613487565b5060a081015160ff8116036114f85760c00151801515036114f8575f6120c8565b3d9150612c13565b9095506020813d602011612cd4575b81612cb460209383613107565b810103126114f857516001600160a01b03811681036114f857945f61209a565b3d9150612ca7565b6d6a17b32fc5d4d48f7124aa2fdba093612022565b60c05192611ffb565b60a05192611fdd565b339550611f9c565b6001600160a01b03161590505f611f96565b608051159150611f90565b50505f608052611f83565b61ffff612d3e613172565b161580612f45575b15612dcc57604051610a498082018281106001600160401b038211176129c8578291614899833960808152612d97612d858d608084019060e0516131ab565b8281036020840152610100518d6131ab565b90676765c793fa10079d601b1b604082015260603091015203905ff58015612960576001600160a01b031660c0525f92611f5e565b612dd4613172565b612ddc613183565b90612de5613197565b9060018060a01b036003541691604051936112d285018581106001600160401b038211176129c85785948f8f9463ffffffff6101a09561ffff612e466064996125fb85978e6112d2906135c790396101c08b526101c08b019060e0516131ab565b676765c793fa10079d601b1b6040890152306060890152336080890152991660a08701521660c08501521660e08301526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166101008401527f000000000000000000000000000000000000000000000000000000000000000081166101208401527f0000000000000000000000000000000000000000000000000000000000000000166101408301526101608201527f0000000000000000000000000000000000000000000000000000000000000000610180820152015203905ff58015612960576001600160a01b031660c052600192611f5e565b5063ffffffff612f53613197565b1615612d46565b63019af63760e01b5f5260045ffd5b5063ffffffff612f77613183565b1615611d7b565b5063ffffffff612f8c613183565b161515611d63565b50603261ffff612fa2613172565b161080611d4c57506103e861ffff612fb8613172565b1611611d4c565b5068056bc75e2d631000006001600160601b03612fda6133d3565b1611611d34565b631d0f9b3760e31b5f5260045ffd5b5082151580611d0e57506001600160a01b0382161515611d0e565b6375ebfc4960e01b5f5260045ffd5b508115611cfd565b60405162461bcd60e51b81526020600482015260086024820152673332b2903c3332b960c11b6044820152606490fd5b630bba69fb60e01b5f5260045ffd5b9181601f840112156114f8578235916001600160401b0383116114f857602083818601950101116114f857565b600435906001600160a01b03821682036114f857565b346114f8575f3660031901126114f857602060405160648152f35b600a548110156130d757600a5f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b61016081019081106001600160401b038211176129c857604052565b90601f801991011681019081106001600160401b038211176129c857604052565b6001600160401b0381116129c857601f01601f191660200190565b3d1561316d573d9061315482613128565b916131626040519384613107565b82523d5f602084013e565b606090565b60e43561ffff811681036114f85790565b6101043563ffffffff811681036114f85790565b6101243563ffffffff811681036114f85790565b908060209392818452848401375f828201840152601f01601f1916010190565b9190820391821161296b57565b908160209103126114f857516001600160401b03811681036114f85790565b91908260409103126114f8576020825192015190565b93909260c0959260209460018060a01b03168652151584860152604085015260018060a01b0316606084015260a0608084015280519182918260a0860152018484015e5f828201840152601f01601f1916010190565b600160ff1b811461296b575f0390565b8181029291811591840414171561296b57565b9190820180921161296b57565b92919261329f82613128565b916132ad6040519384613107565b8294818452818301116114f8578281602093845f960137010152565b6001600160a01b039081165f9081526009602052604090208054909116156133965760038101546040516370a0823160e01b81526001600160a01b0391821660048201529190602090839060249082907f0000000000000000000000000000000000000000000000000000000000000000165afa918215612960575f92613361575b506005015460501c6001600160601b0316111590565b9091506020813d60201161338e575b8161337d60209383613107565b810103126114f8575190600561334b565b3d9150613370565b505f90565b60025f516020616fbb5f395f51905f5254146133c45760025f516020616fbb5f395f51905f5255565b633ee5aeb560e01b5f5260045ffd5b60c4356001600160601b03811681036114f85790565b5f546001600160a01b031633036133fc57565b63118cdaa760e01b5f523360045260245ffd5b916040519163a9059cbb60e01b5f5260018060a01b031660045260245260205f60448180865af19060015f511482161561346f575b6040521561344f5750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b906001811516612b9e57823b15153d15161690613444565b519061ffff821682036114f857565b81519190604183036134c6576134bf9250602082015190606060408401519301515f1a90613544565b9192909190565b50505f9160029190565b600481101561353057806134e2575050565b600181036134f95763f645eedf60e01b5f5260045ffd5b60028103613514575063fce698f760e01b5f5260045260245ffd5b60031461351e5750565b6335e2f38360e21b5f5260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116135bb579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15612960575f516001600160a01b038116156135b157905f905f90565b505f906001905f90565b5050505f916003919056fe6101808060405234610723576112d2803803809161001d8285610727565b833981016101c0828203126107235781516001600160401b038111610723578161004891840161074a565b602083015190916001600160401b0382116107235761006891840161074a565b9160408101519261007b6060830161079f565b926100886080840161079f565b9060a084015161ffff8116809103610723576100a660c086016107b3565b6100b260e087016107b3565b916100c0610100880161079f565b956100ce610120890161079f565b956100dc6101408a0161079f565b906100ea6101608b0161079f565b926101a06101808c01519b01519762ffffff8916809903610723578051906001600160401b03821161061e5760035490600182811c92168015610719575b60208310146106005781601f8493116106a3575b50602090601f831160011461063d575f92610632575b50508160011b915f199060031b1c1916176003555b8051906001600160401b03821161061e5760045490600182811c92168015610614575b60208310146106005781601f84931161058a575b50602090601f8311600114610524575f92610519575b50508160011b915f199060031b1c1916176004555b60e05233610100526101205261014052806104eb57505f195b6080526001600160401b03906101fe9063ffffffff16426107c4565b1660a0526001600160401b039061021b9063ffffffff16426107c4565b1660c0526001600160a01b0382163010156104e4573091905b604080516001600160a01b039485166020820190815294909316908301526060808301919091528152610268608082610727565b5190209160405192602084019260ff60f81b845260018060601b03199060601b16602185015260358401526055830152605582526102a7607583610727565b905190206001600160a01b0390811661016052169081156104d1575f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020836102f486956002546107c4565b60025584845283825260408420818154019055604051908152a360c0516001600160401b03164210806104bd575b806104a8575b6104995760a0516001600160401b03164210908161040c575b816103f5575b506103e657604051610b0090816107d2823960805181818161014101526109dd015260a0518181816101020152610988015260c0518181816103c80152610949015260e0518181816107350152610a2801526101005181818161055c015261088c01526101205181818161017901526108590152610140518181816106f40152610826015261016051818181610518015281816107bc0152610a5a0152f35b6341f5f85960e11b5f5260045ffd5b90505f525f60205260405f2054608051105f610347565b610160519091506001600160a01b031681148015610484575b801561046f575b801561045a575b801561044f575b8015610448575b1590610341565b505f610441565b5061dead811461043a565b50610140516001600160a01b03168114610433565b50610120516001600160a01b0316811461042c565b50610100516001600160a01b03168114610425565b63e09f033160e01b5f5260045ffd5b5060e0516001600160a01b0316811415610328565b50610160516001600160a01b031615610322565b63ec442f0560e01b5f525f60045260245ffd5b3090610234565b8089029089820414891517156105055761271090046101e2565b634e487b7160e01b5f52601160045260245ffd5b015190505f806101b4565b60045f9081528281209350601f198516905b818110610572575090846001959493921061055a575b505050811b016004556101c9565b01515f1960f88460031b161c191690555f808061054c565b92936020600181928786015181550195019301610536565b8281111561019e5760045f52909150601f830160051c7f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b602085106105f8575b849392601f0160051c82900391015f5b8281106105e857505061019e565b5f818301558594506001016105da565b5f91506105ca565b634e487b7160e01b5f52602260045260245ffd5b91607f169161018a565b634e487b7160e01b5f52604160045260245ffd5b015190505f80610152565b60035f9081528281209350601f198516905b81811061068b5750908460019594939210610673575b505050811b01600355610167565b01515f1960f88460031b161c191690555f8080610665565b9293602060018192878601518155019501930161064f565b8281111561013c5760035f52909150601f830160051c7fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b60208510610711575b849392601f0160051c82900391015f5b82811061070157505061013c565b5f818301558594506001016106f3565b5f91506106e3565b91607f1691610128565b5f80fd5b601f909101601f19168101906001600160401b0382119082101761061e57604052565b81601f82011215610723578051906001600160401b03821161061e576040519261077e601f8401601f191660200185610727565b8284526020838301011161072357815f9260208093018386015e8301015290565b51906001600160a01b038216820361072357565b519063ffffffff8216820361072357565b919082018092116105055756fe6080806040526004361015610012575f80fd5b5f3560e01c90816302d05d3f146107235750806306d6e63f146106df57806306fdde031461060d578063095ea7b31461058b57806316eebd1e1461054757806316f0115b1461050357806318160ddd146104e657806323b872dd14610407578063313ce567146103ec5780635a8b554a146103a857806370a082311461037157806395d89b4114610256578063a9059cbb14610225578063cba0e996146101f8578063dd62ed3e146101a8578063f887ea4014610164578063f8b45b051461012a5763fe2a6151146100e2575f80fd5b34610126575f36600319011261012657602060405167ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b5f80fd5b34610126575f3660031901126101265760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b34610126575f366003190112610126576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610126576040366003190112610126576101c161078e565b6101c96107a4565b6001600160a01b039182165f908152600160209081526040808320949093168252928352819020549051908152f35b3461012657602036600319011261012657602061021b61021661078e565b6107ba565b6040519015158152f35b346101265760403660031901126101265761024b61024161078e565b60243590336108bd565b602060405160018152f35b34610126575f366003190112610126576040515f6004548060011c90600181168015610367575b6020831081146103535782855290811561033757506001146102e2575b50819003601f01601f191681019067ffffffffffffffff8211818310176102ce576102ca82918260405282610764565b0390f35b634e487b7160e01b5f52604160045260245ffd5b905060045f527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5f905b8282106103215750602091508201018261029a565b600181602092548385880101520191019061030c565b90506020925060ff191682840152151560051b8201018261029a565b634e487b7160e01b5f52602260045260245ffd5b91607f169161027d565b34610126576020366003190112610126576001600160a01b0361039261078e565b165f525f602052602060405f2054604051908152f35b34610126575f36600319011261012657602060405167ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b34610126575f36600319011261012657602060405160128152f35b346101265760603660031901126101265761042061078e565b6104286107a4565b6001600160a01b0382165f818152600160209081526040808320338452909152902054909260443592915f198110610466575b5061024b93506108bd565b8381106104cb5784156104b85733156104a55761024b945f52600160205260405f2060018060a01b0333165f526020528360405f20910390558461045b565b634a1406b160e11b5f525f60045260245ffd5b63e602df0560e01b5f525f60045260245ffd5b8390637dc7a0d960e11b5f523360045260245260445260645ffd5b34610126575f366003190112610126576020600254604051908152f35b34610126575f366003190112610126576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610126575f366003190112610126576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610126576040366003190112610126576105a461078e565b6024359033156104b8576001600160a01b03169081156104a557335f52600160205260405f20825f526020528060405f20556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b34610126575f366003190112610126576040515f6003548060011c906001811680156106d5575b6020831081146103535782855290811561033757506001146106805750819003601f01601f191681019067ffffffffffffffff8211818310176102ce576102ca82918260405282610764565b905060035f527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5f905b8282106106bf5750602091508201018261029a565b60018160209254838588010152019101906106aa565b91607f1691610634565b34610126575f366003190112610126576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610126575f366003190112610126577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361012657565b602435906001600160a01b038216820361012657565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03908116911690811490811561088a575b8115610857575b8115610824575b8115610818575b8115610812575090565b90501590565b61dead81149150610808565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681149150610801565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316811491506107fa565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316811491506107f3565b9091906001600160a01b03168015610ab7576001600160a01b038316918215610aa457815f525f60205260405f2054818110610a8b577fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60208386948694855f525f84520360405f2055845f525f825260405f20818154019055604051908152a367ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001642109081610a58575b5080610a25575b610a165767ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001642109182610a03575b50816109ce575b506109bf57565b6341f5f85960e11b5f5260045ffd5b90505f525f60205260405f20547f0000000000000000000000000000000000000000000000000000000000000000105f6109b8565b610a0e9192506107ba565b15905f6109b1565b63e09f033160e01b5f5260045ffd5b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316811415610979565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161490505f610972565b8263391434e360e21b5f5260045260245260445260645ffd5b63ec442f0560e01b5f525f60045260245ffd5b634b637e8f60e11b5f525f60045260245ffdfea2646970667358221220b9f80755c77ca3979d38298c127e358b30219bc004b8f6c9c948fb11fcc713d464736f6c634300082300336080604052346103c757610a4980380380610019816103cb565b9283398101906080818303126103c75780516001600160401b0381116103c757826100459183016103f0565b602082015190926001600160401b0382116103c7576100659183016103f0565b604082015160609092015190916001600160a01b038216918290036103c75783516001600160401b0381116102cd57600354600181811c911680156103bd575b60208210146102af57601f811161034f575b50602094601f82116001146102ec579481929394955f926102e1575b50508160011b915f199060031b1c1916176003555b82516001600160401b0381116102cd57600454600181811c911680156102c3575b60208210146102af57601f8111610241575b506020601f82116001146101de57819293945f926101d3575b50508160011b915f199060031b1c1916176004555b81156101c057600254908082018092116101ac5760207fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef915f9360025584845283825260408420818154019055604051908152a360405161060790816104428239f35b634e487b7160e01b5f52601160045260245ffd5b63ec442f0560e01b5f525f60045260245ffd5b015190505f80610134565b601f1982169060045f52805f20915f5b81811061022957509583600195969710610211575b505050811b01600455610149565b01515f1960f88460031b161c191690555f8080610203565b9192602060018192868b0151815501940192016101ee565b8181111561011b5760045f52601f820160051c7f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b602084106102a7575b81601f9101920160051c03905f5b82811061029a57505061011b565b5f8282015560010161028c565b5f915061027e565b634e487b7160e01b5f52602260045260245ffd5b90607f1690610109565b634e487b7160e01b5f52604160045260245ffd5b015190505f806100d3565b601f1982169560035f52805f20915f5b8881106103375750836001959697981061031f575b505050811b016003556100e8565b01515f1960f88460031b161c191690555f8080610311565b919260206001819286850151815501940192016102fc565b818111156100b75760035f52601f820160051c7fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b602084106103b5575b81601f9101920160051c03905f5b8281106103a85750506100b7565b5f8282015560010161039a565b5f915061038c565b90607f16906100a5565b5f80fd5b6040519190601f01601f191682016001600160401b038111838210176102cd57604052565b81601f820112156103c7578051906001600160401b0382116102cd5761041f601f8301601f19166020016103cb565b92828452602083830101116103c757815f9260208093018386015e830101529056fe6080806040526004361015610012575f80fd5b5f3560e01c90816306fdde03146103ef57508063095ea7b31461036d57806318160ddd1461035057806323b872dd14610271578063313ce5671461025657806370a082311461021f57806395d89b4114610104578063a9059cbb146100d35763dd62ed3e1461007f575f80fd5b346100cf5760403660031901126100cf576100986104e8565b6100a06104fe565b6001600160a01b039182165f908152600160209081526040808320949093168252928352819020549051908152f35b5f80fd5b346100cf5760403660031901126100cf576100f96100ef6104e8565b6024359033610514565b602060405160018152f35b346100cf575f3660031901126100cf576040515f6004548060011c90600181168015610215575b602083108114610201578285529081156101e55750600114610190575b50819003601f01601f191681019067ffffffffffffffff82118183101761017c57610178829182604052826104be565b0390f35b634e487b7160e01b5f52604160045260245ffd5b905060045f527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5f905b8282106101cf57506020915082010182610148565b60018160209254838588010152019101906101ba565b90506020925060ff191682840152151560051b82010182610148565b634e487b7160e01b5f52602260045260245ffd5b91607f169161012b565b346100cf5760203660031901126100cf576001600160a01b036102406104e8565b165f525f602052602060405f2054604051908152f35b346100cf575f3660031901126100cf57602060405160128152f35b346100cf5760603660031901126100cf5761028a6104e8565b6102926104fe565b6001600160a01b0382165f818152600160209081526040808320338452909152902054909260443592915f1981106102d0575b506100f99350610514565b83811061033557841561032257331561030f576100f9945f52600160205260405f2060018060a01b0333165f526020528360405f2091039055846102c5565b634a1406b160e11b5f525f60045260245ffd5b63e602df0560e01b5f525f60045260245ffd5b8390637dc7a0d960e11b5f523360045260245260445260645ffd5b346100cf575f3660031901126100cf576020600254604051908152f35b346100cf5760403660031901126100cf576103866104e8565b602435903315610322576001600160a01b031690811561030f57335f52600160205260405f20825f526020528060405f20556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b346100cf575f3660031901126100cf575f6003548060011c906001811680156104b4575b602083108114610201578285529081156101e5575060011461045f5750819003601f01601f191681019067ffffffffffffffff82118183101761017c57610178829182604052826104be565b905060035f527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5f905b82821061049e57506020915082010182610148565b6001816020925483858801015201910190610489565b91607f1691610413565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036100cf57565b602435906001600160a01b03821682036100cf57565b6001600160a01b03169081156105be576001600160a01b03169182156105ab57815f525f60205260405f205481811061059257817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92602092855f525f84520360405f2055845f525f825260405f20818154019055604051908152a3565b8263391434e360e21b5f5260045260245260445260645ffd5b63ec442f0560e01b5f525f60045260245ffd5b634b637e8f60e11b5f525f60045260245ffdfea264697066735822122045459cef98603cc298ead27019b152e1bf1e171d368ba26d9f39da4aeccf98f364736f6c634300082300336101a0806040523461085757611cd9803803809161001d828561085b565b833981016101a0828203126108575781516001600160401b038111610857578161004891840161087e565b602083015190916001600160401b0382116108575761006891840161087e565b9160408101519261007b606083016108d3565b610087608084016108d3565b9061009460a085016108d3565b906100a160c086016108d3565b9160e0860151936101008701519162ffffff8316809303610857576100c961012089016108d3565b916101408901519761ffff8916809903610857576100f76101806100f06101608d016108e7565b9b016108e7565b8b51909b6001600160401b0382116107525760035490600182811c9216801561084d575b60208310146107345781601f8493116107d7575b50602090601f8311600114610771575f92610766575b50508160011b915f199060031b1c1916176003555b8051906001600160401b0382116107525760045490600182811c92168015610748575b60208310146107345781601f8493116106be575b50602090601f8311600114610658575f9261064d575b50508160011b915f199060031b1c1916176004555b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00553360a052608085905260c05260e052610180526001600160a01b038216301015610646573091905b604080516001600160a01b03948516602082019081529490931690830152606080830191909152815261023c60808261085b565b5190209160405192602084019260ff60f81b845260018060601b03199060601b166021850152603584015260558301526055825261027b60758361085b565b905190206001600160a01b0316610100528061063357505f195b610120526001600160401b03906102b29063ffffffff164261091f565b16610140526001600160401b03906102d09063ffffffff164261091f565b1661016052331561062057610100516001600160a01b03161590811561060c575b81156105f8575b81156105e4575b81156105dc575b81156105d3575b610100516001600160a01b0316331480156105bf575b80156105ab575b8015610597575b801561058c575b8015610585575b61034b8260025461091f565b600255335f525f60205260405f208281540190556040518281525f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60203393a3600554828115158061057c575b61052f575b5050159182158115150361050f575b5050610160516001600160401b03164210806104fb575b806104e5575b6104d657610140516001600160401b0316421090816104ce575b50806104b7575b6104a8576040516113ac908161092d82396080518181816103d601528181610c5d01526111e1015260a05181818161082c01528181610bb30152610c14015260c0518181816109ad0152610b80015260e0518181816102490152610b4d0152610100518181816107e801528181610ae301526110490152610120518181816102110152610fd70152610140518181816101a70152610f820152610160518181816106540152610f43015261018051818181610a2601526110170152f35b6341f5f85960e11b5f5260045ffd5b50335f525f60205260405f205461012051106103eb565b90505f6103e4565b63e09f033160e01b5f5260045ffd5b50610180516001600160a01b03163314156103ca565b50610100516001600160a01b0316156103c4565b1561052357600854016008555b5f806103ad565b6008540360085561051c565b610538916108f8565b60066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f8805482019055335f908152604081208054929092039091558261039e565b50801515610399565b505f61033f565b5061dead3314610338565b5060e0516001600160a01b03163314610331565b5060c0516001600160a01b0316331461032a565b5060a0516001600160a01b03163314610323565b6001915061030d565b5f9150610306565b60e0516001600160a01b03161591506102ff565b60c0516001600160a01b03161591506102f8565b60a0516001600160a01b03161591506102f1565b63ec442f0560e01b5f525f60045260245ffd5b61064061271091856108f8565b04610295565b3090610208565b015190505f806101a7565b60045f9081528281209350601f198516905b8181106106a6575090846001959493921061068e575b505050811b016004556101bc565b01515f1960f88460031b161c191690555f8080610680565b9293602060018192878601518155019501930161066a565b828111156101915760045f52909150601f830160051c7f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b6020851061072c575b849392601f0160051c82900391015f5b82811061071c575050610191565b5f8183015585945060010161070e565b5f91506106fe565b634e487b7160e01b5f52602260045260245ffd5b91607f169161017d565b634e487b7160e01b5f52604160045260245ffd5b015190505f80610145565b60035f9081528281209350601f198516905b8181106107bf57509084600195949392106107a7575b505050811b0160035561015a565b01515f1960f88460031b161c191690555f8080610799565b92936020600181928786015181550195019301610783565b8281111561012f5760035f52909150601f830160051c7fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b60208510610845575b849392601f0160051c82900391015f5b82811061083557505061012f565b5f81830155859450600101610827565b5f9150610817565b91607f169161011b565b5f80fd5b601f909101601f19168101906001600160401b0382119082101761075257604052565b81601f82011215610857578051906001600160401b03821161075257604051926108b2601f8401601f19166020018561085b565b8284526020838301011161085757815f9260208093018386015e8301015290565b51906001600160a01b038216820361085757565b519063ffffffff8216820361085757565b8181029291811591840414171561090b57565b634e487b7160e01b5f52601160045260245ffd5b9190820180921161090b5756fe6080806040526004361015610012575f80fd5b5f3560e01c90816302d05d3f14610a145750806304dc0132146109dc57806306d6e63f1461099857806306fdde03146108dd578063095ea7b31461085b57806316eebd1e1461081757806316f0115b146107d357806318160ddd146107b657806318a89fe11461079457806323b872dd146106b5578063313ce5671461069a5780634e71d92d146106785780635a8b554a146106345780636ade07b0146106175780636ef61092146105df57806370a08231146105a85780638c02fda31461058b578063903550871461056457806395d89b4114610460578063a262f5f814610436578063a9059cbb14610405578063ad5c4648146103c1578063cba0e99614610394578063d54ad2a114610377578063dd62ed3e14610327578063e4fc6b6d146102e1578063ea4a6932146102b2578063efca2eed14610295578063f02ec76514610278578063f887ea4014610234578063f8b45b05146101fa578063fa8c00d4146101cf5763fe2a615114610187575f80fd5b346101cb575f3660031901126101cb57602060405167ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b5f80fd5b346101cb5760203660031901126101cb5760206101f26101ed610a55565b610e0c565b604051908152f35b346101cb575f3660031901126101cb5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101cb575f3660031901126101cb576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101cb575f3660031901126101cb576020600b54604051908152f35b346101cb575f3660031901126101cb576020600954604051908152f35b346101cb575f3660031901126101cb5760206040517422361d8afcc93343e962029a7edab20000000000008152f35b346101cb575f3660031901126101cb576102f9611118565b610301610c12565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b346101cb5760403660031901126101cb57610340610a55565b610348610a6b565b6001600160a01b039182165f908152600160209081526040808320949093168252928352819020549051908152f35b346101cb575f3660031901126101cb576020600a54604051908152f35b346101cb5760203660031901126101cb5760206103b76103b2610a55565b610ae1565b6040519015158152f35b346101cb575f3660031901126101cb576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101cb5760403660031901126101cb5761042b610421610a55565b6024359033610e80565b602060405160018152f35b346101cb5760203660031901126101cb57610301610452610a55565b61045a611118565b33611176565b346101cb575f3660031901126101cb576040515f6004548060011c9060018116801561055a575b6020831081146105465782855290811561052257506001146104c4575b6104c0836104b481850382610aab565b60405191829182610a81565b0390f35b91905060045f527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b915f905b808210610508575090915081016020016104b46104a4565b9192600181602092548385880101520191019092916104f0565b60ff191660208086019190915291151560051b840190910191506104b490506104a4565b634e487b7160e01b5f52602260045260245ffd5b91607f1691610487565b346101cb575f3660031901126101cb57602067ffffffffffffffff600c5416604051908152f35b346101cb575f3660031901126101cb576020600554604051908152f35b346101cb5760203660031901126101cb576001600160a01b036105c9610a55565b165f525f602052602060405f2054604051908152f35b346101cb5760203660031901126101cb576001600160a01b03610600610a55565b165f526007602052602060405f2054604051908152f35b346101cb575f3660031901126101cb576020600854604051908152f35b346101cb575f3660031901126101cb57602060405167ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101cb575f3660031901126101cb57610690611118565b6103013333611176565b346101cb575f3660031901126101cb57602060405160128152f35b346101cb5760603660031901126101cb576106ce610a55565b6106d6610a6b565b6001600160a01b0382165f818152600160209081526040808320338452909152902054909260443592915f198110610714575b5061042b9350610e80565b8381106107795784156107665733156107535761042b945f52600160205260405f2060018060a01b0333165f526020528360405f209103905584610709565b634a1406b160e11b5f525f60045260245ffd5b63e602df0560e01b5f525f60045260245ffd5b8390637dc7a0d960e11b5f523360045260245260445260645ffd5b346101cb575f3660031901126101cb576020604051670de0b6b3a76400008152f35b346101cb575f3660031901126101cb576020600254604051908152f35b346101cb575f3660031901126101cb576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101cb575f3660031901126101cb576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101cb5760403660031901126101cb57610874610a55565b602435903315610766576001600160a01b031690811561075357335f52600160205260405f20825f526020528060405f20556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b346101cb575f3660031901126101cb576040515f6003548060011c9060018116801561098e575b602083108114610546578285529081156105225750600114610930576104c0836104b481850382610aab565b91905060035f527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b915f905b808210610974575090915081016020016104b46104a4565b91926001816020925483858801015201910190929161095c565b91607f1691610904565b346101cb575f3660031901126101cb576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101cb5760203660031901126101cb576001600160a01b036109fd610a55565b165f526006602052602060405f2054604051908152f35b346101cb575f3660031901126101cb577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b600435906001600160a01b03821682036101cb57565b602435906001600160a01b03821682036101cb57565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b90601f8019910116810190811067ffffffffffffffff821117610acd57604052565b634e487b7160e01b5f52604160045260245ffd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b039081169116908114908115610bb1575b8115610b7e575b8115610b4b575b8115610b3f575b8115610b39575090565b90501590565b61dead81149150610b2f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681149150610b28565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681149150610b21565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681149150610b1a565b91908203918211610bf157565b634e487b7160e01b5f52601160045260245ffd5b91908201809211610bf157565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610dea576040516370a0823160e01b81523060048201526020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa908115610ddf575f91610dad575b50610caf60095491610ca9600a5484610be4565b90610be4565b90610cbd600b548093610be4565b60085492670de0b6b3a76400008410610d925750600b54610cdd91610c05565b5f600b558015610d8d57610cfc610cf484836112bc565b600554610c05565b92836005557422361d8afcc93343e962029a7edab20000000000008411610d7e577fc5d35a65af09b3042394b742529d10f7fbf9a37294d6b13e4d63d06f9909a15b93610d4b83606095610c05565b60095567ffffffffffffffff421667ffffffffffffffff19600c541617600c5560405192835260208301526040820152a1565b63ff4f097f60e01b5f5260045ffd5b505050565b9250809150610d9f575050565b610da891610c05565b600b55565b90506020813d602011610dd7575b81610dc860209383610aab565b810103126101cb57515f610c95565b3d9150610dbb565b6040513d5f823e3d90fd5b6304e255a160e01b5f5260045ffd5b81810292918115918404141715610bf157565b610e1581610ae1565b610e7b57610e3b6005549160018060a01b031691825f525f60205260405f205490610df9565b815f52600660205260405f2054905f8282019283129112908015821691151617610bf157610e78915f52600760205260405f20549060801d610be4565b90565b505f90565b90916001600160a01b038216908115611105576001600160a01b0384169283156110f257610eb0610eb691610ae1565b94610ae1565b825f525f60205260405f20548281106110d7578290845f525f6020520360405f2055835f525f60205260405f2082815401905583837fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020604051868152a360055482811515806110ce575b61109a575b5050159384158115150361107a575b505067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001642109081611047575b5080611014575b6110055767ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001642109182610ffd575b5081610fc8575b50610fb957565b6341f5f85960e11b5f5260045ffd5b90505f525f60205260405f20547f0000000000000000000000000000000000000000000000000000000000000000105f610fb2565b91505f610fab565b63e09f033160e01b5f5260045ffd5b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316811415610f73565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161490505f610f6c565b1561108e57600854016008555b5f80610f36565b60085403600855611087565b6110a391610df9565b835f52600660205260405f20818154019055845f52600660205260405f209081540390555f82610f27565b50801515610f22565b90508263391434e360e21b5f5260045260245260445260645ffd5b63ec442f0560e01b5f525f60045260245ffd5b634b637e8f60e11b5f525f60045260245ffd5b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054146111675760027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b633ee5aeb560e01b5f5260045ffd5b9061118082610e0c565b91821561127e5760018060a01b031690815f52600760205260405f206111a7848254610c05565b90556111b583600a54610c05565b600a5560405163a9059cbb60e01b5f9081526001600160a01b03928316600481905260248690529491927f0000000000000000000000000000000000000000000000000000000000000000169060209060448180855af160015f511481161561125f575b836040521561124d5750816020917ff7a40077ff7a04c7e61f6f26fb13774259ddf1b6bce9ecf26a8276cdd39926839352a3565b635274afe760e01b5f5260045260245ffd5b600181151661127557813b15153d151616611219565b833d5f823e3d90fd5b6040515f81526001600160a01b0392831693509116907ff7a40077ff7a04c7e61f6f26fb13774259ddf1b6bce9ecf26a8276cdd399268390602090a3565b5f19600160801b8209918160801b91828085109403938085039414611355578382111561133d578190600160801b9009815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b50634e487b715f52156003026011186020526024601cfd5b5080925015611362570490565b634e487b7160e01b5f52601260045260245ffdfea2646970667358221220396e3c6f67d7f9f47076b80dabf81678663a04268c7cabdf729ee0885815678b64736f6c634300082300339b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a26469706673582212200b8c8fe069618ae255f8cbdc864bf61edc5fed1436a7bb1b6b46741b3b91571264736f6c634300082300330000000000000000000000001f7d7550b1b028f7571e69a784071f0205fd2efa00000000000000000000000073991a25c818bf1f1128deaab1492d45638de0d30000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad73000000000000000000000000caf681a66d020601342297493863e78c959e5cb2e34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b5400000000000000000000000082d02fb13372809936eae79fc8a602c4a882192a000000000000000000000000aea517933b4edc28190d0c26828eee4b036e7916
0x6101206040526004361015610085575b3615610019575f80fd5b7f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b0316330361004b57005b60405162461bcd60e51b81526020600482015260126024820152710cae8d040dedcd8f240cce4deda40eecae8d60731b6044820152606490fd5b5f5f3560e01c8063024d11e914611bf157806306d6e63f14611bc857806307e152b414611b8f57806308ccb24f1461128157806309197a8114611b6d5780630aff01fe14611b435780630fe9d73314611b255780631043c81614611b015780631471320614611ad857806315a0ea6a14611664578063249d39e91461164757806324f33ce714611510578063283d6fef146114365780633b151b56146113db57806342275ce1146113565780634db2624f14610b0957806358a4251c1461133a5780635ecd1f201461131d5780635ef37d1514611300578063634282af146112bc5780636882a8881461129e578063692e5b9a146112815780636a27246214610f695780636a97c4c514610d6a578063715018a614610d10578063748747e614610ca85780637d0f7a8814610bcd5780637e42589514610ba35780637f1e9ef614610b5e57806388f4c13714610b355780638da5cb5b14610b0e5780639185f59814610b095780639496700514610aeb5780639818739b14610acd5780639b083ec914610a9f5780639b47c69d14610a835780639f181b5e14610a65578063a1634b1414610a46578063aced166114610a1d578063ad5c4648146109d8578063af6e40d014610998578063c45a015514610953578063c50497ae1461092d578063c57981b514610911578063c6d99bd8146108eb578063cce7ec1314610630578063d64efe91146105f5578063efc24b8c146105d2578063f01e9a8b14610592578063f2fde38b1461050c578063f887ea40146104c7578063f8be4abc146104845763fa461e33146102d7575061000f565b34610481576060366003190112610481576004356024356044356001600160401b0381116104465761030d903690600401613061565b6001546001600160a01b0316330361044a57816020918101031261044657356001600160a01b03811690819003610446578084526009602052604084206003810154336001600160a01b0390911603610411576005015460ff169081156103ea5780915b156103e457507f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad73925b8481136103c9575b50508281136103af578280f35b6103c39133906001600160a01b031661340f565b5f808280f35b6103dd9133906001600160a01b031661340f565b5f806103a2565b9261039a565b7f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad7391610371565b60405162461bcd60e51b815260206004820152600d60248201526c0e0deded840dad2e6dac2e8c6d609b1b6044820152606490fd5b8380fd5b60405162461bcd60e51b815260206004820152600f60248201526e1d5b995e1c1958dd1959081c1bdbdb608a1b6044820152606490fd5b80fd5b5034610481576020366003190112610481576020906001600160401b03906040906001600160a01b036104b561308e565b16815260078452205416604051908152f35b50346104815780600319360112610481576040517f000000000000000000000000caf681a66d020601342297493863e78c959e5cb26001600160a01b03168152602090f35b50346104815760203660031901126104815761052661308e565b61052e6133e9565b6001600160a01b0316801561057e5781546001600160a01b03198116821783556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b631e4fbdf760e01b82526004829052602482fd5b5034610481576020366003190112610481576105ac61308e565b6105b46133e9565b60018060a01b03166001600160601b0360a01b600354161760035580f35b50346104815780600319360112610481576020604051670de0b6b3a76400008152f35b503461048157806003193601126104815760206040517fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b548152f35b5060403660031901126104815761064561308e565b61064d61339b565b6001600160a01b0390811680835260096020526040832080549192909116156108dc5760643402348104606414341517156108c857612710900490837f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b0316803b156108c4578160049160405192838092630d0e30db60e41b825234905af180156108b9576108a4575b508390526005602052604084206106f6838254613286565b905561070282346131cb565b60406005830191600360ff84541615940160018060a01b038154166001600160601b0360a01b600154161760015560018060a01b03905416845f14610889576401000276a4915b88845196896020890152602088526107618689613107565b610781865198899687958694630251596160e31b8652336004870161320d565b03925af190811561087e5785928692610846575b50600180546001600160a01b03191690555460ff161561083657506107b990613263565b915b602435831061082757602093507f7ce543d1780f3bdc3dac42da06c95da802653cd1b212b8d74ec3e3c33ad7095c6040518061080b86339634846040919493926060820195825260208201520152565b0390a360015f516020616fbb5f395f51905f5255604051908152f35b638199f5f360e01b8452600484fd5b6108409150613263565b916107bb565b60ff935061086d91925060403d604011610877575b6108658183613107565b8101906131f7565b9290929190610795565b503d61085b565b6040513d87823e3d90fd5b73fffd8963efd1fc6a506488495d951d5263988d2591610749565b816108ae91613107565b61044657835f6106de565b6040513d84823e3d90fd5b5080fd5b634e487b7160e01b84526011600452602484fd5b638698bf3760e01b8352600483fd5b503461048157806003193601126104815760206040516a0269b982506fa7d2c535288152f35b5034610481578060031936011261048157602060405160648152f35b50346104815780600319360112610481576020604051676765c793fa10079d601b1b8152f35b50346104815780600319360112610481576040517f0000000000000000000000001f7d7550b1b028f7571e69a784071f0205fd2efa6001600160a01b03168152602090f35b5034610481576020366003190112610481576109b261308e565b6109ba6133e9565b60018060a01b03166001600160601b0360a01b600454161760045580f35b50346104815780600319360112610481576040517f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b03168152602090f35b50346104815780600319360112610481576006546040516001600160a01b039091168152602090f35b50346104815780600319360112610481576020604051620d899f198152f35b50346104815780600319360112610481576020600a54604051908152f35b50346104815780600319360112610481576020604051603c8152f35b5034610481576020366003190112610481576020610ac3610abe61308e565b6132c9565b6040519015158152f35b5034610481578060031936011261048157602060405162031da88152f35b50346104815780600319360112610481576020600254604051908152f35b6130a4565b5034610481578060031936011261048157546040516001600160a01b039091168152602090f35b50346104815780600319360112610481576004546040516001600160a01b039091168152602090f35b50346104815780600319360112610481576040517f00000000000000000000000073991a25c818bf1f1128deaab1492d45638de0d36001600160a01b03168152602090f35b50346104815760203660031901126104815760406020916004358152600b83522054604051908152f35b503461048157602036600319011261048157610160906040906001600160a01b03610bf661308e565b16815260096020522060ff60018060a01b038254169160018060a01b0360018201541690600281015460018060a01b036003830154169060056004840154930154936040519687526020870152604086015260608501526080840152818116151560a08401526001600160401b038160081c1660c0840152818160481c1660e08401526001600160601b038160501c1661010084015261ffff8160b01c1661012084015260c01c161515610140820152f35b503461048157602036600319011261048157610cc261308e565b610cca6133e9565b600680546001600160a01b0319166001600160a01b039290921691821790557fdc3dba1d64dd67c0dc8b12621edd0c6ca4303a9073c3a8fcac38115e73d67b6b8280a280f35b5034610481578060031936011261048157610d296133e9565b80546001600160a01b03198116825581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b5034610481576080366003190112610481576024356001600160a01b0381169060043590828103610446576044356064356001600160401b038111610f6557610db7903690600401613061565b91610dc061339b565b804211610f565791610e4c610e5292610e5b94878a52600c60205260408a20546040519060208201923084524660408401528a60608401528b608084015260a083015260c082015260c08152610e1760e082613107565b5190207f19457468657265756d205369676e6564204d6573736167653a0a3332000000008a52601c52603c8920923691613293565b90613496565b909291926134d0565b6004546001600160a01b03908116911603610f4757818452600b6020526040842054908115610f3857828552600c6020526040852080549060018201809211610f245755828552600b6020908152604086208690557fcc2cd38d2704f26cf3668967a7669231ee3c13ffa672e1f5b5daf943ab7dd7b4929091610f099082907f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b031661340f565b604051908152a360015f516020616fbb5f395f51905f525580f35b634e487b7160e01b87526011600452602487fd5b6312d37ee560e31b8552600485fd5b630de54e5d60e31b8452600484fd5b630de54e5d60e31b8752600487fd5b8580fd5b503461048157606036600319011261048157610f8361308e565b9060243591610f9061339b565b6001600160a01b039081168083526009602052604083208054919492909116156108dc576040516323b872dd60e01b84523360045230602452604483905260208460648180895af1906001855114821615611260575b604052836060521561124c5760058101546003919091018054600180546001600160a01b0319166001600160a01b03928316179055905460ff929092169161107091604091168315611231576401000276a4905b825191886020840152602083526110518484613107565b878451809681958294630251596160e31b84528b8b306004870161320d565b03925af19182156112265784918593611203575b50600180546001600160a01b0319169055156111f357506110a490613263565b925b60648402848104606414851517156108c8576127106110e0910480958386526005602052604086206110d9838254613286565b90556131cb565b9260443584106111e4577f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b0316803b156108c457818091602460405180948193632e1a7d4d60e01b83528a60048401525af180156108b9579082916111cf575b50808086335af1611156613143565b501561119f5760408051928352602083810195909552820183905233917f9be8a5ca22b7e6e81f04b5879f0248227bb770114291bd47dfaee4c3a82ad60e90806060810161080b565b60405162461bcd60e51b815260206004820152600860248201526732ba34103c3332b960c11b6044820152606490fd5b816111d991613107565b61048157805f611147565b638199f5f360e01b8152600490fd5b6111fd9150613263565b926110a6565b90925061121f915060403d604011610877576108658183613107565b915f611084565b6040513d86823e3d90fd5b73fffd8963efd1fc6a506488495d951d5263988d259061103a565b635274afe760e01b83526004849052602483fd5b90600181151661127857853b15153d15161690610fe6565b503d84823e3d90fd5b50346104815780600319360112610481576020604051610e108152f35b50346104815780600319360112610481576020604051620d89a08152f35b50346104815760203660031901126104815760043590600a548210156104815760206112e7836130bf565b905460405160039290921b1c6001600160a01b03168152f35b5034610481578060031936011261048157602060405161012c8152f35b503461048157806003193601126104815760206040516103e88152f35b5034610481578060031936011261048157602060405160328152f35b5034610481576020366003190112610481576004356113736133e9565b606481116113ad576020817fad26ff82091c6400b17a1f43f0e737a6a0767dae08becc02811765dfeef14b2592600855604051908152a180f35b60405162461bcd60e51b81526020600482015260066024820152656d617820312560d01b6044820152606490fd5b5034610481576020366003190112610481576004356113f86133e9565b61138881116114075760025580f35b60405162461bcd60e51b81526020600482015260076024820152666d61782035302560c81b6044820152606490fd5b5034610481576020366003190112610481576001600160a01b0361145861308e565b1681526009602090815260408083206003015490516370a0823160e01b81526001600160a01b039182166004820152929190839060249082907f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad73165afa90811561150457906114cd575b602090604051908152f35b506020813d6020116114fc575b816114e760209383613107565b810103126114f857602090516114c2565b5f80fd5b3d91506114da565b604051903d90823e3d90fd5b50346104815760203660031901126104815761152a61308e565b6001600160a01b031680825260096020526040822060050154908290819060c084901c60ff16611590575b6080846001600160401b0387818761ffff604051956001600160601b038160501c16875260b01c166020860152166040840152166060820152f35b60405163fe2a615160e01b81529194509150602081600481855afa90811561122657600491602091869161162a575b509260405192838092632d45aaa560e11b82525afa908115611226576001600160401b0392918391608096916115fb575b509450819250611555565b61161d915060203d602011611623575b6116158183613107565b8101906131d8565b5f6115f0565b503d61160b565b6116419150823d8411611623576116158183613107565b5f6115bf565b503461048157806003193601126104815760206040516127108152f35b50346104815760203660031901126104815761167e61308e565b61168661339b565b6001600160a01b03818116808452600960205260408420805491939290911615611ac95760ff600582015460481c166003811015611ab55760020361197a575081835260076020526001600160401b036040842054169060018060a01b03600654163314610e10830180841161194f574211901592838094611972575b611963578015159081611939575b5061192a578385526007602052604085206001600160401b03804216166001600160401b03198254161790558385526005602052604085205491848652600560205285604081205561177361271061176b60025486613273565b0480946131cb565b91869481611922575b5080611917575b8061190e575b6118f3575b836118ba575b82611879575b816117fb575b506117e37fb46ceabe7d0b214c64aca2326316e0baa0fb2623ab086ec6eb69b6deaa13d41993604051938493846040919493926060820195825260208201520152565b0390a25b60015f516020616fbb5f395f51905f525580f35b6118309082907f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b031661340f565b833b156118755760405163e4fc6b6d60e01b815285908181600481838a5af180156108b957611860575b506117a0565b8161186a91613107565b61187557845f61185a565b8480fd5b6003546118b59084906001600160a01b03908116907f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad731661340f565b61179a565b6118ee84337f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b031661340f565b611794565b91925061190861271061176b60085486613273565b9161178e565b50821515611789565b506008541515611783565b90505f61177c565b631a44723960e01b8552600485fd5b905061012c810180911161194f5742105f611711565b634e487b7160e01b86526011600452602486fd5b637cdcdc8f60e01b8652600486fd5b508115611703565b7f1ac537f0ad67b64ac68a04587ff3a4cb6977de22eb2c37ee560897a92c6d07c79150604090838552600560205281852054848652600560205285838120556119d36127106119cb60025484613273565b0480926131cb565b9181611a74575b60028101805490919015611a1f575082611a01575b505b82519182526020820152a26117e7565b548652600b602052828620611a17838254613286565b90555f6119ef565b90508280611a2f575b50506119f1565b600190910154611a6d91906001600160a01b03908116907f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad731661340f565b5f82611a28565b600354611ab09083906001600160a01b03908116907f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad731661340f565b6119da565b634e487b7160e01b85526021600452602485fd5b638698bf3760e01b8452600484fd5b503461048157806003193601126104815760206040516d6a17b32fc5d4d48f7124aa2fdba08152f35b5034610481578060031936011261048157602060405168056bc75e2d631000008152f35b50346104815780600319360112610481576020600854604051908152f35b50346104815760203660031901126104815760406020916004358152600c83522054604051908152f35b503461048157806003193601126104815760206040516601c6bf526340008152f35b5034610481576020366003190112610481576020906040906001600160a01b03611bb761308e565b168152600583522054604051908152f35b50346104815780600319360112610481576003546040516001600160a01b039091168152602090f35b506101603660031901126114f8576004356001600160401b0381116114f857611c1e903690600401613061565b9060e0526024356001600160401b0381116114f857611c41903690600401613061565b610100526044356001600160401b0381116114f857611c64903690600401613061565b6064356001600160a01b03811681036114f8576084356001600160401b0381116114f857611c96903690600401613061565b929091600360a43510156114f85760803660c31901126114f857611cb861339b565b5f60c0526601c6bf526340003410613052575f8080806601c6bf5263400060018060a01b03600354165af1611ceb613143565b501561302257600160a435148061301a575b61300b5760a4356002148080612ff0575b612fe157670de0b6b3a76400006001600160601b03611d2b6133d3565b16108015612fbf575b612f5a5761ffff611d43613172565b16151580612f94575b612f5a5761ffff611d5b613172565b161580612f7e575b612f5a5761ffff611d72613172565b16151580612f69575b612f5a57610e1063ffffffff611d8f613183565b1611612f5a57603c63ffffffff611da4613197565b1611612f5a5760405160208101903360601b825261014435603482015260348152611dd0605482613107565b5190208115612d33576003546001600160a01b0316611ded613172565b90611df6613183565b90611dff613197565b60405193611cd993848601928684106001600160401b038511176129c8578f8f9261ffff61018095611e6363ffffffff96611e5088968e9d8e6152e290396101a08c526101a08c019060e0516131ab565b908a820360208c015261010051906131ab565b676765c793fa10079d601b1b60408a01526001600160a01b037f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad73811660608b015260808a019a909a527f000000000000000000000000caf681a66d020601342297493863e78c959e5cb28a1660a08a01527f0000000000000000000000001f7d7550b1b028f7571e69a784071f0205fd2efa90991660c08901527fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b5460e089015260646101008901523361012089015216610140870152166101608501521691015203905ff58015612960576001600160a01b031660c0526001925b82965f6080528115155f14612d2857611f78913691613293565b602081519101206080525b60a4351580928193612d1d575b81612d0b575b50612d03575b7f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad7360a081905260c0516001600160a01b0391821691161015612cfa5760c051925b60a05160c0516001600160a01b0391821691161015612cf15760a051925b60a05160c0516001600160a01b0391821691161015612cdc576a0269b982506fa7d2c53528935b6040516309f56ab160e11b81526001600160a01b0387811660048301528281166024830152606460448301819052968116968201879052909590602090879060849082905f907f00000000000000000000000073991a25c818bf1f1128deaab1492d45638de0d3165af1958615612960575f96612c98575b50604051633850c7bd60e01b815260e0816004816001600160a01b038b165afa908115612960575f91612c05575b506001600160a01b031603612bf65760a05160c0516001600160a01b0391821691161015612bec5762031da7195b60a05160c0516001600160a01b0391821691161015612be357620d89a05b60405163095ea7b360e01b5f9081526001600160a01b037f00000000000000000000000073991a25c818bf1f1128deaab1492d45638de0d38116600452676765c793fa10079d601b1b60245260c0516020929160449183918291165af19060015f5114821615612bca575b60405215612a7f575b60a05160c0516001600160a01b0391821691161015612a7857676765c793fa10079d601b1b915b60a05160c0516001600160a01b0391821691161015612a66575f935b604051996121d88b6130eb565b60018060a01b03168a5260018060a01b031660208a0152606460408a015260020b606089015260020b608088015260a087015260c08601525f60e08601525f610100860152306101208601524261014086015261014060405195634418b22b60e11b875260018060a01b03815116600488015260018060a01b03602082015116602488015262ffffff6040820151166044880152606081015160020b6064880152608081015160020b608488015260a081015160a488015260c081015160c488015260e081015160e488015261010081015161010488015260018060a01b03610120820151166101248801520151610144860152608085610164815f60018060a01b037f00000000000000000000000073991a25c818bf1f1128deaab1492d45638de0d3165af1948515612960575f95612a14575b505f8060405160208101906323b872dd60e01b825230602482015261dead604482015288606482015260648152612345608482613107565b5190827f00000000000000000000000073991a25c818bf1f1128deaab1492d45638de0d36001600160a01b03165af161237c613143565b50156129e35760405185815260c0516001600160a01b0316907f0a6164dbc83f96b63add7bc06e3302e5e94b0d0f70d860b260fa44fa79fd466e90602090a2156129dc5786905b6123cb6133d3565b906123d4613172565b604051936123e1856130eb565b338552602085019060018060a01b031681526040850193608051855260a060056060880193600180841b038b168552608089018c8152600180851b03845116600180861b0360c0511610848b015260c08a01956001600160401b034316875260e08b019960ff60a435168b526001600160601b036101008d019716875261ffff6101208d01991689526101408c019915158a52600180871b0360c051165f52600960205260405f2093600180881b038d6001808a1b03905116166001600160601b03881b865416178555600180881b039051166001850190600180891b03166001600160601b03881b825416179055516002840155600180861b039051166003830190600180871b03166001600160601b03861b8254161790555160048201550196015115159169ff00000000000000000068ffffffffffffffff008854925160081b16965160481b16916001600160601b0360501b905160501b169361ffff60b01b905160b01b169460ff60c01b9051151560c01b169560ff60c01b199361ffff60b01b199260ff6001600160601b0360501b1992169069ffffffffffffffffffff19161716171617161717179055600a54680100000000000000008110156129c8578060016125b59201600a556130bf565b815460c0516001600160a01b0390811660039390931b92831b921b191617905561297f575b61260e61266b966125fb604051996101a08b526101a08b019060e0516131ab565b9089820360208b015261010051906131ab565b94608051604089015260018060a01b0316606088015260018060a01b0316608087015260a086015260018060a01b0360a0511660018060a01b0360c051161060c086015260ff60a4351660e08601528483036101008601526131ab565b60c4356001600160601b0381168091036114f85761012083015260e43561ffff81168091036114f8576101408301526101043563ffffffff81168091036114f8576101608301526101243563ffffffff81168091036114f8576101808301527f65eee5d43c73752f824fd2c5152f1c850434e9b514d3b66f2330d03a7c49598933928060018060a01b0360c05116930390a36601c6bf526340003411612733575b60015f516020616fbb5f395f51905f525560405160c0516001600160a01b03168152602090f35b60c0516001600160a01b03165f908152600960205260409020346601c6bf52633fff198101929190831161296b57606483028381046064148415171561296b5760a051612710909104906001600160a01b03163b156114f857604051630d0e30db60e41b815260a0515f908290600490829089906001600160a01b03165af1801561296057612949575b506127eb9060018060a01b0360c0511684526005602052604084206127e3828254613286565b9055846131cb565b60406005830191600360ff84541615940160018060a01b038154166001600160601b0360a01b600154161760015560018060a01b03905416845f1461292e576401000276a4915b8684519660018060a01b0360c051166020890152602088526128548689613107565b612874865198899687958694630251596160e31b8652336004870161320d565b03925af190811561292357839284926128fb575b50600180546001600160a01b03191690555460ff16156128ec57506128ac90613263565b505060405190815233907f643bfd7dd70fce7d617c64985256278e07a766c14fcb4b84005ec0ff84bbf543602060018060a01b0360c0511692a35f61270c565b6128f69150613263565b6128ac565b60ff935061291991925060403d604011610877576108658183613107565b9290929190612888565b6040513d85823e3d90fd5b73fffd8963efd1fc6a506488495d951d5263988d2591612832565b6129569193505f90613107565b5f916127eb6127bd565b6040513d5f823e3d90fd5b634e487b7160e01b5f52601160045260245ffd5b61012b19420142811161296b5760c0516001600160a01b03165f908152600760205260409020805467ffffffffffffffff19166001600160401b039092169190911790556125da565b634e487b7160e01b5f52604160045260245ffd5b5f906123c3565b60405162461bcd60e51b8152602060048201526009602482015268313ab937103c3332b960b91b6044820152606490fd5b9094506080813d608011612a5e575b81612a3060809383613107565b810103126114f857602081519101516fffffffffffffffffffffffffffffffff8116036114f857935f61230d565b3d9150612a23565b676765c793fa10079d601b1b936121cb565b5f916121af565b60405163095ea7b360e01b5f9081526001600160a01b037f00000000000000000000000073991a25c818bf1f1128deaab1492d45638de0d38116600452602482905260c0516020929160449183918291165af19060015f5114821615612ba7575b60405215612b5b5760405163095ea7b360e01b5f9081526001600160a01b037f00000000000000000000000073991a25c818bf1f1128deaab1492d45638de0d38116600452676765c793fa10079d601b1b60245260c0516020929160449183918291165af19060015f5114821615612b7b575b604052612188575b635274afe760e01b5f90815260c0516001600160a01b0316600452602490fd5b906001811516612b9e5760c0516001600160a01b03163b15153d15161690612b53565b503d5f823e3d90fd5b906001811516612b9e5760c0516001600160a01b03163b15153d15161690612ae0565b9060018060a01b0360c051163b15153d1516169061217f565b62031da8612114565b620d899f196120f6565b6334c4589960e01b5f5260045ffd5b905060e0813d60e011612c90575b81612c2060e09383613107565b810103126114f8578051906001600160a01b03821682036114f85760208101518060020b036114f857612c5560408201613487565b50612c6260608201613487565b50612c6f60808201613487565b5060a081015160ff8116036114f85760c00151801515036114f8575f6120c8565b3d9150612c13565b9095506020813d602011612cd4575b81612cb460209383613107565b810103126114f857516001600160a01b03811681036114f857945f61209a565b3d9150612ca7565b6d6a17b32fc5d4d48f7124aa2fdba093612022565b60c05192611ffb565b60a05192611fdd565b339550611f9c565b6001600160a01b03161590505f611f96565b608051159150611f90565b50505f608052611f83565b61ffff612d3e613172565b161580612f45575b15612dcc57604051610a498082018281106001600160401b038211176129c8578291614899833960808152612d97612d858d608084019060e0516131ab565b8281036020840152610100518d6131ab565b90676765c793fa10079d601b1b604082015260603091015203905ff58015612960576001600160a01b031660c0525f92611f5e565b612dd4613172565b612ddc613183565b90612de5613197565b9060018060a01b036003541691604051936112d285018581106001600160401b038211176129c85785948f8f9463ffffffff6101a09561ffff612e466064996125fb85978e6112d2906135c790396101c08b526101c08b019060e0516131ab565b676765c793fa10079d601b1b6040890152306060890152336080890152991660a08701521660c08501521660e08301526001600160a01b037f0000000000000000000000001f7d7550b1b028f7571e69a784071f0205fd2efa81166101008401527f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad7381166101208401527f000000000000000000000000caf681a66d020601342297493863e78c959e5cb2166101408301526101608201527fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54610180820152015203905ff58015612960576001600160a01b031660c052600192611f5e565b5063ffffffff612f53613197565b1615612d46565b63019af63760e01b5f5260045ffd5b5063ffffffff612f77613183565b1615611d7b565b5063ffffffff612f8c613183565b161515611d63565b50603261ffff612fa2613172565b161080611d4c57506103e861ffff612fb8613172565b1611611d4c565b5068056bc75e2d631000006001600160601b03612fda6133d3565b1611611d34565b631d0f9b3760e31b5f5260045ffd5b5082151580611d0e57506001600160a01b0382161515611d0e565b6375ebfc4960e01b5f5260045ffd5b508115611cfd565b60405162461bcd60e51b81526020600482015260086024820152673332b2903c3332b960c11b6044820152606490fd5b630bba69fb60e01b5f5260045ffd5b9181601f840112156114f8578235916001600160401b0383116114f857602083818601950101116114f857565b600435906001600160a01b03821682036114f857565b346114f8575f3660031901126114f857602060405160648152f35b600a548110156130d757600a5f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b61016081019081106001600160401b038211176129c857604052565b90601f801991011681019081106001600160401b038211176129c857604052565b6001600160401b0381116129c857601f01601f191660200190565b3d1561316d573d9061315482613128565b916131626040519384613107565b82523d5f602084013e565b606090565b60e43561ffff811681036114f85790565b6101043563ffffffff811681036114f85790565b6101243563ffffffff811681036114f85790565b908060209392818452848401375f828201840152601f01601f1916010190565b9190820391821161296b57565b908160209103126114f857516001600160401b03811681036114f85790565b91908260409103126114f8576020825192015190565b93909260c0959260209460018060a01b03168652151584860152604085015260018060a01b0316606084015260a0608084015280519182918260a0860152018484015e5f828201840152601f01601f1916010190565b600160ff1b811461296b575f0390565b8181029291811591840414171561296b57565b9190820180921161296b57565b92919261329f82613128565b916132ad6040519384613107565b8294818452818301116114f8578281602093845f960137010152565b6001600160a01b039081165f9081526009602052604090208054909116156133965760038101546040516370a0823160e01b81526001600160a01b0391821660048201529190602090839060249082907f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad73165afa918215612960575f92613361575b506005015460501c6001600160601b0316111590565b9091506020813d60201161338e575b8161337d60209383613107565b810103126114f8575190600561334b565b3d9150613370565b505f90565b60025f516020616fbb5f395f51905f5254146133c45760025f516020616fbb5f395f51905f5255565b633ee5aeb560e01b5f5260045ffd5b60c4356001600160601b03811681036114f85790565b5f546001600160a01b031633036133fc57565b63118cdaa760e01b5f523360045260245ffd5b916040519163a9059cbb60e01b5f5260018060a01b031660045260245260205f60448180865af19060015f511482161561346f575b6040521561344f5750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b906001811516612b9e57823b15153d15161690613444565b519061ffff821682036114f857565b81519190604183036134c6576134bf9250602082015190606060408401519301515f1a90613544565b9192909190565b50505f9160029190565b600481101561353057806134e2575050565b600181036134f95763f645eedf60e01b5f5260045ffd5b60028103613514575063fce698f760e01b5f5260045260245ffd5b60031461351e5750565b6335e2f38360e21b5f5260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116135bb579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15612960575f516001600160a01b038116156135b157905f905f90565b505f906001905f90565b5050505f916003919056fe6101808060405234610723576112d2803803809161001d8285610727565b833981016101c0828203126107235781516001600160401b038111610723578161004891840161074a565b602083015190916001600160401b0382116107235761006891840161074a565b9160408101519261007b6060830161079f565b926100886080840161079f565b9060a084015161ffff8116809103610723576100a660c086016107b3565b6100b260e087016107b3565b916100c0610100880161079f565b956100ce610120890161079f565b956100dc6101408a0161079f565b906100ea6101608b0161079f565b926101a06101808c01519b01519762ffffff8916809903610723578051906001600160401b03821161061e5760035490600182811c92168015610719575b60208310146106005781601f8493116106a3575b50602090601f831160011461063d575f92610632575b50508160011b915f199060031b1c1916176003555b8051906001600160401b03821161061e5760045490600182811c92168015610614575b60208310146106005781601f84931161058a575b50602090601f8311600114610524575f92610519575b50508160011b915f199060031b1c1916176004555b60e05233610100526101205261014052806104eb57505f195b6080526001600160401b03906101fe9063ffffffff16426107c4565b1660a0526001600160401b039061021b9063ffffffff16426107c4565b1660c0526001600160a01b0382163010156104e4573091905b604080516001600160a01b039485166020820190815294909316908301526060808301919091528152610268608082610727565b5190209160405192602084019260ff60f81b845260018060601b03199060601b16602185015260358401526055830152605582526102a7607583610727565b905190206001600160a01b0390811661016052169081156104d1575f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020836102f486956002546107c4565b60025584845283825260408420818154019055604051908152a360c0516001600160401b03164210806104bd575b806104a8575b6104995760a0516001600160401b03164210908161040c575b816103f5575b506103e657604051610b0090816107d2823960805181818161014101526109dd015260a0518181816101020152610988015260c0518181816103c80152610949015260e0518181816107350152610a2801526101005181818161055c015261088c01526101205181818161017901526108590152610140518181816106f40152610826015261016051818181610518015281816107bc0152610a5a0152f35b6341f5f85960e11b5f5260045ffd5b90505f525f60205260405f2054608051105f610347565b610160519091506001600160a01b031681148015610484575b801561046f575b801561045a575b801561044f575b8015610448575b1590610341565b505f610441565b5061dead811461043a565b50610140516001600160a01b03168114610433565b50610120516001600160a01b0316811461042c565b50610100516001600160a01b03168114610425565b63e09f033160e01b5f5260045ffd5b5060e0516001600160a01b0316811415610328565b50610160516001600160a01b031615610322565b63ec442f0560e01b5f525f60045260245ffd5b3090610234565b8089029089820414891517156105055761271090046101e2565b634e487b7160e01b5f52601160045260245ffd5b015190505f806101b4565b60045f9081528281209350601f198516905b818110610572575090846001959493921061055a575b505050811b016004556101c9565b01515f1960f88460031b161c191690555f808061054c565b92936020600181928786015181550195019301610536565b8281111561019e5760045f52909150601f830160051c7f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b602085106105f8575b849392601f0160051c82900391015f5b8281106105e857505061019e565b5f818301558594506001016105da565b5f91506105ca565b634e487b7160e01b5f52602260045260245ffd5b91607f169161018a565b634e487b7160e01b5f52604160045260245ffd5b015190505f80610152565b60035f9081528281209350601f198516905b81811061068b5750908460019594939210610673575b505050811b01600355610167565b01515f1960f88460031b161c191690555f8080610665565b9293602060018192878601518155019501930161064f565b8281111561013c5760035f52909150601f830160051c7fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b60208510610711575b849392601f0160051c82900391015f5b82811061070157505061013c565b5f818301558594506001016106f3565b5f91506106e3565b91607f1691610128565b5f80fd5b601f909101601f19168101906001600160401b0382119082101761061e57604052565b81601f82011215610723578051906001600160401b03821161061e576040519261077e601f8401601f191660200185610727565b8284526020838301011161072357815f9260208093018386015e8301015290565b51906001600160a01b038216820361072357565b519063ffffffff8216820361072357565b919082018092116105055756fe6080806040526004361015610012575f80fd5b5f3560e01c90816302d05d3f146107235750806306d6e63f146106df57806306fdde031461060d578063095ea7b31461058b57806316eebd1e1461054757806316f0115b1461050357806318160ddd146104e657806323b872dd14610407578063313ce567146103ec5780635a8b554a146103a857806370a082311461037157806395d89b4114610256578063a9059cbb14610225578063cba0e996146101f8578063dd62ed3e146101a8578063f887ea4014610164578063f8b45b051461012a5763fe2a6151146100e2575f80fd5b34610126575f36600319011261012657602060405167ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b5f80fd5b34610126575f3660031901126101265760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b34610126575f366003190112610126576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610126576040366003190112610126576101c161078e565b6101c96107a4565b6001600160a01b039182165f908152600160209081526040808320949093168252928352819020549051908152f35b3461012657602036600319011261012657602061021b61021661078e565b6107ba565b6040519015158152f35b346101265760403660031901126101265761024b61024161078e565b60243590336108bd565b602060405160018152f35b34610126575f366003190112610126576040515f6004548060011c90600181168015610367575b6020831081146103535782855290811561033757506001146102e2575b50819003601f01601f191681019067ffffffffffffffff8211818310176102ce576102ca82918260405282610764565b0390f35b634e487b7160e01b5f52604160045260245ffd5b905060045f527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5f905b8282106103215750602091508201018261029a565b600181602092548385880101520191019061030c565b90506020925060ff191682840152151560051b8201018261029a565b634e487b7160e01b5f52602260045260245ffd5b91607f169161027d565b34610126576020366003190112610126576001600160a01b0361039261078e565b165f525f602052602060405f2054604051908152f35b34610126575f36600319011261012657602060405167ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b34610126575f36600319011261012657602060405160128152f35b346101265760603660031901126101265761042061078e565b6104286107a4565b6001600160a01b0382165f818152600160209081526040808320338452909152902054909260443592915f198110610466575b5061024b93506108bd565b8381106104cb5784156104b85733156104a55761024b945f52600160205260405f2060018060a01b0333165f526020528360405f20910390558461045b565b634a1406b160e11b5f525f60045260245ffd5b63e602df0560e01b5f525f60045260245ffd5b8390637dc7a0d960e11b5f523360045260245260445260645ffd5b34610126575f366003190112610126576020600254604051908152f35b34610126575f366003190112610126576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610126575f366003190112610126576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610126576040366003190112610126576105a461078e565b6024359033156104b8576001600160a01b03169081156104a557335f52600160205260405f20825f526020528060405f20556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b34610126575f366003190112610126576040515f6003548060011c906001811680156106d5575b6020831081146103535782855290811561033757506001146106805750819003601f01601f191681019067ffffffffffffffff8211818310176102ce576102ca82918260405282610764565b905060035f527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5f905b8282106106bf5750602091508201018261029a565b60018160209254838588010152019101906106aa565b91607f1691610634565b34610126575f366003190112610126576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610126575f366003190112610126577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361012657565b602435906001600160a01b038216820361012657565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03908116911690811490811561088a575b8115610857575b8115610824575b8115610818575b8115610812575090565b90501590565b61dead81149150610808565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681149150610801565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316811491506107fa565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316811491506107f3565b9091906001600160a01b03168015610ab7576001600160a01b038316918215610aa457815f525f60205260405f2054818110610a8b577fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60208386948694855f525f84520360405f2055845f525f825260405f20818154019055604051908152a367ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001642109081610a58575b5080610a25575b610a165767ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001642109182610a03575b50816109ce575b506109bf57565b6341f5f85960e11b5f5260045ffd5b90505f525f60205260405f20547f0000000000000000000000000000000000000000000000000000000000000000105f6109b8565b610a0e9192506107ba565b15905f6109b1565b63e09f033160e01b5f5260045ffd5b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316811415610979565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161490505f610972565b8263391434e360e21b5f5260045260245260445260645ffd5b63ec442f0560e01b5f525f60045260245ffd5b634b637e8f60e11b5f525f60045260245ffdfea2646970667358221220b9f80755c77ca3979d38298c127e358b30219bc004b8f6c9c948fb11fcc713d464736f6c634300082300336080604052346103c757610a4980380380610019816103cb565b9283398101906080818303126103c75780516001600160401b0381116103c757826100459183016103f0565b602082015190926001600160401b0382116103c7576100659183016103f0565b604082015160609092015190916001600160a01b038216918290036103c75783516001600160401b0381116102cd57600354600181811c911680156103bd575b60208210146102af57601f811161034f575b50602094601f82116001146102ec579481929394955f926102e1575b50508160011b915f199060031b1c1916176003555b82516001600160401b0381116102cd57600454600181811c911680156102c3575b60208210146102af57601f8111610241575b506020601f82116001146101de57819293945f926101d3575b50508160011b915f199060031b1c1916176004555b81156101c057600254908082018092116101ac5760207fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef915f9360025584845283825260408420818154019055604051908152a360405161060790816104428239f35b634e487b7160e01b5f52601160045260245ffd5b63ec442f0560e01b5f525f60045260245ffd5b015190505f80610134565b601f1982169060045f52805f20915f5b81811061022957509583600195969710610211575b505050811b01600455610149565b01515f1960f88460031b161c191690555f8080610203565b9192602060018192868b0151815501940192016101ee565b8181111561011b5760045f52601f820160051c7f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b602084106102a7575b81601f9101920160051c03905f5b82811061029a57505061011b565b5f8282015560010161028c565b5f915061027e565b634e487b7160e01b5f52602260045260245ffd5b90607f1690610109565b634e487b7160e01b5f52604160045260245ffd5b015190505f806100d3565b601f1982169560035f52805f20915f5b8881106103375750836001959697981061031f575b505050811b016003556100e8565b01515f1960f88460031b161c191690555f8080610311565b919260206001819286850151815501940192016102fc565b818111156100b75760035f52601f820160051c7fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b602084106103b5575b81601f9101920160051c03905f5b8281106103a85750506100b7565b5f8282015560010161039a565b5f915061038c565b90607f16906100a5565b5f80fd5b6040519190601f01601f191682016001600160401b038111838210176102cd57604052565b81601f820112156103c7578051906001600160401b0382116102cd5761041f601f8301601f19166020016103cb565b92828452602083830101116103c757815f9260208093018386015e830101529056fe6080806040526004361015610012575f80fd5b5f3560e01c90816306fdde03146103ef57508063095ea7b31461036d57806318160ddd1461035057806323b872dd14610271578063313ce5671461025657806370a082311461021f57806395d89b4114610104578063a9059cbb146100d35763dd62ed3e1461007f575f80fd5b346100cf5760403660031901126100cf576100986104e8565b6100a06104fe565b6001600160a01b039182165f908152600160209081526040808320949093168252928352819020549051908152f35b5f80fd5b346100cf5760403660031901126100cf576100f96100ef6104e8565b6024359033610514565b602060405160018152f35b346100cf575f3660031901126100cf576040515f6004548060011c90600181168015610215575b602083108114610201578285529081156101e55750600114610190575b50819003601f01601f191681019067ffffffffffffffff82118183101761017c57610178829182604052826104be565b0390f35b634e487b7160e01b5f52604160045260245ffd5b905060045f527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5f905b8282106101cf57506020915082010182610148565b60018160209254838588010152019101906101ba565b90506020925060ff191682840152151560051b82010182610148565b634e487b7160e01b5f52602260045260245ffd5b91607f169161012b565b346100cf5760203660031901126100cf576001600160a01b036102406104e8565b165f525f602052602060405f2054604051908152f35b346100cf575f3660031901126100cf57602060405160128152f35b346100cf5760603660031901126100cf5761028a6104e8565b6102926104fe565b6001600160a01b0382165f818152600160209081526040808320338452909152902054909260443592915f1981106102d0575b506100f99350610514565b83811061033557841561032257331561030f576100f9945f52600160205260405f2060018060a01b0333165f526020528360405f2091039055846102c5565b634a1406b160e11b5f525f60045260245ffd5b63e602df0560e01b5f525f60045260245ffd5b8390637dc7a0d960e11b5f523360045260245260445260645ffd5b346100cf575f3660031901126100cf576020600254604051908152f35b346100cf5760403660031901126100cf576103866104e8565b602435903315610322576001600160a01b031690811561030f57335f52600160205260405f20825f526020528060405f20556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b346100cf575f3660031901126100cf575f6003548060011c906001811680156104b4575b602083108114610201578285529081156101e5575060011461045f5750819003601f01601f191681019067ffffffffffffffff82118183101761017c57610178829182604052826104be565b905060035f527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5f905b82821061049e57506020915082010182610148565b6001816020925483858801015201910190610489565b91607f1691610413565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036100cf57565b602435906001600160a01b03821682036100cf57565b6001600160a01b03169081156105be576001600160a01b03169182156105ab57815f525f60205260405f205481811061059257817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92602092855f525f84520360405f2055845f525f825260405f20818154019055604051908152a3565b8263391434e360e21b5f5260045260245260445260645ffd5b63ec442f0560e01b5f525f60045260245ffd5b634b637e8f60e11b5f525f60045260245ffdfea264697066735822122045459cef98603cc298ead27019b152e1bf1e171d368ba26d9f39da4aeccf98f364736f6c634300082300336101a0806040523461085757611cd9803803809161001d828561085b565b833981016101a0828203126108575781516001600160401b038111610857578161004891840161087e565b602083015190916001600160401b0382116108575761006891840161087e565b9160408101519261007b606083016108d3565b610087608084016108d3565b9061009460a085016108d3565b906100a160c086016108d3565b9160e0860151936101008701519162ffffff8316809303610857576100c961012089016108d3565b916101408901519761ffff8916809903610857576100f76101806100f06101608d016108e7565b9b016108e7565b8b51909b6001600160401b0382116107525760035490600182811c9216801561084d575b60208310146107345781601f8493116107d7575b50602090601f8311600114610771575f92610766575b50508160011b915f199060031b1c1916176003555b8051906001600160401b0382116107525760045490600182811c92168015610748575b60208310146107345781601f8493116106be575b50602090601f8311600114610658575f9261064d575b50508160011b915f199060031b1c1916176004555b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00553360a052608085905260c05260e052610180526001600160a01b038216301015610646573091905b604080516001600160a01b03948516602082019081529490931690830152606080830191909152815261023c60808261085b565b5190209160405192602084019260ff60f81b845260018060601b03199060601b166021850152603584015260558301526055825261027b60758361085b565b905190206001600160a01b0316610100528061063357505f195b610120526001600160401b03906102b29063ffffffff164261091f565b16610140526001600160401b03906102d09063ffffffff164261091f565b1661016052331561062057610100516001600160a01b03161590811561060c575b81156105f8575b81156105e4575b81156105dc575b81156105d3575b610100516001600160a01b0316331480156105bf575b80156105ab575b8015610597575b801561058c575b8015610585575b61034b8260025461091f565b600255335f525f60205260405f208281540190556040518281525f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60203393a3600554828115158061057c575b61052f575b5050159182158115150361050f575b5050610160516001600160401b03164210806104fb575b806104e5575b6104d657610140516001600160401b0316421090816104ce575b50806104b7575b6104a8576040516113ac908161092d82396080518181816103d601528181610c5d01526111e1015260a05181818161082c01528181610bb30152610c14015260c0518181816109ad0152610b80015260e0518181816102490152610b4d0152610100518181816107e801528181610ae301526110490152610120518181816102110152610fd70152610140518181816101a70152610f820152610160518181816106540152610f43015261018051818181610a2601526110170152f35b6341f5f85960e11b5f5260045ffd5b50335f525f60205260405f205461012051106103eb565b90505f6103e4565b63e09f033160e01b5f5260045ffd5b50610180516001600160a01b03163314156103ca565b50610100516001600160a01b0316156103c4565b1561052357600854016008555b5f806103ad565b6008540360085561051c565b610538916108f8565b60066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f8805482019055335f908152604081208054929092039091558261039e565b50801515610399565b505f61033f565b5061dead3314610338565b5060e0516001600160a01b03163314610331565b5060c0516001600160a01b0316331461032a565b5060a0516001600160a01b03163314610323565b6001915061030d565b5f9150610306565b60e0516001600160a01b03161591506102ff565b60c0516001600160a01b03161591506102f8565b60a0516001600160a01b03161591506102f1565b63ec442f0560e01b5f525f60045260245ffd5b61064061271091856108f8565b04610295565b3090610208565b015190505f806101a7565b60045f9081528281209350601f198516905b8181106106a6575090846001959493921061068e575b505050811b016004556101bc565b01515f1960f88460031b161c191690555f8080610680565b9293602060018192878601518155019501930161066a565b828111156101915760045f52909150601f830160051c7f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b6020851061072c575b849392601f0160051c82900391015f5b82811061071c575050610191565b5f8183015585945060010161070e565b5f91506106fe565b634e487b7160e01b5f52602260045260245ffd5b91607f169161017d565b634e487b7160e01b5f52604160045260245ffd5b015190505f80610145565b60035f9081528281209350601f198516905b8181106107bf57509084600195949392106107a7575b505050811b0160035561015a565b01515f1960f88460031b161c191690555f8080610799565b92936020600181928786015181550195019301610783565b8281111561012f5760035f52909150601f830160051c7fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b60208510610845575b849392601f0160051c82900391015f5b82811061083557505061012f565b5f81830155859450600101610827565b5f9150610817565b91607f169161011b565b5f80fd5b601f909101601f19168101906001600160401b0382119082101761075257604052565b81601f82011215610857578051906001600160401b03821161075257604051926108b2601f8401601f19166020018561085b565b8284526020838301011161085757815f9260208093018386015e8301015290565b51906001600160a01b038216820361085757565b519063ffffffff8216820361085757565b8181029291811591840414171561090b57565b634e487b7160e01b5f52601160045260245ffd5b9190820180921161090b5756fe6080806040526004361015610012575f80fd5b5f3560e01c90816302d05d3f14610a145750806304dc0132146109dc57806306d6e63f1461099857806306fdde03146108dd578063095ea7b31461085b57806316eebd1e1461081757806316f0115b146107d357806318160ddd146107b657806318a89fe11461079457806323b872dd146106b5578063313ce5671461069a5780634e71d92d146106785780635a8b554a146106345780636ade07b0146106175780636ef61092146105df57806370a08231146105a85780638c02fda31461058b578063903550871461056457806395d89b4114610460578063a262f5f814610436578063a9059cbb14610405578063ad5c4648146103c1578063cba0e99614610394578063d54ad2a114610377578063dd62ed3e14610327578063e4fc6b6d146102e1578063ea4a6932146102b2578063efca2eed14610295578063f02ec76514610278578063f887ea4014610234578063f8b45b05146101fa578063fa8c00d4146101cf5763fe2a615114610187575f80fd5b346101cb575f3660031901126101cb57602060405167ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b5f80fd5b346101cb5760203660031901126101cb5760206101f26101ed610a55565b610e0c565b604051908152f35b346101cb575f3660031901126101cb5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101cb575f3660031901126101cb576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101cb575f3660031901126101cb576020600b54604051908152f35b346101cb575f3660031901126101cb576020600954604051908152f35b346101cb575f3660031901126101cb5760206040517422361d8afcc93343e962029a7edab20000000000008152f35b346101cb575f3660031901126101cb576102f9611118565b610301610c12565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b346101cb5760403660031901126101cb57610340610a55565b610348610a6b565b6001600160a01b039182165f908152600160209081526040808320949093168252928352819020549051908152f35b346101cb575f3660031901126101cb576020600a54604051908152f35b346101cb5760203660031901126101cb5760206103b76103b2610a55565b610ae1565b6040519015158152f35b346101cb575f3660031901126101cb576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101cb5760403660031901126101cb5761042b610421610a55565b6024359033610e80565b602060405160018152f35b346101cb5760203660031901126101cb57610301610452610a55565b61045a611118565b33611176565b346101cb575f3660031901126101cb576040515f6004548060011c9060018116801561055a575b6020831081146105465782855290811561052257506001146104c4575b6104c0836104b481850382610aab565b60405191829182610a81565b0390f35b91905060045f527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b915f905b808210610508575090915081016020016104b46104a4565b9192600181602092548385880101520191019092916104f0565b60ff191660208086019190915291151560051b840190910191506104b490506104a4565b634e487b7160e01b5f52602260045260245ffd5b91607f1691610487565b346101cb575f3660031901126101cb57602067ffffffffffffffff600c5416604051908152f35b346101cb575f3660031901126101cb576020600554604051908152f35b346101cb5760203660031901126101cb576001600160a01b036105c9610a55565b165f525f602052602060405f2054604051908152f35b346101cb5760203660031901126101cb576001600160a01b03610600610a55565b165f526007602052602060405f2054604051908152f35b346101cb575f3660031901126101cb576020600854604051908152f35b346101cb575f3660031901126101cb57602060405167ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101cb575f3660031901126101cb57610690611118565b6103013333611176565b346101cb575f3660031901126101cb57602060405160128152f35b346101cb5760603660031901126101cb576106ce610a55565b6106d6610a6b565b6001600160a01b0382165f818152600160209081526040808320338452909152902054909260443592915f198110610714575b5061042b9350610e80565b8381106107795784156107665733156107535761042b945f52600160205260405f2060018060a01b0333165f526020528360405f209103905584610709565b634a1406b160e11b5f525f60045260245ffd5b63e602df0560e01b5f525f60045260245ffd5b8390637dc7a0d960e11b5f523360045260245260445260645ffd5b346101cb575f3660031901126101cb576020604051670de0b6b3a76400008152f35b346101cb575f3660031901126101cb576020600254604051908152f35b346101cb575f3660031901126101cb576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101cb575f3660031901126101cb576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101cb5760403660031901126101cb57610874610a55565b602435903315610766576001600160a01b031690811561075357335f52600160205260405f20825f526020528060405f20556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b346101cb575f3660031901126101cb576040515f6003548060011c9060018116801561098e575b602083108114610546578285529081156105225750600114610930576104c0836104b481850382610aab565b91905060035f527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b915f905b808210610974575090915081016020016104b46104a4565b91926001816020925483858801015201910190929161095c565b91607f1691610904565b346101cb575f3660031901126101cb576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101cb5760203660031901126101cb576001600160a01b036109fd610a55565b165f526006602052602060405f2054604051908152f35b346101cb575f3660031901126101cb577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b600435906001600160a01b03821682036101cb57565b602435906001600160a01b03821682036101cb57565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b90601f8019910116810190811067ffffffffffffffff821117610acd57604052565b634e487b7160e01b5f52604160045260245ffd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b039081169116908114908115610bb1575b8115610b7e575b8115610b4b575b8115610b3f575b8115610b39575090565b90501590565b61dead81149150610b2f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681149150610b28565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681149150610b21565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681149150610b1a565b91908203918211610bf157565b634e487b7160e01b5f52601160045260245ffd5b91908201809211610bf157565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610dea576040516370a0823160e01b81523060048201526020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa908115610ddf575f91610dad575b50610caf60095491610ca9600a5484610be4565b90610be4565b90610cbd600b548093610be4565b60085492670de0b6b3a76400008410610d925750600b54610cdd91610c05565b5f600b558015610d8d57610cfc610cf484836112bc565b600554610c05565b92836005557422361d8afcc93343e962029a7edab20000000000008411610d7e577fc5d35a65af09b3042394b742529d10f7fbf9a37294d6b13e4d63d06f9909a15b93610d4b83606095610c05565b60095567ffffffffffffffff421667ffffffffffffffff19600c541617600c5560405192835260208301526040820152a1565b63ff4f097f60e01b5f5260045ffd5b505050565b9250809150610d9f575050565b610da891610c05565b600b55565b90506020813d602011610dd7575b81610dc860209383610aab565b810103126101cb57515f610c95565b3d9150610dbb565b6040513d5f823e3d90fd5b6304e255a160e01b5f5260045ffd5b81810292918115918404141715610bf157565b610e1581610ae1565b610e7b57610e3b6005549160018060a01b031691825f525f60205260405f205490610df9565b815f52600660205260405f2054905f8282019283129112908015821691151617610bf157610e78915f52600760205260405f20549060801d610be4565b90565b505f90565b90916001600160a01b038216908115611105576001600160a01b0384169283156110f257610eb0610eb691610ae1565b94610ae1565b825f525f60205260405f20548281106110d7578290845f525f6020520360405f2055835f525f60205260405f2082815401905583837fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020604051868152a360055482811515806110ce575b61109a575b5050159384158115150361107a575b505067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001642109081611047575b5080611014575b6110055767ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001642109182610ffd575b5081610fc8575b50610fb957565b6341f5f85960e11b5f5260045ffd5b90505f525f60205260405f20547f0000000000000000000000000000000000000000000000000000000000000000105f610fb2565b91505f610fab565b63e09f033160e01b5f5260045ffd5b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316811415610f73565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161490505f610f6c565b1561108e57600854016008555b5f80610f36565b60085403600855611087565b6110a391610df9565b835f52600660205260405f20818154019055845f52600660205260405f209081540390555f82610f27565b50801515610f22565b90508263391434e360e21b5f5260045260245260445260645ffd5b63ec442f0560e01b5f525f60045260245ffd5b634b637e8f60e11b5f525f60045260245ffd5b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054146111675760027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b633ee5aeb560e01b5f5260045ffd5b9061118082610e0c565b91821561127e5760018060a01b031690815f52600760205260405f206111a7848254610c05565b90556111b583600a54610c05565b600a5560405163a9059cbb60e01b5f9081526001600160a01b03928316600481905260248690529491927f0000000000000000000000000000000000000000000000000000000000000000169060209060448180855af160015f511481161561125f575b836040521561124d5750816020917ff7a40077ff7a04c7e61f6f26fb13774259ddf1b6bce9ecf26a8276cdd39926839352a3565b635274afe760e01b5f5260045260245ffd5b600181151661127557813b15153d151616611219565b833d5f823e3d90fd5b6040515f81526001600160a01b0392831693509116907ff7a40077ff7a04c7e61f6f26fb13774259ddf1b6bce9ecf26a8276cdd399268390602090a3565b5f19600160801b8209918160801b91828085109403938085039414611355578382111561133d578190600160801b9009815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b50634e487b715f52156003026011186020526024601cfd5b5080925015611362570490565b634e487b7160e01b5f52601260045260245ffdfea2646970667358221220396e3c6f67d7f9f47076b80dabf81678663a04268c7cabdf729ee0885815678b64736f6c634300082300339b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a26469706673582212200b8c8fe069618ae255f8cbdc864bf61edc5fed1436a7bb1b6b46741b3b91571264736f6c63430008230033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| Fresh Test (FRESH2) | FRESH2 | 0.000000 | — | — |
| V6 Canary (V6C) | V6C | 0.000000 | — | — |
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0xe6b712…0f87f2 | 32 days agoTue, 14 Jul 2026 20:06:37 UTC | 0x1ac537…07c7 | [0] 0x000000000000…1fa907ae data: 0x000000000000000000…00000000 |
| 0xca95a7…7bed7d | 32 days agoTue, 14 Jul 2026 20:06:34 UTC | 0x1ac537…07c7 | [0] 0x000000000000…2a8bae6d data: 0x000000000000000000…00000000 |
| 0x724535…769903 | 33 days agoMon, 13 Jul 2026 17:14:57 UTC | 0x65eee5…5989 | [0] 0x000000000000…1fa907ae [1] 0x000000000000…a882192a data: 0x000000000000000000…00000000 |
| 0x724535…769903 | 33 days agoMon, 13 Jul 2026 17:14:57 UTC | 0x0a6164…466e | [0] 0x000000000000…1fa907ae data: 0x000000000000000000…0001a4e0 |
| 0x1abee0…cdb95c | 33 days agoMon, 13 Jul 2026 16:41:39 UTC | 0x1ac537…07c7 | [0] 0x000000000000…2a8bae6d data: 0x000000000000000000…21dba000 |
| 0xf93b9e…5ce3c9 | 33 days agoMon, 13 Jul 2026 16:41:34 UTC | 0x7ce543…095c | [0] 0x000000000000…2a8bae6d [1] 0x000000000000…a882192a data: 0x000000000000000000…31ee804d |
| 0xff5d44…89a5fc | 33 days agoMon, 13 Jul 2026 16:40:56 UTC | 0x65eee5…5989 | [0] 0x000000000000…2a8bae6d [1] 0x000000000000…a882192a data: 0x000000000000000000…00000000 |
| 0xff5d44…89a5fc | 33 days agoMon, 13 Jul 2026 16:40:56 UTC | 0x0a6164…466e | [0] 0x000000000000…2a8bae6d data: 0x000000000000000000…0001a410 |
| 0x4a162e…25751a | 33 days agoMon, 13 Jul 2026 16:40:50 UTC | 0xdc3dba…7b6b | [0] 0x000000000000…b51c0553 |
| 0xc00cc8…314fe4 | 33 days agoMon, 13 Jul 2026 16:39:42 UTC | 0x8be007…57e0 | [0] 0x000000000000…00000000 [1] 0x000000000000…a882192a |
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| no internal transactions found for this address yet (traced blocks + on-demand) | ||||||||
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x724535bd…769903 | Transfer | 8,838,981 | 33 days agoMon, 13 Jul 2026 17:14:57 UTC | 0x6b54…9477 | OUT | 0x0000…dead | Transfer | Uniswap V3 Positions NFT-V1 (UNI-V3-POS) #107744 | |
| 0x724535bd…769903 | Transfer | 8,838,981 | 33 days agoMon, 13 Jul 2026 17:14:57 UTC | 0x0000…0000 | IN | 0x6b54…9477 | Mint | Uniswap V3 Positions NFT-V1 (UNI-V3-POS) #107744 | |
| 0xff5d44ab…89a5fc | Transfer | 8,818,578 | 33 days agoMon, 13 Jul 2026 16:40:56 UTC | 0x6b54…9477 | OUT | 0x0000…dead | Transfer | Uniswap V3 Positions NFT-V1 (UNI-V3-POS) #107536 | |
| 0xff5d44ab…89a5fc | Transfer | 8,818,578 | 33 days agoMon, 13 Jul 2026 16:40:56 UTC | 0x0000…0000 | IN | 0x6b54…9477 | Mint | Uniswap V3 Positions NFT-V1 (UNI-V3-POS) #107536 |
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0xe6b712…0f87f2 | claimFees | 9,804,167 | 32 days agoTue, 14 Jul 2026 20:06:37 UTC | 0x627d…0553 | IN | HoodieLaunchV6 | $0.000 ETH | 0.00000200 | |
| 0xca95a7…7bed7d | claimFees | 9,804,143 | 32 days agoTue, 14 Jul 2026 20:06:34 UTC | 0x627d…0553 | IN | HoodieLaunchV6 | $0.000 ETH | 0.00000196 | |
| 0xf8be4f…5e17d9 | setProtocolWallet | 9,747,254 | 32 days agoTue, 14 Jul 2026 18:31:36 UTC | 0x82d0…192a | IN | HoodieLaunchV6 | $0.000 ETH | 0.00000154 | |
| 0xe0bdef…9afdb8 | setProtocolBps | 9,747,231 | 32 days agoTue, 14 Jul 2026 18:31:34 UTC | 0x82d0…192a | IN | HoodieLaunchV6 | $0.000 ETH | 0.00000147 | |
| 0x3ad8fb…333874 | setProtocolBps | 9,489,173 | 32 days agoTue, 14 Jul 2026 11:21:43 UTC | 0x82d0…192a | IN | HoodieLaunchV6 | $0.000 ETH | 0.00000129 | |
| 0x724535…769903 | launch | 8,838,981 | 33 days agoMon, 13 Jul 2026 17:14:57 UTC | 0x82d0…192a | IN | HoodieLaunchV6 | $0.940.0005 ETH | 0.00028884 | |
| 0x1abee0…cdb95c | claimFees | 8,819,006 | 33 days agoMon, 13 Jul 2026 16:41:39 UTC | 0x82d0…192a | IN | HoodieLaunchV6 | $0.000 ETH | 0.00000313 | |
| 0xf93b9e…5ce3c9 | buy | 8,818,952 | 33 days agoMon, 13 Jul 2026 16:41:34 UTC | 0x82d0…192a | IN | HoodieLaunchV6 | $0.380.0002 ETH | 0.00000968 | |
| 0xff5d44…89a5fc | launch | 8,818,578 | 33 days agoMon, 13 Jul 2026 16:40:56 UTC | 0x82d0…192a | IN | HoodieLaunchV6 | $0.940.0005 ETH | 0.00028916 | |
| 0x4a162e…25751a | setKeeper | 8,818,516 | 33 days agoMon, 13 Jul 2026 16:40:50 UTC | 0x82d0…192a | IN | HoodieLaunchV6 | $0.000 ETH | 0.00000237 |
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x724535bd…769903 | Transfer | 8,838,981 | 33 days agoMon, 13 Jul 2026 17:14:57 UTC | 0x6b54…9477 | OUT | 0x38dc…7c2f | 1,000,000,000.000000 FRESH2 | Fresh Test (FRESH2) | |
| 0x724535bd…769903 | Transfer | 8,838,981 | 33 days agoMon, 13 Jul 2026 17:14:57 UTC | 0x0000…0000 | IN | 0x6b54…9477 | 1,000,000,000.000000 FRESH2 | Fresh Test (FRESH2) | |
| 0x1abee07c…cdb95c | Transfer | 8,819,006 | 33 days agoMon, 13 Jul 2026 16:41:39 UTC | 0x6b54…9477 | OUT | 0x82d0…192a | 0.000001 WETH | WETH (WETH) | |
| 0x1abee07c…cdb95c | Transfer | 8,819,006 | 33 days agoMon, 13 Jul 2026 16:41:39 UTC | 0x6b54…9477 | OUT | 0x82d0…192a | 0.000000 WETH | WETH (WETH) | |
| 0xf93b9e54…5ce3c9 | Transfer | 8,818,952 | 33 days agoMon, 13 Jul 2026 16:41:34 UTC | 0x6b54…9477 | OUT | 0xfe33…dce5 | 0.000198 WETH | WETH (WETH) | |
| 0xf93b9e54…5ce3c9 | Transfer | 8,818,952 | 33 days agoMon, 13 Jul 2026 16:41:34 UTC | 0x0000…0000 | IN | 0x6b54…9477 | 0.0002 WETH | WETH (WETH) | |
| 0xff5d44ab…89a5fc | Transfer | 8,818,578 | 33 days agoMon, 13 Jul 2026 16:40:56 UTC | 0x6b54…9477 | OUT | 0xfe33…dce5 | 1,000,000,000.000000 V6C | V6 Canary (V6C) | |
| 0xff5d44ab…89a5fc | Transfer | 8,818,578 | 33 days agoMon, 13 Jul 2026 16:40:56 UTC | 0x0000…0000 | IN | 0x6b54…9477 | 1,000,000,000.000000 V6C | V6 Canary (V6C) |