Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- FamilyFactory
- Optimization enabled
- false
- Compiler version
- v0.8.24+commit.e11b9ed9
- EVM Version
- Verified at
- 2026-09-02T11:16:03.828075Z
Constructor Arguments
00000000000000000000000004816090b4ef52937c5a0ac040a3e31079f5115900000000000000000000000041fc09bf4e4647f1375633bace8f0203cb45f74200000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000021e19e0c9bab2400000000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000e3aeb5737240a00000
Arg [0] (address) : 0x04816090b4ef52937c5a0ac040a3e31079f51159
Arg [1] (address) : 0x41fc09bf4e4647f1375633bace8f0203cb45f742
Arg [2] (uint256) : 20000000000000000
Arg [3] (uint256) : 10000000000000000000000
Arg [4] (uint256) : 30
Arg [5] (uint256) : 4200000000000000000000
src/FamilyFactory.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import { FamilyLaunch, IERC20M } from "./FamilyLaunch.sol";
/// @title FamilyFactory — one transaction, one token, one locked pool
/// @notice Pons's launch flow: pay the launch fee, name the token, pick the
/// paired asset, optionally developer-buy in the same breath — and the
/// token is trading before the next block, in a pool nothing can
/// unlock. Parameters here are immutable; changing the deal means
/// deploying a new factory version, in public, not turning a knob.
contract FamilyFactory {
address public immutable sink; // MoonxSink — the 30% destination
address public immutable ops; // launch fees land here (native PLS)
uint256 public immutable launchFeePls;
uint256 public immutable virtualPaired;
uint256 public immutable snipeBlocks;
uint256 public immutable gradThreshold;
uint256 public totalLaunched; // the "4,228,127 launched" counter — real
address[] public launches;
mapping(address => bool) public isFamily;
/// @dev Everything the Explore grid needs rides the EVENT, not storage —
/// the indexer reads logs; the chain stores only what the contracts
/// themselves must know.
event Launched(
address indexed token,
address indexed creator,
address indexed pairedAsset,
string name,
string symbol,
string imageURI,
string metaURI,
bool holderMode,
uint256 devBuyPaired,
uint256 launchIndex
);
constructor(address _sink, address _ops, uint256 _launchFeePls, uint256 _virtualPaired, uint256 _snipeBlocks, uint256 _gradThreshold) {
require(_sink != address(0) && _ops != address(0), "zero addr");
sink = _sink;
ops = _ops;
launchFeePls = _launchFeePls;
virtualPaired = _virtualPaired;
snipeBlocks = _snipeBlocks;
gradThreshold = _gradThreshold;
}
/// @notice Launch a token. `devBuyPaired` > 0 executes the developer buy
/// atomically — approve this factory on the paired asset first.
function launch(
string calldata name_,
string calldata symbol_,
IERC20M pairedAsset,
bool holderMode,
uint256 devBuyPaired,
uint256 devBuyMinOut,
string calldata imageURI,
string calldata metaURI
) external payable returns (address token) {
require(msg.value == launchFeePls, "launch fee");
require(address(pairedAsset) != address(0), "no pair");
FamilyLaunch t = new FamilyLaunch(
name_, symbol_, pairedAsset, msg.sender, sink,
virtualPaired, snipeBlocks, gradThreshold, holderMode
);
token = address(t);
launches.push(token);
isFamily[token] = true;
uint256 idx = ++totalLaunched;
// Developer buy: pull the paired asset, buy through the same public
// path everyone else uses — the dev gets no special price, only the
// first slot.
if (devBuyPaired > 0) {
require(pairedAsset.transferFrom(msg.sender, address(this), devBuyPaired), "dev pull");
require(pairedAsset.approve(token, devBuyPaired), "dev approve");
t.buy(devBuyPaired, devBuyMinOut, msg.sender);
}
// Fee to ops last, so a reverting launch never strands value here.
(bool ok, ) = ops.call{ value: msg.value }("");
require(ok, "fee xfer");
emit Launched(token, msg.sender, address(pairedAsset), name_, symbol_, imageURI, metaURI, holderMode, devBuyPaired, idx);
}
function launchCount() external view returns (uint256) {
return launches.length;
}
}
src/FamilyLaunch.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
interface IERC20M {
function transfer(address to, uint256 amt) external returns (bool);
function transferFrom(address from, address to, uint256 amt) external returns (bool);
function approve(address spender, uint256 amt) external returns (bool);
}
/// @title FamilyLaunch — a token that IS its own locked pool
/// @notice The Pons architecture, made literal. One contract is the ERC20,
/// the AMM, the fee splitter and (optionally) the holder-dividend
/// distributor. There is no LP token, no migration event, and no
/// admin function of any kind: "liquidity locked" is not a promise
/// here, it is the shape of the bytecode.
///
/// Mechanics adopted from Pons as-is:
/// - fixed 1,000,000,000 supply, all minted into the pool at birth
/// - constant-product pricing over a VIRTUAL paired reserve, so the
/// token trades from its first block with a sane starting price
/// - 1% trade fee: 70% to the creator (or to holders, chosen once
/// at launch), 30% pushed to the protocol sink every trade
/// - a snipe window: for the first N blocks, sells keep only 1% —
/// the other 99% stays in the pool, deepening liquidity for the
/// people the sniper tried to farm
/// - graduation at a reserve threshold — a milestone flag and an
/// event; it changes NOTHING mechanical, and it is not a quality
/// signal
contract FamilyLaunch {
// ---------------------------------------------------------------- ERC20
string public name;
string public symbol;
uint8 public constant decimals = 18;
uint256 public constant totalSupply = 1_000_000_000e18;
mapping(address => uint256) public balanceOf;
mapping(address => mapping(address => uint256)) public allowance;
event Transfer(address indexed from, address indexed to, uint256 amt);
event Approval(address indexed owner, address indexed spender, uint256 amt);
// ----------------------------------------------------------------- pool
IERC20M public immutable paired;
address public immutable creator;
address public immutable sink;
uint256 public immutable virtualPaired; // phantom depth: sets launch price
uint256 public immutable launchBlock;
uint256 public immutable snipeBlocks;
uint256 public immutable gradThreshold; // real paired reserve that flips the flag
bool public immutable holderMode; // true = creator fees stream to holders
uint256 public realPaired; // paired asset actually owned by the POOL
uint256 public creatorFees; // accrued, claimable by the creator (creator mode)
uint256 public circulating; // supply outside the pool — the dividend base
bool public graduated;
uint256 public constant FEE_BPS = 100; // 1% of trade notional
uint256 public constant CREATOR_SHARE_BPS = 7000; // of the fee
uint256 public constant SNIPE_KEEP_BPS = 100; // seller keeps 1% in the window
event Buy(address indexed who, uint256 pairedIn, uint256 tokensOut, uint256 fee);
event Sell(address indexed who, uint256 tokensIn, uint256 pairedOut, uint256 fee, bool sniped);
event CreatorFeesClaimed(address indexed creator, uint256 amount);
event Graduated(uint256 realReserve);
// ------------------------------------------------- holder-dividend rail
// The magnified-dividend pattern: an accumulator of paired-asset-per-token
// over CIRCULATING supply only. The pool never earns from itself — its
// balance is excluded by construction, because circulating moves exactly
// when tokens cross the pool boundary.
uint256 private constant MAG = 2 ** 128;
uint256 public magDividendPerShare;
mapping(address => int256) private magCorrections;
mapping(address => uint256) public withdrawnDividends;
event HolderDividendsAccrued(uint256 amount);
event HolderDividendsClaimed(address indexed who, uint256 amount);
constructor(
string memory _name,
string memory _symbol,
IERC20M _paired,
address _creator,
address _sink,
uint256 _virtualPaired,
uint256 _snipeBlocks,
uint256 _gradThreshold,
bool _holderMode
) {
require(_virtualPaired > 0 && _creator != address(0) && _sink != address(0), "bad params");
name = _name;
symbol = _symbol;
paired = _paired;
creator = _creator;
sink = _sink;
virtualPaired = _virtualPaired;
launchBlock = block.number;
snipeBlocks = _snipeBlocks;
gradThreshold = _gradThreshold;
holderMode = _holderMode;
balanceOf[address(this)] = totalSupply;
emit Transfer(address(0), address(this), totalSupply);
}
// ------------------------------------------------------- ERC20 plumbing
function approve(address spender, uint256 amt) external returns (bool) {
allowance[msg.sender][spender] = amt;
emit Approval(msg.sender, spender, amt);
return true;
}
function transfer(address to, uint256 amt) external returns (bool) {
_move(msg.sender, to, amt);
return true;
}
function transferFrom(address from, address to, uint256 amt) external returns (bool) {
uint256 a = allowance[from][msg.sender];
require(a >= amt, "allowance");
if (a != type(uint256).max) allowance[from][msg.sender] = a - amt;
_move(from, to, amt);
return true;
}
/// @dev Wallet-to-wallet moves carry dividend entitlement with the usual
/// corrections. Nobody may transfer directly to or from the pool —
/// the pool boundary is crossed only through buy() and sell(), which
/// is what keeps `circulating` exact.
function _move(address from, address to, uint256 amt) internal {
require(to != address(this) && from != address(this), "trade via buy/sell");
require(balanceOf[from] >= amt, "balance");
balanceOf[from] -= amt;
balanceOf[to] += amt;
int256 magAmt = int256(magDividendPerShare * amt);
magCorrections[from] += magAmt;
magCorrections[to] -= magAmt;
emit Transfer(from, to, amt);
}
// ---------------------------------------------------------------- views
function pairedReserveEffective() public view returns (uint256) {
return virtualPaired + realPaired;
}
function tokenReserve() public view returns (uint256) {
return balanceOf[address(this)];
}
function inSnipeWindow() public view returns (bool) {
return block.number < launchBlock + snipeBlocks;
}
/// @notice Spot quote for a buy of `pairedIn` (after fee).
function quoteBuy(uint256 pairedIn) public view returns (uint256 out) {
uint256 effIn = pairedIn - (pairedIn * FEE_BPS) / 10000;
uint256 pr = pairedReserveEffective();
out = (effIn * tokenReserve()) / (pr + effIn);
}
// ---------------------------------------------------------------- trade
/// @notice Buy tokens with the paired asset. Permissionless, no deadline
/// games: minOut is the caller's only and sufficient protection.
function buy(uint256 pairedIn, uint256 minOut, address recipient) external returns (uint256 out) {
require(pairedIn > 0, "zero");
require(recipient != address(0) && recipient != address(this), "bad recipient");
require(paired.transferFrom(msg.sender, address(this), pairedIn), "pay");
uint256 fee = (pairedIn * FEE_BPS) / 10000;
uint256 effIn = pairedIn - fee;
uint256 pr = pairedReserveEffective();
out = (effIn * tokenReserve()) / (pr + effIn);
require(out >= minOut && out > 0, "slippage");
realPaired += effIn;
_splitFee(fee);
balanceOf[address(this)] -= out;
balanceOf[recipient] += out;
circulating += out;
// A fresh buy earns dividends only from now on.
magCorrections[recipient] -= int256(magDividendPerShare * out);
emit Transfer(address(this), recipient, out);
emit Buy(recipient, pairedIn, out, fee);
if (!graduated && realPaired >= gradThreshold) {
graduated = true;
emit Graduated(realPaired);
}
}
/// @notice Sell tokens back into the pool. Inside the snipe window the
/// seller keeps 1% — the rest stays in the pool on purpose.
function sell(uint256 tokensIn, uint256 minOut) external returns (uint256 payout) {
require(tokensIn > 0, "zero");
require(balanceOf[msg.sender] >= tokensIn, "balance");
uint256 pr = pairedReserveEffective();
uint256 tr = tokenReserve();
uint256 grossOut = (tokensIn * pr) / (tr + tokensIn);
// The virtual depth can never be paid out: with every token in
// existence sold back, the effective reserve only asymptotes to the
// virtual floor. Belt to the maths' braces:
require(grossOut <= realPaired, "exceeds real reserve");
balanceOf[msg.sender] -= tokensIn;
balanceOf[address(this)] += tokensIn;
circulating -= tokensIn;
magCorrections[msg.sender] += int256(magDividendPerShare * tokensIn);
emit Transfer(msg.sender, address(this), tokensIn);
bool sniped = inSnipeWindow();
uint256 base = grossOut;
if (sniped) {
// 99% stays in the pool — realPaired simply does not decrease by
// that part, which deepens the price for everyone else.
base = (grossOut * SNIPE_KEEP_BPS) / 10000;
}
uint256 fee = (base * FEE_BPS) / 10000;
payout = base - fee;
require(payout >= minOut, "slippage");
realPaired -= base; // only what actually leaves pool custody
_splitFee(fee);
require(paired.transfer(msg.sender, payout), "payout");
emit Sell(msg.sender, tokensIn, payout, fee, sniped);
}
// ----------------------------------------------------------------- fees
/// @dev 30% of every fee is PUSHED to the sink immediately — the burn
/// cannot be quietly withheld. The creator's 70% either accrues for
/// claim, or (holder mode) feeds the dividend accumulator on the
/// spot. With nobody holding yet, holder-mode fees fall back to the
/// creator rather than vanishing into a zero division.
function _splitFee(uint256 fee) internal {
if (fee == 0) return;
uint256 creatorCut = (fee * CREATOR_SHARE_BPS) / 10000;
uint256 sinkCut = fee - creatorCut;
if (sinkCut > 0) require(paired.transfer(sink, sinkCut), "sink push");
if (holderMode && circulating > 0) {
magDividendPerShare += (creatorCut * MAG) / circulating;
emit HolderDividendsAccrued(creatorCut);
} else {
creatorFees += creatorCut;
}
}
function claimCreatorFees() external returns (uint256 amt) {
require(msg.sender == creator, "not creator");
amt = creatorFees;
require(amt > 0, "nothing");
creatorFees = 0;
require(paired.transfer(creator, amt), "transfer");
emit CreatorFeesClaimed(creator, amt);
}
// ------------------------------------------------------ holder dividends
function dividendsOf(address who) public view returns (uint256) {
uint256 accumulated = uint256(int256(magDividendPerShare * balanceOf[who]) + magCorrections[who]) / MAG;
return accumulated - withdrawnDividends[who];
}
function claimDividends() external returns (uint256 amt) {
amt = dividendsOf(msg.sender);
require(amt > 0, "nothing");
withdrawnDividends[msg.sender] += amt;
require(paired.transfer(msg.sender, amt), "transfer");
emit HolderDividendsClaimed(msg.sender, amt);
}
}
Compiler Settings
{"viaIR":true,"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"],"":["ast"]}},"optimizer":{"runs":200,"enabled":true},"libraries":{},"evmVersion":"paris"}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_sink","internalType":"address"},{"type":"address","name":"_ops","internalType":"address"},{"type":"uint256","name":"_launchFeePls","internalType":"uint256"},{"type":"uint256","name":"_virtualPaired","internalType":"uint256"},{"type":"uint256","name":"_snipeBlocks","internalType":"uint256"},{"type":"uint256","name":"_gradThreshold","internalType":"uint256"}]},{"type":"event","name":"Launched","inputs":[{"type":"address","name":"token","internalType":"address","indexed":true},{"type":"address","name":"creator","internalType":"address","indexed":true},{"type":"address","name":"pairedAsset","internalType":"address","indexed":true},{"type":"string","name":"name","internalType":"string","indexed":false},{"type":"string","name":"symbol","internalType":"string","indexed":false},{"type":"string","name":"imageURI","internalType":"string","indexed":false},{"type":"string","name":"metaURI","internalType":"string","indexed":false},{"type":"bool","name":"holderMode","internalType":"bool","indexed":false},{"type":"uint256","name":"devBuyPaired","internalType":"uint256","indexed":false},{"type":"uint256","name":"launchIndex","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"gradThreshold","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isFamily","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"payable","outputs":[{"type":"address","name":"token","internalType":"address"}],"name":"launch","inputs":[{"type":"string","name":"name_","internalType":"string"},{"type":"string","name":"symbol_","internalType":"string"},{"type":"address","name":"pairedAsset","internalType":"contract IERC20M"},{"type":"bool","name":"holderMode","internalType":"bool"},{"type":"uint256","name":"devBuyPaired","internalType":"uint256"},{"type":"uint256","name":"devBuyMinOut","internalType":"uint256"},{"type":"string","name":"imageURI","internalType":"string"},{"type":"string","name":"metaURI","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"launchCount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"launchFeePls","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"launches","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"ops","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"sink","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"snipeBlocks","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalLaunched","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"virtualPaired","inputs":[]}]
Contract Creation Code
0x6101403461014857601f612b2c38819003918201601f19168301916001600160401b0383118484101761014d5780849260c0946040528339810103126101485761004881610163565b61005460208301610163565b60408301516060840151608085015160a090950151939092906001600160a01b038082161515908161013c575b501561010b5760805260a05260c05260e052610100918252610120908152604051906129b49283610178843960805183818161026d01526107c3015260a0518381816103a2015261077c015260c0518381816101b60152610948015260e05183818161029601526108b00152518281816102bc01526108ed0152518181816102e201526108530152f35b60405162461bcd60e51b81526020600482015260096024820152683d32b9379030b2323960b91b6044820152606490fd5b90508216151538610081565b600080fd5b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b03821682036101485756fe60808060405260043610156200001457600080fd5b60003560e01c9081631765015f14620009305750806327cca59f14620009105780632be29fa814620008d357806330e3d48e14620008965780634c03587014620008765780636edd12e014620008395780637b443a7614620007f2578063c74e820e14620007ab578063e70abe921462000764578063f6c51a5414620000ef5763f8e5695714620000a457600080fd5b34620000ea576020366003190112620000ea576004356001600160a01b03811690819003620000ea576000526002602052602060ff604060002054166040519015158152f35b600080fd5b610100366003190112620000ea5760043567ffffffffffffffff8111620000ea5762000120903690600401620009b9565b9060243567ffffffffffffffff8111620000ea5762000144903690600401620009b9565b929091604435906001600160a01b0382168203620000ea57606435938415158503620000ea5760c43567ffffffffffffffff8111620000ea576200018d903690600401620009b9565b9060e43567ffffffffffffffff8111620000ea57620001b1903690600401620009b9565b9290937f0000000000000000000000000000000000000000000000000000000000000000340362000732576001600160a01b03871615620007035760405180611f3681011067ffffffffffffffff611f3683011117620004f057611f3662000a498239806200024d6200023561012080611f36850152611f368401018c8b620009ea565b611f36830181036020611f36850101528d85620009ea565b6001600160a01b038a8116611f36840160408101919091523360608201527f000000000000000000000000000000000000000000000000000000000000000090911660808201527f000000000000000000000000000000000000000000000000000000000000000060a08201527f000000000000000000000000000000000000000000000000000000000000000060c08201527f000000000000000000000000000000000000000000000000000000000000000060e08201528c15156101009091015203906000f0998a15620006245760015468010000000000000000811015620004f0578060016200034492016001556200096b565b81546001600160a01b038e811660039390931b83811b91901b19909116179091556000908152600260205260408120805460ff1916600117905554966000198814620006ed57600188016000556084356200050c575b6000808080347f00000000000000000000000000000000000000000000000000000000000000005af13d1562000506573d67ffffffffffffffff8111620004f05760405190620003f5601f8201601f19166020018362000a0b565b8152600060203d92013e5b15620004c0576040519960e08b5260e08b01906200041e92620009ea565b9089820360208b01526200043292620009ea565b9087820360408901526200044692620009ea565b9085820360608701526200045a92620009ea565b931515608084015260843560a084015260010160c08301526001600160a01b03908116923392918516917f77d17d72337cd8c8c61c3b13603f2a16399e6531e2133264f8bba32299c8eae59181900390a46040516001600160a01b039091168152602090f35b60405162461bcd60e51b81526020600482015260086024820152673332b2903c3332b960c11b6044820152606490fd5b634e487b7160e01b600052604160045260246000fd5b62000400565b6040516323b872dd60e01b8152336004820152306024820152608435604482015260208160648160006001600160a01b038f165af19081156200062457600091620006c9575b5015620006995760405163095ea7b360e01b81526001600160a01b03808e1660048301526084356024830152602090829060449082906000908f165af1908115620006245760009162000663575b50156200063057600060208d6064604051809481936359a87bc160e01b8352608435600484015260a435602484015233604484015260018060a01b03165af180156200062457620005f3575b506200039a565b602090813d83116200061c575b6200060c818362000a0b565b81010312620000ea578c620005ec565b503d62000600565b6040513d6000823e3d90fd5b60405162461bcd60e51b815260206004820152600b60248201526a64657620617070726f766560a81b6044820152606490fd5b6200068a915060203d60201162000691575b62000681818362000a0b565b81019062000a2e565b8d620005a0565b503d62000675565b60405162461bcd60e51b815260206004820152600860248201526719195d881c1d5b1b60c21b6044820152606490fd5b620006e6915060203d602011620006915762000681818362000a0b565b8d62000552565b634e487b7160e01b600052601160045260246000fd5b60405162461bcd60e51b81526020600482015260076024820152663737903830b4b960c91b6044820152606490fd5b60405162461bcd60e51b815260206004820152600a6024820152696c61756e63682066656560b01b6044820152606490fd5b34620000ea576000366003190112620000ea576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34620000ea576000366003190112620000ea576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34620000ea576020366003190112620000ea57600435600154811015620000ea57620008206020916200096b565b905460405160039290921b1c6001600160a01b03168152f35b34620000ea576000366003190112620000ea5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b34620000ea576000366003190112620000ea576020600054604051908152f35b34620000ea576000366003190112620000ea5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b34620000ea576000366003190112620000ea5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b34620000ea576000366003190112620000ea576020600154604051908152f35b34620000ea576000366003190112620000ea576020907f00000000000000000000000000000000000000000000000000000000000000008152f35b600154811015620009a35760016000527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60190600090565b634e487b7160e01b600052603260045260246000fd5b9181601f84011215620000ea5782359167ffffffffffffffff8311620000ea5760208381860195010111620000ea57565b908060209392818452848401376000828201840152601f01601f1916010190565b90601f8019910116810190811067ffffffffffffffff821117620004f057604052565b90816020910312620000ea57518015158103620000ea579056fe60406101808152346200054b5762001f369081380380620000208162000550565b9384398201906101209182848203126200054b5783516001600160401b0381116200054b57816200005391860162000576565b602085015190916001600160401b0382116200054b576200007691860162000576565b848301516001600160a01b0393919084811681036200054b576200009d60608801620005e8565b620000ab60808901620005e8565b9060a08901519260c08a01519460e08b015197610100809c0151998a15158b036200054b5786151590816200053e575b8162000531575b501562000500578051906001600160401b038211620003f45760005490600182811c92168015620004f5575b6020831014620003d35781601f84931162000492575b50602090601f831160011462000416576000926200040a575b50508160011b916000199060031b1c1916176000555b8051906001600160401b038211620003f45760015490600182811c92168015620003e9575b6020831014620003d35781601f8493116200036f575b50602090601f8311600114620002f557600092620002e9575b50508160011b916000199060031b1c1916176001555b60805260a05260c05260e05243865284526101409182526101609283523060005260026020526b033b2e3c9fd0803ce8000000808260002055815190815260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60203093a351926118f89485620005fe863960805185818161044c01528181610603015281816109c101528181610b1601528181610f2c015261181e015260a051858181610ea201526112ac015260c05185818161066d01526117e3015260e0518581816102ab01528181610a7601528181610b7401528181610e2a01526110220152518481816103ad015281816105cb015261088a01525183818161038c01528181610869015261105d0152518281816109070152610d0c01525181818161070801526117280152f35b015190503880620001a7565b6001600090815260008051602062001f168339815191529350601f198516905b8181106200035657509084600195949392106200033c575b505050811b01600155620001bd565b015160001960f88460031b161c191690553880806200032d565b9293602060018192878601518155019501930162000315565b600160005290915060008051602062001f16833981519152601f840160051c81019160208510620003c8575b90601f859493920160051c01905b818110620003b857506200018e565b60008155849350600101620003a9565b90915081906200039b565b634e487b7160e01b600052602260045260246000fd5b91607f169162000178565b634e487b7160e01b600052604160045260246000fd5b0151905038806200013d565b6000808052935060008051602062001ef683398151915291905b601f198416851062000476576001945083601f198116106200045c575b505050811b0160005562000153565b015160001960f88460031b161c191690553880806200044d565b8181015183556020948501946001909301929091019062000430565b6000805290915060008051602062001ef6833981519152601f840160051c81019160208510620004ea575b90601f859493920160051c01905b818110620004da575062000124565b60008155849350600101620004cb565b9091508190620004bd565b91607f16916200010e565b875162461bcd60e51b815260206004820152600a60248201526962616420706172616d7360b01b6044820152606490fd5b90508516151538620000e2565b85811615159150620000db565b600080fd5b6040519190601f01601f191682016001600160401b03811183821017620003f457604052565b919080601f840112156200054b5782516001600160401b038111620003f457602090620005ac601f8201601f1916830162000550565b928184528282870101116200054b5760005b818110620005d457508260009394955001015290565b8581018301518482018401528201620005be565b51906001600160a01b03821682036200054b5756fe6040608081526004908136101561001557600080fd5b600091823560e01c90816265318b146112db57816302d05d3f1461129757816306fdde03146111d8578163095ea7b31461116757816318160ddd1461114057816323b872dd146110805781632be29fa81461104557816330e3d48e1461100a578163313ce56714610fee578163351fee4614610e8e578163479dfd7b14610e715781634beb394c14610ddf57816359a87bc114610aa45781635ed930f314610a5a578163668038e0146109495781636694ba611461092a5781636c22a77e1461069c5781636edd12e0146108ef57816370a08231146108b757816384207be21461084f5781638ed2d1431461083057816395d89b411461072d5781639988def0146106f0578163a7ffd1cc146106d2578163a9059cbb146106a1578163bf333f2c1461069c578163c74e820e14610658578163cbcb317114610632578163cf880331146105ee578163d00efb2f146105b3578163d79875eb1461026657508063dd62ed3e1461021e578063de3aaf61146101e7578063e7c2b772146101c45763f8718858146101a357600080fd5b346101c057816003193601126101c0576020906006549051908152f35b5080fd5b50346101c057816003193601126101c05760209060ff6007541690519015158152f35b50346101c05760203660031901126101c05760209181906001600160a01b0361020e611301565b168152600a845220549051908152f35b50346101c057806003193601126101c0578060209261023b611301565b61024361131c565b6001600160a01b0391821683526003865283832091168252845220549051908152f35b919050346105af57806003193601126105af57813561028681151561152d565b3384526020936002855261029f828483205410156115af565b8354906102f46102cf837f0000000000000000000000000000000000000000000000000000000000000000611520565b308352600288526102ee856102e88886205493826113cf565b92611520565b90611414565b9182116105755733815260028652838120610310848254611434565b905530815260028652838120610327848254611520565b905561033583600654611434565b600655610344836008546113cf565b338252600987526103598583209182546113f8565b9055835183815230907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef883392a36103d17f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611520565b43109482869396610540575b50606486028681046064148715171561052d576127109004916104196104038489611434565b976104126024358a101561155f565b8354611434565b8255610424836116f9565b855163a9059cbb60e01b815233838201908152602081018990528990829081906040010381857f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af191821561052257916104f5575b50156104c95750835192835284868401528383015260608201527fdc5d404a76ab50144afc43faeff0266b98f34764e05ed785cc958689b620bcc860803392a251908152f35b845162461bcd60e51b815290810187905260066024820152651c185e5bdd5d60d21b6044820152606490fd5b6105159150883d8a1161051b575b61050d8183611332565b8101906114d1565b38610483565b503d610503565b8751903d90823e3d90fd5b634e487b7160e01b835260118252602483fd5b90955060648102908082046064149015171561056257612710900494386103dd565b634e487b7160e01b825260118652602482fd5b835162461bcd60e51b8152808601879052601460248201527365786365656473207265616c207265736572766560601b6044820152606490fd5b8280fd5b5050346101c057816003193601126101c057602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b5050346101c057816003193601126101c057517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5050346101c057816003193601126101c057806020923081526002845220549051908152f35b5050346101c057816003193601126101c057517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b6113b3565b5050346101c057806003193601126101c0576020906106cb6106c1611301565b60243590336115e5565b5160018152f35b9050346105af57826003193601126105af5760209250549051908152f35b5050346101c057816003193601126101c057602090517f000000000000000000000000000000000000000000000000000000000000000015158152f35b919050346105af57826003193601126105af578051918360018054918260011c92600181168015610826575b602095868610821461081357508488529081156107f15750600114610798575b610794868661078a828b0383611332565b519182918261136a565b0390f35b929550600183527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b8284106107de57505050826107949461078a928201019438610779565b80548685018801529286019281016107c1565b60ff191687860152505050151560051b830101925061078a8261079438610779565b634e487b7160e01b845260229052602483fd5b93607f1693610759565b5050346101c057816003193601126101c0576020906008549051908152f35b5050346101c057816003193601126101c0576020906108ae7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611520565b43109051908152f35b5050346101c05760203660031901126101c05760209181906001600160a01b036108df611301565b1681526002845220549051908152f35b5050346101c057816003193601126101c057602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b5050346101c057816003193601126101c0576020906005549051908152f35b919050346105af57826003193601126105af576109bc9261096933611441565b93849361097785151561149b565b3383526020958691600a8352858520610991838254611520565b9055855163a9059cbb60e01b8152339181019182526020820192909252909283918291604090910190565b0381857f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af1918215610a4f5790610a0292610a32575b506114e9565b80518281527f824d01e1921464b4232e19a403a24321155d2e927a48be9bf146b3211989f7e5843392a251908152f35b610a499150853d871161051b5761050d8183611332565b386109fc565b8351903d90823e3d90fd5b828434610aa15780600319360112610aa15750610a9a602092547f0000000000000000000000000000000000000000000000000000000000000000611520565b9051908152f35b80fd5b8383346101c05760603660031901126101c0576001600160a01b039260443584811690823590829003610ddb578015610add811561152d565b82151580610dd1575b15610d9e5785968551906323b872dd60e01b825233868301523060248301528360448301528160648160209b8c947f0000000000000000000000000000000000000000000000000000000000000000165af1908115610d94578791610d77575b5015610d4e5760648202908282046064141715610d3b576127109004610b6c8183611434565b9184549183837f000000000000000000000000000000000000000000000000000000000000000090610b9d91611520565b308a5260028b52888a2054610bb290836113cf565b91610bbc91611520565b610bc591611414565b976024358910157fbeae048c6d270d9469f86cf6e8fedda3c60ad770f16c24c9fc131c8e9a09101d9560609582610c0993610d32575b610c049061155f565b611520565b8755610c14826116f9565b30815260028a52878120610c298a8254611434565b905585815260028a52878120610c408a8254611520565b9055610c4e89600654611520565b600655610c7288610c618b6008546113cf565b9288815260098d5220918254611596565b90558487518981527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8b3092a38651918252878983015286820152a2836007549160ff83161580610d07575b610ccc575b50505051908152f35b60017f04d39283851d5dc1961a5296a48d487854db2aae45afe51e83aae1db8d04d42f9360ff191617600755548351908152a1838381610cc3565b5080547f00000000000000000000000000000000000000000000000000000000000000001115610cbe565b508b1515610bfb565b634e487b7160e01b865260118452602486fd5b845162461bcd60e51b8152808501889052600360248201526270617960e81b6044820152606490fd5b610d8e9150883d8a1161051b5761050d8183611332565b88610b46565b86513d89823e3d90fd5b845162461bcd60e51b8152602081860152600d60248201526c189859081c9958da5c1a595b9d609a1b6044820152606490fd5b5030831415610ae6565b8480fd5b828434610aa1576020366003190112610aa15782356064810281810460641482151715610e5e576020946102e885610e4e610e26610a9a97966127106102ee970490611434565b93547f0000000000000000000000000000000000000000000000000000000000000000611520565b94308152600289522054826113cf565b634e487b7160e01b835260118552602483fd5b5050346101c057816003193601126101c05760209051611b588152f35b8383346101c057816003193601126101c0577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b038181169133839003610fbd578495610f2892602092600554978893610eef85151561149b565b6005829055885163a9059cbb60e01b81526001600160a01b03909316908301908152602081019490945290948593849291839160400190565b03927f0000000000000000000000000000000000000000000000000000000000000000165af1908115610fb35790610f689160209691610f9657506114e9565b7fd046302bdc39599e60a5981e59227dcd1c643f512f56f2e984390c3ac6eadedb848351858152a251908152f35b610fad9150863d881161051b5761050d8183611332565b866109fc565b83513d87823e3d90fd5b835162461bcd60e51b8152602081880152600b60248201526a3737ba1031b932b0ba37b960a91b6044820152606490fd5b5050346101c057816003193601126101c0576020905160128152f35b5050346101c057816003193601126101c057602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b5050346101c057816003193601126101c057602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b919050346105af5760603660031901126105af5761109c611301565b6110a461131c565b6044359160018060a01b03811680875260209560038752858820338952875285882054908582106111115750948096976106cb968660001982036110ed575b50505050506115e5565b6110f691611434565b928152600389528181203382528952205538858180866110e3565b865162461bcd60e51b81529081018890526009602482015268616c6c6f77616e636560b81b6044820152606490fd5b5050346101c057816003193601126101c057602090516b033b2e3c9fd0803ce80000008152f35b5050346101c057806003193601126101c05760209181611185611301565b91602435918291338152600387528181209460018060a01b0316948582528752205582519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925843392a35160018152f35b919050346105af57826003193601126105af57805191838054906001908260011c9260018116801561128d575b602095868610821461081357508488529081156107f1575060011461123557610794868661078a828b0383611332565b8080949750527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5635b82841061127a57505050826107949461078a928201019438610779565b805486850188015292860192810161125d565b93607f1693611205565b5050346101c057816003193601126101c057517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5050346101c05760203660031901126101c057602090610a9a6112fc611301565b611441565b600435906001600160a01b038216820361131757565b600080fd5b602435906001600160a01b038216820361131757565b90601f8019910116810190811067ffffffffffffffff82111761135457604052565b634e487b7160e01b600052604160045260246000fd5b6020808252825181830181905290939260005b82811061139f57505060409293506000838284010152601f8019910116010190565b81810186015184820160400152850161137d565b3461131757600036600319011261131757602060405160648152f35b818102929181159184041417156113e257565b634e487b7160e01b600052601160045260246000fd5b919091600083820193841291129080158216911516176113e257565b811561141e570490565b634e487b7160e01b600052601260045260246000fd5b919082039182116113e257565b6008546001600160a01b03909116600081815260026020526040808220546114989491929161148591611473916113cf565b848352600960205283832054906113f8565b60801c928152600a602052205490611434565b90565b156114a257565b60405162461bcd60e51b81526020600482015260076024820152666e6f7468696e6760c81b6044820152606490fd5b90816020910312611317575180151581036113175790565b156114f057565b60405162461bcd60e51b81526020600482015260086024820152673a3930b739b332b960c11b6044820152606490fd5b919082018092116113e257565b1561153457565b606460405162461bcd60e51b81526020600482015260046024820152637a65726f60e01b6044820152fd5b1561156657565b60405162461bcd60e51b8152602060048201526008602482015267736c69707061676560c01b6044820152606490fd5b818103929160001380158285131691841216176113e257565b156115b657565b60405162461bcd60e51b815260206004820152600760248201526662616c616e636560c81b6044820152606490fd5b6001600160a01b03918216929130841415806116ed575b156116b3577fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91169160009083825260209160028352604090611644838383205410156115af565b85815260028452818120611659848254611434565b905586815260028452818120611670848254611520565b90556116aa82611682856008546113cf565b92888152600987528181206116988582546113f8565b90558981526009875220918254611596565b905551908152a3565b60405162461bcd60e51b81526020600482015260126024820152711d1c985919481d9a5848189d5e4bdcd95b1b60721b6044820152606490fd5b503081831614156115fc565b80156118bf57611b588102611b5719828204016113e25761271061171f91048092611434565b806117cc575b507f0000000000000000000000000000000000000000000000000000000000000000806117c1575b156117b057608081901b8115600160801b8383041417156113e2577f2724190d857d4dc7e52f584276d1bfd610594cdb6e4e5a4969c0db32b9b04bf2916117a461179c60209360065490611414565b600854611520565b600855604051908152a1565b6117bc90600554611520565b600555565b50600654151561174d565b60405163a9059cbb60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600482015260248101919091526020818060448101038160007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af19081156118b357600091611894575b50156118635738611725565b60405162461bcd60e51b81526020600482015260096024820152680e6d2dcd640e0eae6d60bb1b6044820152606490fd5b6118ad915060203d60201161051b5761050d8183611332565b38611857565b6040513d6000823e3d90fd5b5056fea26469706673582212203e8eb02bbe103d497fa3e1f898e2dd5e3c990a5e82a942d89981812657f3de4b64736f6c63430008180033290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6a26469706673582212202ab16cbbbe9dc845b64ccf05fd2eb6b1b5adfbf0ca13034ce515c2d9d70baa7264736f6c6343000818003300000000000000000000000004816090b4ef52937c5a0ac040a3e31079f5115900000000000000000000000041fc09bf4e4647f1375633bace8f0203cb45f74200000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000021e19e0c9bab2400000000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000e3aeb5737240a00000
Deployed ByteCode
0x60808060405260043610156200001457600080fd5b60003560e01c9081631765015f14620009305750806327cca59f14620009105780632be29fa814620008d357806330e3d48e14620008965780634c03587014620008765780636edd12e014620008395780637b443a7614620007f2578063c74e820e14620007ab578063e70abe921462000764578063f6c51a5414620000ef5763f8e5695714620000a457600080fd5b34620000ea576020366003190112620000ea576004356001600160a01b03811690819003620000ea576000526002602052602060ff604060002054166040519015158152f35b600080fd5b610100366003190112620000ea5760043567ffffffffffffffff8111620000ea5762000120903690600401620009b9565b9060243567ffffffffffffffff8111620000ea5762000144903690600401620009b9565b929091604435906001600160a01b0382168203620000ea57606435938415158503620000ea5760c43567ffffffffffffffff8111620000ea576200018d903690600401620009b9565b9060e43567ffffffffffffffff8111620000ea57620001b1903690600401620009b9565b9290937f00000000000000000000000000000000000000000000000000470de4df820000340362000732576001600160a01b03871615620007035760405180611f3681011067ffffffffffffffff611f3683011117620004f057611f3662000a498239806200024d6200023561012080611f36850152611f368401018c8b620009ea565b611f36830181036020611f36850101528d85620009ea565b6001600160a01b038a8116611f36840160408101919091523360608201527f00000000000000000000000004816090b4ef52937c5a0ac040a3e31079f5115990911660808201527f00000000000000000000000000000000000000000000021e19e0c9bab240000060a08201527f000000000000000000000000000000000000000000000000000000000000001e60c08201527f0000000000000000000000000000000000000000000000e3aeb5737240a0000060e08201528c15156101009091015203906000f0998a15620006245760015468010000000000000000811015620004f0578060016200034492016001556200096b565b81546001600160a01b038e811660039390931b83811b91901b19909116179091556000908152600260205260408120805460ff1916600117905554966000198814620006ed57600188016000556084356200050c575b6000808080347f00000000000000000000000041fc09bf4e4647f1375633bace8f0203cb45f7425af13d1562000506573d67ffffffffffffffff8111620004f05760405190620003f5601f8201601f19166020018362000a0b565b8152600060203d92013e5b15620004c0576040519960e08b5260e08b01906200041e92620009ea565b9089820360208b01526200043292620009ea565b9087820360408901526200044692620009ea565b9085820360608701526200045a92620009ea565b931515608084015260843560a084015260010160c08301526001600160a01b03908116923392918516917f77d17d72337cd8c8c61c3b13603f2a16399e6531e2133264f8bba32299c8eae59181900390a46040516001600160a01b039091168152602090f35b60405162461bcd60e51b81526020600482015260086024820152673332b2903c3332b960c11b6044820152606490fd5b634e487b7160e01b600052604160045260246000fd5b62000400565b6040516323b872dd60e01b8152336004820152306024820152608435604482015260208160648160006001600160a01b038f165af19081156200062457600091620006c9575b5015620006995760405163095ea7b360e01b81526001600160a01b03808e1660048301526084356024830152602090829060449082906000908f165af1908115620006245760009162000663575b50156200063057600060208d6064604051809481936359a87bc160e01b8352608435600484015260a435602484015233604484015260018060a01b03165af180156200062457620005f3575b506200039a565b602090813d83116200061c575b6200060c818362000a0b565b81010312620000ea578c620005ec565b503d62000600565b6040513d6000823e3d90fd5b60405162461bcd60e51b815260206004820152600b60248201526a64657620617070726f766560a81b6044820152606490fd5b6200068a915060203d60201162000691575b62000681818362000a0b565b81019062000a2e565b8d620005a0565b503d62000675565b60405162461bcd60e51b815260206004820152600860248201526719195d881c1d5b1b60c21b6044820152606490fd5b620006e6915060203d602011620006915762000681818362000a0b565b8d62000552565b634e487b7160e01b600052601160045260246000fd5b60405162461bcd60e51b81526020600482015260076024820152663737903830b4b960c91b6044820152606490fd5b60405162461bcd60e51b815260206004820152600a6024820152696c61756e63682066656560b01b6044820152606490fd5b34620000ea576000366003190112620000ea576040517f00000000000000000000000041fc09bf4e4647f1375633bace8f0203cb45f7426001600160a01b03168152602090f35b34620000ea576000366003190112620000ea576040517f00000000000000000000000004816090b4ef52937c5a0ac040a3e31079f511596001600160a01b03168152602090f35b34620000ea576020366003190112620000ea57600435600154811015620000ea57620008206020916200096b565b905460405160039290921b1c6001600160a01b03168152f35b34620000ea576000366003190112620000ea5760206040517f0000000000000000000000000000000000000000000000e3aeb5737240a000008152f35b34620000ea576000366003190112620000ea576020600054604051908152f35b34620000ea576000366003190112620000ea5760206040517f00000000000000000000000000000000000000000000021e19e0c9bab24000008152f35b34620000ea576000366003190112620000ea5760206040517f000000000000000000000000000000000000000000000000000000000000001e8152f35b34620000ea576000366003190112620000ea576020600154604051908152f35b34620000ea576000366003190112620000ea576020907f00000000000000000000000000000000000000000000000000470de4df8200008152f35b600154811015620009a35760016000527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60190600090565b634e487b7160e01b600052603260045260246000fd5b9181601f84011215620000ea5782359167ffffffffffffffff8311620000ea5760208381860195010111620000ea57565b908060209392818452848401376000828201840152601f01601f1916010190565b90601f8019910116810190811067ffffffffffffffff821117620004f057604052565b90816020910312620000ea57518015158103620000ea579056fe60406101808152346200054b5762001f369081380380620000208162000550565b9384398201906101209182848203126200054b5783516001600160401b0381116200054b57816200005391860162000576565b602085015190916001600160401b0382116200054b576200007691860162000576565b848301516001600160a01b0393919084811681036200054b576200009d60608801620005e8565b620000ab60808901620005e8565b9060a08901519260c08a01519460e08b015197610100809c0151998a15158b036200054b5786151590816200053e575b8162000531575b501562000500578051906001600160401b038211620003f45760005490600182811c92168015620004f5575b6020831014620003d35781601f84931162000492575b50602090601f831160011462000416576000926200040a575b50508160011b916000199060031b1c1916176000555b8051906001600160401b038211620003f45760015490600182811c92168015620003e9575b6020831014620003d35781601f8493116200036f575b50602090601f8311600114620002f557600092620002e9575b50508160011b916000199060031b1c1916176001555b60805260a05260c05260e05243865284526101409182526101609283523060005260026020526b033b2e3c9fd0803ce8000000808260002055815190815260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60203093a351926118f89485620005fe863960805185818161044c01528181610603015281816109c101528181610b1601528181610f2c015261181e015260a051858181610ea201526112ac015260c05185818161066d01526117e3015260e0518581816102ab01528181610a7601528181610b7401528181610e2a01526110220152518481816103ad015281816105cb015261088a01525183818161038c01528181610869015261105d0152518281816109070152610d0c01525181818161070801526117280152f35b015190503880620001a7565b6001600090815260008051602062001f168339815191529350601f198516905b8181106200035657509084600195949392106200033c575b505050811b01600155620001bd565b015160001960f88460031b161c191690553880806200032d565b9293602060018192878601518155019501930162000315565b600160005290915060008051602062001f16833981519152601f840160051c81019160208510620003c8575b90601f859493920160051c01905b818110620003b857506200018e565b60008155849350600101620003a9565b90915081906200039b565b634e487b7160e01b600052602260045260246000fd5b91607f169162000178565b634e487b7160e01b600052604160045260246000fd5b0151905038806200013d565b6000808052935060008051602062001ef683398151915291905b601f198416851062000476576001945083601f198116106200045c575b505050811b0160005562000153565b015160001960f88460031b161c191690553880806200044d565b8181015183556020948501946001909301929091019062000430565b6000805290915060008051602062001ef6833981519152601f840160051c81019160208510620004ea575b90601f859493920160051c01905b818110620004da575062000124565b60008155849350600101620004cb565b9091508190620004bd565b91607f16916200010e565b875162461bcd60e51b815260206004820152600a60248201526962616420706172616d7360b01b6044820152606490fd5b90508516151538620000e2565b85811615159150620000db565b600080fd5b6040519190601f01601f191682016001600160401b03811183821017620003f457604052565b919080601f840112156200054b5782516001600160401b038111620003f457602090620005ac601f8201601f1916830162000550565b928184528282870101116200054b5760005b818110620005d457508260009394955001015290565b8581018301518482018401528201620005be565b51906001600160a01b03821682036200054b5756fe6040608081526004908136101561001557600080fd5b600091823560e01c90816265318b146112db57816302d05d3f1461129757816306fdde03146111d8578163095ea7b31461116757816318160ddd1461114057816323b872dd146110805781632be29fa81461104557816330e3d48e1461100a578163313ce56714610fee578163351fee4614610e8e578163479dfd7b14610e715781634beb394c14610ddf57816359a87bc114610aa45781635ed930f314610a5a578163668038e0146109495781636694ba611461092a5781636c22a77e1461069c5781636edd12e0146108ef57816370a08231146108b757816384207be21461084f5781638ed2d1431461083057816395d89b411461072d5781639988def0146106f0578163a7ffd1cc146106d2578163a9059cbb146106a1578163bf333f2c1461069c578163c74e820e14610658578163cbcb317114610632578163cf880331146105ee578163d00efb2f146105b3578163d79875eb1461026657508063dd62ed3e1461021e578063de3aaf61146101e7578063e7c2b772146101c45763f8718858146101a357600080fd5b346101c057816003193601126101c0576020906006549051908152f35b5080fd5b50346101c057816003193601126101c05760209060ff6007541690519015158152f35b50346101c05760203660031901126101c05760209181906001600160a01b0361020e611301565b168152600a845220549051908152f35b50346101c057806003193601126101c0578060209261023b611301565b61024361131c565b6001600160a01b0391821683526003865283832091168252845220549051908152f35b919050346105af57806003193601126105af57813561028681151561152d565b3384526020936002855261029f828483205410156115af565b8354906102f46102cf837f0000000000000000000000000000000000000000000000000000000000000000611520565b308352600288526102ee856102e88886205493826113cf565b92611520565b90611414565b9182116105755733815260028652838120610310848254611434565b905530815260028652838120610327848254611520565b905561033583600654611434565b600655610344836008546113cf565b338252600987526103598583209182546113f8565b9055835183815230907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef883392a36103d17f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611520565b43109482869396610540575b50606486028681046064148715171561052d576127109004916104196104038489611434565b976104126024358a101561155f565b8354611434565b8255610424836116f9565b855163a9059cbb60e01b815233838201908152602081018990528990829081906040010381857f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af191821561052257916104f5575b50156104c95750835192835284868401528383015260608201527fdc5d404a76ab50144afc43faeff0266b98f34764e05ed785cc958689b620bcc860803392a251908152f35b845162461bcd60e51b815290810187905260066024820152651c185e5bdd5d60d21b6044820152606490fd5b6105159150883d8a1161051b575b61050d8183611332565b8101906114d1565b38610483565b503d610503565b8751903d90823e3d90fd5b634e487b7160e01b835260118252602483fd5b90955060648102908082046064149015171561056257612710900494386103dd565b634e487b7160e01b825260118652602482fd5b835162461bcd60e51b8152808601879052601460248201527365786365656473207265616c207265736572766560601b6044820152606490fd5b8280fd5b5050346101c057816003193601126101c057602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b5050346101c057816003193601126101c057517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5050346101c057816003193601126101c057806020923081526002845220549051908152f35b5050346101c057816003193601126101c057517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b6113b3565b5050346101c057806003193601126101c0576020906106cb6106c1611301565b60243590336115e5565b5160018152f35b9050346105af57826003193601126105af5760209250549051908152f35b5050346101c057816003193601126101c057602090517f000000000000000000000000000000000000000000000000000000000000000015158152f35b919050346105af57826003193601126105af578051918360018054918260011c92600181168015610826575b602095868610821461081357508488529081156107f15750600114610798575b610794868661078a828b0383611332565b519182918261136a565b0390f35b929550600183527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b8284106107de57505050826107949461078a928201019438610779565b80548685018801529286019281016107c1565b60ff191687860152505050151560051b830101925061078a8261079438610779565b634e487b7160e01b845260229052602483fd5b93607f1693610759565b5050346101c057816003193601126101c0576020906008549051908152f35b5050346101c057816003193601126101c0576020906108ae7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611520565b43109051908152f35b5050346101c05760203660031901126101c05760209181906001600160a01b036108df611301565b1681526002845220549051908152f35b5050346101c057816003193601126101c057602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b5050346101c057816003193601126101c0576020906005549051908152f35b919050346105af57826003193601126105af576109bc9261096933611441565b93849361097785151561149b565b3383526020958691600a8352858520610991838254611520565b9055855163a9059cbb60e01b8152339181019182526020820192909252909283918291604090910190565b0381857f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af1918215610a4f5790610a0292610a32575b506114e9565b80518281527f824d01e1921464b4232e19a403a24321155d2e927a48be9bf146b3211989f7e5843392a251908152f35b610a499150853d871161051b5761050d8183611332565b386109fc565b8351903d90823e3d90fd5b828434610aa15780600319360112610aa15750610a9a602092547f0000000000000000000000000000000000000000000000000000000000000000611520565b9051908152f35b80fd5b8383346101c05760603660031901126101c0576001600160a01b039260443584811690823590829003610ddb578015610add811561152d565b82151580610dd1575b15610d9e5785968551906323b872dd60e01b825233868301523060248301528360448301528160648160209b8c947f0000000000000000000000000000000000000000000000000000000000000000165af1908115610d94578791610d77575b5015610d4e5760648202908282046064141715610d3b576127109004610b6c8183611434565b9184549183837f000000000000000000000000000000000000000000000000000000000000000090610b9d91611520565b308a5260028b52888a2054610bb290836113cf565b91610bbc91611520565b610bc591611414565b976024358910157fbeae048c6d270d9469f86cf6e8fedda3c60ad770f16c24c9fc131c8e9a09101d9560609582610c0993610d32575b610c049061155f565b611520565b8755610c14826116f9565b30815260028a52878120610c298a8254611434565b905585815260028a52878120610c408a8254611520565b9055610c4e89600654611520565b600655610c7288610c618b6008546113cf565b9288815260098d5220918254611596565b90558487518981527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8b3092a38651918252878983015286820152a2836007549160ff83161580610d07575b610ccc575b50505051908152f35b60017f04d39283851d5dc1961a5296a48d487854db2aae45afe51e83aae1db8d04d42f9360ff191617600755548351908152a1838381610cc3565b5080547f00000000000000000000000000000000000000000000000000000000000000001115610cbe565b508b1515610bfb565b634e487b7160e01b865260118452602486fd5b845162461bcd60e51b8152808501889052600360248201526270617960e81b6044820152606490fd5b610d8e9150883d8a1161051b5761050d8183611332565b88610b46565b86513d89823e3d90fd5b845162461bcd60e51b8152602081860152600d60248201526c189859081c9958da5c1a595b9d609a1b6044820152606490fd5b5030831415610ae6565b8480fd5b828434610aa1576020366003190112610aa15782356064810281810460641482151715610e5e576020946102e885610e4e610e26610a9a97966127106102ee970490611434565b93547f0000000000000000000000000000000000000000000000000000000000000000611520565b94308152600289522054826113cf565b634e487b7160e01b835260118552602483fd5b5050346101c057816003193601126101c05760209051611b588152f35b8383346101c057816003193601126101c0577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b038181169133839003610fbd578495610f2892602092600554978893610eef85151561149b565b6005829055885163a9059cbb60e01b81526001600160a01b03909316908301908152602081019490945290948593849291839160400190565b03927f0000000000000000000000000000000000000000000000000000000000000000165af1908115610fb35790610f689160209691610f9657506114e9565b7fd046302bdc39599e60a5981e59227dcd1c643f512f56f2e984390c3ac6eadedb848351858152a251908152f35b610fad9150863d881161051b5761050d8183611332565b866109fc565b83513d87823e3d90fd5b835162461bcd60e51b8152602081880152600b60248201526a3737ba1031b932b0ba37b960a91b6044820152606490fd5b5050346101c057816003193601126101c0576020905160128152f35b5050346101c057816003193601126101c057602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b5050346101c057816003193601126101c057602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b919050346105af5760603660031901126105af5761109c611301565b6110a461131c565b6044359160018060a01b03811680875260209560038752858820338952875285882054908582106111115750948096976106cb968660001982036110ed575b50505050506115e5565b6110f691611434565b928152600389528181203382528952205538858180866110e3565b865162461bcd60e51b81529081018890526009602482015268616c6c6f77616e636560b81b6044820152606490fd5b5050346101c057816003193601126101c057602090516b033b2e3c9fd0803ce80000008152f35b5050346101c057806003193601126101c05760209181611185611301565b91602435918291338152600387528181209460018060a01b0316948582528752205582519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925843392a35160018152f35b919050346105af57826003193601126105af57805191838054906001908260011c9260018116801561128d575b602095868610821461081357508488529081156107f1575060011461123557610794868661078a828b0383611332565b8080949750527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5635b82841061127a57505050826107949461078a928201019438610779565b805486850188015292860192810161125d565b93607f1693611205565b5050346101c057816003193601126101c057517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5050346101c05760203660031901126101c057602090610a9a6112fc611301565b611441565b600435906001600160a01b038216820361131757565b600080fd5b602435906001600160a01b038216820361131757565b90601f8019910116810190811067ffffffffffffffff82111761135457604052565b634e487b7160e01b600052604160045260246000fd5b6020808252825181830181905290939260005b82811061139f57505060409293506000838284010152601f8019910116010190565b81810186015184820160400152850161137d565b3461131757600036600319011261131757602060405160648152f35b818102929181159184041417156113e257565b634e487b7160e01b600052601160045260246000fd5b919091600083820193841291129080158216911516176113e257565b811561141e570490565b634e487b7160e01b600052601260045260246000fd5b919082039182116113e257565b6008546001600160a01b03909116600081815260026020526040808220546114989491929161148591611473916113cf565b848352600960205283832054906113f8565b60801c928152600a602052205490611434565b90565b156114a257565b60405162461bcd60e51b81526020600482015260076024820152666e6f7468696e6760c81b6044820152606490fd5b90816020910312611317575180151581036113175790565b156114f057565b60405162461bcd60e51b81526020600482015260086024820152673a3930b739b332b960c11b6044820152606490fd5b919082018092116113e257565b1561153457565b606460405162461bcd60e51b81526020600482015260046024820152637a65726f60e01b6044820152fd5b1561156657565b60405162461bcd60e51b8152602060048201526008602482015267736c69707061676560c01b6044820152606490fd5b818103929160001380158285131691841216176113e257565b156115b657565b60405162461bcd60e51b815260206004820152600760248201526662616c616e636560c81b6044820152606490fd5b6001600160a01b03918216929130841415806116ed575b156116b3577fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91169160009083825260209160028352604090611644838383205410156115af565b85815260028452818120611659848254611434565b905586815260028452818120611670848254611520565b90556116aa82611682856008546113cf565b92888152600987528181206116988582546113f8565b90558981526009875220918254611596565b905551908152a3565b60405162461bcd60e51b81526020600482015260126024820152711d1c985919481d9a5848189d5e4bdcd95b1b60721b6044820152606490fd5b503081831614156115fc565b80156118bf57611b588102611b5719828204016113e25761271061171f91048092611434565b806117cc575b507f0000000000000000000000000000000000000000000000000000000000000000806117c1575b156117b057608081901b8115600160801b8383041417156113e2577f2724190d857d4dc7e52f584276d1bfd610594cdb6e4e5a4969c0db32b9b04bf2916117a461179c60209360065490611414565b600854611520565b600855604051908152a1565b6117bc90600554611520565b600555565b50600654151561174d565b60405163a9059cbb60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600482015260248101919091526020818060448101038160007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af19081156118b357600091611894575b50156118635738611725565b60405162461bcd60e51b81526020600482015260096024820152680e6d2dcd640e0eae6d60bb1b6044820152606490fd5b6118ad915060203d60201161051b5761050d8183611332565b38611857565b6040513d6000823e3d90fd5b5056fea26469706673582212203e8eb02bbe103d497fa3e1f898e2dd5e3c990a5e82a942d89981812657f3de4b64736f6c63430008180033290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6a26469706673582212202ab16cbbbe9dc845b64ccf05fd2eb6b1b5adfbf0ca13034ce515c2d9d70baa7264736f6c63430008180033