Contract 0x6d608c51c198c728c0a00bfdfa8fef5d57ff4424

 
Ad
Ad
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x97d4292ed1650fe6f97c6f57b5373d28bf13fc44a3e6610b630aafe745653cbcZap Out2Pair Tok...195456702021-09-26 19:09:3237 secs ago0x904d4f8fc7ea7531bbeb6988324a0ba337bf6dd3 IN  0x6d608c51c198c728c0a00bfdfa8fef5d57ff44240 MATIC0.00067509
0x56e93f17ff8d18de6a0cc4be6a4a0f5e3c02621d7efdf3331eef4db92e5fe1a7Zap Out195456512021-09-26 19:08:501 min ago0xaeb1e70effff99746716a2155c677abd5d193bc9 IN  0x6d608c51c198c728c0a00bfdfa8fef5d57ff44240 MATIC0.02132005
0xbeefe8a65cba27c3210b746977679b27858f106287f334b652c5d11602551fd9Zap Out2Pair Tok...195456102021-09-26 19:07:282 mins ago0x904d4f8fc7ea7531bbeb6988324a0ba337bf6dd3 IN  0x6d608c51c198c728c0a00bfdfa8fef5d57ff44240 MATIC0.000771426
0x6ee860139b95ca478cf37707c37ce2964ea87ab943b25d183d836fd416046c30Zap Out195455872021-09-26 19:06:383 mins ago0x926ddd2e5e78bd8e37ed18fdb441119b2b56d06a IN  0x6d608c51c198c728c0a00bfdfa8fef5d57ff44240 MATIC0.001303752
0xfa2e92cd7e03baa08c70d547cc0a0cfa61533107884a96f1d87b7aa06fb8e5a8Zap Out195455812021-09-26 19:06:263 mins ago0x2c0d3ee7f59b686a42dde029b43629b4ae02f590 IN  0x6d608c51c198c728c0a00bfdfa8fef5d57ff44240 MATIC0.00227034
0xe57eb288dd1f45c36d34cc7064bdbb64f88202053ce904744b28c6bdb0fcefd7Zap Out2Pair Tok...195455732021-09-26 19:06:103 mins ago0x4b75ce8a659cd53e1120e282bc205f20bb618bef IN  0x6d608c51c198c728c0a00bfdfa8fef5d57ff44240 MATIC0.000791252
0x5d2b07491320967e7a56c377cb345995dd82cb35ed87bb3ffca21d8d90836f28Zap Out195455182021-09-26 19:04:165 mins ago0x3afc90a783073e20df5052e68ad168af6990603f IN  0x6d608c51c198c728c0a00bfdfa8fef5d57ff44240 MATIC0.003620166
0x75c16b63f7a3741ef6398778624ea3ed8fac58051419464b63d79e8bf7b8bc91Zap Out195455002021-09-26 19:03:406 mins ago0x7a8920afbfa1107374bfa4416bf2d8ba62749125 IN  0x6d608c51c198c728c0a00bfdfa8fef5d57ff44240 MATIC0.00945588
0xd30630b9ff42b4393d730522cd7d27cd1b95cf41d78399adaebed24b6eca540dZap Out195454882021-09-26 19:03:166 mins ago0x2bdec9f629b2317c9b221ac310b6cde3ef72139b IN  0x6d608c51c198c728c0a00bfdfa8fef5d57ff44240 MATIC0.001806471
0x7028ad782dc1792fda03070058347720c938b2e8f111f2c9e7ace8f2f089b798Zap Out195454692021-09-26 19:02:347 mins ago0x6b94e394cfb98e19491bf89764a773234a3932be IN  0x6d608c51c198c728c0a00bfdfa8fef5d57ff44240 MATIC0.000812864
0xef56a8d8ded83075f933b7dcf6af59c3faebfb196dc21a37b2e6cb1025ddad97Zap Out195454502021-09-26 19:01:568 mins ago0xd2db0810985a1084e3a6a50bc44b3e97d5825199 IN  0x6d608c51c198c728c0a00bfdfa8fef5d57ff44240 MATIC0.001212087
0xedcbcc0ff5646454a6956a41bf651f6714b09200aa6d832b1258e5cc6f65f69cZap Out195453932021-09-26 18:59:3010 mins ago0xc975220b40d047d07e4a42112543a767ffb39414 IN  0x6d608c51c198c728c0a00bfdfa8fef5d57ff44240 MATIC0.001211547
0xd7fead1a2f25cb193a33d3eed41af62bbd3d4ec2e08011f222ed7e1835764cf1Zap Out195453862021-09-26 18:59:0211 mins ago0xce2e18a5482f274ee80a3e298fe2e21bb4bc4978 IN  0x6d608c51c198c728c0a00bfdfa8fef5d57ff44240 MATIC0.00113214
0x8ad3c0d63134d1e079a05e25508148c72cfdab929008e8df186eaf103aa9368aZap Out195453852021-09-26 18:58:5811 mins ago0xd30460890791e37ec39a55b7c6129cf78177cee8 IN  0x6d608c51c198c728c0a00bfdfa8fef5d57ff44240 MATIC0.001495167
0x3c62131ff9483cc4217a760afc3eaee74bc24885c1ef9407c61f92e03ef97643Zap Out2Pair Tok...195453802021-09-26 18:58:3811 mins ago0x6c3e1ee9b905f2841764811d49d12bd6f9779227 IN  0x6d608c51c198c728c0a00bfdfa8fef5d57ff44240 MATIC0.000593439
0x12f0d1eb4177f229142f1865631e23052929856e3a1a86e7915d4574d5af5115Zap Out195453702021-09-26 18:57:5812 mins ago0xad96d28309932bcc11399986ac115443b5af0d7c IN  0x6d608c51c198c728c0a00bfdfa8fef5d57ff44240 MATIC0.00181143
0x75e0c2a9c9731afdab067f3f592dd88b583233a6d4533944d741579c6275e5c2Zap Out195453692021-09-26 18:57:5412 mins ago0xda08801a0f70a7a5cd42ca7feeb3d9436720ce50 IN  0x6d608c51c198c728c0a00bfdfa8fef5d57ff44240 MATIC0.001135644
0xb6f43d1a9488bf2aa3fa4b647ff2fec30ee7cf21dad63ddc81e3a5412218fdfeZap Out195452972021-09-26 18:54:3415 mins ago0x5e56171f6f49eb0b8bf98f6b1aed218fde4adf47 IN  0x6d608c51c198c728c0a00bfdfa8fef5d57ff44240 MATIC0.001224544
0xedb0210078deb1e546882a847c030b29b4fdb8ecaa6ede5e0ed7b417a09241e9Zap Out2Pair Tok...195452842021-09-26 18:54:0816 mins ago0x45b697302046d1407cbb64dcdee2575e8037d3c2 IN  0x6d608c51c198c728c0a00bfdfa8fef5d57ff44240 MATIC0.00059871
0x8437e481e54a97b30c67848f20a5864a85fde9241ad60e78378b399973592b8eZap Out195452692021-09-26 18:53:3416 mins ago0x68edb4d77d34f824c4b44f7aa76c7e261b9f1920 IN  0x6d608c51c198c728c0a00bfdfa8fef5d57ff44240 MATIC0.001521668
0x019e5fc1c7b97cba8809a4cf94cdcb83336b2c43051fdbdce455b748662de776Zap Out195452672021-09-26 18:53:3016 mins ago0x00c5c7cb9547a92974c810d3314d0ca852554685 IN  0x6d608c51c198c728c0a00bfdfa8fef5d57ff44240 MATIC0.001149552
0xc2e23b086304927aa9ab5dc134e4a9f3673558e314e1f8c53da448e2d6552265Zap Out195452632021-09-26 18:53:2216 mins ago0x024fc1c9a1e23106bcaeda73744f4acd742e378a IN  0x6d608c51c198c728c0a00bfdfa8fef5d57ff44240 MATIC0.000116356
0xd813cc69b94f587f2dc6f3333460a6a491f60c8af9f7ff9b1d4169e812c7b5beZap Out195452592021-09-26 18:53:1416 mins ago0x024fc1c9a1e23106bcaeda73744f4acd742e378a IN  0x6d608c51c198c728c0a00bfdfa8fef5d57ff44240 MATIC0.000744098
0x4b1af69f3e811eac8702404356ace5135c6c16290baf582e8cdd07b0c514277fZap Out2Pair Tok...195452152021-09-26 18:51:4018 mins ago0xc0685d5e9db6b97395e20a432334e297afa655fc IN  0x6d608c51c198c728c0a00bfdfa8fef5d57ff44240 MATIC0.000833788
0x9959d7dba1307e905efe2110d051f7803b769f45d16062614d17cf7e829cc0e3Zap Out195452142021-09-26 18:51:3618 mins ago0x33e06ae28248001f3750767eb8773d1d272e5e87 IN  0x6d608c51c198c728c0a00bfdfa8fef5d57ff44240 MATIC0.003099432
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x97d4292ed1650fe6f97c6f57b5373d28bf13fc44a3e6610b630aafe745653cbc195456702021-09-26 19:09:3237 secs ago 0x6d608c51c198c728c0a00bfdfa8fef5d57ff44240x904d4f8fc7ea7531bbeb6988324a0ba337bf6dd30.547944198896151956 MATIC
0x97d4292ed1650fe6f97c6f57b5373d28bf13fc44a3e6610b630aafe745653cbc195456702021-09-26 19:09:3237 secs ago QuickSwap: Router 0x6d608c51c198c728c0a00bfdfa8fef5d57ff44240.547944198896151956 MATIC
0xbeefe8a65cba27c3210b746977679b27858f106287f334b652c5d11602551fd9195456102021-09-26 19:07:282 mins ago 0x6d608c51c198c728c0a00bfdfa8fef5d57ff44240x904d4f8fc7ea7531bbeb6988324a0ba337bf6dd310.410773152499038937 MATIC
0xbeefe8a65cba27c3210b746977679b27858f106287f334b652c5d11602551fd9195456102021-09-26 19:07:282 mins ago QuickSwap: Router 0x6d608c51c198c728c0a00bfdfa8fef5d57ff442410.410773152499038937 MATIC
0x6ee860139b95ca478cf37707c37ce2964ea87ab943b25d183d836fd416046c30195455872021-09-26 19:06:383 mins ago 0x6d608c51c198c728c0a00bfdfa8fef5d57ff44240x926ddd2e5e78bd8e37ed18fdb441119b2b56d06a1.440895893398975797 MATIC
0x6ee860139b95ca478cf37707c37ce2964ea87ab943b25d183d836fd416046c30195455872021-09-26 19:06:383 mins ago 0xdb6f1920a889355780af7570773609bd8cb1f498 0x6d608c51c198c728c0a00bfdfa8fef5d57ff44240.720302270237028984 MATIC
0x6ee860139b95ca478cf37707c37ce2964ea87ab943b25d183d836fd416046c30195455872021-09-26 19:06:383 mins ago Polygon: WMATIC Token 0x6d608c51c198c728c0a00bfdfa8fef5d57ff44240.720593623161946813 MATIC
0xfa2e92cd7e03baa08c70d547cc0a0cfa61533107884a96f1d87b7aa06fb8e5a8195455812021-09-26 19:06:263 mins ago 0x6d608c51c198c728c0a00bfdfa8fef5d57ff44240x2c0d3ee7f59b686a42dde029b43629b4ae02f5900.997364963973780211 MATIC
0xfa2e92cd7e03baa08c70d547cc0a0cfa61533107884a96f1d87b7aa06fb8e5a8195455812021-09-26 19:06:263 mins ago 0xdb6f1920a889355780af7570773609bd8cb1f498 0x6d608c51c198c728c0a00bfdfa8fef5d57ff44240.498531175989435753 MATIC
0xfa2e92cd7e03baa08c70d547cc0a0cfa61533107884a96f1d87b7aa06fb8e5a8195455812021-09-26 19:06:263 mins ago 0xdb6f1920a889355780af7570773609bd8cb1f498 0x6d608c51c198c728c0a00bfdfa8fef5d57ff44240.498833787984344458 MATIC
0xe57eb288dd1f45c36d34cc7064bdbb64f88202053ce904744b28c6bdb0fcefd7195455732021-09-26 19:06:103 mins ago 0x6d608c51c198c728c0a00bfdfa8fef5d57ff44240x4b75ce8a659cd53e1120e282bc205f20bb618bef22.413590555596099154 MATIC
0xe57eb288dd1f45c36d34cc7064bdbb64f88202053ce904744b28c6bdb0fcefd7195455732021-09-26 19:06:103 mins ago QuickSwap: Router 0x6d608c51c198c728c0a00bfdfa8fef5d57ff442422.413590555596099154 MATIC
0x5d2b07491320967e7a56c377cb345995dd82cb35ed87bb3ffca21d8d90836f28195455182021-09-26 19:04:165 mins ago 0x6d608c51c198c728c0a00bfdfa8fef5d57ff44240x3afc90a783073e20df5052e68ad168af6990603f906.138502086634730667 MATIC
0x5d2b07491320967e7a56c377cb345995dd82cb35ed87bb3ffca21d8d90836f28195455182021-09-26 19:04:165 mins ago 0xdb6f1920a889355780af7570773609bd8cb1f498 0x6d608c51c198c728c0a00bfdfa8fef5d57ff4424453.043948904474377056 MATIC
0x5d2b07491320967e7a56c377cb345995dd82cb35ed87bb3ffca21d8d90836f28195455182021-09-26 19:04:165 mins ago 0xdb6f1920a889355780af7570773609bd8cb1f498 0x6d608c51c198c728c0a00bfdfa8fef5d57ff4424453.094553182160353611 MATIC
0xd30630b9ff42b4393d730522cd7d27cd1b95cf41d78399adaebed24b6eca540d195454882021-09-26 19:03:166 mins ago 0x6d608c51c198c728c0a00bfdfa8fef5d57ff44240x2bdec9f629b2317c9b221ac310b6cde3ef72139b0.995176037433590353 MATIC
0xd30630b9ff42b4393d730522cd7d27cd1b95cf41d78399adaebed24b6eca540d195454882021-09-26 19:03:166 mins ago 0xdb6f1920a889355780af7570773609bd8cb1f498 0x6d608c51c198c728c0a00bfdfa8fef5d57ff44240.497407224795344064 MATIC
0xd30630b9ff42b4393d730522cd7d27cd1b95cf41d78399adaebed24b6eca540d195454882021-09-26 19:03:166 mins ago 0xdb6f1920a889355780af7570773609bd8cb1f498 0x6d608c51c198c728c0a00bfdfa8fef5d57ff44240.497768812638246289 MATIC
0x7028ad782dc1792fda03070058347720c938b2e8f111f2c9e7ace8f2f089b798195454692021-09-26 19:02:347 mins ago 0x6d608c51c198c728c0a00bfdfa8fef5d57ff44240x6b94e394cfb98e19491bf89764a773234a3932be0.499080607460286599 MATIC
0x7028ad782dc1792fda03070058347720c938b2e8f111f2c9e7ace8f2f089b798195454692021-09-26 19:02:347 mins ago 0xdb6f1920a889355780af7570773609bd8cb1f498 0x6d608c51c198c728c0a00bfdfa8fef5d57ff44240.249460700314272367 MATIC
0x7028ad782dc1792fda03070058347720c938b2e8f111f2c9e7ace8f2f089b798195454692021-09-26 19:02:347 mins ago Polygon: WMATIC Token 0x6d608c51c198c728c0a00bfdfa8fef5d57ff44240.249619907146014232 MATIC
0xef56a8d8ded83075f933b7dcf6af59c3faebfb196dc21a37b2e6cb1025ddad97195454502021-09-26 19:01:568 mins ago 0x6d608c51c198c728c0a00bfdfa8fef5d57ff44240xd2db0810985a1084e3a6a50bc44b3e97d58251999.975523505121029844 MATIC
0xef56a8d8ded83075f933b7dcf6af59c3faebfb196dc21a37b2e6cb1025ddad97195454502021-09-26 19:01:568 mins ago 0xdb6f1920a889355780af7570773609bd8cb1f498 0x6d608c51c198c728c0a00bfdfa8fef5d57ff44244.983186122922316724 MATIC
0xef56a8d8ded83075f933b7dcf6af59c3faebfb196dc21a37b2e6cb1025ddad97195454502021-09-26 19:01:568 mins ago Polygon: WMATIC Token 0x6d608c51c198c728c0a00bfdfa8fef5d57ff44244.99233738219871312 MATIC
0xedcbcc0ff5646454a6956a41bf651f6714b09200aa6d832b1258e5cc6f65f69c195453932021-09-26 18:59:3010 mins ago 0x6d608c51c198c728c0a00bfdfa8fef5d57ff44240xc975220b40d047d07e4a42112543a767ffb394140.998706640379637455 MATIC
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Quickswap_ZapOut_V2

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv2 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2021-06-10
*/

