Source Code
More Info
Private Name Tags
ContractCreator
TokenTracker
| Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 47104099 | 17 days ago | Contract Creation | 0 MON |
Loading...
Loading
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0xd27E4f21...ecDf40e46 The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
BrownFiV2Pair
Compiler Version
v0.8.28+commit.7893614a
Optimization Enabled:
Yes with 999999 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.28;
import './interfaces/IBrownFiV2Pair.sol';
import './BrownFiV2ERC20.sol';
import './libraries/Math.sol';
import '@uniswap/v3-core/contracts/libraries/FullMath.sol';
import './libraries/UQ112x112.sol';
import './interfaces/IERC20.sol';
import './interfaces/IBrownFiV2Factory.sol';
import './interfaces/IBrownFiV2Callee.sol';
contract BrownFiV2Pair is IBrownFiV2Pair, BrownFiV2ERC20 {
using SafeMath for uint;
using UQ112x112 for uint224;
uint public constant override MINIMUM_LIQUIDITY = 10**3;
uint32 public constant PRECISION = 10**8;
uint public constant Q64 = 1 << 64;
address public immutable override factory;
address public override token0;
uint8 public token0Decimals;
address public override token1;
uint8 public token1Decimals;
uint112 private reserve0; // uses single storage slot, accessible via getReserves
uint112 private reserve1; // uses single storage slot, accessible via getReserves
uint32 private blockTimestampLast; // uses single storage slot, accessible via getReserves
bytes4 private constant SELECTOR = bytes4(keccak256(bytes('transfer(address,uint256)')));
uint public override k = uint(Q64) / 1000; // default 0.001
uint64 public override lambda = 0; // default 0
uint32 public override fee = 300_000; // default 0.3%
uint64 public protocolFee = 10_000_000; // default 10%
uint private unlocked = 1;
modifier lock() {
require(unlocked == 1, 'BrownFiV2: LOCKED');
unlocked = 0;
_;
unlocked = 1;
}
modifier whenNotPaused() {
require(!IBrownFiV2Factory(factory).isPaused(), "BrownFiV2: PAUSED");
_;
}
modifier onlyFactory() {
require(msg.sender == factory, 'BrownFiV2: ONLY_FACTORY');
_;
}
function getReserves() public view returns (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast) {
_reserve0 = reserve0;
_reserve1 = reserve1;
_blockTimestampLast = blockTimestampLast;
}
function _safeTransfer(address token, address to, uint value) private {
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(SELECTOR, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), 'BrownFiV2: TRANSFER_FAILED');
}
constructor() {
factory = msg.sender;
}
// called once by the factory at time of deployment
function initialize(address _token0, address _token1) external {
require(msg.sender == factory, 'BrownFiV2: FORBIDDEN'); // sufficient check
require(_token0 != address(0) && _token1 != address(0), 'BrownFiV2: ZERO_ADDRESS');
token0 = _token0;
token1 = _token1;
token0Decimals = IERC20(_token0).decimals();
token1Decimals = IERC20(_token1).decimals();
}
function _getPrices() internal view returns (uint price0, uint price1) {
uint minPriceAge = IBrownFiV2Factory(factory).minPriceAge();
price0 = IBrownFiV2Factory(factory).priceOf(token0, minPriceAge);
price1 = IBrownFiV2Factory(factory).priceOf(token1, minPriceAge);
}
/**
* @dev convert raw amount to default decimals amount
*/
function _parseAmountToDefaultDecimals(uint8 tokenDecimals, uint amount) internal pure returns (uint formattedAmount) {
formattedAmount = tokenDecimals > decimals ?
amount / 10**uint(tokenDecimals - decimals) : amount * 10**uint(decimals - tokenDecimals);
}
// update reserves and, on the first call per block, price accumulators
function _update(uint balance0, uint balance1) private {
require(balance0 <= type(uint112).max && balance1 <= type(uint112).max, 'BrownFiV2: OVERFLOW');
uint32 blockTimestamp = uint32(block.timestamp % 2**32);
reserve0 = uint112(balance0);
reserve1 = uint112(balance1);
blockTimestampLast = blockTimestamp;
emit Sync(reserve0, reserve1);
}
// this low-level function should be called from a contract which performs important safety checks
function mint(address to) external lock whenNotPaused returns (uint liquidity) {
(uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings
uint balance0 = IERC20(token0).balanceOf(address(this));
uint balance1 = IERC20(token1).balanceOf(address(this));
uint amount0 = balance0.sub(_reserve0);
uint amount1 = balance1.sub(_reserve1);
(uint price0, uint price1) = _getPrices();
uint parsedAmount0 = _parseAmountToDefaultDecimals(token0Decimals, amount0);
uint parsedAmount1 = _parseAmountToDefaultDecimals(token1Decimals, amount1);
uint minValue = Math.min(parsedAmount0.mul(price0), parsedAmount1.mul(price1));
uint _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee
if (_totalSupply == 0) {
liquidity = minValue.mul(2) / Q64 - MINIMUM_LIQUIDITY;
_mint(address(0), MINIMUM_LIQUIDITY); // permanently lock the first MINIMUM_LIQUIDITY tokens
} else {
uint parsedReserve0 = _parseAmountToDefaultDecimals(token0Decimals, _reserve0);
uint parsedReserve1 = _parseAmountToDefaultDecimals(token1Decimals, _reserve1);
liquidity = FullMath.mulDiv(
_totalSupply,
minValue.mul(2),
price0.mul(parsedReserve0).add(
price1.mul(parsedReserve1)
)
);
}
require(liquidity > 0, 'BrownFiV2: INSUFFICIENT_LIQUIDITY_MINTED');
_mint(to, liquidity);
_update(balance0, balance1);
emit Mint(msg.sender, amount0, amount1, price0, price1, to);
}
// this low-level function should be called from a contract which performs important safety checks
function burn(address to) external lock whenNotPaused returns (uint amount0, uint amount1) {
address _token0 = token0; // gas savings
address _token1 = token1; // gas savings
uint balance0 = IERC20(_token0).balanceOf(address(this));
uint balance1 = IERC20(_token1).balanceOf(address(this));
uint liquidity = balanceOf[address(this)];
// bool feeOn = _mintFee(_reserve0, _reserve1);
uint _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee
amount0 = liquidity.mul(balance0) / _totalSupply; // using balances ensures pro-rata distribution
amount1 = liquidity.mul(balance1) / _totalSupply; // using balances ensures pro-rata distribution
require(amount0 > 0 && amount1 > 0, 'BrownFiV2: INSUFFICIENT_LIQUIDITY_BURNED');
_burn(address(this), liquidity);
_safeTransfer(_token0, to, amount0);
_safeTransfer(_token1, to, amount1);
balance0 = IERC20(_token0).balanceOf(address(this));
balance1 = IERC20(_token1).balanceOf(address(this));
_update(balance0, balance1);
emit Burn(msg.sender, amount0, amount1, to);
}
// this low-level function should be called from a contract which performs important safety checks
function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external lock whenNotPaused {
require(amount0Out > 0 || amount1Out > 0, 'BrownFiV2: INSUFFICIENT_OUTPUT_AMOUNT');
(uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings
require(amount0Out.mul(10) <= uint(_reserve0).mul(8) && amount1Out.mul(10) <= uint(_reserve1).mul(8), 'BrownFiV2: INSUFFICIENT_LIQUIDITY');
uint balance0;
uint balance1;
{ // scope for _token{0,1}, avoids stack too deep errors
address _token0 = token0;
address _token1 = token1;
require(to != _token0 && to != _token1, 'BrownFiV2: INVALID_TO');
if (amount0Out > 0) _safeTransfer(_token0, to, amount0Out); // optimistically transfer tokens
if (amount1Out > 0) _safeTransfer(_token1, to, amount1Out); // optimistically transfer tokens
if (data.length > 0) IBrownFiV2Callee(to).brownFiV2Call(msg.sender, amount0Out, amount1Out, data);
balance0 = IERC20(_token0).balanceOf(address(this));
balance1 = IERC20(_token1).balanceOf(address(this));
}
uint amount0In = balance0 > _reserve0 - amount0Out ? balance0 - (_reserve0 - amount0Out) : 0;
uint amount1In = balance1 > _reserve1 - amount1Out ? balance1 - (_reserve1 - amount1Out) : 0;
require(amount0In > 0 || amount1In > 0, 'BrownFiV2: INSUFFICIENT_INPUT_AMOUNT');
{ // scope for reserve{0,1}Adjusted, avoids stack too deep errors
(uint price0, uint price1) = _getPrices();
(uint sPrice0, uint sPrice1) = (price0, price1);
if (lambda > 0) {
(sPrice0, sPrice1) = computeSkewnessPrice(_reserve0, _reserve1, price0, price1);
}
uint amount0OutWithoutFee = FullMath.mulDiv(amount0Out, PRECISION, PRECISION + fee);
uint amount1OutWithoutFee = FullMath.mulDiv(amount1Out, PRECISION, PRECISION + fee);
// check inventory
if (amount0Out > 0) {
checkInventory(balance0, balance1, sPrice0, sPrice1, amount0OutWithoutFee, false);
}
if (amount1Out > 0) {
checkInventory(balance0, balance1, sPrice0, sPrice1, amount1OutWithoutFee, true);
}
_update(balance0, balance1);
// calculate protocol fee
if(protocolFee > 0) {
uint lpForProtocol;
uint _totalSupply = totalSupply;
uint inventoryRight = computeInventoryRight(price0, price1);
if (amount0In > 0) {
uint _amount0In = _parseAmountToDefaultDecimals(token0Decimals, amount0In);
uint tradingFee = FullMath.mulDiv(_amount0In, fee, PRECISION + fee);
uint protocolFeeInDollarValue = FullMath.mulDiv(tradingFee, protocolFee * price0, PRECISION);
lpForProtocol = FullMath.mulDiv(protocolFeeInDollarValue, _totalSupply, inventoryRight);
}
if (amount1In > 0) {
uint _amount1In = _parseAmountToDefaultDecimals(token1Decimals, amount1In);
uint tradingFee = FullMath.mulDiv(_amount1In, fee, PRECISION + fee);
uint protocolFeeInDollarValue = FullMath.mulDiv(tradingFee, protocolFee * price1, PRECISION);
lpForProtocol = FullMath.mulDiv(protocolFeeInDollarValue, _totalSupply, inventoryRight);
}
if (lpForProtocol > 0) {
_mint(IBrownFiV2Factory(factory).feeTo(), lpForProtocol);
}
}
emit Swap(msg.sender, amount0In, amount1In, amount0Out, amount1Out, sPrice0, sPrice1, to);
}
}
function computeSkewnessPrice(uint _reserve0, uint _reserve1, uint _price0, uint _price1) internal view returns (uint, uint) {
uint _r0 = _parseAmountToDefaultDecimals(token0Decimals, _reserve0);
uint _r1 = _parseAmountToDefaultDecimals(token1Decimals, _reserve1);
// s = lambda * |x * px - y * py| / (x * px + y * py)
uint reserve0Price = _r0 * _price0;
uint reserve1Price = _r1 * _price1;
uint reservePriceDiff = reserve0Price >= reserve1Price ?
reserve0Price - reserve1Price :
reserve1Price - reserve0Price;
uint reservePriceSum = reserve0Price + reserve1Price;
uint s = FullMath.mulDiv(reservePriceDiff, lambda, reservePriceSum);
uint q64PlusS = Q64 + s;
uint q64MinusS = Q64 - s;
// if x * px >= y * py, px = px * (1 - s), py = py * (1 + s)
// if x * px <= y * py, px = px * (1 + s), py = py * (1 - s)
if (reserve0Price >= reserve1Price) {
return (
FullMath.mulDiv(_price0, q64MinusS, Q64),
FullMath.mulDiv(_price1, q64PlusS, Q64)
);
} else {
return (
FullMath.mulDiv(_price0, q64PlusS, Q64),
FullMath.mulDiv(_price1, q64MinusS, Q64)
);
}
}
function checkInventory(uint balance0, uint balance1, uint price0, uint price1, uint amountOut, bool zeroToOne) internal view {
uint _balance0 = _parseAmountToDefaultDecimals(token0Decimals, balance0);
uint _balance1 = _parseAmountToDefaultDecimals(token1Decimals, balance1);
uint _amountOut = _parseAmountToDefaultDecimals(zeroToOne ? token1Decimals : token0Decimals, amountOut);
uint left = computeInventoryLeft(_balance0, _balance1, price0, price1, _amountOut, zeroToOne);
uint right = computeInventoryRight(price0, price1);
require(left >= right, 'BrownFiV2: INVALID_INVENTORY');
}
function computeInventoryLeft(uint balance0, uint balance1, uint price0, uint price1, uint amountOut, bool zeroToOne) internal view returns (uint) {
uint _k = k;
uint balance = zeroToOne ? balance1 : balance0;
uint price = zeroToOne ? price1 : price0;
// Pre-calculate the denominator with one multiplication
uint denominator = balance.mul(Q64).mul(2);
return price0.mul(balance0).add(price1.mul(balance1)).sub(
FullMath.mulDiv(
price.mul(_k),
amountOut.mul(amountOut),
denominator
)
);
}
function computeInventoryRight(
uint price0,
uint price1
) internal view returns (uint) {
(uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings
uint _r0 = _parseAmountToDefaultDecimals(token0Decimals, _reserve0);
uint _r1 = _parseAmountToDefaultDecimals(token1Decimals, _reserve1);
return price0.mul(_r0).add(price1.mul(_r1));
}
// force balances to match reserves
function skim(address to) external lock {
}
// force reserves to match balances
function sync() external lock {
_update(IERC20(token0).balanceOf(address(this)), IERC20(token1).balanceOf(address(this)));
}
function setK(uint _k) external onlyFactory {
require(_k <= 2 * Q64, 'BrownFiV2: MAXIMUM_K');
k = _k;
}
function setLambda(uint64 _lambda) external onlyFactory {
require(_lambda <= Q64, 'BrownFiV2: MAXIMUM_LAMBDA'); // max 1
lambda = _lambda;
}
function setFee(uint32 _fee) external onlyFactory {
fee = _fee;
}
function setProtocolFee(uint32 _protocolFee) external onlyFactory {
protocolFee = _protocolFee;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/// @title Contains 512-bit math functions
/// @notice Facilitates multiplication and division that can have overflow of an intermediate value without any loss of precision
/// @dev Handles "phantom overflow" i.e., allows multiplication and division where an intermediate value overflows 256 bits
library FullMath {
/// @notice Calculates floor(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
/// @param a The multiplicand
/// @param b The multiplier
/// @param denominator The divisor
/// @return result The 256-bit result
/// @dev Credit to Remco Bloemen under MIT license https://xn--2-umb.com/21/muldiv
function mulDiv(
uint256 a,
uint256 b,
uint256 denominator
) internal pure returns (uint256 result) {
unchecked {
// 512-bit multiply [prod1 prod0] = a * b
// Compute the product mod 2**256 and mod 2**256 - 1
// then use the Chinese Remainder Theorem to reconstruct
// the 512 bit result. The result is stored in two 256
// variables such that product = prod1 * 2**256 + prod0
uint256 prod0; // Least significant 256 bits of the product
uint256 prod1; // Most significant 256 bits of the product
assembly {
let mm := mulmod(a, b, not(0))
prod0 := mul(a, b)
prod1 := sub(sub(mm, prod0), lt(mm, prod0))
}
// Handle non-overflow cases, 256 by 256 division
if (prod1 == 0) {
require(denominator > 0);
assembly {
result := div(prod0, denominator)
}
return result;
}
// Make sure the result is less than 2**256.
// Also prevents denominator == 0
require(denominator > prod1);
///////////////////////////////////////////////
// 512 by 256 division.
///////////////////////////////////////////////
// Make division exact by subtracting the remainder from [prod1 prod0]
// Compute remainder using mulmod
uint256 remainder;
assembly {
remainder := mulmod(a, b, denominator)
}
// Subtract 256 bit number from 512 bit number
assembly {
prod1 := sub(prod1, gt(remainder, prod0))
prod0 := sub(prod0, remainder)
}
// Factor powers of two out of denominator
// Compute largest power of two divisor of denominator.
// Always >= 1.
uint256 twos = (0 - denominator) & denominator;
// Divide denominator by power of two
assembly {
denominator := div(denominator, twos)
}
// Divide [prod1 prod0] by the factors of two
assembly {
prod0 := div(prod0, twos)
}
// Shift in bits from prod1 into prod0. For this we need
// to flip `twos` such that it is 2**256 / twos.
// If twos is zero, then it becomes one
assembly {
twos := add(div(sub(0, twos), twos), 1)
}
prod0 |= prod1 * twos;
// Invert denominator mod 2**256
// Now that denominator is an odd number, it has an inverse
// modulo 2**256 such that denominator * inv = 1 mod 2**256.
// Compute the inverse by starting with a seed that is correct
// correct for four bits. That is, denominator * inv = 1 mod 2**4
uint256 inv = (3 * denominator) ^ 2;
// Now use Newton-Raphson iteration to improve the precision.
// Thanks to Hensel's lifting lemma, this also works in modular
// arithmetic, doubling the correct bits in each step.
inv *= 2 - denominator * inv; // inverse mod 2**8
inv *= 2 - denominator * inv; // inverse mod 2**16
inv *= 2 - denominator * inv; // inverse mod 2**32
inv *= 2 - denominator * inv; // inverse mod 2**64
inv *= 2 - denominator * inv; // inverse mod 2**128
inv *= 2 - denominator * inv; // inverse mod 2**256
// Because the division is now exact we can divide by multiplying
// with the modular inverse of denominator. This will give us the
// correct result modulo 2**256. Since the precoditions guarantee
// that the outcome is less than 2**256, this is the final result.
// We don't need to compute the high bits of the result and prod1
// is no longer required.
result = prod0 * inv;
return result;
}
}
/// @notice Calculates ceil(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
/// @param a The multiplicand
/// @param b The multiplier
/// @param denominator The divisor
/// @return result The 256-bit result
function mulDivRoundingUp(
uint256 a,
uint256 b,
uint256 denominator
) internal pure returns (uint256 result) {
unchecked {
result = mulDiv(a, b, denominator);
if (mulmod(a, b, denominator) > 0) {
require(result < type(uint256).max);
result++;
}
}
}
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.28;
import './interfaces/IBrownFiV2ERC20.sol';
import './libraries/SafeMath.sol';
contract BrownFiV2ERC20 is IBrownFiV2ERC20 {
using SafeMath for uint;
string public constant override name = 'BrownFi V2';
string public constant override symbol = 'BF-V2';
uint8 public constant override decimals = 18;
uint public override totalSupply;
mapping(address => uint) public override balanceOf;
mapping(address => mapping(address => uint)) public override allowance;
bytes32 public override DOMAIN_SEPARATOR;
// keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
bytes32 public constant override PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;
mapping(address => uint) public override nonces;
constructor() {
DOMAIN_SEPARATOR = keccak256(
abi.encode(
keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'),
keccak256(bytes(name)),
keccak256(bytes('1')),
block.chainid,
address(this)
)
);
}
function _mint(address to, uint value) internal {
totalSupply = totalSupply.add(value);
balanceOf[to] = balanceOf[to].add(value);
emit Transfer(address(0), to, value);
}
function _burn(address from, uint value) internal {
balanceOf[from] = balanceOf[from].sub(value);
totalSupply = totalSupply.sub(value);
emit Transfer(from, address(0), value);
}
function _approve(address owner, address spender, uint value) private {
allowance[owner][spender] = value;
emit Approval(owner, spender, value);
}
function _transfer(address from, address to, uint value) private {
balanceOf[from] = balanceOf[from].sub(value);
balanceOf[to] = balanceOf[to].add(value);
emit Transfer(from, to, value);
}
function approve(address spender, uint value) external override returns (bool) {
_approve(msg.sender, spender, value);
return true;
}
function transfer(address to, uint value) external override returns (bool) {
_transfer(msg.sender, to, value);
return true;
}
function transferFrom(address from, address to, uint value) external override returns (bool) {
if (allowance[from][msg.sender] != type(uint256).max) {
allowance[from][msg.sender] = allowance[from][msg.sender].sub(value);
}
_transfer(from, to, value);
return true;
}
function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external override {
require(deadline >= block.timestamp, 'BrownFiV2: EXPIRED');
bytes32 digest = keccak256(
abi.encodePacked(
'\x19\x01',
DOMAIN_SEPARATOR,
keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline))
)
);
address recoveredAddress = ecrecover(digest, v, r, s);
require(recoveredAddress != address(0) && recoveredAddress == owner, 'BrownFiV2: INVALID_SIGNATURE');
_approve(owner, spender, value);
}
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity >=0.5.0;
interface IBrownFiV2Callee {
function brownFiV2Call(address sender, uint amount0, uint amount1, bytes calldata data) external;
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity >=0.5.0;
interface IBrownFiV2ERC20 {
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint value);
function name() external pure returns (string memory);
function symbol() external pure returns (string memory);
function decimals() external pure returns (uint8);
function totalSupply() external view returns (uint);
function balanceOf(address owner) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function transferFrom(address from, address to, uint value) external returns (bool);
function DOMAIN_SEPARATOR() external view returns (bytes32);
function PERMIT_TYPEHASH() external pure returns (bytes32);
function nonces(address owner) external view returns (uint);
function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity >=0.5.0;
interface IBrownFiV2Factory {
event PairCreated(address indexed token0, address indexed token1, address pair, uint totalPair);
event PauseStateChanged(bool paused);
event PriceOracleUpdated(address indexed newOracle);
event FeeToUpdated(address indexed newFeeTo);
event OracleOfUpdated(address indexed token, bytes32 priceFeedId);
event MinPriceAgeUpdated(uint newMinPriceAge);
event KOfPairUpdated(address indexed tokenA, address indexed tokenB, uint k);
event FeeOfPairUpdated(address indexed tokenA, address indexed tokenB, uint32 fee);
event LambdaOfPairUpdated(address indexed tokenA, address indexed tokenB, uint64 lambda);
event ProtocolFeeOfPairUpdated(address indexed tokenA, address indexed tokenB, uint32 protocolFee);
function priceOracle() external view returns (address);
function feeTo() external view returns (address);
function priceOf(address token, uint256 priceAge) external view returns(uint256);
function minPriceAge() external view returns (uint);
function priceFeedIds(address token) external view returns (bytes32);
function getPair(address tokenA, address tokenB) external view returns (address pair);
function allPairs(uint) external view returns (address pair);
function allPairsLength() external view returns (uint);
function createPair(address tokenA, address tokenB, bytes32 priceFeedA, bytes32 priceFeedB) external returns (address pair);
function setPriceOracle(address newOracle) external;
function setFeeTo(address) external;
function setOracleOf(address token, bytes32 priceFeedId) external;
function setMinPriceAge(uint age) external;
function setKOfPair(address tokenA, address tokenB, uint k) external;
function setFeeOfPair(address tokenA, address tokenB, uint32 fee) external;
function setLambdaOfPair(address tokenA, address tokenB, uint64 lambda) external;
function setProtocolFeeOfPair(address tokenA, address tokenB, uint32 protocolFee) external;
function setPaused(bool paused) external;
function isPaused() external view returns (bool);
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity >=0.5.0;
interface IBrownFiV2Pair {
event Mint(address indexed sender, uint amount0, uint amount1, uint price0, uint price1, address indexed to);
event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
event Swap(
address indexed sender,
uint amount0In,
uint amount1In,
uint amount0Out,
uint amount1Out,
uint price0,
uint price1,
address indexed to
);
event Sync(uint112 reserve0, uint112 reserve1);
function MINIMUM_LIQUIDITY() external pure returns (uint);
function factory() external view returns (address);
function token0() external view returns (address);
function token1() external view returns (address);
function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
function k() external view returns (uint);
function lambda() external view returns (uint64);
function fee() external view returns (uint32);
function mint(address to) external returns (uint liquidity);
function burn(address to) external returns (uint amount0, uint amount1);
function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
function skim(address to) external;
function sync() external;
function setK(uint _k) external;
function setFee(uint32 _fee) external;
function setLambda(uint64 _lambda) external;
function setProtocolFee(uint32 _protocolFee) external;
function initialize(address, address) external;
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity >=0.5.0;
interface IERC20 {
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint value);
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
function totalSupply() external view returns (uint);
function balanceOf(address owner) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function transferFrom(address from, address to, uint value) external returns (bool);
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.28;
// a library for performing various math operations
library Math {
function min(uint x, uint y) internal pure returns (uint z) {
z = x < y ? x : y;
}
// babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)
function sqrt(uint y) internal pure returns (uint z) {
if (y > 3) {
z = y;
uint x = y / 2 + 1;
while (x < z) {
z = x;
x = (y / x + x) / 2;
}
} else if (y != 0) {
z = 1;
}
}
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.28;
// a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)
library SafeMath {
function add(uint x, uint y) internal pure returns (uint z) {
require((z = x + y) >= x, 'ds-math-add-overflow');
}
function sub(uint x, uint y) internal pure returns (uint z) {
require((z = x - y) <= x, 'ds-math-sub-underflow');
}
function mul(uint x, uint y) internal pure returns (uint z) {
require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow');
}
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.28;
// a library for handling binary fixed point numbers (https://en.wikipedia.org/wiki/Q_(number_format))
// range: [0, 2**112 - 1]
// resolution: 1 / 2**112
library UQ112x112 {
uint224 constant Q112 = 2**112;
// encode a uint112 as a UQ112x112
function encode(uint112 y) internal pure returns (uint224 z) {
z = uint224(y) * Q112; // never overflows
}
// divide a UQ112x112 by a uint112, returning a UQ112x112
function uqdiv(uint224 x, uint112 y) internal pure returns (uint224 z) {
z = x / uint224(y);
}
}{
"optimizer": {
"enabled": true,
"runs": 999999
},
"viaIR": true,
"evmVersion": "paris",
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price1","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount0Out","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1Out","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price1","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint112","name":"reserve0","type":"uint112"},{"indexed":false,"internalType":"uint112","name":"reserve1","type":"uint112"}],"name":"Sync","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINIMUM_LIQUIDITY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRECISION","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Q64","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"burn","outputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fee","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReserves","outputs":[{"internalType":"uint112","name":"_reserve0","type":"uint112"},{"internalType":"uint112","name":"_reserve1","type":"uint112"},{"internalType":"uint32","name":"_blockTimestampLast","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token0","type":"address"},{"internalType":"address","name":"_token1","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"k","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lambda","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"protocolFee","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"_fee","type":"uint32"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_k","type":"uint256"}],"name":"setK","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_lambda","type":"uint64"}],"name":"setLambda","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_protocolFee","type":"uint32"}],"name":"setProtocolFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"skim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount0Out","type":"uint256"},{"internalType":"uint256","name":"amount1Out","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"swap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sync","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token0","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token0Decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1Decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
0x60a0604052346101555760405161001760408261015a565b600a815269213937bbb72334902b1960b11b602090910152604080517f6734371cf3152a7df61c4623a003b33fdd6df5cdf7648e19ad4b1d9eababb5159161005f908261015a565b600181526020810190603160f81b82525190206040519060208201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8452604083015260608201524660808201523060a082015260a081526100c360c08261015a565b519020600355664189374bc6a7ef600855600980546001600160a01b0319166e989680000493e000000000000000001790556001600a5533608052604051613ae2908161019482396080518181816107c6015281816108d601528181610ada01528181610c9c0152818161122e015281816116e4015281816117d701528181611d61015281816120a401526130e30152f35b600080fd5b601f909101601f19168101906001600160401b0382119082101761017d57604052565b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b6000803560e01c8063022c0d9f14611fe357806306fdde0314611f6c5780630902f1ac14611edb578063095ea7b314611e965780630b77884d14611e545780630dfe168114611e0257806318160ddd14611dc75780631ab971ab14611d0757806323b872dd14611bdd57806330adf81f14611b84578063313ce56714611b4a57806333fca18714611b085780633644e51514611acc578063485cc9551461177f57806367de8be9146116975780636a627842146111a057806370a082311461113d5780637ecebe00146110da57806389afcb4414610c0f57806395d89b4114610b94578063a9059cbb14610b44578063aa9f762814610a80578063aaf5eb6814610a43578063b0e21e8a146109fa578063b31ac6e2146109b8578063b4f40c611461097c578063ba9a7a5614610941578063bc25cf77146108fa578063c45a01551461088b578063cde5bf5314610767578063d21220a714610715578063d505accf14610443578063dad0be61146103fd578063dd62ed3e14610382578063ddca3f431461033d5763fff6cae9146101a957600080fd5b3461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a576101e56001600a5414612bd3565b80600a556024602073ffffffffffffffffffffffffffffffffffffffff60055416604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa801561032f5782906102fc575b60249150602073ffffffffffffffffffffffffffffffffffffffff60065416604051938480927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa9081156102f15783916102b6575b6102ae92506135fd565b6001600a5580f35b90506020823d6020116102e9575b816102d160209383612afb565b810103126102e4576102ae9151906102a4565b600080fd5b3d91506102c4565b6040513d85823e3d90fd5b506020813d602011610327575b8161031660209383612afb565b810103126102e45760249051610245565b3d9150610309565b6040513d84823e3d90fd5b80fd5b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602063ffffffff60095460401c16604051908152f35b503461033a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5773ffffffffffffffffffffffffffffffffffffffff60406103d1612ab5565b92826103db612ad8565b9416815260026020522091166000526020526020604060002054604051908152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602067ffffffffffffffff60095416604051908152f35b503461033a5760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5761047b612ab5565b610483612ad8565b6044359060643560843560ff8116809103610711574282106106b35760035473ffffffffffffffffffffffffffffffffffffffff861692838852600460205260408820908154917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8314610686579282602095928b95600160809601905560405190878201927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9845289604084015273ffffffffffffffffffffffffffffffffffffffff8b1660608401528b8784015260a083015260c082015260c0815261056c60e082612afb565b51902060405190868201927f1901000000000000000000000000000000000000000000000000000000000000845260228301526042820152604281526105b3606282612afb565b519020906040519182528482015260a435604082015260c435606082015282805260015afa1561067b5773ffffffffffffffffffffffffffffffffffffffff855116908115159182610671575b50501561061357610610926138d2565b80f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f42726f776e466956323a20494e56414c49445f5349474e4154555245000000006044820152fd5b1490503880610600565b6040513d86823e3d90fd5b60248a7f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f42726f776e466956323a204558504952454400000000000000000000000000006044820152fd5b8580fd5b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602073ffffffffffffffffffffffffffffffffffffffff60065416604051908152f35b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760043567ffffffffffffffff8116809103610887576107ed73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163314612d1e565b680100000000000000008111610829577fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000600954161760095580f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f42726f776e466956323a204d4158494d554d5f4c414d424441000000000000006044820152fd5b5080fd5b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57610932612ab5565b506102ae6001600a5414612bd3565b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760206040516103e88152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a576020600854604051908152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602060ff60055460a01c16604051908152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602067ffffffffffffffff60095460601c16604051908152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760206040516305f5e1008152f35b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760043563ffffffff8116810361088757610b0173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163314612d1e565b7fffffffffffffffffffffffff0000000000000000ffffffffffffffffffffffff6fffffffff0000000000000000000000006009549260601b1691161760095580f35b503461033a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57610b89610b7f612ab5565b60243590336139a8565b602060405160018152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5750610c0b604051610bd5604082612afb565b600581527f42462d5632000000000000000000000000000000000000000000000000000000602082015260405191829182612b6b565b0390f35b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57610c47612ab5565b610c556001600a5414612bd3565b81600a556040517fb187bd2600000000000000000000000000000000000000000000000000000000815260208160048173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa80156102f157610cd69184916110ab575b5015612c50565b73ffffffffffffffffffffffffffffffffffffffff600554169173ffffffffffffffffffffffffffffffffffffffff6006541691604051917f70a08231000000000000000000000000000000000000000000000000000000008352306004840152602083602481885afa92831561109e57819361106a575b50604051937f70a08231000000000000000000000000000000000000000000000000000000008552306004860152602085602481845afa94851561032f578295611036575b503082526001602052610dc5610db9610db9610dbe60408620549786549384918a612ef4565b612d9c565b9787612ef4565b938515158061102d575b15610fa9576024968360209230825260018452610df0816040842054613935565b308352600185526040832055610e07818354613935565b82556040519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef843092a3610e3f878683612f2b565b610e4a868685612f2b565b604051978880927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa95861561032f578296610f74575b506020602491604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa918215610f685791610f35575b50610edc906040956135fd565b73ffffffffffffffffffffffffffffffffffffffff84519184835283602084015216907fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496853392a36001600a5582519182526020820152f35b90506020813d602011610f60575b81610f5060209383612afb565b810103126102e457516040610ecf565b3d9150610f43565b604051903d90823e3d90fd5b9095506020813d602011610fa1575b81610f9060209383612afb565b810103126102e45751946020610e8a565b3d9150610f83565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f42726f776e466956323a20494e53554646494349454e545f4c4951554944495460448201527f595f4255524e45440000000000000000000000000000000000000000000000006064820152fd5b50841515610dcf565b9094506020813d602011611062575b8161105260209383612afb565b810103126102e457519338610d93565b3d9150611045565b9092506020813d602011611096575b8161108660209383612afb565b810103126102e457519138610d4e565b3d9150611079565b50604051903d90823e3d90fd5b6110cd915060203d6020116110d3575b6110c58183612afb565b810190612c38565b38610ccf565b503d6110bb565b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57604060209173ffffffffffffffffffffffffffffffffffffffff61112c612ab5565b168152600483522054604051908152f35b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57604060209173ffffffffffffffffffffffffffffffffffffffff61118f612ab5565b168152600183522054604051908152f35b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a576111d8612ab5565b906111e76001600a5414612bd3565b80600a556040517fb187bd2600000000000000000000000000000000000000000000000000000000815260208160048173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa90811561032f57906112699183916110ab575015612c50565b61129c6007546dffffffffffffffffffffffffffff8116916dffffffffffffffffffffffffffff8260701c169160e01c90565b5090600554604051947f70a0823100000000000000000000000000000000000000000000000000000000865230600487015260208660248173ffffffffffffffffffffffffffffffffffffffff86165afa95861561168c578596611658575b5060065491604051927f70a0823100000000000000000000000000000000000000000000000000000000845230600485015260208460248173ffffffffffffffffffffffffffffffffffffffff85165afa93841561164d578794611609575b506dffffffffffffffffffffffffffff60ff939495166dffffffffffffffffffffffffffff611389828b613935565b97166113958188613935565b9261139e6130cc565b96909560a01c169160ff6113b28b856137bd565b9260a01c16916113d6886113d0896113ca8a886137bd565b94612ef4565b92612ef4565b808210156116015750935b8b5493846115b25750505050506113f790612ea6565b60401c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18810190811161158557966114326103e88254613a39565b8155808052600160205261144c6103e86040832054613a39565b81805260016020526040822055807fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60206040516103e88152a35b8615611501576114b873ffffffffffffffffffffffffffffffffffffffff956020996114b38a8861385e565b6135fd565b604051958652878601526040850152606084015216907f265ee4cff6cdf714e68c02e61a7864cf66bc04e372a41b6cc425acbb737cd39560803392a36001600a55604051908152f35b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f42726f776e466956323a20494e53554646494349454e545f4c4951554944495460448201527f595f4d494e5445440000000000000000000000000000000000000000000000006064820152fd5b6024887f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b6115fb969c506115e16115db6115f5959697946115d56115ef956115e8956137bd565b976137bd565b93612ea6565b9488612ef4565b9188612ef4565b90613a39565b91613557565b95611487565b9050936113e1565b9293506020833d602011611645575b8161162560209383612afb565b810103126102e457915192916dffffffffffffffffffffffffffff61135a565b3d9150611618565b6040513d89823e3d90fd5b9095506020813d602011611684575b8161167460209383612afb565b810103126102e4575194386112fb565b3d9150611667565b6040513d87823e3d90fd5b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760043561170b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163314612d1e565b6802000000000000000081116117215760085580f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f42726f776e466956323a204d4158494d554d5f4b0000000000000000000000006044820152fd5b503461033a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a576117b7612ab5565b6117bf612ad8565b9073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163303611a6e5773ffffffffffffffffffffffffffffffffffffffff169081151580611a4f575b156119f15773ffffffffffffffffffffffffffffffffffffffff60055491837fffffffffffffffffffffffff0000000000000000000000000000000000000000841617600555169060065492827fffffffffffffffffffffffff00000000000000000000000000000000000000008516176006556040517f313ce567000000000000000000000000000000000000000000000000000000008152602081600481855afa9081156119e6577fffffffffffffffffffffff0000000000000000000000000000000000000000009174ff00000000000000000000000000000000000000009188916119c7575b5060a01b16921617176005556040517f313ce567000000000000000000000000000000000000000000000000000000008152602081600481855afa90811561067b577fffffffffffffffffffffff0000000000000000000000000000000000000000009174ff0000000000000000000000000000000000000000918691611998575b5060a01b169216171760065580f35b6119ba915060203d6020116119c0575b6119b28183612afb565b810190612d83565b38611989565b503d6119a8565b6119e0915060203d6020116119c0576119b28183612afb565b38611907565b6040513d88823e3d90fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f42726f776e466956323a205a45524f5f414444524553530000000000000000006044820152fd5b5073ffffffffffffffffffffffffffffffffffffffff8116151561181d565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f42726f776e466956323a20464f5242494444454e0000000000000000000000006044820152fd5b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a576020600354604051908152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a576020604051680100000000000000008152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602060405160128152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760206040517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98152f35b503461033a5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57610b8990611c19612ab5565b611c21612ad8565b906044359273ffffffffffffffffffffffffffffffffffffffff82169081815260026020526040812073ffffffffffffffffffffffffffffffffffffffff33166000526020527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60406000205403611c9b575b50506139a8565b808260409252600260205281812073ffffffffffffffffffffffffffffffffffffffff3316600052602052611cd4868360002054613935565b92815260026020522073ffffffffffffffffffffffffffffffffffffffff33166000526020526040600020553880611c94565b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760043563ffffffff8116810361088757611d8873ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163314612d1e565b7fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff6bffffffff00000000000000006009549260401b1691161760095580f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760209054604051908152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602073ffffffffffffffffffffffffffffffffffffffff60055416604051908152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602060ff60065460a01c16604051908152f35b503461033a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57610b89611ed1612ab5565b60243590336138d2565b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760606dffffffffffffffffffffffffffff63ffffffff611f536007546dffffffffffffffffffffffffffff8116916dffffffffffffffffffffffffffff8260701c169160e01c90565b9193908160405195168552166020840152166040820152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5750610c0b604051611fad604082612afb565b600a81527f42726f776e466920563200000000000000000000000000000000000000000000602082015260405191829182612b6b565b503461033a5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a576004359060243560443573ffffffffffffffffffffffffffffffffffffffff811691828203612ab1576064359067ffffffffffffffff8211612aad5736602383011215612aad5781600401359567ffffffffffffffff8711610711573660248885010111610711576120896001600a5414612bd3565b85600a5573ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166040517fb187bd26000000000000000000000000000000000000000000000000000000008152602081600481855afa908115612aa2579061210c9189916110ab575015612c50565b81159081158092612a99575b15612a15576121506007546dffffffffffffffffffffffffffff8116916dffffffffffffffffffffffffffff8260701c169160e01c90565b509690956dffffffffffffffffffffffffffff61216c86612dd5565b97169661217888612e83565b1015806129eb575b156129675773ffffffffffffffffffffffffffffffffffffffff600554169a73ffffffffffffffffffffffffffffffffffffffff60065416928c8b14158061295d575b156128ff578c8782886128ee575b50505087806128dd575b50508061281d575b5050602060249798999a604051988980927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa96871561249b578a976127e8575b506020602491604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa90811561249b578a916127b6575b5061227e8487612cb5565b8711156127a0576dffffffffffffffffffffffffffff6122a76122a18689612cb5565b89612cb5565b985b16966122b58689612cb5565b821115612799576122cf6122c9878a612cb5565b83612cb5565b935b89159182158093612790575b1561270d578c936122ec6130cc565b929093849b849d6009549167ffffffffffffffff83166126ee575b50508d918b61233c8f938f9061232f61233663ffffffff809360401c16958361232f88612cf1565b1690613397565b94612cf1565b9161264d575b508c61254e575b50505090612356916135fd565b6009549067ffffffffffffffff8260601c1691826123c3575b50505050505050604051958652602086015260408501526060840152608083015260a08201527f72362f8601a26e309bef1da8d6795550a593bd38f121bedcaf24be6e4b7c6bee60c03392a36001600a5580f35b8554938d6123d18483613727565b96612503575b5050876124a6575b5050505050806123f5575b808080808d9461236f565b6020600492604051938480927f017e7e580000000000000000000000000000000000000000000000000000000082525afa801561249b578a90612444575b61243d925061385e565b38806123ea565b50906020813d602011612493575b8161245f60209383612afb565b8101031261248f57519073ffffffffffffffffffffffffffffffffffffffff8216820361248f5761243d91612433565b8980fd5b3d9150612452565b6040513d8c823e3d90fd5b6124f995506124f492916124e86124ee9263ffffffff6124ce8c60ff60065460a01c166137bd565b9160401c1663ffffffff6124e182612cf1565b1691613557565b92612d0b565b90613448565b613557565b38808080806123df565b6125469297506124f487926124ee61253f6125278a9560ff60055460a01c166137bd565b63ffffffff8d60401c1663ffffffff6124e182612cf1565b9188612d0b565b94388d6123d7565b906125cf916125c96125c2879b6125bc88996115ef6125b561259861257e6125d59d60ff60055460a01c166137bd565b9861259260ff60065460a01c1695866137bd565b946137bd565b9760085495506125af6125aa85612ec9565b612ea6565b99612ef4565b918a612ef4565b96612ef4565b9180612ef4565b90613557565b90613935565b6125df8c8c613727565b116125ef57938d948b8b38612349565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f42726f776e466956323a20494e56414c49445f494e56454e544f5259000000006044820152fd5b91846125c96125c2886125bc6126c0986125cf979f986126956115ef9161268f61268060ff60055460a01c169a8b6137bd565b9660ff60065460a01c166137bd565b986137bd565b966113d0600854958c6000146126e757829c5b156126da576126ba6125aa869e612ec9565b9a612ef4565b6126ca8d8d613727565b116125ef578b8f968c9038612342565b6126ba6125aa8c9e612ec9565b809c6126a8565b8c9f508d929e50876127019288926132c8565b9e909d91508290612307565b60846040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f42726f776e466956323a20494e53554646494349454e545f494e5055545f414d60448201527f4f554e54000000000000000000000000000000000000000000000000000000006064820152fd5b508515156122dd565b8a936122d1565b6dffffffffffffffffffffffffffff8a986122a9565b90506020813d6020116127e0575b816127d160209383612afb565b810103126102e4575138612273565b3d91506127c4565b9096506020813d602011612815575b8161280460209383612afb565b810103126102e4575195602061222d565b3d91506127f7565b893b156128d9578660a4877fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8f95806024604051998a9889977f6f9d78fc0000000000000000000000000000000000000000000000000000000089523360048a01528389015260448801526080606488015282608488015201868601378685828601015201168101030181838d5af1801561249b576128bf575b806121e3565b896128d06024999a9b602093612afb565b999897506128b9565b8a80fd5b6128e79185612f2b565b38876121db565b6128f792612f2b565b8c87826121d1565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f42726f776e466956323a20494e56414c49445f544f00000000000000000000006044820152fd5b50838b14156121c3565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f42726f776e466956323a20494e53554646494349454e545f4c4951554944495460448201527f59000000000000000000000000000000000000000000000000000000000000006064820152fd5b506129f586612dd5565b612a0e6dffffffffffffffffffffffffffff8a16612e83565b1015612180565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f42726f776e466956323a20494e53554646494349454e545f4f55545055545f4160448201527f4d4f554e540000000000000000000000000000000000000000000000000000006064820152fd5b50831515612118565b6040513d8a823e3d90fd5b8480fd5b8380fd5b6004359073ffffffffffffffffffffffffffffffffffffffff821682036102e457565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036102e457565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117612b3c57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b9190916020815282519283602083015260005b848110612bbd5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006040809697860101520116010190565b8060208092840101516040828601015201612b7e565b15612bda57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f42726f776e466956323a204c4f434b45440000000000000000000000000000006044820152fd5b908160209103126102e4575180151581036102e45790565b15612c5757565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f42726f776e466956323a205041555345440000000000000000000000000000006044820152fd5b91908203918211612cc257565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b63ffffffff166305f5e100019063ffffffff8211612cc257565b81810292918115918404141715612cc257565b15612d2557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f42726f776e466956323a204f4e4c595f464143544f52590000000000000000006044820152fd5b908160209103126102e4575160ff811681036102e45790565b8115612da6570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b90600091600a8102818104600a1482151715612e56579250600a830403612df857565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f770000000000000000000000006044820152fd5b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b906000916008810281810460081482151715612e565780935060031c03612df857565b906000916002810281810460021482151715612e565780935060011c03612df857565b9060009168010000000000000000808202908282041482151715612e565780935060401c03612df857565b600092918015918215612f0b575b505015612df857565b91509250612f23612f1c8483612d0b565b9384612d9c565b143880612f02565b60009190829182604095612fd07fffffffff00000000000000000000000000000000000000000000000000000000601960208a51612f698c82612afb565b8281527f7472616e7366657228616464726573732c75696e743235362900000000000000910190815220895191166020820190815273ffffffffffffffffffffffffffffffffffffffff959095166024820152604480820193909352918252606482612afb565b51925af13d156130c5573d67ffffffffffffffff8111612b3c5782519061301f601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200183612afb565b81523d6000602083013e5b81613096575b50156130395750565b606490517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f42726f776e466956323a205452414e534645525f4641494c45440000000000006044820152fd5b80518015925082156130ab575b505038613030565b6130be9250602080918301019101612c38565b38806130a3565b606061302a565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906040517f67cc3403000000000000000000000000000000000000000000000000000000008152602081600481865afa90811561324957600091613289575b506005546040517ffc3d545d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015260248101829052602081604481875afa90811561324957600091613255575b506006546040517ffc3d545d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015260248101929092529260209082908180604481015b03915afa9081156132495760009161321a575090565b90506020813d602011613241575b8161323560209383612afb565b810103126102e4575190565b3d9150613228565b6040513d6000823e3d90fd5b90506020813d602011613281575b8161327060209383612afb565b810103126102e457516132046131a8565b3d9150613263565b906020823d6020116132b3575b816132a360209383612afb565b8101031261033a57505138613142565b3d9150613296565b91908201809211612cc257565b6132f7846132f1856132eb61268061332a969a999a60ff60055460a01c166137bd565b95612d0b565b93612d0b565b808310801593916133169161338d576133108184612cb5565b926132bb565b9067ffffffffffffffff6009541690613557565b9182680100000000000000000192836801000000000000000011612cc257680100000000000000000391680100000000000000008311612cc257156133805761337d9291613377916134e0565b936134e0565b90565b61337d92613377916134e0565b6133108382612cb5565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6305f5e1008209916305f5e10082029182808510940393808503941461343b57838211156102e4576305f5e100829109818060000316809204600281600302188082026002030280820260020302808202600203028082026002030280820260020302809102600203029360018380600003040190848311900302920304170290565b50809250156102e4570490565b9190916000907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84820990848102928380841093039280840393146134d157826305f5e100111561033a57507facbe0e98f503f8881186e60dbb7f727bf36b7213ee9f5a78c767074b22e90e2193946305f5e100910990828211900360f81b910360081c170290565b5050506305f5e1009192500490565b6000917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818309918181029384808510940393808503941461354d578368010000000000000000111561033a57509068010000000000000000910990828211900360c01b910360401c1790565b5050505060401c90565b917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82840992828102928380861095039480860395146135ef57848311156102e457829109818060000316809204600281600302188082026002030280820260020302808202600203028082026002030280820260020302809102600203029360018380600003040190848311900302920304170290565b5050809250156102e4570490565b6dffffffffffffffffffffffffffff8111158061370f575b156136b1577f1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1916dffffffffffffffffffffffffffff806040931691827bffffffffffffffffffffffffffff00000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000004260e01b169260701b16171780600755835192835260701c166020820152a1565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f42726f776e466956323a204f564552464c4f57000000000000000000000000006044820152fd5b506dffffffffffffffffffffffffffff821115613615565b906115ef61337d926113d061378e6113d061376b6007546dffffffffffffffffffffffffffff8116916dffffffffffffffffffffffffffff8260701c169160e01c90565b5092906dffffffffffffffffffffffffffff60ff60055460a01c169116906137bd565b916dffffffffffffffffffffffffffff60ff60065460a01c169116906137bd565b604d8111612cc257600a0a90565b60009060ff16601281111561380e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee9150019060ff8211612cc25761380860ff61337d93166137af565b90612d9c565b6012039060ff821161383157509061382b60ff61337d93166137af565b90612d0b565b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526011600452fd5b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602073ffffffffffffffffffffffffffffffffffffffff6000936138a4868654613a39565b85551693848452600182526138bd816040862054613a39565b858552600183526040852055604051908152a3565b602073ffffffffffffffffffffffffffffffffffffffff807f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925931693846000526002835260406000208282166000528352856040600020556040519586521693a3565b91906139419083612cb5565b91821161394a57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f7700000000000000000000006044820152fd5b602073ffffffffffffffffffffffffffffffffffffffff807fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef93169384600052600183526139fb86604060002054613935565b856000526001845260406000205516938460005260018252613a2281604060002054613a39565b8560005260018352604060002055604051908152a3565b9190613a4590836132bb565b918210613a4e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f770000000000000000000000006044820152fdfea26469706673582212201634120ea8a3571b194d610828716ad7c6c5e7329387eff50ccf0bdb13b8557b64736f6c634300081c0033
Deployed Bytecode
0x6080604052600436101561001257600080fd5b6000803560e01c8063022c0d9f14611fe357806306fdde0314611f6c5780630902f1ac14611edb578063095ea7b314611e965780630b77884d14611e545780630dfe168114611e0257806318160ddd14611dc75780631ab971ab14611d0757806323b872dd14611bdd57806330adf81f14611b84578063313ce56714611b4a57806333fca18714611b085780633644e51514611acc578063485cc9551461177f57806367de8be9146116975780636a627842146111a057806370a082311461113d5780637ecebe00146110da57806389afcb4414610c0f57806395d89b4114610b94578063a9059cbb14610b44578063aa9f762814610a80578063aaf5eb6814610a43578063b0e21e8a146109fa578063b31ac6e2146109b8578063b4f40c611461097c578063ba9a7a5614610941578063bc25cf77146108fa578063c45a01551461088b578063cde5bf5314610767578063d21220a714610715578063d505accf14610443578063dad0be61146103fd578063dd62ed3e14610382578063ddca3f431461033d5763fff6cae9146101a957600080fd5b3461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a576101e56001600a5414612bd3565b80600a556024602073ffffffffffffffffffffffffffffffffffffffff60055416604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa801561032f5782906102fc575b60249150602073ffffffffffffffffffffffffffffffffffffffff60065416604051938480927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa9081156102f15783916102b6575b6102ae92506135fd565b6001600a5580f35b90506020823d6020116102e9575b816102d160209383612afb565b810103126102e4576102ae9151906102a4565b600080fd5b3d91506102c4565b6040513d85823e3d90fd5b506020813d602011610327575b8161031660209383612afb565b810103126102e45760249051610245565b3d9150610309565b6040513d84823e3d90fd5b80fd5b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602063ffffffff60095460401c16604051908152f35b503461033a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5773ffffffffffffffffffffffffffffffffffffffff60406103d1612ab5565b92826103db612ad8565b9416815260026020522091166000526020526020604060002054604051908152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602067ffffffffffffffff60095416604051908152f35b503461033a5760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5761047b612ab5565b610483612ad8565b6044359060643560843560ff8116809103610711574282106106b35760035473ffffffffffffffffffffffffffffffffffffffff861692838852600460205260408820908154917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8314610686579282602095928b95600160809601905560405190878201927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9845289604084015273ffffffffffffffffffffffffffffffffffffffff8b1660608401528b8784015260a083015260c082015260c0815261056c60e082612afb565b51902060405190868201927f1901000000000000000000000000000000000000000000000000000000000000845260228301526042820152604281526105b3606282612afb565b519020906040519182528482015260a435604082015260c435606082015282805260015afa1561067b5773ffffffffffffffffffffffffffffffffffffffff855116908115159182610671575b50501561061357610610926138d2565b80f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f42726f776e466956323a20494e56414c49445f5349474e4154555245000000006044820152fd5b1490503880610600565b6040513d86823e3d90fd5b60248a7f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f42726f776e466956323a204558504952454400000000000000000000000000006044820152fd5b8580fd5b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602073ffffffffffffffffffffffffffffffffffffffff60065416604051908152f35b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760043567ffffffffffffffff8116809103610887576107ed73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000068bc42f886ddf6a4b0b90a9496493da1f8304536163314612d1e565b680100000000000000008111610829577fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000600954161760095580f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f42726f776e466956323a204d4158494d554d5f4c414d424441000000000000006044820152fd5b5080fd5b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602060405173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000068bc42f886ddf6a4b0b90a9496493da1f8304536168152f35b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57610932612ab5565b506102ae6001600a5414612bd3565b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760206040516103e88152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a576020600854604051908152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602060ff60055460a01c16604051908152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602067ffffffffffffffff60095460601c16604051908152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760206040516305f5e1008152f35b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760043563ffffffff8116810361088757610b0173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000068bc42f886ddf6a4b0b90a9496493da1f8304536163314612d1e565b7fffffffffffffffffffffffff0000000000000000ffffffffffffffffffffffff6fffffffff0000000000000000000000006009549260601b1691161760095580f35b503461033a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57610b89610b7f612ab5565b60243590336139a8565b602060405160018152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5750610c0b604051610bd5604082612afb565b600581527f42462d5632000000000000000000000000000000000000000000000000000000602082015260405191829182612b6b565b0390f35b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57610c47612ab5565b610c556001600a5414612bd3565b81600a556040517fb187bd2600000000000000000000000000000000000000000000000000000000815260208160048173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000068bc42f886ddf6a4b0b90a9496493da1f8304536165afa80156102f157610cd69184916110ab575b5015612c50565b73ffffffffffffffffffffffffffffffffffffffff600554169173ffffffffffffffffffffffffffffffffffffffff6006541691604051917f70a08231000000000000000000000000000000000000000000000000000000008352306004840152602083602481885afa92831561109e57819361106a575b50604051937f70a08231000000000000000000000000000000000000000000000000000000008552306004860152602085602481845afa94851561032f578295611036575b503082526001602052610dc5610db9610db9610dbe60408620549786549384918a612ef4565b612d9c565b9787612ef4565b938515158061102d575b15610fa9576024968360209230825260018452610df0816040842054613935565b308352600185526040832055610e07818354613935565b82556040519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef843092a3610e3f878683612f2b565b610e4a868685612f2b565b604051978880927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa95861561032f578296610f74575b506020602491604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa918215610f685791610f35575b50610edc906040956135fd565b73ffffffffffffffffffffffffffffffffffffffff84519184835283602084015216907fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496853392a36001600a5582519182526020820152f35b90506020813d602011610f60575b81610f5060209383612afb565b810103126102e457516040610ecf565b3d9150610f43565b604051903d90823e3d90fd5b9095506020813d602011610fa1575b81610f9060209383612afb565b810103126102e45751946020610e8a565b3d9150610f83565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f42726f776e466956323a20494e53554646494349454e545f4c4951554944495460448201527f595f4255524e45440000000000000000000000000000000000000000000000006064820152fd5b50841515610dcf565b9094506020813d602011611062575b8161105260209383612afb565b810103126102e457519338610d93565b3d9150611045565b9092506020813d602011611096575b8161108660209383612afb565b810103126102e457519138610d4e565b3d9150611079565b50604051903d90823e3d90fd5b6110cd915060203d6020116110d3575b6110c58183612afb565b810190612c38565b38610ccf565b503d6110bb565b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57604060209173ffffffffffffffffffffffffffffffffffffffff61112c612ab5565b168152600483522054604051908152f35b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57604060209173ffffffffffffffffffffffffffffffffffffffff61118f612ab5565b168152600183522054604051908152f35b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a576111d8612ab5565b906111e76001600a5414612bd3565b80600a556040517fb187bd2600000000000000000000000000000000000000000000000000000000815260208160048173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000068bc42f886ddf6a4b0b90a9496493da1f8304536165afa90811561032f57906112699183916110ab575015612c50565b61129c6007546dffffffffffffffffffffffffffff8116916dffffffffffffffffffffffffffff8260701c169160e01c90565b5090600554604051947f70a0823100000000000000000000000000000000000000000000000000000000865230600487015260208660248173ffffffffffffffffffffffffffffffffffffffff86165afa95861561168c578596611658575b5060065491604051927f70a0823100000000000000000000000000000000000000000000000000000000845230600485015260208460248173ffffffffffffffffffffffffffffffffffffffff85165afa93841561164d578794611609575b506dffffffffffffffffffffffffffff60ff939495166dffffffffffffffffffffffffffff611389828b613935565b97166113958188613935565b9261139e6130cc565b96909560a01c169160ff6113b28b856137bd565b9260a01c16916113d6886113d0896113ca8a886137bd565b94612ef4565b92612ef4565b808210156116015750935b8b5493846115b25750505050506113f790612ea6565b60401c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18810190811161158557966114326103e88254613a39565b8155808052600160205261144c6103e86040832054613a39565b81805260016020526040822055807fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60206040516103e88152a35b8615611501576114b873ffffffffffffffffffffffffffffffffffffffff956020996114b38a8861385e565b6135fd565b604051958652878601526040850152606084015216907f265ee4cff6cdf714e68c02e61a7864cf66bc04e372a41b6cc425acbb737cd39560803392a36001600a55604051908152f35b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f42726f776e466956323a20494e53554646494349454e545f4c4951554944495460448201527f595f4d494e5445440000000000000000000000000000000000000000000000006064820152fd5b6024887f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b6115fb969c506115e16115db6115f5959697946115d56115ef956115e8956137bd565b976137bd565b93612ea6565b9488612ef4565b9188612ef4565b90613a39565b91613557565b95611487565b9050936113e1565b9293506020833d602011611645575b8161162560209383612afb565b810103126102e457915192916dffffffffffffffffffffffffffff61135a565b3d9150611618565b6040513d89823e3d90fd5b9095506020813d602011611684575b8161167460209383612afb565b810103126102e4575194386112fb565b3d9150611667565b6040513d87823e3d90fd5b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760043561170b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000068bc42f886ddf6a4b0b90a9496493da1f8304536163314612d1e565b6802000000000000000081116117215760085580f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f42726f776e466956323a204d4158494d554d5f4b0000000000000000000000006044820152fd5b503461033a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a576117b7612ab5565b6117bf612ad8565b9073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000068bc42f886ddf6a4b0b90a9496493da1f8304536163303611a6e5773ffffffffffffffffffffffffffffffffffffffff169081151580611a4f575b156119f15773ffffffffffffffffffffffffffffffffffffffff60055491837fffffffffffffffffffffffff0000000000000000000000000000000000000000841617600555169060065492827fffffffffffffffffffffffff00000000000000000000000000000000000000008516176006556040517f313ce567000000000000000000000000000000000000000000000000000000008152602081600481855afa9081156119e6577fffffffffffffffffffffff0000000000000000000000000000000000000000009174ff00000000000000000000000000000000000000009188916119c7575b5060a01b16921617176005556040517f313ce567000000000000000000000000000000000000000000000000000000008152602081600481855afa90811561067b577fffffffffffffffffffffff0000000000000000000000000000000000000000009174ff0000000000000000000000000000000000000000918691611998575b5060a01b169216171760065580f35b6119ba915060203d6020116119c0575b6119b28183612afb565b810190612d83565b38611989565b503d6119a8565b6119e0915060203d6020116119c0576119b28183612afb565b38611907565b6040513d88823e3d90fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f42726f776e466956323a205a45524f5f414444524553530000000000000000006044820152fd5b5073ffffffffffffffffffffffffffffffffffffffff8116151561181d565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f42726f776e466956323a20464f5242494444454e0000000000000000000000006044820152fd5b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a576020600354604051908152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a576020604051680100000000000000008152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602060405160128152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760206040517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98152f35b503461033a5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57610b8990611c19612ab5565b611c21612ad8565b906044359273ffffffffffffffffffffffffffffffffffffffff82169081815260026020526040812073ffffffffffffffffffffffffffffffffffffffff33166000526020527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60406000205403611c9b575b50506139a8565b808260409252600260205281812073ffffffffffffffffffffffffffffffffffffffff3316600052602052611cd4868360002054613935565b92815260026020522073ffffffffffffffffffffffffffffffffffffffff33166000526020526040600020553880611c94565b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760043563ffffffff8116810361088757611d8873ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000068bc42f886ddf6a4b0b90a9496493da1f8304536163314612d1e565b7fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff6bffffffff00000000000000006009549260401b1691161760095580f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760209054604051908152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602073ffffffffffffffffffffffffffffffffffffffff60055416604051908152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602060ff60065460a01c16604051908152f35b503461033a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57610b89611ed1612ab5565b60243590336138d2565b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760606dffffffffffffffffffffffffffff63ffffffff611f536007546dffffffffffffffffffffffffffff8116916dffffffffffffffffffffffffffff8260701c169160e01c90565b9193908160405195168552166020840152166040820152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5750610c0b604051611fad604082612afb565b600a81527f42726f776e466920563200000000000000000000000000000000000000000000602082015260405191829182612b6b565b503461033a5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a576004359060243560443573ffffffffffffffffffffffffffffffffffffffff811691828203612ab1576064359067ffffffffffffffff8211612aad5736602383011215612aad5781600401359567ffffffffffffffff8711610711573660248885010111610711576120896001600a5414612bd3565b85600a5573ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000068bc42f886ddf6a4b0b90a9496493da1f8304536166040517fb187bd26000000000000000000000000000000000000000000000000000000008152602081600481855afa908115612aa2579061210c9189916110ab575015612c50565b81159081158092612a99575b15612a15576121506007546dffffffffffffffffffffffffffff8116916dffffffffffffffffffffffffffff8260701c169160e01c90565b509690956dffffffffffffffffffffffffffff61216c86612dd5565b97169661217888612e83565b1015806129eb575b156129675773ffffffffffffffffffffffffffffffffffffffff600554169a73ffffffffffffffffffffffffffffffffffffffff60065416928c8b14158061295d575b156128ff578c8782886128ee575b50505087806128dd575b50508061281d575b5050602060249798999a604051988980927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa96871561249b578a976127e8575b506020602491604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa90811561249b578a916127b6575b5061227e8487612cb5565b8711156127a0576dffffffffffffffffffffffffffff6122a76122a18689612cb5565b89612cb5565b985b16966122b58689612cb5565b821115612799576122cf6122c9878a612cb5565b83612cb5565b935b89159182158093612790575b1561270d578c936122ec6130cc565b929093849b849d6009549167ffffffffffffffff83166126ee575b50508d918b61233c8f938f9061232f61233663ffffffff809360401c16958361232f88612cf1565b1690613397565b94612cf1565b9161264d575b508c61254e575b50505090612356916135fd565b6009549067ffffffffffffffff8260601c1691826123c3575b50505050505050604051958652602086015260408501526060840152608083015260a08201527f72362f8601a26e309bef1da8d6795550a593bd38f121bedcaf24be6e4b7c6bee60c03392a36001600a5580f35b8554938d6123d18483613727565b96612503575b5050876124a6575b5050505050806123f5575b808080808d9461236f565b6020600492604051938480927f017e7e580000000000000000000000000000000000000000000000000000000082525afa801561249b578a90612444575b61243d925061385e565b38806123ea565b50906020813d602011612493575b8161245f60209383612afb565b8101031261248f57519073ffffffffffffffffffffffffffffffffffffffff8216820361248f5761243d91612433565b8980fd5b3d9150612452565b6040513d8c823e3d90fd5b6124f995506124f492916124e86124ee9263ffffffff6124ce8c60ff60065460a01c166137bd565b9160401c1663ffffffff6124e182612cf1565b1691613557565b92612d0b565b90613448565b613557565b38808080806123df565b6125469297506124f487926124ee61253f6125278a9560ff60055460a01c166137bd565b63ffffffff8d60401c1663ffffffff6124e182612cf1565b9188612d0b565b94388d6123d7565b906125cf916125c96125c2879b6125bc88996115ef6125b561259861257e6125d59d60ff60055460a01c166137bd565b9861259260ff60065460a01c1695866137bd565b946137bd565b9760085495506125af6125aa85612ec9565b612ea6565b99612ef4565b918a612ef4565b96612ef4565b9180612ef4565b90613557565b90613935565b6125df8c8c613727565b116125ef57938d948b8b38612349565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f42726f776e466956323a20494e56414c49445f494e56454e544f5259000000006044820152fd5b91846125c96125c2886125bc6126c0986125cf979f986126956115ef9161268f61268060ff60055460a01c169a8b6137bd565b9660ff60065460a01c166137bd565b986137bd565b966113d0600854958c6000146126e757829c5b156126da576126ba6125aa869e612ec9565b9a612ef4565b6126ca8d8d613727565b116125ef578b8f968c9038612342565b6126ba6125aa8c9e612ec9565b809c6126a8565b8c9f508d929e50876127019288926132c8565b9e909d91508290612307565b60846040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f42726f776e466956323a20494e53554646494349454e545f494e5055545f414d60448201527f4f554e54000000000000000000000000000000000000000000000000000000006064820152fd5b508515156122dd565b8a936122d1565b6dffffffffffffffffffffffffffff8a986122a9565b90506020813d6020116127e0575b816127d160209383612afb565b810103126102e4575138612273565b3d91506127c4565b9096506020813d602011612815575b8161280460209383612afb565b810103126102e4575195602061222d565b3d91506127f7565b893b156128d9578660a4877fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8f95806024604051998a9889977f6f9d78fc0000000000000000000000000000000000000000000000000000000089523360048a01528389015260448801526080606488015282608488015201868601378685828601015201168101030181838d5af1801561249b576128bf575b806121e3565b896128d06024999a9b602093612afb565b999897506128b9565b8a80fd5b6128e79185612f2b565b38876121db565b6128f792612f2b565b8c87826121d1565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f42726f776e466956323a20494e56414c49445f544f00000000000000000000006044820152fd5b50838b14156121c3565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f42726f776e466956323a20494e53554646494349454e545f4c4951554944495460448201527f59000000000000000000000000000000000000000000000000000000000000006064820152fd5b506129f586612dd5565b612a0e6dffffffffffffffffffffffffffff8a16612e83565b1015612180565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f42726f776e466956323a20494e53554646494349454e545f4f55545055545f4160448201527f4d4f554e540000000000000000000000000000000000000000000000000000006064820152fd5b50831515612118565b6040513d8a823e3d90fd5b8480fd5b8380fd5b6004359073ffffffffffffffffffffffffffffffffffffffff821682036102e457565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036102e457565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117612b3c57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b9190916020815282519283602083015260005b848110612bbd5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006040809697860101520116010190565b8060208092840101516040828601015201612b7e565b15612bda57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f42726f776e466956323a204c4f434b45440000000000000000000000000000006044820152fd5b908160209103126102e4575180151581036102e45790565b15612c5757565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f42726f776e466956323a205041555345440000000000000000000000000000006044820152fd5b91908203918211612cc257565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b63ffffffff166305f5e100019063ffffffff8211612cc257565b81810292918115918404141715612cc257565b15612d2557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f42726f776e466956323a204f4e4c595f464143544f52590000000000000000006044820152fd5b908160209103126102e4575160ff811681036102e45790565b8115612da6570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b90600091600a8102818104600a1482151715612e56579250600a830403612df857565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f770000000000000000000000006044820152fd5b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b906000916008810281810460081482151715612e565780935060031c03612df857565b906000916002810281810460021482151715612e565780935060011c03612df857565b9060009168010000000000000000808202908282041482151715612e565780935060401c03612df857565b600092918015918215612f0b575b505015612df857565b91509250612f23612f1c8483612d0b565b9384612d9c565b143880612f02565b60009190829182604095612fd07fffffffff00000000000000000000000000000000000000000000000000000000601960208a51612f698c82612afb565b8281527f7472616e7366657228616464726573732c75696e743235362900000000000000910190815220895191166020820190815273ffffffffffffffffffffffffffffffffffffffff959095166024820152604480820193909352918252606482612afb565b51925af13d156130c5573d67ffffffffffffffff8111612b3c5782519061301f601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200183612afb565b81523d6000602083013e5b81613096575b50156130395750565b606490517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f42726f776e466956323a205452414e534645525f4641494c45440000000000006044820152fd5b80518015925082156130ab575b505038613030565b6130be9250602080918301019101612c38565b38806130a3565b606061302a565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000068bc42f886ddf6a4b0b90a9496493da1f830453616906040517f67cc3403000000000000000000000000000000000000000000000000000000008152602081600481865afa90811561324957600091613289575b506005546040517ffc3d545d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015260248101829052602081604481875afa90811561324957600091613255575b506006546040517ffc3d545d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015260248101929092529260209082908180604481015b03915afa9081156132495760009161321a575090565b90506020813d602011613241575b8161323560209383612afb565b810103126102e4575190565b3d9150613228565b6040513d6000823e3d90fd5b90506020813d602011613281575b8161327060209383612afb565b810103126102e457516132046131a8565b3d9150613263565b906020823d6020116132b3575b816132a360209383612afb565b8101031261033a57505138613142565b3d9150613296565b91908201809211612cc257565b6132f7846132f1856132eb61268061332a969a999a60ff60055460a01c166137bd565b95612d0b565b93612d0b565b808310801593916133169161338d576133108184612cb5565b926132bb565b9067ffffffffffffffff6009541690613557565b9182680100000000000000000192836801000000000000000011612cc257680100000000000000000391680100000000000000008311612cc257156133805761337d9291613377916134e0565b936134e0565b90565b61337d92613377916134e0565b6133108382612cb5565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6305f5e1008209916305f5e10082029182808510940393808503941461343b57838211156102e4576305f5e100829109818060000316809204600281600302188082026002030280820260020302808202600203028082026002030280820260020302809102600203029360018380600003040190848311900302920304170290565b50809250156102e4570490565b9190916000907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84820990848102928380841093039280840393146134d157826305f5e100111561033a57507facbe0e98f503f8881186e60dbb7f727bf36b7213ee9f5a78c767074b22e90e2193946305f5e100910990828211900360f81b910360081c170290565b5050506305f5e1009192500490565b6000917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818309918181029384808510940393808503941461354d578368010000000000000000111561033a57509068010000000000000000910990828211900360c01b910360401c1790565b5050505060401c90565b917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82840992828102928380861095039480860395146135ef57848311156102e457829109818060000316809204600281600302188082026002030280820260020302808202600203028082026002030280820260020302809102600203029360018380600003040190848311900302920304170290565b5050809250156102e4570490565b6dffffffffffffffffffffffffffff8111158061370f575b156136b1577f1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1916dffffffffffffffffffffffffffff806040931691827bffffffffffffffffffffffffffff00000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000004260e01b169260701b16171780600755835192835260701c166020820152a1565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f42726f776e466956323a204f564552464c4f57000000000000000000000000006044820152fd5b506dffffffffffffffffffffffffffff821115613615565b906115ef61337d926113d061378e6113d061376b6007546dffffffffffffffffffffffffffff8116916dffffffffffffffffffffffffffff8260701c169160e01c90565b5092906dffffffffffffffffffffffffffff60ff60055460a01c169116906137bd565b916dffffffffffffffffffffffffffff60ff60065460a01c169116906137bd565b604d8111612cc257600a0a90565b60009060ff16601281111561380e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee9150019060ff8211612cc25761380860ff61337d93166137af565b90612d9c565b6012039060ff821161383157509061382b60ff61337d93166137af565b90612d0b565b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526011600452fd5b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602073ffffffffffffffffffffffffffffffffffffffff6000936138a4868654613a39565b85551693848452600182526138bd816040862054613a39565b858552600183526040852055604051908152a3565b602073ffffffffffffffffffffffffffffffffffffffff807f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925931693846000526002835260406000208282166000528352856040600020556040519586521693a3565b91906139419083612cb5565b91821161394a57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f7700000000000000000000006044820152fd5b602073ffffffffffffffffffffffffffffffffffffffff807fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef93169384600052600183526139fb86604060002054613935565b856000526001845260406000205516938460005260018252613a2281604060002054613a39565b8560005260018352604060002055604051908152a3565b9190613a4590836132bb565b918210613a4e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f770000000000000000000000006044820152fdfea26469706673582212201634120ea8a3571b194d610828716ad7c6c5e7329387eff50ccf0bdb13b8557b64736f6c634300081c0033
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.