// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;
import {Create2} from "@openzeppelin/contracts/utils/Create2.sol";
import {PonsV2LauncherToken} from "./PonsV2LauncherToken.sol";
import {PonsV2BondingCurve} from "./PonsV2BondingCurve.sol";
import {PonsV2BuybackVault} from "./PonsV2BuybackVault.sol";
import {FeePolicySnapshot, IPonsV2FeeEscrow, IPonsV2FeePolicy} from "./interfaces/ILaunchpadV2.sol";
/**
* @notice Every input PonsV2LaunchFactory hands the deployer to stand up one
* launch. Grouped into a single calldata struct rather than a flat parameter
* list so the deployer stays inside the EVM's 16-slot stack window when
* compiled without the IR pipeline, which is the mode `forge coverage` uses.
*/
struct LaunchDeployment {
address pairToken;
address creatorFeeRecipient;
address originalDeployer;
IPonsV2FeePolicy feePolicy;
FeePolicySnapshot policy;
IPonsV2FeeEscrow feeEscrow;
PonsV2BuybackVault buybackVault;
uint256 phantomQuote;
uint256 curveFeeBps;
uint256 creatorTaxBps;
bool buybackEnabled;
uint256 graduationThreshold;
uint256 supply;
// Creator-chosen CREATE2 salt, forwarded from TokenParams. The factory
// authenticates `originalDeployer`, which gives each initiating account
// its own salt space even when it names a separate fee recipient.
bytes32 salt;
string name;
string symbol;
string logo;
string description;
PonsV2LauncherToken.Socials socials;
}
/**
* @title PonsV2LaunchDeployer
* @notice Deploys the bonding curve and launch token pair for one pons v2
* launch on PonsV2LaunchFactory's behalf. Split out into its own contract
* purely so PonsV2LaunchFactory's own bytecode stays under EIP-170's
* 24576-byte deployed-code limit: embedding two full contracts' creation
* code via `new` inside the factory itself was the single largest
* contributor to its size. Both new contracts still record the real
* factory's address explicitly (never this deployer's), since they gate
* privileged calls on it.
*/
contract PonsV2LaunchDeployer {
// Metadata is stored on the token and read back by unbounded-return view
// functions, so an unbounded write here becomes a permanently unreadable
// token: `socials()` returns all five strings at once and would run out
// of gas or time out an RPC node. Bounding the write is the only place
// the limit can be enforced, since the strings are immutable afterwards.
uint256 private constant MAX_NAME_LENGTH = 64;
uint256 private constant MAX_SYMBOL_LENGTH = 16;
uint256 private constant MAX_LOGO_LENGTH = 512;
uint256 private constant MAX_DESCRIPTION_LENGTH = 2048;
uint256 private constant MAX_SOCIAL_LENGTH = 256;
error NotFactory();
error MetadataTooLong();
address public immutable factory;
modifier onlyFactory() {
if (msg.sender != factory) revert NotFactory();
_;
}
constructor(address factory_) {
if (factory_ == address(0)) revert NotFactory();
factory = factory_;
}
/**
* @notice Deploys a fresh curve/token pair and returns both addresses.
* Both contracts are told `factory` (not this deployer) is their
* privileged caller. Wiring the curve to its token via `initialize()` is
* left to the factory itself, since that call is `onlyFactory`-gated.
*
* @dev Deployed with CREATE2 rather than CREATE so neither address depends
* on this deployer's nonce, and therefore on the order launches happen to
* land in. Under CREATE the Nth launch simply took the Nth address, so an
* address predicted before its launch confirmed committed to nothing and
* a different launch could arrive there instead. Under CREATE2 the address
* is a function of the salt and the creation code, and the creation code
* carries every constructor argument, so an address can only ever hold the
* exact launch it was computed from.
*
* Reverts through `Create2` with `FailedDeployment` when the pair already
* exists, which is the same creator reusing a salt on otherwise identical
* terms. Callers can test for it in advance with `predictLaunchAddresses`.
*/
function deployLaunch(LaunchDeployment calldata params)
external
onlyFactory
returns (address token, address curve)
{
_requireMetadataWithinLimits(params);
bytes32 salt = _launchSalt(params);
curve = Create2.deploy(0, salt, _curveCreationCode(params));
token = Create2.deploy(0, salt, _tokenCreationCode(params, curve));
}
/**
* @notice Returns the addresses `deployLaunch` would produce for `params`,
* without deploying anything.
*
* @dev Lets a caller confirm that a launch it has not seen confirmed yet
* will land where it expects, and lets the launch path be checked for a
* salt the creator has already used. The token is derived from the curve
* because the curve's address is one of the token's constructor
* arguments, so the pair has to be computed in deployment order.
*/
function predictLaunchAddresses(LaunchDeployment calldata params)
external
view
returns (address token, address curve)
{
bytes32 salt = _launchSalt(params);
curve = Create2.computeAddress(salt, keccak256(_curveCreationCode(params)));
token = Create2.computeAddress(salt, keccak256(_tokenCreationCode(params, curve)));
}
/**
* @dev CREATE2 salt for one launch: the creator's chosen salt namespaced
* by the factory-authenticated initiating account. `creatorFeeRecipient`
* is intentionally not the namespace because any caller may name an
* arbitrary payout address and could otherwise squat another creator's
* deployment.
*/
function _launchSalt(LaunchDeployment calldata params) private pure returns (bytes32) {
return keccak256(abi.encode(params.originalDeployer, params.salt));
}
/**
* @dev Creation code for the launch's bonding curve. Shared by the deploy
* and predict paths so the two can never derive different addresses.
*/
function _curveCreationCode(LaunchDeployment calldata params) private view returns (bytes memory) {
return abi.encodePacked(
type(PonsV2BondingCurve).creationCode,
abi.encode(
params.pairToken,
params.creatorFeeRecipient,
factory,
params.feePolicy,
params.policy,
params.feeEscrow,
params.buybackVault,
params.phantomQuote,
params.curveFeeBps,
params.creatorTaxBps,
params.buybackEnabled,
params.graduationThreshold
)
);
}
/**
* @dev Creation code for the launch's token, given the curve it mints its
* whole supply to.
*/
function _tokenCreationCode(LaunchDeployment calldata params, address curve) private view returns (bytes memory) {
return abi.encodePacked(
type(PonsV2LauncherToken).creationCode,
abi.encode(
params.name,
params.symbol,
params.logo,
params.description,
params.socials,
params.originalDeployer,
curve,
factory,
params.supply
)
);
}
/**
* @notice Reverts unless every metadata string fits its length cap.
* @dev The factory already rejects an empty name or symbol, so only the
* upper bound is checked here.
*/
function _requireMetadataWithinLimits(LaunchDeployment calldata params) private pure {
if (
bytes(params.name).length > MAX_NAME_LENGTH || bytes(params.symbol).length > MAX_SYMBOL_LENGTH
|| bytes(params.logo).length > MAX_LOGO_LENGTH
|| bytes(params.description).length > MAX_DESCRIPTION_LENGTH
) {
revert MetadataTooLong();
}
if (
bytes(params.socials.twitter).length > MAX_SOCIAL_LENGTH
|| bytes(params.socials.telegram).length > MAX_SOCIAL_LENGTH
|| bytes(params.socials.discord).length > MAX_SOCIAL_LENGTH
|| bytes(params.socials.website).length > MAX_SOCIAL_LENGTH
|| bytes(params.socials.farcaster).length > MAX_SOCIAL_LENGTH
) {
revert MetadataTooLong();
}
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "factory_",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "nonpayable"
},
{
"name": "Create2EmptyBytecode",
"type": "error",
"inputs": []
},
{
"name": "FailedDeployment",
"type": "error",
"inputs": []
},
{
"name": "InsufficientBalance",
"type": "error",
"inputs": [
{
"name": "balance",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "needed",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "MetadataTooLong",
"type": "error",
"inputs": []
},
{
"name": "NotFactory",
"type": "error",
"inputs": []
},
{
"name": "deployLaunch",
"type": "function",
"inputs": [
{
"name": "params",
"type": "tuple",
"components": [
{
"name": "pairToken",
"type": "address",
"internalType": "address"
},
{
"name": "creatorFeeRecipient",
"type": "address",
"internalType": "address"
},
{
"name": "originalDeployer",
"type": "address",
"internalType": "address"
},
{
"name": "feePolicy",
"type": "address",
"internalType": "contract IPonsV2FeePolicy"
},
{
"name": "policy",
"type": "tuple",
"components": [
{
"name": "protocolFeeRecipient",
"type": "address",
"internalType": "address"
},
{
"name": "protocolFeeShareBps",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "buybackBurnBps",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "hookFeeBps",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "maxInternalPriceImpactBps",
"type": "uint16",
"internalType": "uint16"
}
],
"internalType": "struct FeePolicySnapshot"
},
{
"name": "feeEscrow",
"type": "address",
"internalType": "contract IPonsV2FeeEscrow"
},
{
"name": "buybackVault",
"type": "address",
"internalType": "contract PonsV2BuybackVault"
},
{
"name": "phantomQuote",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "curveFeeBps",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "creatorTaxBps",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "buybackEnabled",
"type": "bool",
"internalType": "bool"
},
{
"name": "graduationThreshold",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "supply",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "salt",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "name",
"type": "string",
"internalType": "string"
},
{
"name": "symbol",
"type": "string",
"internalType": "string"
},
{
"name": "logo",
"type": "string",
"internalType": "string"
},
{
"name": "description",
"type": "string",
"internalType": "string"
},
{
"name": "socials",
"type": "tuple",
"components": [
{
"name": "twitter",
"type": "string",
"internalType": "string"
},
{
"name": "telegram",
"type": "string",
"internalType": "string"
},
{
"name": "discord",
"type": "string",
"internalType": "string"
},
{
"name": "website",
"type": "string",
"internalType": "string"
},
{
"name": "farcaster",
"type": "string",
"internalType": "string"
}
],
"internalType": "struct PonsV2LauncherToken.Socials"
}
],
"internalType": "struct LaunchDeployment"
}
],
"outputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "curve",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "nonpayable"
},
{
"name": "factory",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "predictLaunchAddresses",
"type": "function",
"inputs": [
{
"name": "params",
"type": "tuple",
"components": [
{
"name": "pairToken",
"type": "address",
"internalType": "address"
},
{
"name": "creatorFeeRecipient",
"type": "address",
"internalType": "address"
},
{
"name": "originalDeployer",
"type": "address",
"internalType": "address"
},
{
"name": "feePolicy",
"type": "address",
"internalType": "contract IPonsV2FeePolicy"
},
{
"name": "policy",
"type": "tuple",
"components": [
{
"name": "protocolFeeRecipient",
"type": "address",
"internalType": "address"
},
{
"name": "protocolFeeShareBps",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "buybackBurnBps",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "hookFeeBps",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "maxInternalPriceImpactBps",
"type": "uint16",
"internalType": "uint16"
}
],
"internalType": "struct FeePolicySnapshot"
},
{
"name": "feeEscrow",
"type": "address",
"internalType": "contract IPonsV2FeeEscrow"
},
{
"name": "buybackVault",
"type": "address",
"internalType": "contract PonsV2BuybackVault"
},
{
"name": "phantomQuote",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "curveFeeBps",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "creatorTaxBps",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "buybackEnabled",
"type": "bool",
"internalType": "bool"
},
{
"name": "graduationThreshold",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "supply",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "salt",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "name",
"type": "string",
"internalType": "string"
},
{
"name": "symbol",
"type": "string",
"internalType": "string"
},
{
"name": "logo",
"type": "string",
"internalType": "string"
},
{
"name": "description",
"type": "string",
"internalType": "string"
},
{
"name": "socials",
"type": "tuple",
"components": [
{
"name": "twitter",
"type": "string",
"internalType": "string"
},
{
"name": "telegram",
"type": "string",
"internalType": "string"
},
{
"name": "discord",
"type": "string",
"internalType": "string"
},
{
"name": "website",
"type": "string",
"internalType": "string"
},
{
"name": "farcaster",
"type": "string",
"internalType": "string"
}
],
"internalType": "struct PonsV2LauncherToken.Socials"
}
],
"internalType": "struct LaunchDeployment"
}
],
"outputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "curve",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
}
]0x60a03461009257601f61525538819003918201601f19168301916001600160401b038311848410176100965780849260209460405283398101031261009257516001600160a01b0381168082036100925715610083576080526040516151aa90816100ab8239608051818181604f0152818160920152818161043b01526107c60152f35b631966391b60e11b5f5260045ffd5b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c80632bc63e611461027657806378b98955146100825763c45a01551461003a575f80fd5b3461007e575f36600319011261007e576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b3461007e57610090366102b9565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036102675760406100d061024083018361058c565b905011801561024e575b8015610234575b801561021a575b610177576102c0810161010061010761010183856105bf565b8061058c565b9050119081156101f5575b81156101d0575b81156101ab575b8115610186575b506101775761015a61013882610338565b61015461014d61014785610387565b83610842565b8094610626565b90610842565b604080516001600160a01b03928316815292909116602083015290f35b63216e38bd60e21b5f5260045ffd5b61010091506101986101a291846105bf565b608081019061058c565b90501182610127565b90506101006101c76101bd83856105bf565b606081019061058c565b90501190610120565b90506101006101ec6101e283856105bf565b604081019061058c565b90501190610119565b905061010061021161020783856105bf565b602081019061058c565b90501190610112565b5061080061022c6102a083018361058c565b9050116100e8565b5061020061024661028083018361058c565b9050116100e1565b50601061025f61026083018361058c565b9050116100da565b631966391b60e11b5f5260045ffd5b3461007e57610284366102b9565b61015a61029082610338565b6102ac61014d61029f85610387565b6020815191012083610562565b6020815191012090610562565b602060031982011261007e576004359067ffffffffffffffff821161007e576102e090829003600319011261007e5760040190565b356001600160a01b038116810361007e5790565b90601f8019910116810190811067ffffffffffffffff82111761032457604052565b634e487b7160e01b5f52604160045260245ffd5b610344604082016102ee565b604080516001600160a01b039092166020830190815261022090930135828201528152610372606082610302565b51902090565b359061ffff8216820361007e57565b612cd89060405161039b6020840182610302565b828152602081019261089384396103b1826102ee565b6103bd602084016102ee565b60608401356001600160a01b03811692919083900361007e576101208501356001600160a01b038116939084900361007e576101408601356001600160a01b038116969087900361007e576101c08101359182151580930361007e57604080516001600160a01b0396871660208201908152958716918101919091527f000000000000000000000000000000000000000000000000000000000000000086166060820152608080820192909252939490820135908116929083900361007e5761055f976020966101e09460a087015261ffff61049b60a08601610378565b1660c087015261ffff6104b060c08601610378565b1660e087015261ffff6104c560e08601610378565b1661010087015261ffff6104dc6101008601610378565b166101208701526101408601526101608501526101608201356101808501526101808201356101a08501526101a08201356101c0850152828401520135610200820152610200815261053061022082610302565b6040519586945180918587015e840190838201905f8252519283915e01015f815203601f198101835282610302565b90565b90600b9160405191604083015260208201523081520160ff8153605590206001600160a01b031690565b903590601e198136030182121561007e570180359067ffffffffffffffff821161007e5760200191813603831361007e57565b903590609e198136030182121561007e570190565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561007e57016020813591019167ffffffffffffffff821161007e57813603831361007e57565b611c0a91604051916020840161063c9084610302565b838352602083019361356b853961065761024082018261058c565b9261066661026084018461058c565b93909161067761028083018361058c565b906106866102a085018561058c565b90916106966102c08701876105bf565b936106a3604088016102ee565b976040519a8b9a60208c019d6101208f526101408d01906106c3926105d4565b90601f198c83030160408d01526106d9926105d4565b90601f198a83030160608b01526106ef926105d4565b90601f19888303016080890152610705926105d4565b858103601f190160a08701529061071c81806105f4565b60a0845260a084019061072e926105d4565b61073b60208301836105f4565b848303602086015261074d92916105d4565b61075a60408301836105f4565b848303604086015261076c92916105d4565b61077960608301836105f4565b848303606086015261078b92916105d4565b9060808101610799916105f4565b909280830390608001526107ac926105d4565b6001600160a01b0393841660c086015290831660e08501527f0000000000000000000000000000000000000000000000000000000000000000909216610100840152610200013561012083015203601f198101825261080b9082610302565b604051938493518091602086015e83019060208201905f8252519283915e016020015f815203601f198101825261055f9082610302565b90805115610883576020815191015ff5906001600160a01b0382161561086457565b3d6108785763b06ebf3d60e01b5f5260045ffd5b6040513d5f823e3d90fd5b631328927760e21b5f5260045ffdfe610240604052346104a757604051612cd838819003601f8101601f191683016001600160401b038111848210176104ab578392829160405283398101039061020082126104a75761004f816104bf565b9161005c602083016104bf565b91610069604082016104bf565b606082015190926001600160a01b03821682036104a75760a090607f1901126104a75760405160a081016001600160401b038111828210176104ab576040526100b4608084016104bf565b81526100c260a084016104d3565b60208201526100d360c084016104d3565b60408201526100e460e084016104d3565b60608201526100f661010084016104d3565b6080820152610120830151956001600160a01b03871687036104a757610140840151926001600160a01b03841684036104a75761016085015191610180860151936101a0870151956101c08801519788151589036104a7576101e0015160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00559a6001600160a01b038b16158015610496575b610476576001600160a01b038516158015610485575b610476576001600160a01b038216156104765782516001600160a01b0316158015610463575b8015610450575b8015610440575b801561042c575b61040957878701808811610418576107d0106104095761ffff9460809485526001549a60a05260c05260e0526101005260018060a01b03815116610120528861014052826020820151166101605282604082015116610180520151166101a0526101c0526101e0526102005260ff60a01b90151560a01b169160018060a01b03169060018060a81b0319161717600155610220526040516127f590816104e3823960805181818161042f0152818161166d01528181611fc80152818161206d0152612614015260a051818181610230015281816107b001528181610af401528181610bc101528181610d7f015281816110f4015281816114160152611845015260c051818181610d190152611718015260e051818181610aaf0152818161264501526126e60152610100518181816103a90152611c6d015261012051818181610e51015281816114eb0152818161155f01528181611c2501528181611cff0152611f910152610140518181816116b10152611cd7015261016051818181610ca40152818161146b01528181611b3601528181611ed70152612243015261018051818181611617015261227501526101a051818181610c650152611df501526101c0518181816107710152818161083901528181610ee701526119c401526101e05181818161059201528181610f360152818161135e01526118d10152610200518181816105c601528181610b3b01528181610f68015261139001526102205181818161085d0152610ce00152f35b637a34030f60e01b5f5260045ffd5b634e487b7160e01b5f52601160045260245ffd5b5061271061ffff60808501511610156101db565b5061ffff608084015116156101d4565b5061271061ffff604085015116116101cd565b5061271061ffff602085015116116101c6565b63d92e233d60e01b5f5260045ffd5b506001600160a01b038116156101a0565b506001600160a01b038a161561018a565b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b03821682036104a757565b519061ffff821682036104a75756fe60806040526004361015610011575f80fd5b5f5f3560e01c80630902f1ac1461193657806315a5534714611919578063160d0da5146118f457806324a9d853146118ba57806331ff7f221461182a5780633729bb9a146116e05780633cd1fb8f1461169c5780633de35b79146116585780633f7ed6b71461163b57806349127e2a146115fd5780634c37ef23146115e05780634f1f58fd146115bc57806350e25ac21461159f578063529205871461140457806359a87bc114610e8057806364df049e14610e3b5780636783774b14610e1d5780637809452a14610dff5780637b04ea6214610d63578063808bcddc14610d485780638258903814610d035780638b0bc50114610cc85780639040f86614610c8957806390addc1e14610c4a5780639a9b567d14610ba05780639da771f414610b7c578063bf56b37114610b5e578063c1bb890114610b23578063c45a015514610ade578063c4b7de9714610a99578063c4d66de814610794578063c57eadfc14610759578063c68360a514610734578063ca52b0b714610716578063cbcb3171146106f1578063d04c698314610511578063d44bdfe7146104d2578063d5f39488146104a9578063d7e1ef391461047d578063db2bd5331461045f578063dc08e09414610419578063e7c2b772146103f6578063ed479c47146103d8578063f1f5c99314610393578063fc0c546a1461036c5763ff6d8d0514610214575f80fd5b346103695760203660031901126103695761022d61195c565b907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361035a576007549160ff831661034b576001600160a01b03811692831561033c57610283611a62565b1561032a57606060409460017ff8d37a90738ae063b8b8058b66f5880cf3cf7ab0c5d4fa78219696591dfbfb679360ff1916176007556102c1611eb7565b60055494806005556006548095826006558761031b575b816102fe575b50505085519081528460208201528386820152a182519182526020820152f35b915461031392906001600160a01b03166122b2565b5f84816102de565b6103258882611fc6565b6102d8565b6001620b9b5560e31b03198352600483fd5b63d92e233d60e01b8352600483fd5b63e6a0d45f60e01b8252600482fd5b631966391b60e11b8152600490fd5b80fd5b5034610369578060031936011261036957546040516001600160a01b039091168152602090f35b50346103695780600319360112610369576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103695780600319360112610369576020600254604051908152f35b5034610369578060031936011261036957602060ff600754166040519015158152f35b50346103695780600319360112610369576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316158152602090f35b50346103695780600319360112610369576020600454604051908152f35b50346103695760203660031901126103695760206104a161049c61195c565b611a7c565b604051908152f35b50346103695780600319360112610369576001546040516001600160a01b039091168152602090f35b50346103695760203660031901126103695760209060ff906040906001600160a01b036104fd61195c565b168152600d84522054166040519015158152f35b50346103695761052036611972565b909161052a611ae6565b83546001600160a01b03169384156106e25760ff6007541680156106d4575b6106c55781156106b6576001600160a01b0383169283156106a7576105896105f996846105836105776119b6565b92909330903390612472565b856121a9565b916127106105b77f000000000000000000000000000000000000000000000000000000000000000085611a25565b049687936105f46127106105eb7f000000000000000000000000000000000000000000000000000000000000000084611a25565b04998a926119a9565b6119a9565b9580871061068f575050948161065a86602098610637857f8113d738abdcb6b38357e9d53a54a7157861a09031b453651f0fe7fe151f59df976121f8565b610643826005546119a9565b6005556106528760065461199c565b600655611fc6565b604080519485526020850187905284015260608301523391608090a360015f5160206127a05f395f51905f5255604051908152f35b6371c4efed60e01b8252600487905260245260449150fd5b63d92e233d60e01b8252600482fd5b631f2a200560e01b8152600490fd5b63012d60bf60e11b8152600490fd5b506106dd611a62565b610549565b6321c4e35760e21b8152600490fd5b5034610369578060031936011261036957602061070c6119b6565b9050604051908152f35b50346103695780600319360112610369576020600554604051908152f35b5034610369578060031936011261036957602061074f611a62565b6040519015158152f35b503461036957806003193601126103695760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b5034610369576020366003190112610369576107ae61195c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633819003610a8a578254916001600160a01b038316610a7c576001600160a01b0316918215610a6d576001600160a01b031916821783556040516318160ddd60e01b8152602081600481865afa908115610a17578491610a3b575b506108897f00000000000000000000000000000000000000000000000000000000000000006108827f00000000000000000000000000000000000000000000000000000000000000008261199c565b90836123d4565b80158015610a31575b610a225760085560095542600a556040516328712d6160e11b8152602081600481855afa908115610a175784916109e4575b50600b55604051636783774b60e01b815290602090829060049082905afa9081156109a75783916109b2575b50600c556040516370a0823160e01b8152306004820152602081602481855afa9081156109a7578391610951575b507f908408e307fc569b417f6cbec5d5a06f44a0a505ac0479b47d421a4b2fd6a1e691602091600655604051908152a180f35b90506020813d60201161099f575b8161096c602093836119ef565b8101031261099b57517f908408e307fc569b417f6cbec5d5a06f44a0a505ac0479b47d421a4b2fd6a1e661091e565b5f80fd5b3d915061095f565b6040513d85823e3d90fd5b90506020813d6020116109dc575b816109cd602093836119ef565b8101031261099b57515f6108f0565b3d91506109c0565b90506020813d602011610a0f575b816109ff602093836119ef565b8101031261099b575160046108c4565b3d91506109f2565b6040513d86823e3d90fd5b63bc0ecfe360e01b8552600485fd5b5081811015610892565b90506020813d602011610a65575b81610a56602093836119ef565b8101031261099b57515f610833565b3d9150610a49565b63d92e233d60e01b8452600484fd5b62dc149f60e41b8452600484fd5b631966391b60e11b8352600483fd5b50346103695780600319360112610369576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103695780600319360112610369576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461036957806003193601126103695760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b50346103695780600319360112610369576020600a54604051908152f35b50346103695780600319360112610369576020610b976119b6565b50604051908152f35b503461036957602036600319011261036957600435801515809103610c46577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610c37576001805460ff60a01b191660a083901b60ff60a01b161790556040519081527fbfe799fb5e0148a5f2590ff531306d42a5d512b74a5029ceb805abb808b0f1a090602090a180f35b631966391b60e11b8252600482fd5b5080fd5b5034610369578060031936011261036957602060405161ffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b5034610369578060031936011261036957602060405161ffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b503461036957806003193601126103695760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b50346103695780600319360112610369576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461036957806003193601126103695760206104a1611a42565b503461036957602036600319011261036957610d7d61195c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610c37576001600160a01b031680156106a757600154816001600160a01b0382167f2cc664e1ac1e2d05c0d4637bb63ec8189113b6ac39276be8977e26216a8cdd198580a36001600160a01b0319161760015580f35b50346103695780600319360112610369576020600354604051908152f35b50346103695780600319360112610369576020600c54604051908152f35b50346103695780600319360112610369576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50610e8a36611972565b610e95929192611ae6565b5f546001600160a01b0316156113f55760ff60075416611345576001600160a01b0381169182156113e657610ec99061206b565b80156113d75760ff6007541661134557610f1d610f14610f0b6005547f000000000000000000000000000000000000000000000000000000000000000061199c565b600254906119a9565b600454906119a9565b9360065494610f2b84611a7c565b928361135c575b80947f000000000000000000000000000000000000000000000000000000000000000093610f608584611a25565b6127109004937f000000000000000000000000000000000000000000000000000000000000000095610f928786611a25565b612710900497610fa28187611a25565b612710900497838d8a8c610fb68c8c6119a9565b90610fc0916119a9565b90610fca916119a9565b91610fd4926121a9565b9c6008548082115f1461135457610feb90826119a9565b905b811561134557818f1161121e575b50505050505061100b8188611a25565b6110158a85611a25565b1061120857509161108d8685936105f48b61109e9761105f8b61105a7fec36bf571f136799e8dc0b0b8bea4b04d8bd3d43de838aab0d5fc21d4cbfc4559d9c8a61199c565b6121f8565b61106b8560055461199c565b60055561107a826006546119a9565b6006555f546001600160a01b03166122b2565b806111cc575b508161119c5761199c565b604080519485526020850187905284015260608301523391608090a36110c2611a62565b6110e3575b60209060015f5160206127a05f395f51905f5255604051908152f35b5f546001600160a01b0390811692907f000000000000000000000000000000000000000000000000000000000000000016803b1561099b575f80916024602096604051948593849263ff6d8d0560e01b845260048401525af19081611187575b5061118157546001600160a01b03167fe2cd2f31ebc05ec28640102987f4c8fc5f20e269e1b3aa82577f3f2f0e35c7c6835a604051908152a26110c7565b506110c7565b6111949192505f906119ef565b5f905f611143565b867f3bc39a5562b28f5fe8f36cecabfbaa12bb969acf05717994709225fc412a99346020604051858152a261199c565b611202906040518181527fa69e8258ccc7b9bbb70ab953fc2d1062b4ee28b8ca827534097e1732e87b026260203392a233611fc6565b5f611093565b886371c4efed60e01b5f5260045260245260445ffd5b949d5094985096509750975081998015801561133b575b61132c576112439083611a25565b91612710830292808404612710149015171561131857611262916119a9565b61271081029080820461271014901517156113185761128091611a38565b60018101809111611318578661271003612710811161131857866105f4866112a7936119a9565b6112b18183612333565b908015611304576112ef6127106112e76112d76112f7958397958480970915159061199c565b8880821091180288189b8c611a25565b04968a611a25565b049688611a25565b04935f8080808080610ffb565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b63bb55fd2760e01b5f5260045ffd5b5082821115611235565b63012d60bf60e11b5f5260045ffd5b505f90610fed565b7f0000000000000000000000000000000000000000000000000000000000000000612710036127108111611318576113b5907f0000000000000000000000000000000000000000000000000000000000000000906119a9565b6063198101908111611318578085116113cf575b50610f32565b93505f6113c9565b631f2a200560e01b5f5260045ffd5b63d92e233d60e01b5f5260045ffd5b6321c4e35760e21b5f5260045ffd5b3461099b575f36600319011261099b577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036115905760025460045490801580611588575b6113d75761149e60409261149961271061149161ffff7f00000000000000000000000000000000000000000000000000000000000000001686611a25565b0480946119a9565b61199c565b5f6002555f6003555f6004556114bf6114b7828461199c565b6005546119a9565b60055581611559575b8061153d575b6001548351838152602081018390526001600160a01b03918216917f000000000000000000000000000000000000000000000000000000000000000016907f6460dc5c867a0678a8bcc5e64f629fae539901c53a4a8b42fe21d7a6c5e6437d908690a382519182526020820152f35b6001546115549082906001600160a01b0316611fc6565b6114ce565b611583827f0000000000000000000000000000000000000000000000000000000000000000611fc6565b6114c8565b508115611453565b631966391b60e11b5f5260045ffd5b3461099b575f36600319011261099b576020600b54604051908152f35b3461099b575f36600319011261099b5760206104a1610f14600554600254906119a9565b3461099b575f36600319011261099b576020600654604051908152f35b3461099b575f36600319011261099b57602060405161ffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461099b575f36600319011261099b576020600954604051908152f35b3461099b575f36600319011261099b576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461099b575f36600319011261099b576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461099b57602036600319011261099b576116f9611ae6565b60ff6007541661181b57604051638a36a6bb60e01b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa908115611810575f916117ce575b506001600160a01b031633141580806117b9575b6117aa578061179f575b6117905761177d600435611b1e565b60015f5160206127a05f395f51905f5255005b630c736d4160e21b5f5260045ffd5b50600354151561176e565b63235084c360e21b5f5260045ffd5b506001546001600160a01b0316331415611764565b90506020813d602011611808575b816117e9602093836119ef565b8101031261099b57516001600160a01b038116810361099b5781611750565b3d91506117dc565b6040513d5f823e3d90fd5b63e6a0d45f60e01b5f5260045ffd5b3461099b57602036600319011261099b5761184361195c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303611590576001600160a01b03165f818152600d60205260408120805460ff191660011790557fe4b7e48fbd47c2f602bacadee76ad33b16542ddb4997cfc0de04c311adcfa8c79080a2005b3461099b575f36600319011261099b5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b3461099b575f36600319011261099b57602060ff60015460a01c166040519015158152f35b3461099b575f36600319011261099b576020600854604051908152f35b3461099b575f36600319011261099b5760406119506119b6565b82519182526020820152f35b600435906001600160a01b038216820361099b57565b606090600319011261099b5760043590602435906044356001600160a01b038116810361099b5790565b9190820180921161131857565b9190820391821161131857565b6119e8610f14610f0b6005547f000000000000000000000000000000000000000000000000000000000000000061199c565b9060065490565b90601f8019910116810190811067ffffffffffffffff821117611a1157604052565b634e487b7160e01b5f52604160045260245ffd5b8181029291811591840414171561131857565b8115611304570490565b60065460085480821115611a5c57611a59916119a9565b90565b50505f90565b60ff60075416611a7857611a74611a42565b1590565b5f90565b6001600160a01b03165f908152600d602052604090205460ff16611a7857600b548015611ae157611aaf600a54426119a9565b600c5480821015611ada57600e820291808304600e149015171561131857611ad691611a38565b1c90565b5050505f90565b505f90565b60025f5160206127a05f395f51905f525414611b0f5760025f5160206127a05f395f51905f5255565b633ee5aeb560e01b5f5260045ffd5b60025490600454821580611eaf575b611eaa5761ffff7f000000000000000000000000000000000000000000000000000000000000000016611b6e612710611b668387611a25565b0480956119a9565b600354818082109118029384821890611b8c829561149984866119a9565b955f93148015611db3575b5050505f6002555f6003555f600455611bb36114b7858761199c565b60055580611c4e575b5050916060917f9f4cd7c4ed99d08a797804560c9c5d71d2cf7e101f2e3b5e7d1ca8a24c370e4f9382611c1f575b81611c03575b60405192835260208301526040820152a1565b600154611c1a9083906001600160a01b031661260f565b611bf0565b611c49837f000000000000000000000000000000000000000000000000000000000000000061260f565b611bea565b92909391611c5e846006546119a9565b6006555f546001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169691611c9e91879189911661251a565b5f546001600160a01b031690863b1561099b5760405163892823f760e01b81526004810192909252602482018690526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660448401527f00000000000000000000000000000000000000000000000000000000000000001660648301526084820152945f90869060a490829084905af19485156118105760406060957f5feba9b0d52c92ada4b9c571c2bee52390c54f2947208ab250221e6ee32f12ff927f9f4cd7c4ed99d08a797804560c9c5d71d2cf7e101f2e3b5e7d1ca8a24c370e4f98611da3575b508151908482526020820152a19193819350611bbc565b5f611dad916119ef565b5f611d8c565b8196939592949615611e9b57611dc76119b6565b909161271087029087820461271014171561131857611df090611dea888561199c565b90611a38565b61ffff7f0000000000000000000000000000000000000000000000000000000000000000161015611e64575b505084611e3b57505090611e2f9161199c565b915f915b5f8080611b97565b848192959396945010611e4e5750611e33565b906371c4efed60e01b5f5260045260245260445ffd5b611e6e91866124db565b80151580611e8a575b611e82575b80611e1c565b94505f611e7c565b50611e93611a42565b811115611e77565b633672d25f60e01b5f5260045ffd5b505050565b508015611b2d565b600254600454811580611fbe575b611fba57611f05612710611efd61ffff7f00000000000000000000000000000000000000000000000000000000000000001685611a25565b0480936119a9565b91611f336060927f9f4cd7c4ed99d08a797804560c9c5d71d2cf7e101f2e3b5e7d1ca8a24c370e4f9461199c565b5f6002555f6003555f600455611f4c6114b7828461199c565b60055581611f8b575b80611f6f575b6040519182525f60208301526040820152a1565b600154611f869082906001600160a01b031661260f565b611f5b565b611fb5827f000000000000000000000000000000000000000000000000000000000000000061260f565b611f55565b5050565b508015611ec5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169190821561200357612001926122b2565b565b5f9250829182918291906001600160a01b03165af13d15612066573d67ffffffffffffffff8111611a115760405190612046601f8201601f1916602001836119ef565b81525f60203d92013e5b1561205757565b6312171d8360e31b5f5260045ffd5b612050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169081156121875734612178576040516370a0823160e01b815230600482015290602082602481865afa918215611810575f92612143575b506024926120de602092303384612472565b6040516370a0823160e01b815230600482015293849182905afa8015611810575f9061210f575b611a5992506119a9565b506020823d60201161213b575b81612129602093836119ef565b8101031261099b57611a599151612105565b3d915061211c565b9091506020813d602011612170575b8161215f602093836119ef565b8101031261099b57519060246120cc565b3d9150612152565b63e0aeda7d60e01b5f5260045ffd5b80915034036121935790565b635e3b067f60e11b5f523460045260245260445ffd5b909181156121e957821580156121e1575b61132c576121c9925f92612757565b9081156121d257565b6342301c2360e01b5f5260045ffd5b5080156121ba565b63098fb56160e01b5f5260045ffd5b90612214906122098360025461199c565b60025560045461199c565b60045560ff60015460a01c16806122a9575b61222d5750565b61271061229b6122706122a4938361226961ffff7f00000000000000000000000000000000000000000000000000000000000000001683611a25565b04906119a9565b61ffff7f00000000000000000000000000000000000000000000000000000000000000001690611a25565b0460035461199c565b600355565b50801515612226565b916040519163a9059cbb60e01b5f5260018060a01b031660045260245260205f60448180865af19060015f5114821615612312575b604052156122f25750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b90600181151661232a57823b15153d151616906122e7565b503d5f823e3d90fd5b5f196127108209916127108202918280851094039380850394146123c857838211156123b057612710829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b50634e487b715f52156003026011186020526024601cfd5b5090611a599250611a38565b90915f198383099280830292838086109503948086039514612465578483111561244d5790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b505090611a599250611a38565b6040516323b872dd60e01b5f9081526001600160a01b039384166004529290931660245260449390935260209060648180865af19060015f51148216156124c3575b6040525f606052156122f25750565b90600181151661232a57823b15153d151616906124b4565b909181158015612512575b801561250a575b8015612503575b611ada57611a59925f92612757565b505f6124f4565b5080156124ed565b5082156124e6565b916040519163095ea7b360e01b5f5260018060a01b031691826004528160245260205f60448180885af19060015f5114821615612600575b6040521561255f57505050565b60405163095ea7b360e01b5f52826004525f60245260205f60448180885af19060015f51148216156125e8575b604052156125ca576040519163095ea7b360e01b5f5260045260245260205f60448180865af19060015f511482161561231257604052156122f25750565b635274afe760e01b5f9081526001600160a01b038416600452602490fd5b90600181151661232a57843b15153d1516169061258c565b90843b15153d15161690612552565b5f91907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169081156126e0577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661267884828561251a565b803b156126dc578492918360649260405196879586946309ad4dd960e01b865260018060a01b03166004860152602485015260448401525af180156126d1576126bf575050565b6126ca8280926119ef565b6103695750565b6040513d84823e3d90fd5b8480fd5b919250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b1561099b576040516301aba89b60e71b81526001600160a01b03909216600483015290915f9183916024918391905af180156118105761274d5750565b5f612001916119ef565b909192612710039061271082116113185761277c9161277591611a25565b9283611a25565b90612710810290808204612710149015171561131857611a5992611dea9161199c56fe9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a2646970667358221220e96b30c1852a1d0fb726a607894af92ab1cce71f676a967229cfaed5e9b6a73564736f6c6343000823003360e060405234610ecb57611c0a8038038061001981610ecf565b928339810161012082820312610ecb5781516001600160401b038111610ecb5781610045918401610ef4565b60208301516001600160401b038111610ecb5782610064918501610ef4565b60408401519092906001600160401b038111610ecb5781610086918601610ef4565b60608501516001600160401b038111610ecb57826100a5918701610ef4565b60808601519091906001600160401b038111610ecb5786019160a083850312610ecb576040519060a082016001600160401b038111838210176107255760405283516001600160401b038111610ecb5785610101918601610ef4565b825260208401516001600160401b038111610ecb5785610122918601610ef4565b6020830190815260408501519093906001600160401b038111610ecb578661014b918701610ef4565b6040840190815260608601519095906001600160401b038111610ecb5787610174918301610ef4565b6060850190815260808201519097906001600160401b038111610ecb5761019b9201610ef4565b9860808401998a526101af60a08201610f45565b6101bb60c08301610f45565b996101006101cb60e08501610f45565b9301518a51909a6001600160401b0382116107255760035490600182811c92168015610ec1575b60208310146107075781601f849311610e4b575b50602090601f8311600114610de5575f92610dda575b50508160011b915f199060031b1c1916176003555b8051906001600160401b0382116107255760045490600182811c92168015610dd0575b60208310146107075781601f849311610d5a575b50602090601f8311600114610cf4575f92610ce9575b50508160011b915f199060031b1c1916176004555b6001600160a01b038116158015610cd8575b8015610cc7575b610cb85760805260a05260c08890528051906001600160401b0382116107255760055490600182811c92168015610cae575b60208310146107075781601f849311610c54575b50602090601f8311600114610bee575f92610be3575b50508160011b915f199060031b1c1916176005555b8051906001600160401b0382116107255760065490600182811c92168015610bd9575b60208310146107075781601f849311610b63575b50602090601f8311600114610afd575f92610af2575b50508160011b915f199060031b1c1916176006555b518051906001600160401b0382116107255760075490600182811c92168015610ae8575b60208310146107075781601f849311610a72575b50602090601f8311600114610a0c575f92610a01575b50508160011b915f199060031b1c1916176007555b518051906001600160401b0382116107255760085490600182811c921680156109f7575b60208310146107075781601f849311610981575b50602090601f831160011461091b575f92610910575b50508160011b915f199060031b1c1916176008555b518051906001600160401b0382116107255760095490600182811c92168015610906575b60208310146107075781601f849311610890575b50602090601f831160011461082a575f9261081f575b50508160011b915f199060031b1c1916176009555b5180519093906001600160401b03811161072557600a54600181811c91168015610815575b602082101461070757601f81116107a7575b50602094601f8211600114610744579481929394955f92610739575b50508160011b915f199060031b1c191617600a555b5180519092906001600160401b03811161072557600b54600181811c9116801561071b575b602082101461070757601f8111610699575b506020601f821160011461063657819293945f9261062b575b50508160011b915f199060031b1c191617600b555b6001600160a01b031690811561061857600254908082018092116106045760207fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef915f9360025584845283825260408420818154019055604051908152a3604051610cb09081610f5a823960805181818161017b0152610211015260a0518161054d015260c051816104460152f35b634e487b7160e01b5f52601160045260245ffd5b63ec442f0560e01b5f525f60045260245ffd5b015190505f80610560565b601f19821690600b5f52805f20915f5b81811061068157509583600195969710610669575b505050811b01600b55610575565b01515f1960f88460031b161c191690555f808061065b565b9192602060018192868b015181550194019201610646565b8181111561054757600b5f52601f820160051c7f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9602084106106ff575b81601f9101920160051c03905f5b8281106106f2575050610547565b5f828201556001016106e4565b5f91506106d6565b634e487b7160e01b5f52602260045260245ffd5b90607f1690610535565b634e487b7160e01b5f52604160045260245ffd5b015190505f806104fb565b601f19821695600a5f52805f20915f5b88811061078f57508360019596979810610777575b505050811b01600a55610510565b01515f1960f88460031b161c191690555f8080610769565b91926020600181928685015181550194019201610754565b818111156104df57600a5f52601f820160051c7fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a86020841061080d575b81601f9101920160051c03905f5b8281106108005750506104df565b5f828201556001016107f2565b5f91506107e4565b90607f16906104cd565b015190505f80610493565b60095f9081528281209350601f198516905b8181106108785750908460019594939210610860575b505050811b016009556104a8565b01515f1960f88460031b161c191690555f8080610852565b9293602060018192878601518155019501930161083c565b8281111561047d5760095f52909150601f830160051c7f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af602085106108fe575b849392601f0160051c82900391015f5b8281106108ee57505061047d565b5f818301558594506001016108e0565b5f91506108d0565b91607f1691610469565b015190505f80610430565b60085f9081528281209350601f198516905b8181106109695750908460019594939210610951575b505050811b01600855610445565b01515f1960f88460031b161c191690555f8080610943565b9293602060018192878601518155019501930161092d565b8281111561041a5760085f52909150601f830160051c7ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3602085106109ef575b849392601f0160051c82900391015f5b8281106109df57505061041a565b5f818301558594506001016109d1565b5f91506109c1565b91607f1691610406565b015190505f806103cd565b60075f9081528281209350601f198516905b818110610a5a5750908460019594939210610a42575b505050811b016007556103e2565b01515f1960f88460031b161c191690555f8080610a34565b92936020600181928786015181550195019301610a1e565b828111156103b75760075f52909150601f830160051c7fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68860208510610ae0575b849392601f0160051c82900391015f5b828110610ad05750506103b7565b5f81830155859450600101610ac2565b5f9150610ab2565b91607f16916103a3565b015190505f8061036a565b60065f9081528281209350601f198516905b818110610b4b5750908460019594939210610b33575b505050811b0160065561037f565b01515f1960f88460031b161c191690555f8080610b25565b92936020600181928786015181550195019301610b0f565b828111156103545760065f52909150601f830160051c7ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f60208510610bd1575b849392601f0160051c82900391015f5b828110610bc1575050610354565b5f81830155859450600101610bb3565b5f9150610ba3565b91607f1691610340565b015190505f80610308565b60055f9081528281209350601f198516905b818110610c3c5750908460019594939210610c24575b505050811b0160055561031d565b01515f1960f88460031b161c191690555f8080610c16565b92936020600181928786015181550195019301610c00565b828111156102f25790915060055f5260205f20601f840160051c9060208510610ca6575b849392601f0160051c82900391015f5b828110610c965750506102f2565b5f81830155859450600101610c88565b5f9150610c78565b91607f16916102de565b63d92e233d60e01b5f5260045ffd5b506001600160a01b038216156102ac565b506001600160a01b038a16156102a5565b015190505f8061027e565b60045f9081528281209350601f198516905b818110610d425750908460019594939210610d2a575b505050811b01600455610293565b01515f1960f88460031b161c191690555f8080610d1c565b92936020600181928786015181550195019301610d06565b828111156102685760045f52909150601f830160051c7f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b60208510610dc8575b849392601f0160051c82900391015f5b828110610db8575050610268565b5f81830155859450600101610daa565b5f9150610d9a565b91607f1691610254565b015190505f8061021c565b60035f9081528281209350601f198516905b818110610e335750908460019594939210610e1b575b505050811b01600355610231565b01515f1960f88460031b161c191690555f8080610e0d565b92936020600181928786015181550195019301610df7565b828111156102065760035f52909150601f830160051c7fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b60208510610eb9575b849392601f0160051c82900391015f5b828110610ea9575050610206565b5f81830155859450600101610e9b565b5f9150610e8b565b91607f16916101f2565b5f80fd5b6040519190601f01601f191682016001600160401b0381118382101761072557604052565b81601f82011215610ecb578051906001600160401b03821161072557610f23601f8301601f1916602001610ecf565b9282845260208383010111610ecb57815f9260208093018386015e8301015290565b51906001600160a01b0382168203610ecb5756fe60806040526004361015610011575f80fd5b5f3560e01c806306fdde03146106b1578063095ea7b31461060957806318160ddd146105ec57806323b872dd146105b4578063313ce5671461059957806342966c681461057c578063536dac9b1461053857806353cd512a146104ac57806370a08231146104755780637165485d146104315780637284e4161461041657806379cc6790146103e457806395d89b41146102f0578063a9059cbb146102bf578063abb1dc44146101aa578063d5f3948814610166578063dd62ed3e146101165763fb7f21eb146100df575f80fd5b34610112575f3660031901126101125761010e6100fa6108dc565b60405191829160208352602083019061076c565b0390f35b5f80fd5b346101125760403660031901126101125761012f610790565b6101376107a6565b6001600160a01b039182165f908152600160209081526040808320949093168252928352819020549051908152f35b34610112575f366003190112610112576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610112575f36600319011261011257606060806040516101ca816107bc565b828152826020820152826040820152828082015201526102446101eb6108dc565b61010e6101f661080e565b610252610201610a3e565b9160405195869560018060a01b037f000000000000000000000000000000000000000000000000000000000000000016875260806020880152608087019061076c565b90858203604087015261076c565b838103606085015260806102ae61029c61028a610278865160a0875260a087019061076c565b6020870151868203602088015261076c565b6040860151858203604087015261076c565b6060850151848203606086015261076c565b92015190608081840391015261076c565b34610112576040366003190112610112576102e56102db610790565b6024359033610b39565b602060405160018152f35b34610112575f366003190112610112576040515f6004548060011c906001811680156103da575b6020831081146103c6578285529081156103a25750600114610344575b61010e836100fa818503826107ec565b60045f9081527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b939250905b808210610388575090915081016020016100fa610334565b919260018160209254838588010152019101909291610370565b60ff191660208086019190915291151560051b840190910191506100fa9050610334565b634e487b7160e01b5f52602260045260245ffd5b91607f1691610317565b3461011257604036600319011261011257610414610400610790565b6024359061040f823383610a96565b610bf6565b005b34610112575f3660031901126101125761010e6100fa61080e565b34610112575f366003190112610112576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610112576020366003190112610112576001600160a01b03610496610790565b165f525f602052602060405f2054604051908152f35b34610112575f366003190112610112576105006104c7610a3e565b61010e81519161052a60208201519161051c604082015161050e6080606085015194015195604051998a9960a08b5260a08b019061076c565b9089820360208b015261076c565b90878203604089015261076c565b90858203606087015261076c565b90838203608085015261076c565b34610112575f366003190112610112576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101125760203660031901126101125761041460043533610bf6565b34610112575f36600319011261011257602060405160128152f35b34610112576060366003190112610112576102e56105d0610790565b6105d86107a6565b604435916105e7833383610a96565b610b39565b34610112575f366003190112610112576020600254604051908152f35b3461011257604036600319011261011257610622610790565b60243590331561069e576001600160a01b031690811561068b57335f52600160205260405f20825f526020528060405f20556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b634a1406b160e11b5f525f60045260245ffd5b63e602df0560e01b5f525f60045260245ffd5b34610112575f366003190112610112576040515f6003548060011c90600181168015610762575b6020831081146103c6578285529081156103a257506001146107045761010e836100fa818503826107ec565b60035f9081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b939250905b808210610748575090915081016020016100fa610334565b919260018160209254838588010152019101909291610730565b91607f16916106d8565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361011257565b602435906001600160a01b038216820361011257565b60a0810190811067ffffffffffffffff8211176107d857604052565b634e487b7160e01b5f52604160045260245ffd5b90601f8019910116810190811067ffffffffffffffff8211176107d857604052565b604051905f6006548060011c91600182169182156108d2575b6020841083146103c65783865285929081156108b35750600114610854575b610852925003836107ec565b565b5060065f90815290917ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f5b81831061089757505090602061085292820101610846565b602091935080600191548385890101520191019091849261087f565b6020925061085294915060ff191682840152151560051b820101610846565b92607f1692610827565b604051905f6005548060011c916001821691821561097e575b6020841083146103c65783865285929081156108b3575060011461091f57610852925003836107ec565b5060055f90815290917f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db05b81831061096257505090602061085292820101610846565b602091935080600191548385890101520191019091849261094a565b92607f16926108f5565b90604051915f8154908160011c9260018316928315610a34575b6020851084146103c6578487528693908115610a1257506001146109ce575b50610852925003836107ec565b90505f9291925260205f20905f915b8183106109f6575050906020610852928201015f6109c1565b60209193508060019154838589010152019101909184926109dd565b90506020925061085294915060ff191682840152151560051b8201015f6109c1565b93607f16936109a2565b60405190610a4b826107bc565b81610a566007610988565b8152610a626008610988565b6020820152610a716009610988565b6040820152610a80600a610988565b60608201526080610a91600b610988565b910152565b6001600160a01b039081165f818152600160209081526040808320948616835293905291909120549291905f198410610ad0575b50505050565b828410610b1657801561069e576001600160a01b0382161561068b575f52600160205260405f209060018060a01b03165f5260205260405f20910390555f808080610aca565b508290637dc7a0d960e11b5f5260018060a01b031660045260245260445260645ffd5b6001600160a01b0316908115610be3576001600160a01b0316918215610bd057815f525f60205260405f2054818110610bb757817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92602092855f525f84520360405f2055845f525f825260405f20818154019055604051908152a3565b8263391434e360e21b5f5260045260245260445260645ffd5b63ec442f0560e01b5f525f60045260245ffd5b634b637e8f60e11b5f525f60045260245ffd5b9091906001600160a01b03168015610be357805f525f60205260405f2054838110610c60576020845f94957fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef938587528684520360408620558060025403600255604051908152a3565b915063391434e360e21b5f5260045260245260445260645ffdfea2646970667358221220f8f8df1aef409554acec1774e66d855cbdc94f6a3e199a378f5ba9fe2a08326664736f6c63430008230033a264697066735822122043692b12e926ea372e49ab4ff77f7ae460bf174c2328b899294d64ad027310eb64736f6c634300082300330000000000000000000000007ed598bcef8bd9edd8c97a195c6d13f40801ec7e
0x60806040526004361015610011575f80fd5b5f3560e01c80632bc63e611461027657806378b98955146100825763c45a01551461003a575f80fd5b3461007e575f36600319011261007e576040517f0000000000000000000000007ed598bcef8bd9edd8c97a195c6d13f40801ec7e6001600160a01b03168152602090f35b5f80fd5b3461007e57610090366102b9565b7f0000000000000000000000007ed598bcef8bd9edd8c97a195c6d13f40801ec7e6001600160a01b031633036102675760406100d061024083018361058c565b905011801561024e575b8015610234575b801561021a575b610177576102c0810161010061010761010183856105bf565b8061058c565b9050119081156101f5575b81156101d0575b81156101ab575b8115610186575b506101775761015a61013882610338565b61015461014d61014785610387565b83610842565b8094610626565b90610842565b604080516001600160a01b03928316815292909116602083015290f35b63216e38bd60e21b5f5260045ffd5b61010091506101986101a291846105bf565b608081019061058c565b90501182610127565b90506101006101c76101bd83856105bf565b606081019061058c565b90501190610120565b90506101006101ec6101e283856105bf565b604081019061058c565b90501190610119565b905061010061021161020783856105bf565b602081019061058c565b90501190610112565b5061080061022c6102a083018361058c565b9050116100e8565b5061020061024661028083018361058c565b9050116100e1565b50601061025f61026083018361058c565b9050116100da565b631966391b60e11b5f5260045ffd5b3461007e57610284366102b9565b61015a61029082610338565b6102ac61014d61029f85610387565b6020815191012083610562565b6020815191012090610562565b602060031982011261007e576004359067ffffffffffffffff821161007e576102e090829003600319011261007e5760040190565b356001600160a01b038116810361007e5790565b90601f8019910116810190811067ffffffffffffffff82111761032457604052565b634e487b7160e01b5f52604160045260245ffd5b610344604082016102ee565b604080516001600160a01b039092166020830190815261022090930135828201528152610372606082610302565b51902090565b359061ffff8216820361007e57565b612cd89060405161039b6020840182610302565b828152602081019261089384396103b1826102ee565b6103bd602084016102ee565b60608401356001600160a01b03811692919083900361007e576101208501356001600160a01b038116939084900361007e576101408601356001600160a01b038116969087900361007e576101c08101359182151580930361007e57604080516001600160a01b0396871660208201908152958716918101919091527f0000000000000000000000007ed598bcef8bd9edd8c97a195c6d13f40801ec7e86166060820152608080820192909252939490820135908116929083900361007e5761055f976020966101e09460a087015261ffff61049b60a08601610378565b1660c087015261ffff6104b060c08601610378565b1660e087015261ffff6104c560e08601610378565b1661010087015261ffff6104dc6101008601610378565b166101208701526101408601526101608501526101608201356101808501526101808201356101a08501526101a08201356101c0850152828401520135610200820152610200815261053061022082610302565b6040519586945180918587015e840190838201905f8252519283915e01015f815203601f198101835282610302565b90565b90600b9160405191604083015260208201523081520160ff8153605590206001600160a01b031690565b903590601e198136030182121561007e570180359067ffffffffffffffff821161007e5760200191813603831361007e57565b903590609e198136030182121561007e570190565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561007e57016020813591019167ffffffffffffffff821161007e57813603831361007e57565b611c0a91604051916020840161063c9084610302565b838352602083019361356b853961065761024082018261058c565b9261066661026084018461058c565b93909161067761028083018361058c565b906106866102a085018561058c565b90916106966102c08701876105bf565b936106a3604088016102ee565b976040519a8b9a60208c019d6101208f526101408d01906106c3926105d4565b90601f198c83030160408d01526106d9926105d4565b90601f198a83030160608b01526106ef926105d4565b90601f19888303016080890152610705926105d4565b858103601f190160a08701529061071c81806105f4565b60a0845260a084019061072e926105d4565b61073b60208301836105f4565b848303602086015261074d92916105d4565b61075a60408301836105f4565b848303604086015261076c92916105d4565b61077960608301836105f4565b848303606086015261078b92916105d4565b9060808101610799916105f4565b909280830390608001526107ac926105d4565b6001600160a01b0393841660c086015290831660e08501527f0000000000000000000000007ed598bcef8bd9edd8c97a195c6d13f40801ec7e909216610100840152610200013561012083015203601f198101825261080b9082610302565b604051938493518091602086015e83019060208201905f8252519283915e016020015f815203601f198101825261055f9082610302565b90805115610883576020815191015ff5906001600160a01b0382161561086457565b3d6108785763b06ebf3d60e01b5f5260045ffd5b6040513d5f823e3d90fd5b631328927760e21b5f5260045ffdfe610240604052346104a757604051612cd838819003601f8101601f191683016001600160401b038111848210176104ab578392829160405283398101039061020082126104a75761004f816104bf565b9161005c602083016104bf565b91610069604082016104bf565b606082015190926001600160a01b03821682036104a75760a090607f1901126104a75760405160a081016001600160401b038111828210176104ab576040526100b4608084016104bf565b81526100c260a084016104d3565b60208201526100d360c084016104d3565b60408201526100e460e084016104d3565b60608201526100f661010084016104d3565b6080820152610120830151956001600160a01b03871687036104a757610140840151926001600160a01b03841684036104a75761016085015191610180860151936101a0870151956101c08801519788151589036104a7576101e0015160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00559a6001600160a01b038b16158015610496575b610476576001600160a01b038516158015610485575b610476576001600160a01b038216156104765782516001600160a01b0316158015610463575b8015610450575b8015610440575b801561042c575b61040957878701808811610418576107d0106104095761ffff9460809485526001549a60a05260c05260e0526101005260018060a01b03815116610120528861014052826020820151166101605282604082015116610180520151166101a0526101c0526101e0526102005260ff60a01b90151560a01b169160018060a01b03169060018060a81b0319161717600155610220526040516127f590816104e3823960805181818161042f0152818161166d01528181611fc80152818161206d0152612614015260a051818181610230015281816107b001528181610af401528181610bc101528181610d7f015281816110f4015281816114160152611845015260c051818181610d190152611718015260e051818181610aaf0152818161264501526126e60152610100518181816103a90152611c6d015261012051818181610e51015281816114eb0152818161155f01528181611c2501528181611cff0152611f910152610140518181816116b10152611cd7015261016051818181610ca40152818161146b01528181611b3601528181611ed70152612243015261018051818181611617015261227501526101a051818181610c650152611df501526101c0518181816107710152818161083901528181610ee701526119c401526101e05181818161059201528181610f360152818161135e01526118d10152610200518181816105c601528181610b3b01528181610f68015261139001526102205181818161085d0152610ce00152f35b637a34030f60e01b5f5260045ffd5b634e487b7160e01b5f52601160045260245ffd5b5061271061ffff60808501511610156101db565b5061ffff608084015116156101d4565b5061271061ffff604085015116116101cd565b5061271061ffff602085015116116101c6565b63d92e233d60e01b5f5260045ffd5b506001600160a01b038116156101a0565b506001600160a01b038a161561018a565b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b03821682036104a757565b519061ffff821682036104a75756fe60806040526004361015610011575f80fd5b5f5f3560e01c80630902f1ac1461193657806315a5534714611919578063160d0da5146118f457806324a9d853146118ba57806331ff7f221461182a5780633729bb9a146116e05780633cd1fb8f1461169c5780633de35b79146116585780633f7ed6b71461163b57806349127e2a146115fd5780634c37ef23146115e05780634f1f58fd146115bc57806350e25ac21461159f578063529205871461140457806359a87bc114610e8057806364df049e14610e3b5780636783774b14610e1d5780637809452a14610dff5780637b04ea6214610d63578063808bcddc14610d485780638258903814610d035780638b0bc50114610cc85780639040f86614610c8957806390addc1e14610c4a5780639a9b567d14610ba05780639da771f414610b7c578063bf56b37114610b5e578063c1bb890114610b23578063c45a015514610ade578063c4b7de9714610a99578063c4d66de814610794578063c57eadfc14610759578063c68360a514610734578063ca52b0b714610716578063cbcb3171146106f1578063d04c698314610511578063d44bdfe7146104d2578063d5f39488146104a9578063d7e1ef391461047d578063db2bd5331461045f578063dc08e09414610419578063e7c2b772146103f6578063ed479c47146103d8578063f1f5c99314610393578063fc0c546a1461036c5763ff6d8d0514610214575f80fd5b346103695760203660031901126103695761022d61195c565b907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361035a576007549160ff831661034b576001600160a01b03811692831561033c57610283611a62565b1561032a57606060409460017ff8d37a90738ae063b8b8058b66f5880cf3cf7ab0c5d4fa78219696591dfbfb679360ff1916176007556102c1611eb7565b60055494806005556006548095826006558761031b575b816102fe575b50505085519081528460208201528386820152a182519182526020820152f35b915461031392906001600160a01b03166122b2565b5f84816102de565b6103258882611fc6565b6102d8565b6001620b9b5560e31b03198352600483fd5b63d92e233d60e01b8352600483fd5b63e6a0d45f60e01b8252600482fd5b631966391b60e11b8152600490fd5b80fd5b5034610369578060031936011261036957546040516001600160a01b039091168152602090f35b50346103695780600319360112610369576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103695780600319360112610369576020600254604051908152f35b5034610369578060031936011261036957602060ff600754166040519015158152f35b50346103695780600319360112610369576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316158152602090f35b50346103695780600319360112610369576020600454604051908152f35b50346103695760203660031901126103695760206104a161049c61195c565b611a7c565b604051908152f35b50346103695780600319360112610369576001546040516001600160a01b039091168152602090f35b50346103695760203660031901126103695760209060ff906040906001600160a01b036104fd61195c565b168152600d84522054166040519015158152f35b50346103695761052036611972565b909161052a611ae6565b83546001600160a01b03169384156106e25760ff6007541680156106d4575b6106c55781156106b6576001600160a01b0383169283156106a7576105896105f996846105836105776119b6565b92909330903390612472565b856121a9565b916127106105b77f000000000000000000000000000000000000000000000000000000000000000085611a25565b049687936105f46127106105eb7f000000000000000000000000000000000000000000000000000000000000000084611a25565b04998a926119a9565b6119a9565b9580871061068f575050948161065a86602098610637857f8113d738abdcb6b38357e9d53a54a7157861a09031b453651f0fe7fe151f59df976121f8565b610643826005546119a9565b6005556106528760065461199c565b600655611fc6565b604080519485526020850187905284015260608301523391608090a360015f5160206127a05f395f51905f5255604051908152f35b6371c4efed60e01b8252600487905260245260449150fd5b63d92e233d60e01b8252600482fd5b631f2a200560e01b8152600490fd5b63012d60bf60e11b8152600490fd5b506106dd611a62565b610549565b6321c4e35760e21b8152600490fd5b5034610369578060031936011261036957602061070c6119b6565b9050604051908152f35b50346103695780600319360112610369576020600554604051908152f35b5034610369578060031936011261036957602061074f611a62565b6040519015158152f35b503461036957806003193601126103695760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b5034610369576020366003190112610369576107ae61195c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633819003610a8a578254916001600160a01b038316610a7c576001600160a01b0316918215610a6d576001600160a01b031916821783556040516318160ddd60e01b8152602081600481865afa908115610a17578491610a3b575b506108897f00000000000000000000000000000000000000000000000000000000000000006108827f00000000000000000000000000000000000000000000000000000000000000008261199c565b90836123d4565b80158015610a31575b610a225760085560095542600a556040516328712d6160e11b8152602081600481855afa908115610a175784916109e4575b50600b55604051636783774b60e01b815290602090829060049082905afa9081156109a75783916109b2575b50600c556040516370a0823160e01b8152306004820152602081602481855afa9081156109a7578391610951575b507f908408e307fc569b417f6cbec5d5a06f44a0a505ac0479b47d421a4b2fd6a1e691602091600655604051908152a180f35b90506020813d60201161099f575b8161096c602093836119ef565b8101031261099b57517f908408e307fc569b417f6cbec5d5a06f44a0a505ac0479b47d421a4b2fd6a1e661091e565b5f80fd5b3d915061095f565b6040513d85823e3d90fd5b90506020813d6020116109dc575b816109cd602093836119ef565b8101031261099b57515f6108f0565b3d91506109c0565b90506020813d602011610a0f575b816109ff602093836119ef565b8101031261099b575160046108c4565b3d91506109f2565b6040513d86823e3d90fd5b63bc0ecfe360e01b8552600485fd5b5081811015610892565b90506020813d602011610a65575b81610a56602093836119ef565b8101031261099b57515f610833565b3d9150610a49565b63d92e233d60e01b8452600484fd5b62dc149f60e41b8452600484fd5b631966391b60e11b8352600483fd5b50346103695780600319360112610369576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103695780600319360112610369576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461036957806003193601126103695760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b50346103695780600319360112610369576020600a54604051908152f35b50346103695780600319360112610369576020610b976119b6565b50604051908152f35b503461036957602036600319011261036957600435801515809103610c46577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610c37576001805460ff60a01b191660a083901b60ff60a01b161790556040519081527fbfe799fb5e0148a5f2590ff531306d42a5d512b74a5029ceb805abb808b0f1a090602090a180f35b631966391b60e11b8252600482fd5b5080fd5b5034610369578060031936011261036957602060405161ffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b5034610369578060031936011261036957602060405161ffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b503461036957806003193601126103695760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b50346103695780600319360112610369576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461036957806003193601126103695760206104a1611a42565b503461036957602036600319011261036957610d7d61195c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610c37576001600160a01b031680156106a757600154816001600160a01b0382167f2cc664e1ac1e2d05c0d4637bb63ec8189113b6ac39276be8977e26216a8cdd198580a36001600160a01b0319161760015580f35b50346103695780600319360112610369576020600354604051908152f35b50346103695780600319360112610369576020600c54604051908152f35b50346103695780600319360112610369576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50610e8a36611972565b610e95929192611ae6565b5f546001600160a01b0316156113f55760ff60075416611345576001600160a01b0381169182156113e657610ec99061206b565b80156113d75760ff6007541661134557610f1d610f14610f0b6005547f000000000000000000000000000000000000000000000000000000000000000061199c565b600254906119a9565b600454906119a9565b9360065494610f2b84611a7c565b928361135c575b80947f000000000000000000000000000000000000000000000000000000000000000093610f608584611a25565b6127109004937f000000000000000000000000000000000000000000000000000000000000000095610f928786611a25565b612710900497610fa28187611a25565b612710900497838d8a8c610fb68c8c6119a9565b90610fc0916119a9565b90610fca916119a9565b91610fd4926121a9565b9c6008548082115f1461135457610feb90826119a9565b905b811561134557818f1161121e575b50505050505061100b8188611a25565b6110158a85611a25565b1061120857509161108d8685936105f48b61109e9761105f8b61105a7fec36bf571f136799e8dc0b0b8bea4b04d8bd3d43de838aab0d5fc21d4cbfc4559d9c8a61199c565b6121f8565b61106b8560055461199c565b60055561107a826006546119a9565b6006555f546001600160a01b03166122b2565b806111cc575b508161119c5761199c565b604080519485526020850187905284015260608301523391608090a36110c2611a62565b6110e3575b60209060015f5160206127a05f395f51905f5255604051908152f35b5f546001600160a01b0390811692907f000000000000000000000000000000000000000000000000000000000000000016803b1561099b575f80916024602096604051948593849263ff6d8d0560e01b845260048401525af19081611187575b5061118157546001600160a01b03167fe2cd2f31ebc05ec28640102987f4c8fc5f20e269e1b3aa82577f3f2f0e35c7c6835a604051908152a26110c7565b506110c7565b6111949192505f906119ef565b5f905f611143565b867f3bc39a5562b28f5fe8f36cecabfbaa12bb969acf05717994709225fc412a99346020604051858152a261199c565b611202906040518181527fa69e8258ccc7b9bbb70ab953fc2d1062b4ee28b8ca827534097e1732e87b026260203392a233611fc6565b5f611093565b886371c4efed60e01b5f5260045260245260445ffd5b949d5094985096509750975081998015801561133b575b61132c576112439083611a25565b91612710830292808404612710149015171561131857611262916119a9565b61271081029080820461271014901517156113185761128091611a38565b60018101809111611318578661271003612710811161131857866105f4866112a7936119a9565b6112b18183612333565b908015611304576112ef6127106112e76112d76112f7958397958480970915159061199c565b8880821091180288189b8c611a25565b04968a611a25565b049688611a25565b04935f8080808080610ffb565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b63bb55fd2760e01b5f5260045ffd5b5082821115611235565b63012d60bf60e11b5f5260045ffd5b505f90610fed565b7f0000000000000000000000000000000000000000000000000000000000000000612710036127108111611318576113b5907f0000000000000000000000000000000000000000000000000000000000000000906119a9565b6063198101908111611318578085116113cf575b50610f32565b93505f6113c9565b631f2a200560e01b5f5260045ffd5b63d92e233d60e01b5f5260045ffd5b6321c4e35760e21b5f5260045ffd5b3461099b575f36600319011261099b577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036115905760025460045490801580611588575b6113d75761149e60409261149961271061149161ffff7f00000000000000000000000000000000000000000000000000000000000000001686611a25565b0480946119a9565b61199c565b5f6002555f6003555f6004556114bf6114b7828461199c565b6005546119a9565b60055581611559575b8061153d575b6001548351838152602081018390526001600160a01b03918216917f000000000000000000000000000000000000000000000000000000000000000016907f6460dc5c867a0678a8bcc5e64f629fae539901c53a4a8b42fe21d7a6c5e6437d908690a382519182526020820152f35b6001546115549082906001600160a01b0316611fc6565b6114ce565b611583827f0000000000000000000000000000000000000000000000000000000000000000611fc6565b6114c8565b508115611453565b631966391b60e11b5f5260045ffd5b3461099b575f36600319011261099b576020600b54604051908152f35b3461099b575f36600319011261099b5760206104a1610f14600554600254906119a9565b3461099b575f36600319011261099b576020600654604051908152f35b3461099b575f36600319011261099b57602060405161ffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461099b575f36600319011261099b576020600954604051908152f35b3461099b575f36600319011261099b576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461099b575f36600319011261099b576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461099b57602036600319011261099b576116f9611ae6565b60ff6007541661181b57604051638a36a6bb60e01b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa908115611810575f916117ce575b506001600160a01b031633141580806117b9575b6117aa578061179f575b6117905761177d600435611b1e565b60015f5160206127a05f395f51905f5255005b630c736d4160e21b5f5260045ffd5b50600354151561176e565b63235084c360e21b5f5260045ffd5b506001546001600160a01b0316331415611764565b90506020813d602011611808575b816117e9602093836119ef565b8101031261099b57516001600160a01b038116810361099b5781611750565b3d91506117dc565b6040513d5f823e3d90fd5b63e6a0d45f60e01b5f5260045ffd5b3461099b57602036600319011261099b5761184361195c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303611590576001600160a01b03165f818152600d60205260408120805460ff191660011790557fe4b7e48fbd47c2f602bacadee76ad33b16542ddb4997cfc0de04c311adcfa8c79080a2005b3461099b575f36600319011261099b5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b3461099b575f36600319011261099b57602060ff60015460a01c166040519015158152f35b3461099b575f36600319011261099b576020600854604051908152f35b3461099b575f36600319011261099b5760406119506119b6565b82519182526020820152f35b600435906001600160a01b038216820361099b57565b606090600319011261099b5760043590602435906044356001600160a01b038116810361099b5790565b9190820180921161131857565b9190820391821161131857565b6119e8610f14610f0b6005547f000000000000000000000000000000000000000000000000000000000000000061199c565b9060065490565b90601f8019910116810190811067ffffffffffffffff821117611a1157604052565b634e487b7160e01b5f52604160045260245ffd5b8181029291811591840414171561131857565b8115611304570490565b60065460085480821115611a5c57611a59916119a9565b90565b50505f90565b60ff60075416611a7857611a74611a42565b1590565b5f90565b6001600160a01b03165f908152600d602052604090205460ff16611a7857600b548015611ae157611aaf600a54426119a9565b600c5480821015611ada57600e820291808304600e149015171561131857611ad691611a38565b1c90565b5050505f90565b505f90565b60025f5160206127a05f395f51905f525414611b0f5760025f5160206127a05f395f51905f5255565b633ee5aeb560e01b5f5260045ffd5b60025490600454821580611eaf575b611eaa5761ffff7f000000000000000000000000000000000000000000000000000000000000000016611b6e612710611b668387611a25565b0480956119a9565b600354818082109118029384821890611b8c829561149984866119a9565b955f93148015611db3575b5050505f6002555f6003555f600455611bb36114b7858761199c565b60055580611c4e575b5050916060917f9f4cd7c4ed99d08a797804560c9c5d71d2cf7e101f2e3b5e7d1ca8a24c370e4f9382611c1f575b81611c03575b60405192835260208301526040820152a1565b600154611c1a9083906001600160a01b031661260f565b611bf0565b611c49837f000000000000000000000000000000000000000000000000000000000000000061260f565b611bea565b92909391611c5e846006546119a9565b6006555f546001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169691611c9e91879189911661251a565b5f546001600160a01b031690863b1561099b5760405163892823f760e01b81526004810192909252602482018690526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660448401527f00000000000000000000000000000000000000000000000000000000000000001660648301526084820152945f90869060a490829084905af19485156118105760406060957f5feba9b0d52c92ada4b9c571c2bee52390c54f2947208ab250221e6ee32f12ff927f9f4cd7c4ed99d08a797804560c9c5d71d2cf7e101f2e3b5e7d1ca8a24c370e4f98611da3575b508151908482526020820152a19193819350611bbc565b5f611dad916119ef565b5f611d8c565b8196939592949615611e9b57611dc76119b6565b909161271087029087820461271014171561131857611df090611dea888561199c565b90611a38565b61ffff7f0000000000000000000000000000000000000000000000000000000000000000161015611e64575b505084611e3b57505090611e2f9161199c565b915f915b5f8080611b97565b848192959396945010611e4e5750611e33565b906371c4efed60e01b5f5260045260245260445ffd5b611e6e91866124db565b80151580611e8a575b611e82575b80611e1c565b94505f611e7c565b50611e93611a42565b811115611e77565b633672d25f60e01b5f5260045ffd5b505050565b508015611b2d565b600254600454811580611fbe575b611fba57611f05612710611efd61ffff7f00000000000000000000000000000000000000000000000000000000000000001685611a25565b0480936119a9565b91611f336060927f9f4cd7c4ed99d08a797804560c9c5d71d2cf7e101f2e3b5e7d1ca8a24c370e4f9461199c565b5f6002555f6003555f600455611f4c6114b7828461199c565b60055581611f8b575b80611f6f575b6040519182525f60208301526040820152a1565b600154611f869082906001600160a01b031661260f565b611f5b565b611fb5827f000000000000000000000000000000000000000000000000000000000000000061260f565b611f55565b5050565b508015611ec5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169190821561200357612001926122b2565b565b5f9250829182918291906001600160a01b03165af13d15612066573d67ffffffffffffffff8111611a115760405190612046601f8201601f1916602001836119ef565b81525f60203d92013e5b1561205757565b6312171d8360e31b5f5260045ffd5b612050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169081156121875734612178576040516370a0823160e01b815230600482015290602082602481865afa918215611810575f92612143575b506024926120de602092303384612472565b6040516370a0823160e01b815230600482015293849182905afa8015611810575f9061210f575b611a5992506119a9565b506020823d60201161213b575b81612129602093836119ef565b8101031261099b57611a599151612105565b3d915061211c565b9091506020813d602011612170575b8161215f602093836119ef565b8101031261099b57519060246120cc565b3d9150612152565b63e0aeda7d60e01b5f5260045ffd5b80915034036121935790565b635e3b067f60e11b5f523460045260245260445ffd5b909181156121e957821580156121e1575b61132c576121c9925f92612757565b9081156121d257565b6342301c2360e01b5f5260045ffd5b5080156121ba565b63098fb56160e01b5f5260045ffd5b90612214906122098360025461199c565b60025560045461199c565b60045560ff60015460a01c16806122a9575b61222d5750565b61271061229b6122706122a4938361226961ffff7f00000000000000000000000000000000000000000000000000000000000000001683611a25565b04906119a9565b61ffff7f00000000000000000000000000000000000000000000000000000000000000001690611a25565b0460035461199c565b600355565b50801515612226565b916040519163a9059cbb60e01b5f5260018060a01b031660045260245260205f60448180865af19060015f5114821615612312575b604052156122f25750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b90600181151661232a57823b15153d151616906122e7565b503d5f823e3d90fd5b5f196127108209916127108202918280851094039380850394146123c857838211156123b057612710829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b50634e487b715f52156003026011186020526024601cfd5b5090611a599250611a38565b90915f198383099280830292838086109503948086039514612465578483111561244d5790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b505090611a599250611a38565b6040516323b872dd60e01b5f9081526001600160a01b039384166004529290931660245260449390935260209060648180865af19060015f51148216156124c3575b6040525f606052156122f25750565b90600181151661232a57823b15153d151616906124b4565b909181158015612512575b801561250a575b8015612503575b611ada57611a59925f92612757565b505f6124f4565b5080156124ed565b5082156124e6565b916040519163095ea7b360e01b5f5260018060a01b031691826004528160245260205f60448180885af19060015f5114821615612600575b6040521561255f57505050565b60405163095ea7b360e01b5f52826004525f60245260205f60448180885af19060015f51148216156125e8575b604052156125ca576040519163095ea7b360e01b5f5260045260245260205f60448180865af19060015f511482161561231257604052156122f25750565b635274afe760e01b5f9081526001600160a01b038416600452602490fd5b90600181151661232a57843b15153d1516169061258c565b90843b15153d15161690612552565b5f91907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169081156126e0577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661267884828561251a565b803b156126dc578492918360649260405196879586946309ad4dd960e01b865260018060a01b03166004860152602485015260448401525af180156126d1576126bf575050565b6126ca8280926119ef565b6103695750565b6040513d84823e3d90fd5b8480fd5b919250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b1561099b576040516301aba89b60e71b81526001600160a01b03909216600483015290915f9183916024918391905af180156118105761274d5750565b5f612001916119ef565b909192612710039061271082116113185761277c9161277591611a25565b9283611a25565b90612710810290808204612710149015171561131857611a5992611dea9161199c56fe9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a2646970667358221220e96b30c1852a1d0fb726a607894af92ab1cce71f676a967229cfaed5e9b6a73564736f6c6343000823003360e060405234610ecb57611c0a8038038061001981610ecf565b928339810161012082820312610ecb5781516001600160401b038111610ecb5781610045918401610ef4565b60208301516001600160401b038111610ecb5782610064918501610ef4565b60408401519092906001600160401b038111610ecb5781610086918601610ef4565b60608501516001600160401b038111610ecb57826100a5918701610ef4565b60808601519091906001600160401b038111610ecb5786019160a083850312610ecb576040519060a082016001600160401b038111838210176107255760405283516001600160401b038111610ecb5785610101918601610ef4565b825260208401516001600160401b038111610ecb5785610122918601610ef4565b6020830190815260408501519093906001600160401b038111610ecb578661014b918701610ef4565b6040840190815260608601519095906001600160401b038111610ecb5787610174918301610ef4565b6060850190815260808201519097906001600160401b038111610ecb5761019b9201610ef4565b9860808401998a526101af60a08201610f45565b6101bb60c08301610f45565b996101006101cb60e08501610f45565b9301518a51909a6001600160401b0382116107255760035490600182811c92168015610ec1575b60208310146107075781601f849311610e4b575b50602090601f8311600114610de5575f92610dda575b50508160011b915f199060031b1c1916176003555b8051906001600160401b0382116107255760045490600182811c92168015610dd0575b60208310146107075781601f849311610d5a575b50602090601f8311600114610cf4575f92610ce9575b50508160011b915f199060031b1c1916176004555b6001600160a01b038116158015610cd8575b8015610cc7575b610cb85760805260a05260c08890528051906001600160401b0382116107255760055490600182811c92168015610cae575b60208310146107075781601f849311610c54575b50602090601f8311600114610bee575f92610be3575b50508160011b915f199060031b1c1916176005555b8051906001600160401b0382116107255760065490600182811c92168015610bd9575b60208310146107075781601f849311610b63575b50602090601f8311600114610afd575f92610af2575b50508160011b915f199060031b1c1916176006555b518051906001600160401b0382116107255760075490600182811c92168015610ae8575b60208310146107075781601f849311610a72575b50602090601f8311600114610a0c575f92610a01575b50508160011b915f199060031b1c1916176007555b518051906001600160401b0382116107255760085490600182811c921680156109f7575b60208310146107075781601f849311610981575b50602090601f831160011461091b575f92610910575b50508160011b915f199060031b1c1916176008555b518051906001600160401b0382116107255760095490600182811c92168015610906575b60208310146107075781601f849311610890575b50602090601f831160011461082a575f9261081f575b50508160011b915f199060031b1c1916176009555b5180519093906001600160401b03811161072557600a54600181811c91168015610815575b602082101461070757601f81116107a7575b50602094601f8211600114610744579481929394955f92610739575b50508160011b915f199060031b1c191617600a555b5180519092906001600160401b03811161072557600b54600181811c9116801561071b575b602082101461070757601f8111610699575b506020601f821160011461063657819293945f9261062b575b50508160011b915f199060031b1c191617600b555b6001600160a01b031690811561061857600254908082018092116106045760207fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef915f9360025584845283825260408420818154019055604051908152a3604051610cb09081610f5a823960805181818161017b0152610211015260a0518161054d015260c051816104460152f35b634e487b7160e01b5f52601160045260245ffd5b63ec442f0560e01b5f525f60045260245ffd5b015190505f80610560565b601f19821690600b5f52805f20915f5b81811061068157509583600195969710610669575b505050811b01600b55610575565b01515f1960f88460031b161c191690555f808061065b565b9192602060018192868b015181550194019201610646565b8181111561054757600b5f52601f820160051c7f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9602084106106ff575b81601f9101920160051c03905f5b8281106106f2575050610547565b5f828201556001016106e4565b5f91506106d6565b634e487b7160e01b5f52602260045260245ffd5b90607f1690610535565b634e487b7160e01b5f52604160045260245ffd5b015190505f806104fb565b601f19821695600a5f52805f20915f5b88811061078f57508360019596979810610777575b505050811b01600a55610510565b01515f1960f88460031b161c191690555f8080610769565b91926020600181928685015181550194019201610754565b818111156104df57600a5f52601f820160051c7fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a86020841061080d575b81601f9101920160051c03905f5b8281106108005750506104df565b5f828201556001016107f2565b5f91506107e4565b90607f16906104cd565b015190505f80610493565b60095f9081528281209350601f198516905b8181106108785750908460019594939210610860575b505050811b016009556104a8565b01515f1960f88460031b161c191690555f8080610852565b9293602060018192878601518155019501930161083c565b8281111561047d5760095f52909150601f830160051c7f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af602085106108fe575b849392601f0160051c82900391015f5b8281106108ee57505061047d565b5f818301558594506001016108e0565b5f91506108d0565b91607f1691610469565b015190505f80610430565b60085f9081528281209350601f198516905b8181106109695750908460019594939210610951575b505050811b01600855610445565b01515f1960f88460031b161c191690555f8080610943565b9293602060018192878601518155019501930161092d565b8281111561041a5760085f52909150601f830160051c7ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3602085106109ef575b849392601f0160051c82900391015f5b8281106109df57505061041a565b5f818301558594506001016109d1565b5f91506109c1565b91607f1691610406565b015190505f806103cd565b60075f9081528281209350601f198516905b818110610a5a5750908460019594939210610a42575b505050811b016007556103e2565b01515f1960f88460031b161c191690555f8080610a34565b92936020600181928786015181550195019301610a1e565b828111156103b75760075f52909150601f830160051c7fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68860208510610ae0575b849392601f0160051c82900391015f5b828110610ad05750506103b7565b5f81830155859450600101610ac2565b5f9150610ab2565b91607f16916103a3565b015190505f8061036a565b60065f9081528281209350601f198516905b818110610b4b5750908460019594939210610b33575b505050811b0160065561037f565b01515f1960f88460031b161c191690555f8080610b25565b92936020600181928786015181550195019301610b0f565b828111156103545760065f52909150601f830160051c7ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f60208510610bd1575b849392601f0160051c82900391015f5b828110610bc1575050610354565b5f81830155859450600101610bb3565b5f9150610ba3565b91607f1691610340565b015190505f80610308565b60055f9081528281209350601f198516905b818110610c3c5750908460019594939210610c24575b505050811b0160055561031d565b01515f1960f88460031b161c191690555f8080610c16565b92936020600181928786015181550195019301610c00565b828111156102f25790915060055f5260205f20601f840160051c9060208510610ca6575b849392601f0160051c82900391015f5b828110610c965750506102f2565b5f81830155859450600101610c88565b5f9150610c78565b91607f16916102de565b63d92e233d60e01b5f5260045ffd5b506001600160a01b038216156102ac565b506001600160a01b038a16156102a5565b015190505f8061027e565b60045f9081528281209350601f198516905b818110610d425750908460019594939210610d2a575b505050811b01600455610293565b01515f1960f88460031b161c191690555f8080610d1c565b92936020600181928786015181550195019301610d06565b828111156102685760045f52909150601f830160051c7f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b60208510610dc8575b849392601f0160051c82900391015f5b828110610db8575050610268565b5f81830155859450600101610daa565b5f9150610d9a565b91607f1691610254565b015190505f8061021c565b60035f9081528281209350601f198516905b818110610e335750908460019594939210610e1b575b505050811b01600355610231565b01515f1960f88460031b161c191690555f8080610e0d565b92936020600181928786015181550195019301610df7565b828111156102065760035f52909150601f830160051c7fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b60208510610eb9575b849392601f0160051c82900391015f5b828110610ea9575050610206565b5f81830155859450600101610e9b565b5f9150610e8b565b91607f16916101f2565b5f80fd5b6040519190601f01601f191682016001600160401b0381118382101761072557604052565b81601f82011215610ecb578051906001600160401b03821161072557610f23601f8301601f1916602001610ecf565b9282845260208383010111610ecb57815f9260208093018386015e8301015290565b51906001600160a01b0382168203610ecb5756fe60806040526004361015610011575f80fd5b5f3560e01c806306fdde03146106b1578063095ea7b31461060957806318160ddd146105ec57806323b872dd146105b4578063313ce5671461059957806342966c681461057c578063536dac9b1461053857806353cd512a146104ac57806370a08231146104755780637165485d146104315780637284e4161461041657806379cc6790146103e457806395d89b41146102f0578063a9059cbb146102bf578063abb1dc44146101aa578063d5f3948814610166578063dd62ed3e146101165763fb7f21eb146100df575f80fd5b34610112575f3660031901126101125761010e6100fa6108dc565b60405191829160208352602083019061076c565b0390f35b5f80fd5b346101125760403660031901126101125761012f610790565b6101376107a6565b6001600160a01b039182165f908152600160209081526040808320949093168252928352819020549051908152f35b34610112575f366003190112610112576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610112575f36600319011261011257606060806040516101ca816107bc565b828152826020820152826040820152828082015201526102446101eb6108dc565b61010e6101f661080e565b610252610201610a3e565b9160405195869560018060a01b037f000000000000000000000000000000000000000000000000000000000000000016875260806020880152608087019061076c565b90858203604087015261076c565b838103606085015260806102ae61029c61028a610278865160a0875260a087019061076c565b6020870151868203602088015261076c565b6040860151858203604087015261076c565b6060850151848203606086015261076c565b92015190608081840391015261076c565b34610112576040366003190112610112576102e56102db610790565b6024359033610b39565b602060405160018152f35b34610112575f366003190112610112576040515f6004548060011c906001811680156103da575b6020831081146103c6578285529081156103a25750600114610344575b61010e836100fa818503826107ec565b60045f9081527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b939250905b808210610388575090915081016020016100fa610334565b919260018160209254838588010152019101909291610370565b60ff191660208086019190915291151560051b840190910191506100fa9050610334565b634e487b7160e01b5f52602260045260245ffd5b91607f1691610317565b3461011257604036600319011261011257610414610400610790565b6024359061040f823383610a96565b610bf6565b005b34610112575f3660031901126101125761010e6100fa61080e565b34610112575f366003190112610112576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610112576020366003190112610112576001600160a01b03610496610790565b165f525f602052602060405f2054604051908152f35b34610112575f366003190112610112576105006104c7610a3e565b61010e81519161052a60208201519161051c604082015161050e6080606085015194015195604051998a9960a08b5260a08b019061076c565b9089820360208b015261076c565b90878203604089015261076c565b90858203606087015261076c565b90838203608085015261076c565b34610112575f366003190112610112576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101125760203660031901126101125761041460043533610bf6565b34610112575f36600319011261011257602060405160128152f35b34610112576060366003190112610112576102e56105d0610790565b6105d86107a6565b604435916105e7833383610a96565b610b39565b34610112575f366003190112610112576020600254604051908152f35b3461011257604036600319011261011257610622610790565b60243590331561069e576001600160a01b031690811561068b57335f52600160205260405f20825f526020528060405f20556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b634a1406b160e11b5f525f60045260245ffd5b63e602df0560e01b5f525f60045260245ffd5b34610112575f366003190112610112576040515f6003548060011c90600181168015610762575b6020831081146103c6578285529081156103a257506001146107045761010e836100fa818503826107ec565b60035f9081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b939250905b808210610748575090915081016020016100fa610334565b919260018160209254838588010152019101909291610730565b91607f16916106d8565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361011257565b602435906001600160a01b038216820361011257565b60a0810190811067ffffffffffffffff8211176107d857604052565b634e487b7160e01b5f52604160045260245ffd5b90601f8019910116810190811067ffffffffffffffff8211176107d857604052565b604051905f6006548060011c91600182169182156108d2575b6020841083146103c65783865285929081156108b35750600114610854575b610852925003836107ec565b565b5060065f90815290917ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f5b81831061089757505090602061085292820101610846565b602091935080600191548385890101520191019091849261087f565b6020925061085294915060ff191682840152151560051b820101610846565b92607f1692610827565b604051905f6005548060011c916001821691821561097e575b6020841083146103c65783865285929081156108b3575060011461091f57610852925003836107ec565b5060055f90815290917f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db05b81831061096257505090602061085292820101610846565b602091935080600191548385890101520191019091849261094a565b92607f16926108f5565b90604051915f8154908160011c9260018316928315610a34575b6020851084146103c6578487528693908115610a1257506001146109ce575b50610852925003836107ec565b90505f9291925260205f20905f915b8183106109f6575050906020610852928201015f6109c1565b60209193508060019154838589010152019101909184926109dd565b90506020925061085294915060ff191682840152151560051b8201015f6109c1565b93607f16936109a2565b60405190610a4b826107bc565b81610a566007610988565b8152610a626008610988565b6020820152610a716009610988565b6040820152610a80600a610988565b60608201526080610a91600b610988565b910152565b6001600160a01b039081165f818152600160209081526040808320948616835293905291909120549291905f198410610ad0575b50505050565b828410610b1657801561069e576001600160a01b0382161561068b575f52600160205260405f209060018060a01b03165f5260205260405f20910390555f808080610aca565b508290637dc7a0d960e11b5f5260018060a01b031660045260245260445260645ffd5b6001600160a01b0316908115610be3576001600160a01b0316918215610bd057815f525f60205260405f2054818110610bb757817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92602092855f525f84520360405f2055845f525f825260405f20818154019055604051908152a3565b8263391434e360e21b5f5260045260245260445260645ffd5b63ec442f0560e01b5f525f60045260245ffd5b634b637e8f60e11b5f525f60045260245ffd5b9091906001600160a01b03168015610be357805f525f60205260405f2054838110610c60576020845f94957fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef938587528684520360408620558060025403600255604051908152a3565b915063391434e360e21b5f5260045260245260445260645ffdfea2646970667358221220f8f8df1aef409554acec1774e66d855cbdc94f6a3e199a378f5ba9fe2a08326664736f6c63430008230033a264697066735822122043692b12e926ea372e49ab4ff77f7ae460bf174c2328b899294d64ad027310eb64736f6c63430008230033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| no token holdings | ||||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| no event logs emitted by this address | |||
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| No direct transactions — this address is only ever reached via internal calls (common for a contract only invoked through a router or proxy). View Internal Transactions → | |||||||||
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| no token transfers for this address yet | |||||||||
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 39,564,233 | 1 min agoTue, 18 Aug 2026 08:44:18 UTC | 0x858491…d782f5 | CREATE2 | launchToken | 0x3711…1a42 | OUT | 0x5260…ccc0 | 0 ETH |
| 39,564,233 | 1 min agoTue, 18 Aug 2026 08:44:18 UTC | 0x858491…d782f5 | CREATE2 | launchToken | 0x3711…1a42 | OUT | 0x58d3…8278 | 0 ETH |
| 39,563,335 | 3 mins agoTue, 18 Aug 2026 08:42:47 UTC | 0xb5ce37…a00996 | CREATE2 | launchAndBuy | 0x3711…1a42 | OUT | 0x2382…444e | 0 ETH |
| 39,563,335 | 3 mins agoTue, 18 Aug 2026 08:42:47 UTC | 0xb5ce37…a00996 | CREATE2 | launchAndBuy | 0x3711…1a42 | OUT | 0xbd11…09a9 | 0 ETH |
| 39,561,177 | 7 mins agoTue, 18 Aug 2026 08:39:11 UTC | 0x4a056d…c8350c | CREATE2 | launchAndBuy | 0x3711…1a42 | OUT | 0xb6e0…ad9c | 0 ETH |
| 39,561,177 | 7 mins agoTue, 18 Aug 2026 08:39:11 UTC | 0x4a056d…c8350c | CREATE2 | launchAndBuy | 0x3711…1a42 | OUT | 0x77b2…a2fd | 0 ETH |
| 39,560,762 | 7 mins agoTue, 18 Aug 2026 08:38:30 UTC | 0x72a780…efecfc | CREATE2 | launchAndBuy | 0x3711…1a42 | OUT | 0xd455…c1ff | 0 ETH |
| 39,560,762 | 7 mins agoTue, 18 Aug 2026 08:38:30 UTC | 0x72a780…efecfc | CREATE2 | launchAndBuy | 0x3711…1a42 | OUT | 0xf6e7…ec0c | 0 ETH |
| 39,560,355 | 8 mins agoTue, 18 Aug 2026 08:37:49 UTC | 0x0000af…5785da | CREATE2 | launchAndBuy | 0x3711…1a42 | OUT | 0x5e1f…6f3b | 0 ETH |
| 39,560,355 | 8 mins agoTue, 18 Aug 2026 08:37:49 UTC | 0x0000af…5785da | CREATE2 | launchAndBuy | 0x3711…1a42 | OUT | 0x5580…8235 | 0 ETH |
| 39,560,228 | 8 mins agoTue, 18 Aug 2026 08:37:36 UTC | 0xccd7ec…22e013 | CREATE2 | launchAndBuy | 0x3711…1a42 | OUT | 0x8ffb…34e8 | 0 ETH |
| 39,560,228 | 8 mins agoTue, 18 Aug 2026 08:37:36 UTC | 0xccd7ec…22e013 | CREATE2 | launchAndBuy | 0x3711…1a42 | OUT | 0x6808…cd7a | 0 ETH |
| 39,559,886 | 9 mins agoTue, 18 Aug 2026 08:37:02 UTC | 0x776f86…06a7ef | CREATE2 | launchAndBuy | 0x3711…1a42 | OUT | 0x86e4…4d4c | 0 ETH |
| 39,559,886 | 9 mins agoTue, 18 Aug 2026 08:37:02 UTC | 0x776f86…06a7ef | CREATE2 | launchAndBuy | 0x3711…1a42 | OUT | 0xe8b1…5007 | 0 ETH |
| 39,559,414 | 10 mins agoTue, 18 Aug 2026 08:36:14 UTC | 0x8d6b54…5fbc8c | CREATE2 | launchToken | 0x3711…1a42 | OUT | 0x8aad…a836 | 0 ETH |
| 39,559,414 | 10 mins agoTue, 18 Aug 2026 08:36:14 UTC | 0x8d6b54…5fbc8c | CREATE2 | launchToken | 0x3711…1a42 | OUT | 0x3c9a…bb69 | 0 ETH |
| 39,559,073 | 10 mins agoTue, 18 Aug 2026 08:35:41 UTC | 0x14de86…b1a535 | CREATE2 | launchAndBuy | 0x3711…1a42 | OUT | 0x496d…6180 | 0 ETH |
| 39,559,073 | 10 mins agoTue, 18 Aug 2026 08:35:41 UTC | 0x14de86…b1a535 | CREATE2 | launchAndBuy | 0x3711…1a42 | OUT | 0x4ebd…385f | 0 ETH |
| 39,558,905 | 10 mins agoTue, 18 Aug 2026 08:35:24 UTC | 0x17241f…422a08 | CREATE2 | launchAndBuy | 0x3711…1a42 | OUT | 0xf0e5…c7ac | 0 ETH |
| 39,558,905 | 10 mins agoTue, 18 Aug 2026 08:35:24 UTC | 0x17241f…422a08 | CREATE2 | launchAndBuy | 0x3711…1a42 | OUT | 0x67da…aa1b | 0 ETH |
| 39,558,762 | 11 mins agoTue, 18 Aug 2026 08:35:10 UTC | 0x95237e…ec0527 | CREATE2 | launchAndBuy | 0x3711…1a42 | OUT | 0xdfa8…bc25 | 0 ETH |
| 39,558,762 | 11 mins agoTue, 18 Aug 2026 08:35:10 UTC | 0x95237e…ec0527 | CREATE2 | launchAndBuy | 0x3711…1a42 | OUT | 0x0b63…e49b | 0 ETH |
| 39,558,559 | 11 mins agoTue, 18 Aug 2026 08:34:49 UTC | 0xd60a6e…4e260f | CREATE2 | launchAndBuy | 0x3711…1a42 | OUT | 0x100b…feed | 0 ETH |
| 39,558,559 | 11 mins agoTue, 18 Aug 2026 08:34:49 UTC | 0xd60a6e…4e260f | CREATE2 | launchAndBuy | 0x3711…1a42 | OUT | 0xb696…0061 | 0 ETH |
| 39,558,348 | 11 mins agoTue, 18 Aug 2026 08:34:28 UTC | 0x555064…dcc926 | CREATE2 | launchAndBuy | 0x3711…1a42 | OUT | 0xf4e1…0888 | 0 ETH |