// ███████╗░█████╗░██████╗░██████╗░███████╗██████╗░░░░███████╗██╗
// ╚════██║██╔══██╗██╔══██╗██╔══██╗██╔════╝██╔══██╗░░░██╔════╝██║
// ░░███╔═╝███████║██████╔╝██████╔╝█████╗░░██████╔╝░░░█████╗░░██║
// ██╔══╝░░██╔══██║██╔═══╝░██╔═══╝░██╔══╝░░██╔══██╗░░░██╔══╝░░██║
// ███████╗██║░░██║██║░░░░░██║░░░░░███████╗██║░░██║██╗██║░░░░░██║
// ╚══════╝╚═╝░░╚═╝╚═╝░░░░░╚═╝░░░░░╚══════╝╚═╝░░╚═╝╚═╝╚═╝░░░░░╚═╝
// Copyright (C) 2021 zapper

// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Affero General Public License for more details.
//
// Visit <https://www.gnu.org/licenses/>for a copy of the GNU Affero General Public License

///@author Zapper
///@notice this contract removes liquidity from Quickswap pools on Polygon (Matic), receiving ETH, ERC20 or both.
// SPDX-License-Identifier: GPL-2.0 AND MIT

// File contracts/oz/0.8.0/utils/Context.sol


pragma solidity ^0.8.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File contracts/oz/0.8.0/access/Ownable.sol


pragma solidity ^0.8.0;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(
            newOwner != address(0),
            "Ownable: new owner is the zero address"
        );
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// File contracts/oz/0.8.0/token/ERC20/IERC20.sol


pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount)
        external
        returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

// File contracts/oz/0.8.0/utils/Address.sol


pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(
            address(this).balance >= amount,
            "Address: insufficient balance"
        );

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(
            success,
            "Address: unable to send value, recipient may have reverted"
        );
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return
            functionCallWithValue(
                target,
                data,
                value,
                "Address: low-level call with value failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(
            address(this).balance >= value,
            "Address: insufficient balance for call"
        );
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) =
            target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data)
        internal
        view
        returns (bytes memory)
    {
        return
            functionStaticCall(
                target,
                data,
                "Address: low-level static call failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return
            functionDelegateCall(
                target,
                data,
                "Address: low-level delegate call failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File contracts/oz/0.8.0/token/ERC20/utils/SafeERC20.sol


pragma solidity ^0.8.0;

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.transfer.selector, to, value)
        );
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.transferFrom.selector, from, to, value)
        );
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.approve.selector, spender, value)
        );
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(
                token.approve.selector,
                spender,
                newAllowance
            )
        );
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(
                oldAllowance >= value,
                "SafeERC20: decreased allowance below zero"
            );
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(
                token,
                abi.encodeWithSelector(
                    token.approve.selector,
                    spender,
                    newAllowance
                )
            );
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata =
            address(token).functionCall(
                data,
                "SafeERC20: low-level call failed"
            );
        if (returndata.length > 0) {
            // Return data is optional
            // solhint-disable-next-line max-line-length
            require(
                abi.decode(returndata, (bool)),
                "SafeERC20: ERC20 operation did not succeed"
            );
        }
    }
}

// File contracts/_base/ZapBaseV2.sol

pragma solidity ^0.8.0;

abstract contract ZapBaseV2 is Ownable {
    using SafeERC20 for IERC20;
    bool public stopped = false;

    // if true, goodwill is not deducted
    mapping(address => bool) public feeWhitelist;

    uint256 public goodwill;
    // % share of goodwill (0-100 %)
    uint256 affiliateSplit;
    // restrict affiliates
    mapping(address => bool) public affiliates;
    // affiliate => token => amount
    mapping(address => mapping(address => uint256)) public affiliateBalance;
    // token => amount
    mapping(address => uint256) public totalAffiliateBalance;
    // swapTarget => approval status
    mapping(address => bool) public approvedTargets;

    address internal constant ETHAddress =
        0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;

    constructor(uint256 _goodwill, uint256 _affiliateSplit) {
        goodwill = _goodwill;
        affiliateSplit = _affiliateSplit;
    }

    // circuit breaker modifiers
    modifier stopInEmergency {
        if (stopped) {
            revert("Temporarily Paused");
        } else {
            _;
        }
    }

    function _getBalance(address token)
        internal
        view
        returns (uint256 balance)
    {
        if (token == address(0)) {
            balance = address(this).balance;
        } else {
            balance = IERC20(token).balanceOf(address(this));
        }
    }

    function _approveToken(address token, address spender) internal {
        IERC20 _token = IERC20(token);
        if (_token.allowance(address(this), spender) > 0) return;
        else {
            _token.safeApprove(spender, type(uint256).max);
        }
    }

    function _approveToken(
        address token,
        address spender,
        uint256 amount
    ) internal {
        IERC20(token).safeApprove(spender, 0);
        IERC20(token).safeApprove(spender, amount);
    }

    // - to Pause the contract
    function toggleContractActive() public onlyOwner {
        stopped = !stopped;
    }

    function set_feeWhitelist(address zapAddress, bool status)
        external
        onlyOwner
    {
        feeWhitelist[zapAddress] = status;
    }

    function set_new_goodwill(uint256 _new_goodwill) public onlyOwner {
        require(
            _new_goodwill >= 0 && _new_goodwill <= 100,
            "GoodWill Value not allowed"
        );
        goodwill = _new_goodwill;
    }

    function set_new_affiliateSplit(uint256 _new_affiliateSplit)
        external
        onlyOwner
    {
        require(
            _new_affiliateSplit <= 100,
            "Affiliate Split Value not allowed"
        );
        affiliateSplit = _new_affiliateSplit;
    }

    function set_affiliate(address _affiliate, bool _status)
        external
        onlyOwner
    {
        affiliates[_affiliate] = _status;
    }

    ///@notice Withdraw goodwill share, retaining affilliate share
    function withdrawTokens(address[] calldata tokens) external onlyOwner {
        for (uint256 i = 0; i < tokens.length; i++) {
            uint256 qty;

            if (tokens[i] == ETHAddress) {
                qty = address(this).balance - totalAffiliateBalance[tokens[i]];

                Address.sendValue(payable(owner()), qty);
            } else {
                qty =
                    IERC20(tokens[i]).balanceOf(address(this)) -
                    totalAffiliateBalance[tokens[i]];
                IERC20(tokens[i]).safeTransfer(owner(), qty);
            }
        }
    }

    ///@notice Withdraw affilliate share, retaining goodwill share
    function affilliateWithdraw(address[] calldata tokens) external {
        uint256 tokenBal;
        for (uint256 i = 0; i < tokens.length; i++) {
            tokenBal = affiliateBalance[msg.sender][tokens[i]];
            affiliateBalance[msg.sender][tokens[i]] = 0;
            totalAffiliateBalance[tokens[i]] =
                totalAffiliateBalance[tokens[i]] -
                tokenBal;

            if (tokens[i] == ETHAddress) {
                Address.sendValue(payable(msg.sender), tokenBal);
            } else {
                IERC20(tokens[i]).safeTransfer(msg.sender, tokenBal);
            }
        }
    }

    function setApprovedTargets(
        address[] calldata targets,
        bool[] calldata isApproved
    ) external onlyOwner {
        require(targets.length == isApproved.length, "Invalid Input length");

        for (uint256 i = 0; i < targets.length; i++) {
            approvedTargets[targets[i]] = isApproved[i];
        }
    }

    receive() external payable {
        require(msg.sender != tx.origin, "Do not send ETH directly");
    }
}

// File contracts/_base/ZapOutBaseV3.sol


pragma solidity ^0.8.0;

abstract contract ZapOutBaseV3 is ZapBaseV2 {
    using SafeERC20 for IERC20;

    /**
        @dev Transfer tokens from msg.sender to this contract
        @param token The ERC20 token to transfer to this contract
        @param shouldSellEntireBalance If True transfers entrire allowable amount from another contract
        @return Quantity of tokens transferred to this contract
     */
    function _pullTokens(
        address token,
        uint256 amount,
        bool shouldSellEntireBalance
    ) internal returns (uint256) {
        if (shouldSellEntireBalance) {
            require(
                Address.isContract(msg.sender),
                "ERR: shouldSellEntireBalance is true for EOA"
            );

            uint256 allowance =
                IERC20(token).allowance(msg.sender, address(this));
            IERC20(token).safeTransferFrom(
                msg.sender,
                address(this),
                allowance
            );

            return allowance;
        } else {
            IERC20(token).safeTransferFrom(msg.sender, address(this), amount);

            return amount;
        }
    }

    function _subtractGoodwill(
        address token,
        uint256 amount,
        address affiliate,
        bool enableGoodwill
    ) internal returns (uint256 totalGoodwillPortion) {
        bool whitelisted = feeWhitelist[msg.sender];
        if (enableGoodwill && !whitelisted && goodwill > 0) {
            totalGoodwillPortion = (amount * goodwill) / 10000;

            if (affiliates[affiliate]) {
                if (token == address(0)) {
                    token = ETHAddress;
                }

                uint256 affiliatePortion =
                    (totalGoodwillPortion * affiliateSplit) / 100;
                affiliateBalance[affiliate][token] += affiliatePortion;
                totalAffiliateBalance[token] += affiliatePortion;
            }
        }
    }
}

// File contracts/Polygon/QuickSwap/Quickswap_ZapOut_V2.sol

pragma solidity ^0.8.0;

interface IUniswapV2Factory {
    function getPair(address tokenA, address tokenB)
        external
        view
        returns (address pair);
}

interface IUniswapV2Router02 {
    function WETH() external pure returns (address);

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);
}

interface IUniswapV2Pair {
    function token0() external pure returns (address);

    function token1() external pure returns (address);

    function balanceOf(address user) external view returns (uint256);

    function totalSupply() external view returns (uint256);

    function getReserves()
        external
        view
        returns (
            uint112 _reserve0,
            uint112 _reserve1,
            uint32 _blockTimestampLast
        );

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;
}

interface IWETH {
    function withdraw(uint256 wad) external;
}

contract Quickswap_ZapOut_V2 is ZapOutBaseV3 {
    using SafeERC20 for IERC20;

    uint256 private constant deadline =
        0xf000000000000000000000000000000000000000000000000000000000000000;

    uint256 private constant permitAllowance = 79228162514260000000000000000;

    IUniswapV2Router02 private constant quickswapRouter =
        IUniswapV2Router02(0xa5E0829CaCEd8fFDD4De3c43696c57F7D7A678ff);
    IUniswapV2Factory private constant quickswapFactory =
        IUniswapV2Factory(0x5757371414417b8C6CAad45bAeF941aBc7d3Ab32);

    address private constant wmaticTokenAddress =
        address(0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270);

    constructor(uint256 _goodwill, uint256 _affiliateSplit)
        ZapBaseV2(_goodwill, _affiliateSplit)
    {
        // 0x exchange
        approvedTargets[0xDef1C0ded9bec7F1a1670819833240f027b25EfF] = true;
    }

    event zapOut(
        address sender,
        address pool,
        address token,
        uint256 tokensRec
    );

    /**
        @notice Zap out in both tokens
        @param fromPoolAddress Pool from which to remove liquidity
        @param incomingLP Quantity of LP to remove from pool
        @param affiliate Affiliate address
        @return amountA Quantity of tokenA received after zapout
        @return amountB Quantity of tokenB received after zapout
    */
    function ZapOut2PairToken(
        address fromPoolAddress,
        uint256 incomingLP,
        address affiliate
    ) public stopInEmergency returns (uint256 amountA, uint256 amountB) {
        IUniswapV2Pair pair = IUniswapV2Pair(fromPoolAddress);

        require(address(pair) != address(0), "Pool Cannot be Zero Address");

        // get reserves
        address token0 = pair.token0();
        address token1 = pair.token1();

        IERC20(fromPoolAddress).safeTransferFrom(
            msg.sender,
            address(this),
            incomingLP
        );

        _approveToken(fromPoolAddress, address(quickswapRouter), incomingLP);

        if (token0 == wmaticTokenAddress || token1 == wmaticTokenAddress) {
            address _token = token0 == wmaticTokenAddress ? token1 : token0;
            (amountA, amountB) = quickswapRouter.removeLiquidityETH(
                _token,
                incomingLP,
                1,
                1,
                address(this),
                deadline
            );

            // subtract goodwill
            uint256 tokenGoodwill =
                _subtractGoodwill(_token, amountA, affiliate, true);
            uint256 ethGoodwill =
                _subtractGoodwill(ETHAddress, amountB, affiliate, true);

            // send tokens
            IERC20(_token).safeTransfer(msg.sender, amountA - tokenGoodwill);
            Address.sendValue(payable(msg.sender), amountB - ethGoodwill);
        } else {
            (amountA, amountB) = quickswapRouter.removeLiquidity(
                token0,
                token1,
                incomingLP,
                1,
                1,
                address(this),
                deadline
            );

            // subtract goodwill
            uint256 tokenAGoodwill =
                _subtractGoodwill(token0, amountA, affiliate, true);
            uint256 tokenBGoodwill =
                _subtractGoodwill(token1, amountB, affiliate, true);

            // send tokens
            IERC20(token0).safeTransfer(msg.sender, amountA - tokenAGoodwill);
            IERC20(token1).safeTransfer(msg.sender, amountB - tokenBGoodwill);
        }
        emit zapOut(msg.sender, fromPoolAddress, token0, amountA);
        emit zapOut(msg.sender, fromPoolAddress, token1, amountB);
    }

    /**
    @notice Zap out in a single token
    @param toTokenAddress Address of desired token
    @param fromPoolAddress Pool from which to remove liquidity
    @param incomingLP Quantity of LP to remove from pool
    @param minTokensRec Minimum quantity of tokens to receive
    @param swapTargets Execution targets for swaps
    @param swapData DEX swap data
    @param affiliate Affiliate address
    @param shouldSellEntireBalance If True transfers entrire allowable amount from another contract
    */
    function ZapOut(
        address toTokenAddress,
        address fromPoolAddress,
        uint256 incomingLP,
        uint256 minTokensRec,
        address[] memory swapTargets,
        bytes[] memory swapData,
        address affiliate,
        bool shouldSellEntireBalance
    ) public stopInEmergency returns (uint256 tokensRec) {
        (uint256 amount0, uint256 amount1) =
            _removeLiquidity(
                fromPoolAddress,
                incomingLP,
                shouldSellEntireBalance
            );

        //swaps tokens to token
        tokensRec = _swapTokens(
            fromPoolAddress,
            amount0,
            amount1,
            toTokenAddress,
            swapTargets,
            swapData
        );
        require(tokensRec >= minTokensRec, "High Slippage");

        uint256 totalGoodwillPortion;

        // transfer toTokens to sender
        if (toTokenAddress == address(0)) {
            totalGoodwillPortion = _subtractGoodwill(
                ETHAddress,
                tokensRec,
                affiliate,
                true
            );

            payable(msg.sender).transfer(tokensRec - totalGoodwillPortion);
        } else {
            totalGoodwillPortion = _subtractGoodwill(
                toTokenAddress,
                tokensRec,
                affiliate,
                true
            );

            IERC20(toTokenAddress).safeTransfer(
                msg.sender,
                tokensRec - totalGoodwillPortion
            );
        }

        tokensRec = tokensRec - totalGoodwillPortion;

        emit zapOut(msg.sender, fromPoolAddress, toTokenAddress, tokensRec);

        return tokensRec;
    }

    /**
    @notice Zap out in both tokens with permit
    @param fromPoolAddress Pool from which to remove liquidity
    @param incomingLP Quantity of LP to remove from pool
    @param affiliate Affiliate address to share fees
    @param permitSig Signature for permit
    @return amountA Quantity of tokenA received
    @return amountB Quantity of tokenB received
    */
    function ZapOut2PairTokenWithPermit(
        address fromPoolAddress,
        uint256 incomingLP,
        address affiliate,
        bytes calldata permitSig
    ) external stopInEmergency returns (uint256 amountA, uint256 amountB) {
        // permit
        _permit(fromPoolAddress, permitAllowance, permitSig);

        (amountA, amountB) = ZapOut2PairToken(
            fromPoolAddress,
            incomingLP,
            affiliate
        );
    }

    /**
    @notice Zap out in a single token with permit
    @param toTokenAddress Address of desired token
    @param fromPoolAddress Pool from which to remove liquidity
    @param incomingLP Quantity of LP to remove from pool
    @param minTokensRec Minimum quantity of tokens to receive
    @param permitSig Signature for permit
    @param swapTargets Execution targets for swaps
    @param swapData DEX swap data
    @param affiliate Affiliate address
    */
    function ZapOutWithPermit(
        address toTokenAddress,
        address fromPoolAddress,
        uint256 incomingLP,
        uint256 minTokensRec,
        bytes calldata permitSig,
        address[] memory swapTargets,
        bytes[] memory swapData,
        address affiliate
    ) public stopInEmergency returns (uint256) {
        // permit
        _permit(fromPoolAddress, permitAllowance, permitSig);

        return (
            ZapOut(
                toTokenAddress,
                fromPoolAddress,
                incomingLP,
                minTokensRec,
                swapTargets,
                swapData,
                affiliate,
                false
            )
        );
    }

    function _permit(
        address fromPoolAddress,
        uint256 amountIn,
        bytes memory permitSig
    ) internal {
        require(permitSig.length == 65, "Invalid signature length");

        bytes32 r;
        bytes32 s;
        uint8 v;
        assembly {
            r := mload(add(permitSig, 32))
            s := mload(add(permitSig, 64))
            v := byte(0, mload(add(permitSig, 96)))
        }
        IUniswapV2Pair(fromPoolAddress).permit(
            msg.sender,
            address(this),
            amountIn,
            deadline,
            v,
            r,
            s
        );
    }

    function _removeLiquidity(
        address fromPoolAddress,
        uint256 incomingLP,
        bool shouldSellEntireBalance
    ) internal returns (uint256 amount0, uint256 amount1) {
        IUniswapV2Pair pair = IUniswapV2Pair(fromPoolAddress);

        require(address(pair) != address(0), "Pool Cannot be Zero Address");

        address token0 = pair.token0();
        address token1 = pair.token1();

        _pullTokens(fromPoolAddress, incomingLP, shouldSellEntireBalance);

        _approveToken(fromPoolAddress, address(quickswapRouter), incomingLP);

        (amount0, amount1) = quickswapRouter.removeLiquidity(
            token0,
            token1,
            incomingLP,
            1,
            1,
            address(this),
            deadline
        );
        require(amount0 > 0 && amount1 > 0, "Removed Insufficient Liquidity");
    }

    function _swapTokens(
        address fromPoolAddress,
        uint256 amount0,
        uint256 amount1,
        address toToken,
        address[] memory swapTargets,
        bytes[] memory swapData
    ) internal returns (uint256 tokensBought) {
        address token0 = IUniswapV2Pair(fromPoolAddress).token0();
        address token1 = IUniswapV2Pair(fromPoolAddress).token1();

        //swap token0 to toToken
        if (token0 == toToken) {
            tokensBought = tokensBought + amount0;
        } else {
            //swap token using 0x swap
            tokensBought =
                tokensBought +
                _fillQuote(
                    token0,
                    toToken,
                    amount0,
                    swapTargets[0],
                    swapData[0]
                );
        }

        //swap token1 to toToken
        if (token1 == toToken) {
            tokensBought = tokensBought + amount1;
        } else {
            //swap token using 0x swap
            tokensBought =
                tokensBought +
                _fillQuote(
                    token1,
                    toToken,
                    amount1,
                    swapTargets[1],
                    swapData[1]
                );
        }
    }

    function _fillQuote(
        address fromTokenAddress,
        address toToken,
        uint256 amount,
        address swapTarget,
        bytes memory swapData
    ) internal returns (uint256) {
        if (fromTokenAddress == wmaticTokenAddress && toToken == address(0)) {
            IWETH(wmaticTokenAddress).withdraw(amount);
            return amount;
        }

        uint256 valueToSend;
        if (fromTokenAddress == address(0)) {
            valueToSend = amount;
        } else {
            _approveToken(fromTokenAddress, swapTarget, amount);
        }

        uint256 initialBalance = _getBalance(toToken);

        require(approvedTargets[swapTarget], "Target not Authorized");
        (bool success, ) = swapTarget.call{ value: valueToSend }(swapData);
        require(success, "Error Swapping Tokens");

        uint256 finalBalance = _getBalance(toToken) - initialBalance;

        require(finalBalance > 0, "Swapped to Invalid Intermediate");

        return finalBalance;
    }

    /**
        @notice Utility function to determine quantity and addresses of tokens being removed
        @param fromPoolAddress Pool from which to remove liquidity
        @param liquidity Quantity of LP tokens to remove.
        @return amountA Quantity of tokenA removed
        @return amountB Quantity of tokenB removed
        @return token0 Address of the underlying token to be removed
        @return token1 Address of the underlying token to be removed
    */
    function removeLiquidityReturn(address fromPoolAddress, uint256 liquidity)
        external
        view
        returns (
            uint256 amountA,
            uint256 amountB,
            address token0,
            address token1
        )
    {
        IUniswapV2Pair pair = IUniswapV2Pair(fromPoolAddress);
        token0 = pair.token0();
        token1 = pair.token1();

        uint256 balance0 = IERC20(token0).balanceOf(fromPoolAddress);
        uint256 balance1 = IERC20(token1).balanceOf(fromPoolAddress);

        uint256 _totalSupply = pair.totalSupply();

        amountA = (liquidity * balance0) / _totalSupply;
        amountB = (liquidity * balance1) / _totalSupply;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"_goodwill","type":"uint256"},{"internalType":"uint256","name":"_affiliateSplit","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokensRec","type":"uint256"}],"name":"zapOut","type":"event"},{"inputs":[{"internalType":"address","name":"toTokenAddress","type":"address"},{"internalType":"address","name":"fromPoolAddress","type":"address"},{"internalType":"uint256","name":"incomingLP","type":"uint256"},{"internalType":"uint256","name":"minTokensRec","type":"uint256"},{"internalType":"address[]","name":"swapTargets","type":"address[]"},{"internalType":"bytes[]","name":"swapData","type":"bytes[]"},{"internalType":"address","name":"affiliate","type":"address"},{"internalType":"bool","name":"shouldSellEntireBalance","type":"bool"}],"name":"ZapOut","outputs":[{"internalType":"uint256","name":"tokensRec","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"fromPoolAddress","type":"address"},{"internalType":"uint256","name":"incomingLP","type":"uint256"},{"internalType":"address","name":"affiliate","type":"address"}],"name":"ZapOut2PairToken","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"fromPoolAddress","type":"address"},{"internalType":"uint256","name":"incomingLP","type":"uint256"},{"internalType":"address","name":"affiliate","type":"address"},{"internalType":"bytes","name":"permitSig","type":"bytes"}],"name":"ZapOut2PairTokenWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"toTokenAddress","type":"address"},{"internalType":"address","name":"fromPoolAddress","type":"address"},{"internalType":"uint256","name":"incomingLP","type":"uint256"},{"internalType":"uint256","name":"minTokensRec","type":"uint256"},{"internalType":"bytes","name":"permitSig","type":"bytes"},{"internalType":"address[]","name":"swapTargets","type":"address[]"},{"internalType":"bytes[]","name":"swapData","type":"bytes[]"},{"internalType":"address","name":"affiliate","type":"address"}],"name":"ZapOutWithPermit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"affiliateBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"affiliates","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"name":"affilliateWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"approvedTargets","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"feeWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"goodwill","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"fromPoolAddress","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"name":"removeLiquidityReturn","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"bool[]","name":"isApproved","type":"bool[]"}],"name":"setApprovedTargets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_affiliate","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"set_affiliate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"zapAddress","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"set_feeWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_new_affiliateSplit","type":"uint256"}],"name":"set_new_affiliateSplit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_new_goodwill","type":"uint256"}],"name":"set_new_goodwill","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopped","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleContractActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalAffiliateBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526000805460ff60a01b191690553480156200001e57600080fd5b5060405162003271380380620032718339810160408190526200004191620000e0565b600080546001600160a01b03191633908117825560405184928492918291907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600291909155600355505073def1c0ded9bec7f1a1670819833240f027b25eff60005260076020527ff6019cd1944dc466e824190b288e5a63528dd4c9a6d8cbd707956fd30d2f1e0d805460ff1916600117905562000104565b60008060408385031215620000f3578182fd5b505080516020909101519092909150565b61315d80620001146000396000f3fe6080604052600436106101445760003560e01c8063715018a6116100b65780639779d1a61161006f5780639779d1a614610435578063cfd7789c14610465578063d408f6571461049a578063f21d3ab5146104ca578063f2fde38b146104ea578063fbec27bf1461050a57600080fd5b8063715018a61461034857806375f12b211461035d5780637ee992831461037e5780638da5cb5b146103cd57806391027c5b146103f55780639735a6341461041557600080fd5b8063247482ba11610108578063247482ba146102725780633ff428c7146102925780634f51e294146102b2578063550bfa56146102f25780635de0398e146103125780635ecb16cd1461032857600080fd5b806301e980d4146101a55780630dc9de85146101c55780631385d24c146101e55780631781261f146101fa57806318b135e31461024557600080fd5b366101a0573332141561019e5760405162461bcd60e51b815260206004820152601860248201527f446f206e6f742073656e6420455448206469726563746c79000000000000000060448201526064015b60405180910390fd5b005b600080fd5b3480156101b157600080fd5b5061019e6101c0366004612e5e565b61052a565b3480156101d157600080fd5b5061019e6101e0366004612d7d565b6105b4565b3480156101f157600080fd5b5061019e61080f565b34801561020657600080fd5b50610232610215366004612aab565b600560209081526000928352604080842090915290825290205481565b6040519081526020015b60405180910390f35b34801561025157600080fd5b50610232610260366004612a73565b60066020526000908152604090205481565b34801561027e57600080fd5b5061023261028d366004612ae3565b61085a565b34801561029e57600080fd5b5061019e6102ad366004612c73565b6109dc565b3480156102be57600080fd5b506102e26102cd366004612a73565b60046020526000908152604090205460ff1681565b604051901515815260200161023c565b3480156102fe57600080fd5b5061019e61030d366004612e5e565b610a31565b34801561031e57600080fd5b5061023260025481565b34801561033457600080fd5b5061019e610343366004612d7d565b610ab1565b34801561035457600080fd5b5061019e610d22565b34801561036957600080fd5b506000546102e290600160a01b900460ff1681565b34801561038a57600080fd5b5061039e610399366004612ca0565b610d96565b6040805194855260208501939093526001600160a01b039182169284019290925216606082015260800161023c565b3480156103d957600080fd5b506000546040516001600160a01b03909116815260200161023c565b34801561040157600080fd5b50610232610410366004612ba4565b611035565b34801561042157600080fd5b5061019e610430366004612dbd565b6110cc565b34801561044157600080fd5b506102e2610450366004612a73565b60076020526000908152604090205460ff1681565b34801561047157600080fd5b50610485610480366004612d0c565b6111f6565b6040805192835260208301919091520161023c565b3480156104a657600080fd5b506102e26104b5366004612a73565b60016020526000908152604090205460ff1681565b3480156104d657600080fd5b506104856104e5366004612ccb565b611289565b3480156104f657600080fd5b5061019e610505366004612a73565b611742565b34801561051657600080fd5b5061019e610525366004612c73565b61182c565b6000546001600160a01b031633146105545760405162461bcd60e51b815260040161019590612f96565b60648111156105af5760405162461bcd60e51b815260206004820152602160248201527f416666696c696174652053706c69742056616c7565206e6f7420616c6c6f77656044820152601960fa1b6064820152608401610195565b600355565b6000805b8281101561080957336000908152600560205260408120908585848181106105f057634e487b7160e01b600052603260045260246000fd5b90506020020160208101906106059190612a73565b6001600160a01b0316815260208082019290925260409081016000908120543382526005909352908120919350908186868581811061065457634e487b7160e01b600052603260045260246000fd5b90506020020160208101906106699190612a73565b6001600160a01b03166001600160a01b031681526020019081526020016000208190555081600660008686858181106106b257634e487b7160e01b600052603260045260246000fd5b90506020020160208101906106c79190612a73565b6001600160a01b03166001600160a01b03168152602001908152602001600020546106f29190613077565b6006600086868581811061071657634e487b7160e01b600052603260045260246000fd5b905060200201602081019061072b9190612a73565b6001600160a01b0316815260208101919091526040016000205573eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee84848381811061077a57634e487b7160e01b600052603260045260246000fd5b905060200201602081019061078f9190612a73565b6001600160a01b031614156107ad576107a83383611881565b6107f7565b6107f733838686858181106107d257634e487b7160e01b600052603260045260246000fd5b90506020020160208101906107e79190612a73565b6001600160a01b0316919061199a565b80610801816130ba565b9150506105b8565b50505050565b6000546001600160a01b031633146108395760405162461bcd60e51b815260040161019590612f96565b6000805460ff60a01b198116600160a01b9182900460ff1615909102179055565b60008054600160a01b900460ff16156108855760405162461bcd60e51b815260040161019590612f6a565b6000806108938a8a866119fd565b915091506108a58a83838e8b8b611c70565b9250878310156108e75760405162461bcd60e51b815260206004820152600d60248201526c4869676820536c69707061676560981b6044820152606401610195565b60006001600160a01b038c166109565761091873eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee85886001611e84565b9050336108fc6109288387613077565b6040518115909202916000818181858888f19350505050158015610950573d6000803e3d6000fd5b50610984565b6109638c85886001611e84565b9050610984336109738387613077565b6001600160a01b038f16919061199a565b61098e8185613077565b93507ff2d3e32195f8631c70e1d996c9bd5d4a3369d0580786dcd662bf13139310355d338c8e876040516109c59493929190612ecd565b60405180910390a150505098975050505050505050565b6000546001600160a01b03163314610a065760405162461bcd60e51b815260040161019590612f96565b6001600160a01b03919091166000908152600460205260409020805460ff1916911515919091179055565b6000546001600160a01b03163314610a5b5760405162461bcd60e51b815260040161019590612f96565b6064811115610aac5760405162461bcd60e51b815260206004820152601a60248201527f476f6f6457696c6c2056616c7565206e6f7420616c6c6f7765640000000000006044820152606401610195565b600255565b6000546001600160a01b03163314610adb5760405162461bcd60e51b815260040161019590612f96565b60005b81811015610d1d57600073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee848484818110610b1d57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610b329190612a73565b6001600160a01b03161415610bc05760066000858585818110610b6557634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610b7a9190612a73565b6001600160a01b03168152602081019190915260400160002054610b9e9047613077565b9050610bbb610bb56000546001600160a01b031690565b82611881565b610d0a565b60066000858585818110610be457634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610bf99190612a73565b6001600160a01b03166001600160a01b0316815260200190815260200160002054848484818110610c3a57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610c4f9190612a73565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a082319060240160206040518083038186803b158015610c9057600080fd5b505afa158015610ca4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc89190612e76565b610cd29190613077565b9050610d0a610ce96000546001600160a01b031690565b828686868181106107d257634e487b7160e01b600052603260045260246000fd5b5080610d15816130ba565b915050610ade565b505050565b6000546001600160a01b03163314610d4c5760405162461bcd60e51b815260040161019590612f96565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000806000806000869050806001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015610dda57600080fd5b505afa158015610dee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e129190612a8f565b9250806001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610e4d57600080fd5b505afa158015610e61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e859190612a8f565b6040516370a0823160e01b81526001600160a01b0389811660048301529193506000918516906370a082319060240160206040518083038186803b158015610ecc57600080fd5b505afa158015610ee0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f049190612e76565b6040516370a0823160e01b81526001600160a01b038a811660048301529192506000918516906370a082319060240160206040518083038186803b158015610f4b57600080fd5b505afa158015610f5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f839190612e76565b90506000836001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610fc057600080fd5b505afa158015610fd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff89190612e76565b905080611005848b613058565b61100f9190613038565b97508061101c838b613058565b6110269190613038565b96505050505092959194509250565b60008054600160a01b900460ff16156110605760405162461bcd60e51b815260040161019590612f6a565b6110ad896bfffffffffff096fb4da2000088888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611faf92505050565b6110be8a8a8a8a888888600061085a565b9a9950505050505050505050565b6000546001600160a01b031633146110f65760405162461bcd60e51b815260040161019590612f96565b82811461113c5760405162461bcd60e51b8152602060048201526014602482015273092dcecc2d8d2c84092dce0eae840d8cadccee8d60631b6044820152606401610195565b60005b838110156111ef5782828281811061116757634e487b7160e01b600052603260045260246000fd5b905060200201602081019061117c9190612e26565b600760008787858181106111a057634e487b7160e01b600052603260045260246000fd5b90506020020160208101906111b59190612a73565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806111e7816130ba565b91505061113f565b5050505050565b600080548190600160a01b900460ff16156112235760405162461bcd60e51b815260040161019590612f6a565b611270876bfffffffffff096fb4da2000086868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611faf92505050565b61127b878787611289565b909890975095505050505050565b600080548190600160a01b900460ff16156112b65760405162461bcd60e51b815260040161019590612f6a565b846001600160a01b03811661130d5760405162461bcd60e51b815260206004820152601b60248201527f506f6f6c2043616e6e6f74206265205a65726f204164647265737300000000006044820152606401610195565b6000816001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561134857600080fd5b505afa15801561135c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113809190612a8f565b90506000826001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156113bd57600080fd5b505afa1580156113d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f59190612a8f565b905061140c6001600160a01b03891633308a6120a4565b61142b8873a5e0829caced8ffdd4de3c43696c57f7d7a678ff896120dc565b6001600160a01b038216730d500b1d8e8ef31e21c99d1db9a6444d3adf1270148061147257506001600160a01b038116730d500b1d8e8ef31e21c99d1db9a6444d3adf1270145b156115cd5760006001600160a01b038316730d500b1d8e8ef31e21c99d1db9a6444d3adf1270146114a357826114a5565b815b604051629d473b60e21b81526001600160a01b0382166004820152602481018a90526001604482018190526064820152306084820152600f60fc1b60a482015290915073a5e0829caced8ffdd4de3c43696c57f7d7a678ff906302751cec9060c4016040805180830381600087803b15801561152057600080fd5b505af1158015611534573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115589190612e8e565b9096509450600061156c82888a6001611e84565b9050600061159173eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee888b6001611e84565b90506115b2336115a1848b613077565b6001600160a01b038616919061199a565b6115c5336115c0838a613077565b611881565b5050506116bd565b604051635d5155ef60e11b815273a5e0829caced8ffdd4de3c43696c57f7d7a678ff9063baa2abde9061161590859085908c9060019081903090600f60fc1b90600401612ef7565b6040805180830381600087803b15801561162e57600080fd5b505af1158015611642573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116669190612e8e565b9095509350600061167a8387896001611e84565b9050600061168b83878a6001611e84565b90506116ac3361169b848a613077565b6001600160a01b038716919061199a565b6116ba336115a18389613077565b50505b7ff2d3e32195f8631c70e1d996c9bd5d4a3369d0580786dcd662bf13139310355d338984886040516116f29493929190612ecd565b60405180910390a17ff2d3e32195f8631c70e1d996c9bd5d4a3369d0580786dcd662bf13139310355d3389838760405161172f9493929190612ecd565b60405180910390a1505050935093915050565b6000546001600160a01b0316331461176c5760405162461bcd60e51b815260040161019590612f96565b6001600160a01b0381166117d15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610195565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146118565760405162461bcd60e51b815260040161019590612f96565b6001600160a01b03919091166000908152600160205260409020805460ff1916911515919091179055565b804710156118d15760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610195565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461191e576040519150601f19603f3d011682016040523d82523d6000602084013e611923565b606091505b5050905080610d1d5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610195565b6040516001600160a01b038316602482015260448101829052610d1d90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612105565b600080846001600160a01b038116611a575760405162461bcd60e51b815260206004820152601b60248201527f506f6f6c2043616e6e6f74206265205a65726f204164647265737300000000006044820152606401610195565b6000816001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015611a9257600080fd5b505afa158015611aa6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aca9190612a8f565b90506000826001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015611b0757600080fd5b505afa158015611b1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b3f9190612a8f565b9050611b4c8888886121d7565b50611b6c8873a5e0829caced8ffdd4de3c43696c57f7d7a678ff896120dc565b604051635d5155ef60e11b815273a5e0829caced8ffdd4de3c43696c57f7d7a678ff9063baa2abde90611bb490859085908c9060019081903090600f60fc1b90600401612ef7565b6040805180830381600087803b158015611bcd57600080fd5b505af1158015611be1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c059190612e8e565b90955093508415801590611c195750600084115b611c655760405162461bcd60e51b815260206004820152601e60248201527f52656d6f76656420496e73756666696369656e74204c697175696469747900006044820152606401610195565b505050935093915050565b600080876001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015611cac57600080fd5b505afa158015611cc0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ce49190612a8f565b90506000886001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015611d2157600080fd5b505afa158015611d35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d599190612a8f565b9050856001600160a01b0316826001600160a01b03161415611d8657611d7f8884613020565b9250611df0565b611de382878a88600081518110611dad57634e487b7160e01b600052603260045260246000fd5b602002602001015188600081518110611dd657634e487b7160e01b600052603260045260246000fd5b60200260200101516122ff565b611ded9084613020565b92505b856001600160a01b0316816001600160a01b03161415611e1b57611e148784613020565b9250611e78565b611e6b81878988600181518110611e4257634e487b7160e01b600052603260045260246000fd5b602002602001015188600181518110611dd657634e487b7160e01b600052603260045260246000fd5b611e759084613020565b92505b50509695505050505050565b3360009081526001602052604081205460ff16828015611ea2575080155b8015611eb057506000600254115b15611fa65761271060025486611ec69190613058565b611ed09190613038565b6001600160a01b03851660009081526004602052604090205490925060ff1615611fa6576001600160a01b038616611f1a5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee95505b6000606460035484611f2c9190613058565b611f369190613038565b6001600160a01b038087166000908152600560209081526040808320938c16835292905290812080549293508392909190611f72908490613020565b90915550506001600160a01b03871660009081526006602052604081208054839290611f9f908490613020565b9091555050505b50949350505050565b80516041146120005760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964207369676e6174757265206c656e67746800000000000000006044820152606401610195565b60208101516040808301516060840151915163d505accf60e01b815233600482015230602482015260448101869052600f60fc1b606482015260009290921a6084830181905260a4830184905260c4830182905290916001600160a01b0387169063d505accf9060e401600060405180830381600087803b15801561208457600080fd5b505af1158015612098573d6000803e3d6000fd5b50505050505050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526108099085906323b872dd60e01b906084016119c6565b6120f16001600160a01b038416836000612553565b610d1d6001600160a01b0384168383612553565b600061215a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166126779092919063ffffffff16565b805190915015610d1d57808060200190518101906121789190612e42565b610d1d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610195565b600081156122e057333b6122425760405162461bcd60e51b815260206004820152602c60248201527f4552523a2073686f756c6453656c6c456e7469726542616c616e63652069732060448201526b7472756520666f7220454f4160a01b6064820152608401610195565b604051636eb1769f60e11b81523360048201523060248201526000906001600160a01b0386169063dd62ed3e9060440160206040518083038186803b15801561228a57600080fd5b505afa15801561229e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122c29190612e76565b90506122d96001600160a01b0386163330846120a4565b90506122f8565b6122f56001600160a01b0385163330866120a4565b50815b9392505050565b60006001600160a01b038616730d500b1d8e8ef31e21c99d1db9a6444d3adf127014801561233457506001600160a01b038516155b156123a657604051632e1a7d4d60e01b815260048101859052730d500b1d8e8ef31e21c99d1db9a6444d3adf127090632e1a7d4d90602401600060405180830381600087803b15801561238657600080fd5b505af115801561239a573d6000803e3d6000fd5b5050505083905061254a565b60006001600160a01b0387166123bd5750836123c8565b6123c88785876120dc565b60006123d38761268e565b6001600160a01b03861660009081526007602052604090205490915060ff166124365760405162461bcd60e51b815260206004820152601560248201527415185c99d95d081b9bdd08105d5d1a1bdc9a5e9959605a1b6044820152606401610195565b6000856001600160a01b031683866040516124519190612eb1565b60006040518083038185875af1925050503d806000811461248e576040519150601f19603f3d011682016040523d82523d6000602084013e612493565b606091505b50509050806124dc5760405162461bcd60e51b81526020600482015260156024820152744572726f72205377617070696e6720546f6b656e7360581b6044820152606401610195565b6000826124e88a61268e565b6124f29190613077565b9050600081116125445760405162461bcd60e51b815260206004820152601f60248201527f5377617070656420746f20496e76616c696420496e7465726d656469617465006044820152606401610195565b93505050505b95945050505050565b8015806125dc5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b1580156125a257600080fd5b505afa1580156125b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125da9190612e76565b155b6126475760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610195565b6040516001600160a01b038316602482015260448101829052610d1d90849063095ea7b360e01b906064016119c6565b60606126868484600085612724565b949350505050565b60006001600160a01b0382166126a5575047919050565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a082319060240160206040518083038186803b1580156126e457600080fd5b505afa1580156126f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061271c9190612e76565b90505b919050565b6060824710156127855760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610195565b843b6127d35760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610195565b600080866001600160a01b031685876040516127ef9190612eb1565b60006040518083038185875af1925050503d806000811461282c576040519150601f19603f3d011682016040523d82523d6000602084013e612831565b606091505b509150915061284182828661284c565b979650505050505050565b6060831561285b5750816122f8565b82511561286b5782518084602001fd5b8160405162461bcd60e51b81526004016101959190612f37565b803561271f81613101565b60008083601f8401126128a1578182fd5b50813567ffffffffffffffff8111156128b8578182fd5b6020830191508360208260051b85010111156128d357600080fd5b9250929050565b600082601f8301126128ea578081fd5b813560206128ff6128fa83612ffc565b612fcb565b80838252828201915082860187848660051b890101111561291e578586fd5b855b8581101561294557813561293381613101565b84529284019290840190600101612920565b5090979650505050505050565b6000601f8381840112612963578182fd5b823560206129736128fa83612ffc565b80838252828201915082870188848660051b8a01011115612992578687fd5b865b85811015612a2557813567ffffffffffffffff808211156129b357898afd5b818b0191508b603f8301126129c657898afd5b868201356040828211156129dc576129dc6130eb565b6129ed828c01601f19168a01612fcb565b92508183528d81838601011115612a02578b8cfd5b818185018a85013750810187018a90528552509284019290840190600101612994565b509098975050505050505050565b60008083601f840112612a44578182fd5b50813567ffffffffffffffff811115612a5b578182fd5b6020830191508360208285010111156128d357600080fd5b600060208284031215612a84578081fd5b81356122f881613101565b600060208284031215612aa0578081fd5b81516122f881613101565b60008060408385031215612abd578081fd5b8235612ac881613101565b91506020830135612ad881613101565b809150509250929050565b600080600080600080600080610100898b031215612aff578384fd5b8835612b0a81613101565b97506020890135612b1a81613101565b96506040890135955060608901359450608089013567ffffffffffffffff80821115612b44578586fd5b612b508c838d016128da565b955060a08b0135915080821115612b65578485fd5b50612b728b828c01612952565b93505060c0890135612b8381613101565b915060e0890135612b9381613119565b809150509295985092959890939650565b60008060008060008060008060006101008a8c031215612bc2578081fd5b612bcb8a612885565b9850612bd960208b01612885565b975060408a0135965060608a0135955060808a013567ffffffffffffffff80821115612c03578283fd5b612c0f8d838e01612a33565b909750955060a08c0135915080821115612c27578283fd5b612c338d838e016128da565b945060c08c0135915080821115612c48578283fd5b50612c558c828d01612952565b925050612c6460e08b01612885565b90509295985092959850929598565b60008060408385031215612c85578182fd5b8235612c9081613101565b91506020830135612ad881613119565b60008060408385031215612cb2578182fd5b8235612cbd81613101565b946020939093013593505050565b600080600060608486031215612cdf578081fd5b8335612cea81613101565b9250602084013591506040840135612d0181613101565b809150509250925092565b600080600080600060808688031215612d23578283fd5b8535612d2e81613101565b9450602086013593506040860135612d4581613101565b9250606086013567ffffffffffffffff811115612d60578182fd5b612d6c88828901612a33565b969995985093965092949392505050565b60008060208385031215612d8f578182fd5b823567ffffffffffffffff811115612da5578283fd5b612db185828601612890565b90969095509350505050565b60008060008060408587031215612dd2578182fd5b843567ffffffffffffffff80821115612de9578384fd5b612df588838901612890565b90965094506020870135915080821115612e0d578384fd5b50612e1a87828801612890565b95989497509550505050565b600060208284031215612e37578081fd5b81356122f881613119565b600060208284031215612e53578081fd5b81516122f881613119565b600060208284031215612e6f578081fd5b5035919050565b600060208284031215612e87578081fd5b5051919050565b60008060408385031215612ea0578182fd5b505080516020909101519092909150565b60008251612ec381846020870161308e565b9190910192915050565b6001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b6001600160a01b039788168152958716602087015260408601949094526060850192909252608084015290921660a082015260c081019190915260e00190565b6020815260008251806020840152612f5681604085016020870161308e565b601f01601f19169190910160400192915050565b60208082526012908201527115195b5c1bdc985c9a5b1e4814185d5cd95960721b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b604051601f8201601f1916810167ffffffffffffffff81118282101715612ff457612ff46130eb565b604052919050565b600067ffffffffffffffff821115613016576130166130eb565b5060051b60200190565b60008219821115613033576130336130d5565b500190565b60008261305357634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615613072576130726130d5565b500290565b600082821015613089576130896130d5565b500390565b60005b838110156130a9578181015183820152602001613091565b838111156108095750506000910152565b60006000198214156130ce576130ce6130d5565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461311657600080fd5b50565b801515811461311657600080fdfea26469706673582212208d90f02172c42d198ceecca0b296b3c3bcf93a1e8fa039763c1ca1c35e69d66764736f6c6343000804003300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _goodwill (uint256): 0
Arg [1] : _affiliateSplit (uint256): 0

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed ByteCode Sourcemap

29953:13223:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26194:10;26208:9;26194:23;;26186:60;;;;-1:-1:-1;;;26186:60:0;;16306:2:1;26186:60:0;;;16288:21:1;16345:2;16325:18;;;16318:30;16384:26;16364:18;;;16357:54;16428:18;;26186:60:0;;;;;;;;;29953:13223;;;;;23964:278;;;;;;;;;;-1:-1:-1;23964:278:0;;;;;:::i;:::-;;:::i;25154:636::-;;;;;;;;;;-1:-1:-1;25154:636:0;;;;;:::i;:::-;;:::i;23463:86::-;;;;;;;;;;;;;:::i;21936:71::-;;;;;;;;;;-1:-1:-1;21936:71:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;23741:25:1;;;23729:2;23714:18;21936:71:0;;;;;;;;22038:56;;;;;;;;;;-1:-1:-1;22038:56:0;;;;;:::i;:::-;;;;;;;;;;;;;;34239:1749;;;;;;;;;;-1:-1:-1;34239:1749:0;;;;;:::i;:::-;;:::i;24250:150::-;;;;;;;;;;-1:-1:-1;24250:150:0;;;;;:::i;:::-;;:::i;21850:42::-;;;;;;;;;;-1:-1:-1;21850:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15339:14:1;;15332:22;15314:41;;15302:2;15287:18;21850:42:0;15269:92:1;23718:238:0;;;;;;;;;;-1:-1:-1;23718:238:0;;;;;:::i;:::-;;:::i;21725:23::-;;;;;;;;;;;;;;;;24476:602;;;;;;;;;;-1:-1:-1;24476:602:0;;;;;:::i;:::-;;:::i;4707:148::-;;;;;;;;;;;;;:::i;21594:27::-;;;;;;;;;;-1:-1:-1;21594:27:0;;;;-1:-1:-1;;;21594:27:0;;;;;;42460:713;;;;;;;;;;-1:-1:-1;42460:713:0;;;;;:::i;:::-;;:::i;:::-;;;;24261:25:1;;;24317:2;24302:18;;24295:34;;;;-1:-1:-1;;;;;24403:15:1;;;24383:18;;;24376:43;;;;24455:15;24450:2;24435:18;;24428:43;24248:3;24233:19;42460:713:0;24215:262:1;4056:87:0;;;;;;;;;;-1:-1:-1;4102:7:0;4129:6;4056:87;;-1:-1:-1;;;;;4129:6:0;;;11703:51:1;;11691:2;11676:18;4056:87:0;11658:102:1;37328:730:0;;;;;;;;;;-1:-1:-1;37328:730:0;;;;;:::i;:::-;;:::i;25798:342::-;;;;;;;;;;-1:-1:-1;25798:342:0;;;;;:::i;:::-;;:::i;22139:47::-;;;;;;;;;;-1:-1:-1;22139:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;36378:467;;;;;;;;;;-1:-1:-1;36378:467:0;;;;;:::i;:::-;;:::i;:::-;;;;23951:25:1;;;24007:2;23992:18;;23985:34;;;;23924:18;36378:467:0;23906:119:1;21672:44:0;;;;;;;;;;-1:-1:-1;21672:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;31337:2373;;;;;;;;;;-1:-1:-1;31337:2373:0;;;;;:::i;:::-;;:::i;5010:281::-;;;;;;;;;;-1:-1:-1;5010:281:0;;;;;:::i;:::-;;:::i;23557:153::-;;;;;;;;;;-1:-1:-1;23557:153:0;;;;;:::i;:::-;;:::i;23964:278::-;4102:7;4129:6;-1:-1:-1;;;;;4129:6:0;2678:10;4276:23;4268:68;;;;-1:-1:-1;;;4268:68:0;;;;;;;:::i;:::-;24123:3:::1;24100:19;:26;;24078:109;;;::::0;-1:-1:-1;;;24078:109:0;;20357:2:1;24078:109:0::1;::::0;::::1;20339:21:1::0;20396:2;20376:18;;;20369:30;20435:34;20415:18;;;20408:62;-1:-1:-1;;;20486:18:1;;;20479:31;20527:19;;24078:109:0::1;20329:223:1::0;24078:109:0::1;24198:14;:36:::0;23964:278::o;25154:636::-;25229:16;;25256:527;25276:17;;;25256:527;;;25343:10;25326:28;;;;:16;:28;;;;;;25355:6;;25362:1;25355:9;;;;;-1:-1:-1;;;25355:9:0;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;25326:39:0;;;;;;;;;;;;;;;-1:-1:-1;25326:39:0;;;;25397:10;25380:28;;:16;:28;;;;;;25326:39;;-1:-1:-1;;;25409:6:0;;25416:1;25409:9;;;;;-1:-1:-1;;;25409:9:0;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;25380:39:0;-1:-1:-1;;;;;25380:39:0;;;;;;;;;;;;:43;;;;25542:8;25490:21;:32;25512:6;;25519:1;25512:9;;;;;-1:-1:-1;;;25512:9:0;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;25490:32:0;-1:-1:-1;;;;;25490:32:0;;;;;;;;;;;;;:60;;;;:::i;:::-;25438:21;:32;25460:6;;25467:1;25460:9;;;;;-1:-1:-1;;;25460:9:0;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;25438:32:0;;;;;;;;;;;;-1:-1:-1;25438:32:0;:112;22243:42;25571:6;;25578:1;25571:9;;;;;-1:-1:-1;;;25571:9:0;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;25571:23:0;;25567:205;;;25615:48;25641:10;25654:8;25615:17;:48::i;:::-;25567:205;;;25704:52;25735:10;25747:8;25711:6;;25718:1;25711:9;;;;;-1:-1:-1;;;25711:9:0;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;25704:30:0;;:52;:30;:52::i;:::-;25295:3;;;;:::i;:::-;;;;25256:527;;;;25154:636;;;:::o;23463:86::-;4102:7;4129:6;-1:-1:-1;;;;;4129:6:0;2678:10;4276:23;4268:68;;;;-1:-1:-1;;;4268:68:0;;;;;;;:::i;:::-;23534:7:::1;::::0;;-1:-1:-1;;;;23523:18:0;::::1;-1:-1:-1::0;;;23534:7:0;;;::::1;;;23533:8;23523:18:::0;;::::1;;::::0;;23463:86::o;34239:1749::-;34561:17;22514:7;;-1:-1:-1;;;22514:7:0;;;;22510:102;;;22538:28;;-1:-1:-1;;;22538:28:0;;;;;;;:::i;22510:102::-;34592:15:::1;34609::::0;34641:136:::1;34676:15;34710:10;34739:23;34641:16;:136::i;:::-;34591:186;;;;34835:174;34861:15;34891:7;34913;34935:14;34964:11;34990:8;34835:11;:174::i;:::-;34823:186;;35041:12;35028:9;:25;;35020:51;;;::::0;-1:-1:-1;;;35020:51:0;;16659:2:1;35020:51:0::1;::::0;::::1;16641:21:1::0;16698:2;16678:18;;;16671:30;-1:-1:-1;;;16717:18:1;;;16710:43;16770:18;;35020:51:0::1;16631:163:1::0;35020:51:0::1;35084:28;-1:-1:-1::0;;;;;35169:28:0;::::1;35165:650;;35237:140;22243:42;35302:9;35330;35358:4;35237:17;:140::i;:::-;35214:163:::0;-1:-1:-1;35402:10:0::1;35394:62;35423:32;35214:163:::0;35423:9;:32:::1;:::i;:::-;35394:62;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;35165:650;;;35512:144;35548:14;35581:9;35609;35637:4;35512:17;:144::i;:::-;35489:167:::0;-1:-1:-1;35673:130:0::1;35727:10;35756:32;35489:167:::0;35756:9;:32:::1;:::i;:::-;-1:-1:-1::0;;;;;35673:35:0;::::1;::::0;:130;:35:::1;:130::i;:::-;35839:32;35851:20:::0;35839:9;:32:::1;:::i;:::-;35827:44;;35889:62;35896:10;35908:15;35925:14;35941:9;35889:62;;;;;;;;;:::i;:::-;;;;;;;;35964:16;;;34239:1749:::0;;;;;;;;;;:::o;24250:150::-;4102:7;4129:6;-1:-1:-1;;;;;4129:6:0;2678:10;4276:23;4268:68;;;;-1:-1:-1;;;4268:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24360:22:0;;;::::1;;::::0;;;:10:::1;:22;::::0;;;;:32;;-1:-1:-1;;24360:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;24250:150::o;23718:238::-;4102:7;4129:6;-1:-1:-1;;;;;4129:6:0;2678:10;4276:23;4268:68;;;;-1:-1:-1;;;4268:68:0;;;;;;;:::i;:::-;23856:3:::1;23839:13;:20;;23795:118;;;::::0;-1:-1:-1;;;23795:118:0;;19297:2:1;23795:118:0::1;::::0;::::1;19279:21:1::0;19336:2;19316:18;;;19309:30;19375:28;19355:18;;;19348:56;19421:18;;23795:118:0::1;19269:176:1::0;23795:118:0::1;23924:8;:24:::0;23718:238::o;24476:602::-;4102:7;4129:6;-1:-1:-1;;;;;4129:6:0;2678:10;4276:23;4268:68;;;;-1:-1:-1;;;4268:68:0;;;;;;;:::i;:::-;24562:9:::1;24557:514;24577:17:::0;;::::1;24557:514;;;24616:11;22243:42;24648:6:::0;;24655:1;24648:9;;::::1;;;-1:-1:-1::0;;;24648:9:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;24648:23:0::1;;24644:416;;;24722:21;:32;24744:6;;24751:1;24744:9;;;;;-1:-1:-1::0;;;24744:9:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;24722:32:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;24722:32:0;;24698:56:::1;::::0;:21:::1;:56;:::i;:::-;24692:62;;24775:40;24801:7;4102::::0;4129:6;-1:-1:-1;;;;;4129:6:0;;4056:87;24801:7:::1;24811:3;24775:17;:40::i;:::-;24644:416;;;24949:21;:32;24971:6;;24978:1;24971:9;;;;;-1:-1:-1::0;;;24971:9:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;24949:32:0::1;-1:-1:-1::0;;;;;24949:32:0::1;;;;;;;;;;;;;24890:6;;24897:1;24890:9;;;;;-1:-1:-1::0;;;24890:9:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24883:42;::::0;-1:-1:-1;;;24883:42:0;;24919:4:::1;24883:42;::::0;::::1;11703:51:1::0;-1:-1:-1;;;;;24883:27:0;;;::::1;::::0;::::1;::::0;11676:18:1;;24883:42:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:98;;;;:::i;:::-;24856:125;;25000:44;25031:7;4102::::0;4129:6;-1:-1:-1;;;;;4129:6:0;;4056:87;25031:7:::1;25040:3;25007:6;;25014:1;25007:9;;;;;-1:-1:-1::0;;;25007:9:0::1;;;;;;;;25000:44;-1:-1:-1::0;24596:3:0;::::1;::::0;::::1;:::i;:::-;;;;24557:514;;;;24476:602:::0;;:::o;4707:148::-;4102:7;4129:6;-1:-1:-1;;;;;4129:6:0;2678:10;4276:23;4268:68;;;;-1:-1:-1;;;4268:68:0;;;;;;;:::i;:::-;4814:1:::1;4798:6:::0;;4777:40:::1;::::0;-1:-1:-1;;;;;4798:6:0;;::::1;::::0;4777:40:::1;::::0;4814:1;;4777:40:::1;4845:1;4828:19:::0;;-1:-1:-1;;;;;;4828:19:0::1;::::0;;4707:148::o;42460:713::-;42599:15;42629;42659:14;42688;42730:19;42767:15;42730:53;;42803:4;-1:-1:-1;;;;;42803:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42794:22;;42836:4;-1:-1:-1;;;;;42836:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42881:41;;-1:-1:-1;;;42881:41:0;;-1:-1:-1;;;;;11721:32:1;;;42881:41:0;;;11703:51:1;42827:22:0;;-1:-1:-1;42862:16:0;;42881:24;;;;;11676:18:1;;42881:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42952;;-1:-1:-1;;;42952:41:0;;-1:-1:-1;;;;;11721:32:1;;;42952:41:0;;;11703:51:1;42862:60:0;;-1:-1:-1;42933:16:0;;42952:24;;;;;11676:18:1;;42952:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42933:60;;43006:20;43029:4;-1:-1:-1;;;;;43029:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43006:41;-1:-1:-1;43006:41:0;43071:20;43083:8;43071:9;:20;:::i;:::-;43070:37;;;;:::i;:::-;43060:47;-1:-1:-1;43153:12:0;43129:20;43141:8;43129:9;:20;:::i;:::-;43128:37;;;;:::i;:::-;43118:47;;42460:713;;;;;;;;;;;:::o;37328:730::-;37656:7;22514;;-1:-1:-1;;;22514:7:0;;;;22510:102;;;22538:28;;-1:-1:-1;;;22538:28:0;;;;;;;:::i;22510:102::-;37695:52:::1;37703:15;30203:29;37737:9;;37695:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;37695:7:0::1;::::0;-1:-1:-1;;;37695:52:0:i:1;:::-;37782:257;37807:14;37840:15;37874:10;37903:12;37934:11;37964:8;37991:9;38019:5;37782:6;:257::i;:::-;37760:290:::0;37328:730;-1:-1:-1;;;;;;;;;;37328:730:0:o;25798:342::-;4102:7;4129:6;-1:-1:-1;;;;;4129:6:0;2678:10;4276:23;4268:68;;;;-1:-1:-1;;;4268:68:0;;;;;;;:::i;:::-;25945:35;;::::1;25937:68;;;::::0;-1:-1:-1;;;25937:68:0;;20008:2:1;25937:68:0::1;::::0;::::1;19990:21:1::0;20047:2;20027:18;;;20020:30;-1:-1:-1;;;20066:18:1;;;20059:50;20126:18;;25937:68:0::1;19980:170:1::0;25937:68:0::1;26023:9;26018:115;26038:18:::0;;::::1;26018:115;;;26108:10;;26119:1;26108:13;;;;;-1:-1:-1::0;;;26108:13:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26078:15;:27;26094:7;;26102:1;26094:10;;;;;-1:-1:-1::0;;;26094:10:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;26078:27:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;26078:27:0;:43;;-1:-1:-1;;26078:43:0::1;::::0;::::1;;::::0;;;::::1;::::0;;26058:3;::::1;::::0;::::1;:::i;:::-;;;;26018:115;;;;25798:342:::0;;;;:::o;36378:467::-;36581:15;22514:7;;36581:15;;-1:-1:-1;;;22514:7:0;;;;22510:102;;;22538:28;;-1:-1:-1;;;22538:28:0;;;;;;;:::i;22510:102::-;36645:52:::1;36653:15;30203:29;36687:9;;36645:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;36645:7:0::1;::::0;-1:-1:-1;;;36645:52:0:i:1;:::-;36731:106;36762:15;36792:10;36817:9;36731:16;:106::i;:::-;36710:127:::0;;;;-1:-1:-1;36378:467:0;-1:-1:-1;;;;;;36378:467:0:o;31337:2373::-;31493:15;22514:7;;31493:15;;-1:-1:-1;;;22514:7:0;;;;22510:102;;;22538:28;;-1:-1:-1;;;22538:28:0;;;;;;;:::i;22510:102::-;31575:15;-1:-1:-1;;;;;31612:27:0;::::1;31604:67;;;::::0;-1:-1:-1;;;31604:67:0;;19652:2:1;31604:67:0::1;::::0;::::1;19634:21:1::0;19691:2;19671:18;;;19664:30;19730:29;19710:18;;;19703:57;19777:18;;31604:67:0::1;19624:177:1::0;31604:67:0::1;31709:14;31726:4;-1:-1:-1::0;;;;;31726:11:0::1;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31709:30;;31750:14;31767:4;-1:-1:-1::0;;;;;31767:11:0::1;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31750:30:::0;-1:-1:-1;31793:129:0::1;-1:-1:-1::0;;;;;31793:40:0;::::1;31848:10;31881:4;31901:10:::0;31793:40:::1;:129::i;:::-;31935:68;31949:15;30323:42;31992:10;31935:13;:68::i;:::-;-1:-1:-1::0;;;;;32020:28:0;::::1;30569:42;32020:28;::::0;:60:::1;;-1:-1:-1::0;;;;;;32052:28:0;::::1;30569:42;32052:28;32020:60;32016:1551;;;32097:14;-1:-1:-1::0;;;;;32114:28:0;::::1;30569:42;32114:28;:46;;32154:6;32114:46;;;32145:6;32114:46;32196:202;::::0;-1:-1:-1;;;32196:202:0;;-1:-1:-1;;;;;14921:15:1;;32196:202:0::1;::::0;::::1;14903:34:1::0;14953:18;;;14946:34;;;32303:1:0::1;14996:18:1::0;;;14989:34;;;15039:18;;;15032:34;32351:4:0::1;15082:19:1::0;;;15075:44;-1:-1:-1;;;15135:19:1;;;15128:35;32097:63:0;;-1:-1:-1;30323:42:0::1;::::0;32196:34:::1;::::0;14837:19:1;;32196:202:0::1;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32175:223:::0;;-1:-1:-1;32175:223:0;-1:-1:-1;32449:21:0::1;32490:51;32508:6:::0;32175:223;32525:9;32536:4:::1;32490:17;:51::i;:::-;32449:92;;32556:19;32595:55;22243:42;32625:7;32634:9;32645:4;32595:17;:55::i;:::-;32556:94:::0;-1:-1:-1;32695:64:0::1;32723:10;32735:23;32745:13:::0;32735:7;:23:::1;:::i;:::-;-1:-1:-1::0;;;;;32695:27:0;::::1;::::0;:64;:27:::1;:64::i;:::-;32774:61;32800:10;32813:21;32823:11:::0;32813:7;:21:::1;:::i;:::-;32774:17;:61::i;:::-;32016:1551;;;;;;32889:224;::::0;-1:-1:-1;;;32889:224:0;;30323:42:::1;::::0;32889:31:::1;::::0;:224:::1;::::0;32939:6;;32964;;32989:10;;33018:1:::1;::::0;;;33066:4:::1;::::0;-1:-1:-1;;;30085:66:0;32889:224:::1;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32868:245:::0;;-1:-1:-1;32868:245:0;-1:-1:-1;33164:22:0::1;33206:51;33224:6:::0;32868:245;33241:9;33252:4:::1;33206:17;:51::i;:::-;33164:93;;33272:22;33314:51;33332:6;33340:7;33349:9;33360:4;33314:17;:51::i;:::-;33272:93:::0;-1:-1:-1;33410:65:0::1;33438:10;33450:24;33460:14:::0;33450:7;:24:::1;:::i;:::-;-1:-1:-1::0;;;;;33410:27:0;::::1;::::0;:65;:27:::1;:65::i;:::-;33490;33518:10;33530:24;33540:14:::0;33530:7;:24:::1;:::i;33490:65::-;32016:1551;;;33582:52;33589:10;33601:15;33618:6;33626:7;33582:52;;;;;;;;;:::i;:::-;;;;;;;;33650;33657:10;33669:15;33686:6;33694:7;33650:52;;;;;;;;;:::i;:::-;;;;;;;;22599:1;;;31337:2373:::0;;;;;;:::o;5010:281::-;4102:7;4129:6;-1:-1:-1;;;;;4129:6:0;2678:10;4276:23;4268:68;;;;-1:-1:-1;;;4268:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5113:22:0;::::1;5091:110;;;::::0;-1:-1:-1;;;5091:110:0;;17001:2:1;5091:110:0::1;::::0;::::1;16983:21:1::0;17040:2;17020:18;;;17013:30;17079:34;17059:18;;;17052:62;-1:-1:-1;;;17130:18:1;;;17123:36;17176:19;;5091:110:0::1;16973:228:1::0;5091:110:0::1;5238:6;::::0;;5217:38:::1;::::0;-1:-1:-1;;;;;5217:38:0;;::::1;::::0;5238:6;::::1;::::0;5217:38:::1;::::0;::::1;5266:6;:17:::0;;-1:-1:-1;;;;;;5266:17:0::1;-1:-1:-1::0;;;;;5266:17:0;;;::::1;::::0;;;::::1;::::0;;5010:281::o;23557:153::-;4102:7;4129:6;-1:-1:-1;;;;;4129:6:0;2678:10;4276:23;4268:68;;;;-1:-1:-1;;;4268:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23669:24:0;;;::::1;;::::0;;;:12:::1;:24;::::0;;;;:33;;-1:-1:-1;;23669:33:0::1;::::0;::::1;;::::0;;;::::1;::::0;;23557:153::o;10343:471::-;10472:6;10447:21;:31;;10425:110;;;;-1:-1:-1;;;10425:110:0;;18532:2:1;10425:110:0;;;18514:21:1;18571:2;18551:18;;;18544:30;18610:31;18590:18;;;18583:59;18659:18;;10425:110:0;18504:179:1;10425:110:0;10627:12;10645:9;-1:-1:-1;;;;;10645:14:0;10668:6;10645:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10626:54;;;10713:7;10691:115;;;;-1:-1:-1;;;10691:115:0;;17758:2:1;10691:115:0;;;17740:21:1;17797:2;17777:18;;;17770:30;17836:34;17816:18;;;17809:62;17907:28;17887:18;;;17880:56;17953:19;;10691:115:0;17730:248:1;17534::0;17705:58;;-1:-1:-1;;;;;14475:32:1;;17705:58:0;;;14457:51:1;14524:18;;;14517:34;;;17651:123:0;;17685:5;;-1:-1:-1;;;17728:23:0;14430:18:1;;17705:58:0;;;;-1:-1:-1;;17705:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;17705:58:0;-1:-1:-1;;;;;;17705:58:0;;;;;;;;;;17651:19;:123::i;38718:888::-;38871:15;;38953;-1:-1:-1;;;;;38990:27:0;;38982:67;;;;-1:-1:-1;;;38982:67:0;;19652:2:1;38982:67:0;;;19634:21:1;19691:2;19671:18;;;19664:30;19730:29;19710:18;;;19703:57;19777:18;;38982:67:0;19624:177:1;38982:67:0;39062:14;39079:4;-1:-1:-1;;;;;39079:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39062:30;;39103:14;39120:4;-1:-1:-1;;;;;39120:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39103:30;;39146:65;39158:15;39175:10;39187:23;39146:11;:65::i;:::-;;39224:68;39238:15;30323:42;39281:10;39224:13;:68::i;:::-;39326:192;;-1:-1:-1;;;39326:192:0;;30323:42;;39326:31;;:192;;39372:6;;39393;;39414:10;;39439:1;;;;39479:4;;-1:-1:-1;;;30085:66:0;39326:192;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39305:213;;-1:-1:-1;39305:213:0;-1:-1:-1;39537:11:0;;;;;:26;;;39562:1;39552:7;:11;39537:26;39529:69;;;;-1:-1:-1;;;39529:69:0;;22604:2:1;39529:69:0;;;22586:21:1;22643:2;22623:18;;;22616:30;22682:32;22662:18;;;22655:60;22732:18;;39529:69:0;22576:180:1;39529:69:0;38718:888;;;;;;;;;:::o;39614:1315::-;39845:20;39878:14;39910:15;-1:-1:-1;;;;;39895:38:0;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39878:57;;39946:14;39978:15;-1:-1:-1;;;;;39963:38:0;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39946:57;;40064:7;-1:-1:-1;;;;;40054:17:0;:6;-1:-1:-1;;;;;40054:17:0;;40050:413;;;40103:22;40118:7;40103:12;:22;:::i;:::-;40088:37;;40050:413;;;40262:189;40295:6;40324:7;40354;40384:11;40396:1;40384:14;;;;;;-1:-1:-1;;;40384:14:0;;;;;;;;;;;;;;;40421:8;40430:1;40421:11;;;;;;-1:-1:-1;;;40421:11:0;;;;;;;;;;;;;;;40262:10;:189::i;:::-;40230:221;;:12;:221;:::i;:::-;40198:253;;40050:413;40523:7;-1:-1:-1;;;;;40513:17:0;:6;-1:-1:-1;;;;;40513:17:0;;40509:413;;;40562:22;40577:7;40562:12;:22;:::i;:::-;40547:37;;40509:413;;;40721:189;40754:6;40783:7;40813;40843:11;40855:1;40843:14;;;;;;-1:-1:-1;;;40843:14:0;;;;;;;;;;;;;;;40880:8;40889:1;40880:11;;;;;;-1:-1:-1;;;40880:11:0;;;;;;;;40721:189;40689:221;;:12;:221;:::i;:::-;40657:253;;40509:413;39614:1315;;;;;;;;;;:::o;27513:807::-;27745:10;27672:28;27732:24;;;:12;:24;;;;;;;;27771:14;:30;;;;;27790:11;27789:12;27771:30;:46;;;;;27816:1;27805:8;;:12;27771:46;27767:546;;;27879:5;27867:8;;27858:6;:17;;;;:::i;:::-;27857:27;;;;:::i;:::-;-1:-1:-1;;;;;27905:21:0;;;;;;:10;:21;;;;;;27834:50;;-1:-1:-1;27905:21:0;;27901:401;;;-1:-1:-1;;;;;27951:19:0;;27947:86;;22243:42;27995:18;;27947:86;28053:24;28143:3;28125:14;;28102:20;:37;;;;:::i;:::-;28101:45;;;;:::i;:::-;-1:-1:-1;;;;;28165:27:0;;;;;;;:16;:27;;;;;;;;:34;;;;;;;;;;;:54;;28053:93;;-1:-1:-1;28053:93:0;;28165:34;;:27;:54;;28053:93;;28165:54;:::i;:::-;;;;-1:-1:-1;;;;;;;28238:28:0;;;;;;:21;:28;;;;;:48;;28270:16;;28238:28;:48;;28270:16;;28238:48;:::i;:::-;;;;-1:-1:-1;;;27901:401:0;27513:807;;;;;;;:::o;38066:644::-;38212:9;:16;38232:2;38212:22;38204:59;;;;-1:-1:-1;;;38204:59:0;;22251:2:1;38204:59:0;;;22233:21:1;22290:2;22270:18;;;22263:30;22329:26;22309:18;;;22302:54;22373:18;;38204:59:0;22223:174:1;38204:59:0;38384:2;38369:18;;38363:25;38428:2;38413:18;;;38407:25;38480:2;38465:18;;38459:25;38506:196;;-1:-1:-1;;;38506:196:0;;38559:10;38506:196;;;13957:34:1;38592:4:0;14007:18:1;;;14000:43;14059:18;;;14052:34;;;-1:-1:-1;;;14102:18:1;;;14095:34;38276:9:0;38451:34;;;;14145:19:1;;;14138:46;;;14200:19;;;14193:35;;;14244:19;;;14237:35;;;38407:25:0;;-1:-1:-1;;;;;38506:38:0;;;;;13891:19:1;;38506:196:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38066:644;;;;;;:::o;17790:285::-;17988:68;;-1:-1:-1;;;;;12793:15:1;;;17988:68:0;;;12775:34:1;12845:15;;12825:18;;;12818:43;12877:18;;;12870:34;;;17934:133:0;;17968:5;;-1:-1:-1;;;18011:27:0;12710:18:1;;17988:68:0;12692:218:1;23200:223:0;23325:37;-1:-1:-1;;;;;23325:25:0;;23351:7;23360:1;23325:25;:37::i;:::-;23373:42;-1:-1:-1;;;;;23373:25:0;;23399:7;23408:6;23373:25;:42::i;20555:885::-;20979:23;21018:118;21064:4;21018:118;;;;;;;;;;;;;;;;;21026:5;-1:-1:-1;;;;;21018:27:0;;;:118;;;;;:::i;:::-;21151:17;;20979:157;;-1:-1:-1;21151:21:0;21147:286;;21324:10;21313:30;;;;;;;;;;;;:::i;:::-;21287:134;;;;-1:-1:-1;;;21287:134:0;;22963:2:1;21287:134:0;;;22945:21:1;23002:2;22982:18;;;22975:30;23041:34;23021:18;;;23014:62;-1:-1:-1;;;23092:18:1;;;23085:40;23142:19;;21287:134:0;22935:232:1;26738:767:0;26872:7;26896:23;26892:606;;;26981:10;9344:20;26936:136;;;;-1:-1:-1;;;26936:136:0;;21120:2:1;26936:136:0;;;21102:21:1;21159:2;21139:18;;;21132:30;21198:34;21178:18;;;21171:62;-1:-1:-1;;;21249:18:1;;;21242:42;21301:19;;26936:136:0;21092:234:1;26936:136:0;27126:50;;-1:-1:-1;;;27126:50:0;;27150:10;27126:50;;;11977:34:1;27170:4:0;12027:18:1;;;12020:43;27089:17:0;;-1:-1:-1;;;;;27126:23:0;;;;;11912:18:1;;27126:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27089:87;-1:-1:-1;27191:134:0;-1:-1:-1;;;;;27191:30:0;;27240:10;27277:4;27089:87;27191:30;:134::i;:::-;27349:9;-1:-1:-1;27342:16:0;;26892:606;27391:65;-1:-1:-1;;;;;27391:30:0;;27422:10;27442:4;27449:6;27391:30;:65::i;:::-;-1:-1:-1;27480:6:0;26892:606;26738:767;;;;;:::o;40937:1033::-;41129:7;-1:-1:-1;;;;;41153:38:0;;30569:42;41153:38;:63;;;;-1:-1:-1;;;;;;41195:21:0;;;41153:63;41149:166;;;41233:42;;-1:-1:-1;;;41233:42:0;;;;;23741:25:1;;;30569:42:0;;41233:34;;23714:18:1;;41233:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41297:6;41290:13;;;;41149:166;41327:19;-1:-1:-1;;;;;41361:30:0;;41357:167;;-1:-1:-1;41422:6:0;41357:167;;;41461:51;41475:16;41493:10;41505:6;41461:13;:51::i;:::-;41536:22;41561:20;41573:7;41561:11;:20::i;:::-;-1:-1:-1;;;;;41602:27:0;;;;;;:15;:27;;;;;;41536:45;;-1:-1:-1;41602:27:0;;41594:61;;;;-1:-1:-1;;;41594:61:0;;15956:2:1;41594:61:0;;;15938:21:1;15995:2;15975:18;;;15968:30;-1:-1:-1;;;16014:18:1;;;16007:51;16075:18;;41594:61:0;15928:171:1;41594:61:0;41667:12;41685:10;-1:-1:-1;;;;;41685:15:0;41709:11;41723:8;41685:47;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41666:66;;;41751:7;41743:41;;;;-1:-1:-1;;;41743:41:0;;17408:2:1;41743:41:0;;;17390:21:1;17447:2;17427:18;;;17420:30;-1:-1:-1;;;17466:18:1;;;17459:51;17527:18;;41743:41:0;17380:171:1;41743:41:0;41797:20;41843:14;41820:20;41832:7;41820:11;:20::i;:::-;:37;;;;:::i;:::-;41797:60;;41893:1;41878:12;:16;41870:60;;;;-1:-1:-1;;;41870:60:0;;21533:2:1;41870:60:0;;;21515:21:1;21572:2;21552:18;;;21545:30;21611:33;21591:18;;;21584:61;21662:18;;41870:60:0;21505:181:1;41870:60:0;41950:12;-1:-1:-1;;;;40937:1033:0;;;;;;;;:::o;18344:707::-;18762:10;;;18761:62;;-1:-1:-1;18778:39:0;;-1:-1:-1;;;18778:39:0;;18802:4;18778:39;;;11977:34:1;-1:-1:-1;;;;;12047:15:1;;;12027:18;;;12020:43;18778:15:0;;;;;11912:18:1;;18778:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;18761:62;18739:166;;;;-1:-1:-1;;;18739:166:0;;23374:2:1;18739:166:0;;;23356:21:1;23413:2;23393:18;;;23386:30;23452:34;23432:18;;;23425:62;-1:-1:-1;;;23503:18:1;;;23496:52;23565:19;;18739:166:0;23346:244:1;18739:166:0;18970:62;;-1:-1:-1;;;;;14475:32:1;;18970:62:0;;;14457:51:1;14524:18;;;14517:34;;;18916:127:0;;18950:5;;-1:-1:-1;;;18993:22:0;14430:18:1;;18970:62:0;14412:145:1;12003:229:0;12140:12;12172:52;12194:6;12202:4;12208:1;12211:12;12172:21;:52::i;:::-;12165:59;12003:229;-1:-1:-1;;;;12003:229:0:o;22627:290::-;22713:15;-1:-1:-1;;;;;22750:19:0;;22746:164;;-1:-1:-1;22796:21:0;22627:290;;;:::o;22746:164::-;22860:38;;-1:-1:-1;;;22860:38:0;;22892:4;22860:38;;;11703:51:1;-1:-1:-1;;;;;22860:23:0;;;;;11676:18:1;;22860:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22850:48;;22746:164;22627:290;;;:::o;13219:623::-;13389:12;13461:5;13436:21;:30;;13414:118;;;;-1:-1:-1;;;13414:118:0;;18890:2:1;13414:118:0;;;18872:21:1;18929:2;18909:18;;;18902:30;18968:34;18948:18;;;18941:62;-1:-1:-1;;;19019:18:1;;;19012:36;19065:19;;13414:118:0;18862:228:1;13414:118:0;9344:20;;13543:60;;;;-1:-1:-1;;;13543:60:0;;21893:2:1;13543:60:0;;;21875:21:1;21932:2;21912:18;;;21905:30;21971:31;21951:18;;;21944:59;22020:18;;13543:60:0;21865:179:1;13543:60:0;13677:12;13691:23;13731:6;-1:-1:-1;;;;;13731:11:0;13751:5;13759:4;13731:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13676:88;;;;13782:52;13800:7;13809:10;13821:12;13782:17;:52::i;:::-;13775:59;13219:623;-1:-1:-1;;;;;;;13219:623:0:o;16133:777::-;16283:12;16312:7;16308:595;;;-1:-1:-1;16343:10:0;16336:17;;16308:595;16457:17;;:21;16453:439;;16720:10;16714:17;16781:15;16768:10;16764:2;16760:19;16753:44;16668:148;16863:12;16856:20;;-1:-1:-1;;;16856:20:0;;;;;;;;:::i;14:134:1:-;82:20;;111:31;82:20;111:31;:::i;153:395::-;216:8;226:6;280:3;273:4;265:6;261:17;257:27;247:2;;305:8;295;288:26;247:2;-1:-1:-1;335:20:1;;378:18;367:30;;364:2;;;417:8;407;400:26;364:2;461:4;453:6;449:17;437:29;;521:3;514:4;504:6;501:1;497:14;489:6;485:27;481:38;478:47;475:2;;;538:1;535;528:12;475:2;237:311;;;;;:::o;553:768::-;607:5;660:3;653:4;645:6;641:17;637:27;627:2;;682:5;675;668:20;627:2;722:6;709:20;748:4;772:60;788:43;828:2;788:43;:::i;:::-;772:60;:::i;:::-;854:3;878:2;873:3;866:15;906:2;901:3;897:12;890:19;;941:2;933:6;929:15;993:3;988:2;982;979:1;975:10;967:6;963:23;959:32;956:41;953:2;;;1014:5;1007;1000:20;953:2;1040:5;1054:238;1068:2;1065:1;1062:9;1054:238;;;1139:3;1126:17;1156:31;1181:5;1156:31;:::i;:::-;1200:18;;1238:12;;;;1270;;;;1086:1;1079:9;1054:238;;;-1:-1:-1;1310:5:1;;617:704;-1:-1:-1;;;;;;;617:704:1:o;1326:1385::-;1378:5;1408:4;1452:3;1447:2;1439:6;1435:15;1431:25;1421:2;;1474:5;1467;1460:20;1421:2;1514:6;1501:20;1540:4;1564:60;1580:43;1620:2;1580:43;:::i;1564:60::-;1646:3;1670:2;1665:3;1658:15;1698:2;1693:3;1689:12;1682:19;;1733:2;1725:6;1721:15;1785:3;1780:2;1774;1771:1;1767:10;1759:6;1755:23;1751:32;1748:41;1745:2;;;1806:5;1799;1792:20;1745:2;1832:5;1846:836;1860:2;1857:1;1854:9;1846:836;;;1937:3;1924:17;1964:18;2014:2;2001:11;1998:19;1995:2;;;2034:5;2027;2020:20;1995:2;2077:11;2069:6;2065:24;2055:34;;2129:3;2124:2;2120;2116:11;2112:21;2102:2;;2151:5;2144;2137:20;2102:2;2203;2199;2195:11;2182:25;2230:2;2255;2251;2248:10;2245:2;;;2261:18;;:::i;:::-;2309:51;2333:11;;;-1:-1:-1;;2329:25:1;2325:34;;2309:51;:::i;:::-;2294:66;;2389:2;2380:7;2373:19;2433:3;2428:2;2423;2419;2415:11;2411:20;2408:29;2405:2;;;2454:5;2447;2440:20;2405:2;2519;2514;2510;2506:11;2501:2;2492:7;2488:16;2475:47;-1:-1:-1;2546:16:1;;2542:25;;2535:40;;;2588:20;;-1:-1:-1;2628:12:1;;;;2660;;;;1878:1;1871:9;1846:836;;;-1:-1:-1;2700:5:1;;1388:1323;-1:-1:-1;;;;;;;;1388:1323:1:o;2716:375::-;2767:8;2777:6;2831:3;2824:4;2816:6;2812:17;2808:27;2798:2;;2856:8;2846;2839:26;2798:2;-1:-1:-1;2886:20:1;;2929:18;2918:30;;2915:2;;;2968:8;2958;2951:26;2915:2;3012:4;3004:6;3000:17;2988:29;;3064:3;3057:4;3048:6;3040;3036:19;3032:30;3029:39;3026:2;;;3081:1;3078;3071:12;3096:257;3155:6;3208:2;3196:9;3187:7;3183:23;3179:32;3176:2;;;3229:6;3221;3214:22;3176:2;3273:9;3260:23;3292:31;3317:5;3292:31;:::i;3358:261::-;3428:6;3481:2;3469:9;3460:7;3456:23;3452:32;3449:2;;;3502:6;3494;3487:22;3449:2;3539:9;3533:16;3558:31;3583:5;3558:31;:::i;3624:398::-;3692:6;3700;3753:2;3741:9;3732:7;3728:23;3724:32;3721:2;;;3774:6;3766;3759:22;3721:2;3818:9;3805:23;3837:31;3862:5;3837:31;:::i;:::-;3887:5;-1:-1:-1;3944:2:1;3929:18;;3916:32;3957:33;3916:32;3957:33;:::i;:::-;4009:7;3999:17;;;3711:311;;;;;:::o;4027:1325::-;4205:6;4213;4221;4229;4237;4245;4253;4261;4314:3;4302:9;4293:7;4289:23;4285:33;4282:2;;;4336:6;4328;4321:22;4282:2;4380:9;4367:23;4399:31;4424:5;4399:31;:::i;:::-;4449:5;-1:-1:-1;4506:2:1;4491:18;;4478:32;4519:33;4478:32;4519:33;:::i;:::-;4571:7;-1:-1:-1;4625:2:1;4610:18;;4597:32;;-1:-1:-1;4676:2:1;4661:18;;4648:32;;-1:-1:-1;4731:3:1;4716:19;;4703:33;4755:18;4785:14;;;4782:2;;;4817:6;4809;4802:22;4782:2;4845:61;4898:7;4889:6;4878:9;4874:22;4845:61;:::i;:::-;4835:71;;4959:3;4948:9;4944:19;4931:33;4915:49;;4989:2;4979:8;4976:16;4973:2;;;5010:6;5002;4995:22;4973:2;;5038:61;5091:7;5080:8;5069:9;5065:24;5038:61;:::i;:::-;5028:71;;;5151:3;5140:9;5136:19;5123:33;5165;5190:7;5165:33;:::i;:::-;5217:7;-1:-1:-1;5276:3:1;5261:19;;5248:33;5290:30;5248:33;5290:30;:::i;:::-;5339:7;5329:17;;;4272:1080;;;;;;;;;;;:::o;5357:1292::-;5549:6;5557;5565;5573;5581;5589;5597;5605;5613;5666:3;5654:9;5645:7;5641:23;5637:33;5634:2;;;5688:6;5680;5673:22;5634:2;5716:29;5735:9;5716:29;:::i;:::-;5706:39;;5764:38;5798:2;5787:9;5783:18;5764:38;:::i;:::-;5754:48;;5849:2;5838:9;5834:18;5821:32;5811:42;;5900:2;5889:9;5885:18;5872:32;5862:42;;5955:3;5944:9;5940:19;5927:33;5979:18;6020:2;6012:6;6009:14;6006:2;;;6041:6;6033;6026:22;6006:2;6085:58;6135:7;6126:6;6115:9;6111:22;6085:58;:::i;:::-;6162:8;;-1:-1:-1;6059:84:1;-1:-1:-1;6250:3:1;6235:19;;6222:33;;-1:-1:-1;6267:16:1;;;6264:2;;;6301:6;6293;6286:22;6264:2;6329:63;6384:7;6373:8;6362:9;6358:24;6329:63;:::i;:::-;6319:73;;6445:3;6434:9;6430:19;6417:33;6401:49;;6475:2;6465:8;6462:16;6459:2;;;6496:6;6488;6481:22;6459:2;;6524:61;6577:7;6566:8;6555:9;6551:24;6524:61;:::i;:::-;6514:71;;;6604:39;6638:3;6627:9;6623:19;6604:39;:::i;:::-;6594:49;;5624:1025;;;;;;;;;;;:::o;6654:392::-;6719:6;6727;6780:2;6768:9;6759:7;6755:23;6751:32;6748:2;;;6801:6;6793;6786:22;6748:2;6845:9;6832:23;6864:31;6889:5;6864:31;:::i;:::-;6914:5;-1:-1:-1;6971:2:1;6956:18;;6943:32;6984:30;6943:32;6984:30;:::i;7051:325::-;7119:6;7127;7180:2;7168:9;7159:7;7155:23;7151:32;7148:2;;;7201:6;7193;7186:22;7148:2;7245:9;7232:23;7264:31;7289:5;7264:31;:::i;:::-;7314:5;7366:2;7351:18;;;;7338:32;;-1:-1:-1;;;7138:238:1:o;7381:466::-;7458:6;7466;7474;7527:2;7515:9;7506:7;7502:23;7498:32;7495:2;;;7548:6;7540;7533:22;7495:2;7592:9;7579:23;7611:31;7636:5;7611:31;:::i;:::-;7661:5;-1:-1:-1;7713:2:1;7698:18;;7685:32;;-1:-1:-1;7769:2:1;7754:18;;7741:32;7782:33;7741:32;7782:33;:::i;:::-;7834:7;7824:17;;;7485:362;;;;;:::o;7852:774::-;7949:6;7957;7965;7973;7981;8034:3;8022:9;8013:7;8009:23;8005:33;8002:2;;;8056:6;8048;8041:22;8002:2;8100:9;8087:23;8119:31;8144:5;8119:31;:::i;:::-;8169:5;-1:-1:-1;8221:2:1;8206:18;;8193:32;;-1:-1:-1;8277:2:1;8262:18;;8249:32;8290:33;8249:32;8290:33;:::i;:::-;8342:7;-1:-1:-1;8400:2:1;8385:18;;8372:32;8427:18;8416:30;;8413:2;;;8464:6;8456;8449:22;8413:2;8508:58;8558:7;8549:6;8538:9;8534:22;8508:58;:::i;:::-;7992:634;;;;-1:-1:-1;7992:634:1;;-1:-1:-1;8585:8:1;;8482:84;7992:634;-1:-1:-1;;;7992:634:1:o;8631:457::-;8717:6;8725;8778:2;8766:9;8757:7;8753:23;8749:32;8746:2;;;8799:6;8791;8784:22;8746:2;8844:9;8831:23;8877:18;8869:6;8866:30;8863:2;;;8914:6;8906;8899:22;8863:2;8958:70;9020:7;9011:6;9000:9;8996:22;8958:70;:::i;:::-;9047:8;;8932:96;;-1:-1:-1;8736:352:1;-1:-1:-1;;;;8736:352:1:o;9093:800::-;9212:6;9220;9228;9236;9289:2;9277:9;9268:7;9264:23;9260:32;9257:2;;;9310:6;9302;9295:22;9257:2;9355:9;9342:23;9384:18;9425:2;9417:6;9414:14;9411:2;;;9446:6;9438;9431:22;9411:2;9490:70;9552:7;9543:6;9532:9;9528:22;9490:70;:::i;:::-;9579:8;;-1:-1:-1;9464:96:1;-1:-1:-1;9667:2:1;9652:18;;9639:32;;-1:-1:-1;9683:16:1;;;9680:2;;;9717:6;9709;9702:22;9680:2;;9761:72;9825:7;9814:8;9803:9;9799:24;9761:72;:::i;:::-;9247:646;;;;-1:-1:-1;9852:8:1;-1:-1:-1;;;;9247:646:1:o;9898:251::-;9954:6;10007:2;9995:9;9986:7;9982:23;9978:32;9975:2;;;10028:6;10020;10013:22;9975:2;10072:9;10059:23;10091:28;10113:5;10091:28;:::i;10154:255::-;10221:6;10274:2;10262:9;10253:7;10249:23;10245:32;10242:2;;;10295:6;10287;10280:22;10242:2;10332:9;10326:16;10351:28;10373:5;10351:28;:::i;10414:190::-;10473:6;10526:2;10514:9;10505:7;10501:23;10497:32;10494:2;;;10547:6;10539;10532:22;10494:2;-1:-1:-1;10575:23:1;;10484:120;-1:-1:-1;10484:120:1:o;10609:194::-;10679:6;10732:2;10720:9;10711:7;10707:23;10703:32;10700:2;;;10753:6;10745;10738:22;10700:2;-1:-1:-1;10781:16:1;;10690:113;-1:-1:-1;10690:113:1:o;10808:255::-;10887:6;10895;10948:2;10936:9;10927:7;10923:23;10919:32;10916:2;;;10969:6;10961;10954:22;10916:2;-1:-1:-1;;10997:16:1;;11053:2;11038:18;;;11032:25;10997:16;;11032:25;;-1:-1:-1;10906:157:1:o;11068:274::-;11197:3;11235:6;11229:13;11251:53;11297:6;11292:3;11285:4;11277:6;11273:17;11251:53;:::i;:::-;11320:16;;;;;11205:137;-1:-1:-1;;11205:137:1:o;12074:456::-;-1:-1:-1;;;;;12361:15:1;;;12343:34;;12413:15;;;12408:2;12393:18;;12386:43;12465:15;;12460:2;12445:18;;12438:43;12512:2;12497:18;;12490:34;;;;12292:3;12277:19;;12259:271::o;12915:688::-;-1:-1:-1;;;;;13302:15:1;;;13284:34;;13354:15;;;13349:2;13334:18;;13327:43;13401:2;13386:18;;13379:34;;;;13444:2;13429:18;;13422:34;;;;13487:3;13472:19;;13465:35;13537:15;;;13264:3;13516:19;;13509:44;13584:3;13569:19;;13562:35;;;;13233:3;13218:19;;13200:403::o;15366:383::-;15515:2;15504:9;15497:21;15478:4;15547:6;15541:13;15590:6;15585:2;15574:9;15570:18;15563:34;15606:66;15665:6;15660:2;15649:9;15645:18;15640:2;15632:6;15628:15;15606:66;:::i;:::-;15733:2;15712:15;-1:-1:-1;;15708:29:1;15693:45;;;;15740:2;15689:54;;15487:262;-1:-1:-1;;15487:262:1:o;17983:342::-;18185:2;18167:21;;;18224:2;18204:18;;;18197:30;-1:-1:-1;;;18258:2:1;18243:18;;18236:48;18316:2;18301:18;;18157:168::o;20557:356::-;20759:2;20741:21;;;20778:18;;;20771:30;20837:34;20832:2;20817:18;;20810:62;20904:2;20889:18;;20731:182::o;24482:275::-;24553:2;24547:9;24618:2;24599:13;;-1:-1:-1;;24595:27:1;24583:40;;24653:18;24638:34;;24674:22;;;24635:62;24632:2;;;24700:18;;:::i;:::-;24736:2;24729:22;24527:230;;-1:-1:-1;24527:230:1:o;24762:183::-;24822:4;24855:18;24847:6;24844:30;24841:2;;;24877:18;;:::i;:::-;-1:-1:-1;24922:1:1;24918:14;24934:4;24914:25;;24831:114::o;24950:128::-;24990:3;25021:1;25017:6;25014:1;25011:13;25008:2;;;25027:18;;:::i;:::-;-1:-1:-1;25063:9:1;;24998:80::o;25083:217::-;25123:1;25149;25139:2;;-1:-1:-1;;;25174:31:1;;25228:4;25225:1;25218:15;25256:4;25181:1;25246:15;25139:2;-1:-1:-1;25285:9:1;;25129:171::o;25305:168::-;25345:7;25411:1;25407;25403:6;25399:14;25396:1;25393:21;25388:1;25381:9;25374:17;25370:45;25367:2;;;25418:18;;:::i;:::-;-1:-1:-1;25458:9:1;;25357:116::o;25478:125::-;25518:4;25546:1;25543;25540:8;25537:2;;;25551:18;;:::i;:::-;-1:-1:-1;25588:9:1;;25527:76::o;25608:258::-;25680:1;25690:113;25704:6;25701:1;25698:13;25690:113;;;25780:11;;;25774:18;25761:11;;;25754:39;25726:2;25719:10;25690:113;;;25821:6;25818:1;25815:13;25812:2;;;-1:-1:-1;;25856:1:1;25838:16;;25831:27;25661:205::o;25871:135::-;25910:3;-1:-1:-1;;25931:17:1;;25928:2;;;25951:18;;:::i;:::-;-1:-1:-1;25998:1:1;25987:13;;25918:88::o;26011:127::-;26072:10;26067:3;26063:20;26060:1;26053:31;26103:4;26100:1;26093:15;26127:4;26124:1;26117:15;26143:127;26204:10;26199:3;26195:20;26192:1;26185:31;26235:4;26232:1;26225:15;26259:4;26256:1;26249:15;26275:131;-1:-1:-1;;;;;26350:31:1;;26340:42;;26330:2;;26396:1;26393;26386:12;26330:2;26320:86;:::o;26411:118::-;26497:5;26490:13;26483:21;26476:5;26473:32;26463:2;;26519:1;26516;26509:12

Swarm Source

ipfs://8d90f02172c42d198ceecca0b296b3c3bcf93a1e8fa039763c1ca1c35e69d667
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.