Contract 0xba69d0d709d805f3c4e807926f1068dfad4b6d6a

 
 
Txn Hash
Method
Block
From
To
Value [Txn Fee]
0xa4a3774ece1e484cb80d214f7e37d362744735f9e2489606f0e88df9fecccb78Move Fund274238032022-04-22 1:38:14412 days 9 hrs ago0x2699eacc1cd8d115c36c72d9ce075cfb69a9dc37 IN  0xba69d0d709d805f3c4e807926f1068dfad4b6d6a0 MATIC0.00438399921 53.389181019
0x8450b33b5e567cb820dc3076d170028a3e0919e22d0b1a8b516e5258f7966df8Buy Token274086752022-04-21 16:46:55412 days 18 hrs ago0x604dcf3e87620353140a810b15e7e01ae9c55460 IN  0xba69d0d709d805f3c4e807926f1068dfad4b6d6a0 MATIC0.017779616697 63.746331091
0xa3c97eb897131c065678b54d8629bd5ee356fc4071eb8f9a61459c81c4b11e16Buy Token274086152022-04-21 16:44:51412 days 18 hrs ago0x604dcf3e87620353140a810b15e7e01ae9c55460 IN  0xba69d0d709d805f3c4e807926f1068dfad4b6d6a0 MATIC0.021798962875 73.642159358
0x69bcdb10c81f2a3f97f1cb22149e893ebb33e53d280917e373fca5725af77735Buy Token274085862022-04-21 16:43:53412 days 18 hrs ago0x6826faff1ebe17caed305dbfdc789789ac19f8e5 IN  0xba69d0d709d805f3c4e807926f1068dfad4b6d6a0 MATIC0.024701831924 80.717027495
0xacefd2a050fab958dd14e44cf36fa862be4c3eed5ac1c6ea717b252df6ec9472Buy Token274079412022-04-21 16:21:43412 days 18 hrs ago0x99006d2fbcf1c78349fc04ebc17ed8b95f424a45 IN  0xba69d0d709d805f3c4e807926f1068dfad4b6d6a0 MATIC0.019792367001 67.359925814
0x94632705995377b6f69faf7db580e13f9c59e34c1d2d42e2c16ae163364b3292Buy Token274078342022-04-21 16:18:01412 days 19 hrs ago0x4e85ba255bd882e718ee2ede2c1ec9bb16a3ebfa IN  0xba69d0d709d805f3c4e807926f1068dfad4b6d6a0 MATIC0.012991260116 43.120650155
0x1022ead27c676986ba07f2c5b9bf2d7457a7befaee1f7c613a46acbc8738fa59Buy Token274077362022-04-21 16:14:37412 days 19 hrs ago0xdea902311e924224dc77df3144e82c2034ec7b16 IN  0xba69d0d709d805f3c4e807926f1068dfad4b6d6a0 MATIC0.014446175323 52.620331481
0x4f02606271556dba7ee7ec1c882fa38d5cc7b5c9b90d568cdf92984c2182e49aSave Me274075732022-04-21 16:09:03412 days 19 hrs ago0x2699eacc1cd8d115c36c72d9ce075cfb69a9dc37 IN  0xba69d0d709d805f3c4e807926f1068dfad4b6d6a0 MATIC0.015671369455 94.020695075
0x1bff502e095aaa6407e4b786baa7107a9738e6cc4d205d6202515647250724b4Save Me274075482022-04-21 16:08:09412 days 19 hrs ago0x2699eacc1cd8d115c36c72d9ce075cfb69a9dc37 IN  0xba69d0d709d805f3c4e807926f1068dfad4b6d6a0 MATIC0.018107390312 108.635651021
0xb99868fb116e403b28d5100d929d7c42785a92b84e1065253fc656b3a88f80c0Save Me274075292022-04-21 16:07:31412 days 19 hrs ago0x2699eacc1cd8d115c36c72d9ce075cfb69a9dc37 IN  0xba69d0d709d805f3c4e807926f1068dfad4b6d6a0 MATIC0.01695909974 101.746458729
0x49d8403d8bbff2e68db406d44d7aa5543c8f326c439d3e7a896c91e13b4f5ba0Save Me274074902022-04-21 16:06:13412 days 19 hrs ago0x2699eacc1cd8d115c36c72d9ce075cfb69a9dc37 IN  0xba69d0d709d805f3c4e807926f1068dfad4b6d6a0 MATIC0.020403845735 122.413281349
0xfa2e3295bf29c9508b4c56dcf0687fc0fb26a2ebffbbf4b1bd37bcd9617e33e8Buy Token274074602022-04-21 16:05:09412 days 19 hrs ago0x6c38faefc560aa3cd2f8978cc0bbc2419d4b1245 IN  0xba69d0d709d805f3c4e807926f1068dfad4b6d6a0 MATIC0.043142823163 135.508605092
0xa8bcfd4e255aab3f97d6569e2dc41b854983a27eb95e377d1decbbaf63a43593Save Me274074452022-04-21 16:04:39412 days 19 hrs ago0x2699eacc1cd8d115c36c72d9ce075cfb69a9dc37 IN  0xba69d0d709d805f3c4e807926f1068dfad4b6d6a0 MATIC0.023482837058 140.885751491
0xffa53a5132f0c7449d3605c646f05d7aa996dfac25c6ec6c76f23cd4fc3cd02aSave Me274074162022-04-21 16:03:37412 days 19 hrs ago0x2699eacc1cd8d115c36c72d9ce075cfb69a9dc37 IN  0xba69d0d709d805f3c4e807926f1068dfad4b6d6a0 MATIC0.059372059937 194.404348119
0x585ea4c3968002c6db56cc71d7554a076adab4dbf43f790d1cd05c26ef27eb00Buy Token274073352022-04-21 16:00:51412 days 19 hrs ago0x99006d2fbcf1c78349fc04ebc17ed8b95f424a45 IN  0xba69d0d709d805f3c4e807926f1068dfad4b6d6a0 MATIC0.027271006157 87.707864013
0xe85d204b82d945f1ba3d198330481534e59ca8b5bd557dcd5197567fc0c114b3Buy Token274071082022-04-21 15:53:05412 days 19 hrs ago0xf589647e25383e120852a08dc642369a10e0a61e IN  0xba69d0d709d805f3c4e807926f1068dfad4b6d6a0 MATIC0.023233888975 79.075784928
0xf9cfe92771dd066641a9a8ea5a71f8f49fe13ac936a8a2f4f417687644fae712Buy Token274070732022-04-21 15:51:51412 days 19 hrs ago0x79ac6df75b05ac019f4371f4170d07a1c336f9f6 IN  0xba69d0d709d805f3c4e807926f1068dfad4b6d6a0 MATIC0.018053151103 119.947319453
0xe1b6cdbbbe4efc0f939e351f8660ee335ec3597b3adc32c6f4dcf425896071b3Buy Token274070732022-04-21 15:51:51412 days 19 hrs ago0x79ac6df75b05ac019f4371f4170d07a1c336f9f6 IN  0xba69d0d709d805f3c4e807926f1068dfad4b6d6a0 MATIC0.013815583951 91.792410764
0x207c7cad5aee1d974182605693e6796f3120e8c5e43587dcbba95e3775c1b4bdBuy Token274070732022-04-21 15:51:51412 days 19 hrs ago0x79ac6df75b05ac019f4371f4170d07a1c336f9f6 IN  0xba69d0d709d805f3c4e807926f1068dfad4b6d6a0 MATIC0.019966992656 66.27453359
0x06548343d9595157a4654b10aa9940aabbf6b0e56ef1aa4687ff4b1e6145c129Buy Token274070392022-04-21 15:50:39412 days 19 hrs ago0xf589647e25383e120852a08dc642369a10e0a61e IN  0xba69d0d709d805f3c4e807926f1068dfad4b6d6a0 MATIC0.022331419244 76.004258569
0xb6433f4019f2c90650e5b5ed049c094a91a4f60565877b25b211d6df2ded92eaBuy Token274070062022-04-21 15:49:33412 days 19 hrs ago0xcd1fd79aa88548842e77b2eb3d05f2ab746fad3b IN  0xba69d0d709d805f3c4e807926f1068dfad4b6d6a0 MATIC0.034045713759 77.373984432
0x73925439e860b234f10e12a253fe19b58e78233cb1a5b41aad9da5f303d6f3abBuy Token274069792022-04-21 15:48:39412 days 19 hrs ago0x304bee906380d8166de5238aa95d1fd6358d835c IN  0xba69d0d709d805f3c4e807926f1068dfad4b6d6a0 MATIC0.022661782869 81.254151559
0xe4afe23e95f0cf4a1ea46ac9035ba0349b1d66fa71871c3d79dc757ebb98473aBuy Token274068892022-04-21 15:45:31412 days 19 hrs ago0x304bee906380d8166de5238aa95d1fd6358d835c IN  0xba69d0d709d805f3c4e807926f1068dfad4b6d6a0 MATIC0.021811607851 73.684877138
0xf61455ba5e1e0a3294febe6da7cfa55c82f8d3765ef438a2cdb070653bce44c7Save Me274068112022-04-21 15:42:51412 days 19 hrs ago0x28720eacf70adc3a450aaa06b547958e90ce2774 IN  0xba69d0d709d805f3c4e807926f1068dfad4b6d6a0 MATIC0.015908554418 95.357304209
0x4dd1444254b55b10dea9052b958aed5f1472edbe89ec9066f1856cdc6adb5830Buy Token274066642022-04-21 15:37:49412 days 19 hrs ago0x79ac6df75b05ac019f4371f4170d07a1c336f9f6 IN  0xba69d0d709d805f3c4e807926f1068dfad4b6d6a0 MATIC0.030570613697 69.476930572
[ Download CSV Export 
Latest 1 internal transaction
Parent Txn Hash Block From To Value
0x647902797de47eef7aa7eae6da94cd2fa7f59606ec64aca4335c1e7baf0f1f19273535952022-04-20 7:24:19414 days 3 hrs ago 0x0d16857125d5483bfbad99290503c79260dc992e  Contract Creation0 MATIC
[ Download CSV Export 
Loading

Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0xef69a1511a337b53788306a1f90cc13bffd93773

Contract Name:
KommunitasPrivProject

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2022-01-03
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.7.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 GSN 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 payable) {
        return msg.sender;
    }

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


pragma solidity ^0.7.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);
}


pragma solidity ^0.7.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}


pragma solidity ^0.7.0;

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20 {
    using SafeMath for uint256;

    mapping (address => uint256) private _balances;

    mapping (address => mapping (address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;
    uint8 private _decimals;

    /**
     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with
     * a default value of 18.
     *
     * To select a different value for {decimals}, use {_setupDecimals}.
     *
     * All three of these values are immutable: they can only be set once during
     * construction.
     */
    constructor (string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _decimals = 18;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is
     * called.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view returns (uint8) {
        return _decimals;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Sets {decimals} to a value other than the default one of 18.
     *
     * WARNING: This function should only be called from the constructor. Most
     * applications that interact with token contracts will not expect
     * {decimals} to ever change, and may work incorrectly if it does.
     */
    function _setupDecimals(uint8 decimals_) internal {
        _decimals = decimals_;
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be to transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}


pragma solidity 0.7.6;

interface IKommunitasPrivFactory{
    event ProjectCreated(address indexed project, uint index);
    
    function owner() external  view returns (address);
    function savior() external  view returns (address);
    function devAddr() external view returns (address);

    function swapFactory() external view returns (address);
    function weth() external view returns (address);
    function stakingV1() external view returns (address);
    function stakingV2() external view returns (address);
    
    function allProjectsLength() external view returns(uint);
    function allPaymentsLength() external view returns(uint);
    function allProjects(uint) external view returns(address);
    function allPayments(uint) external view returns(address);
    function getPaymentIndex(address) external view returns(uint);

    function createProject(address, uint, uint, uint, uint, uint, uint[2] memory, uint[2] memory, uint) external returns (address);
    
    function transferOwnership(address) external;
    function setPayment(address) external;
    function removePayment(address) external;
    function config(address, address, address) external;
}


pragma solidity 0.7.6;

interface KommunitasStaking{
    function getUserStakedTokens(address _of) external view returns (uint256);
    function communityStaked() external view returns(uint256);
}


pragma solidity 0.7.6;

interface KommunitasStakingV2{
    function getUserStakedTokens(address _of) external view returns (uint256);
    function getUserStakedTokensBeforeDate(address _of, uint256 _before) external view returns (uint256);
    function minPrivateSale() external view returns(uint256);
}


pragma solidity >=0.5.0;

interface IWETH {
    function deposit() external payable;
    function transfer(address to, uint value) external returns (bool);
    function withdraw(uint) external;
}


pragma solidity >=0.6.0;

// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
    function safeApprove(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('approve(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED');
    }

    function safeTransfer(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED');
    }

    function safeTransferFrom(address token, address from, address to, uint value) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED');
    }

    function safeTransferETH(address to, uint value) internal {
        (bool success,) = to.call{value:value}(new bytes(0));
        require(success, 'TransferHelper: ETH_TRANSFER_FAILED');
    }
}

pragma solidity 0.7.6;

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}


pragma solidity 0.7.6;

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

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

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}


pragma solidity 0.7.6;

library UniswapV2Library {
    using SafeMath for uint;

    // returns sorted token addresses, used to handle return values from pairs sorted in this order
    function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {
        require(tokenA != tokenB, 'UniswapV2Library: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'UniswapV2Library: ZERO_ADDRESS');
    }

    // Less efficient than the CREATE2 method below
    function pairFor(address factory, address tokenA, address tokenB) internal view returns (address pair) {
        (address token0, address token1) = sortTokens(tokenA, tokenB);
        pair = IUniswapV2Factory(factory).getPair(token0, token1);
    }

    // fetches and sorts the reserves for a pair
    function getReserves(address factory, address tokenA, address tokenB) internal view returns (uint reserveA, uint reserveB) {
        (address token0,) = sortTokens(tokenA, tokenB);
        (uint reserve0, uint reserve1,) = IUniswapV2Pair(pairFor(factory, tokenA, tokenB)).getReserves();
        (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
    }

    // given some amount of an asset and pair reserves, returns an equivalent amount of the other asset
    function quote(uint amountA, uint reserveA, uint reserveB) internal pure returns (uint amountB) {
        require(amountA > 0, 'UniswapV2Library: INSUFFICIENT_AMOUNT');
        require(reserveA > 0 && reserveB > 0, 'UniswapV2Library: INSUFFICIENT_LIQUIDITY');
        amountB = amountA.mul(reserveB) / reserveA;
    }

    // given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) internal pure returns (uint amountOut) {
        require(amountIn > 0, 'UniswapV2Library: INSUFFICIENT_INPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'UniswapV2Library: INSUFFICIENT_LIQUIDITY');
        uint amountInWithFee = amountIn.mul(997);
        uint numerator = amountInWithFee.mul(reserveOut);
        uint denominator = reserveIn.mul(1000).add(amountInWithFee);
        amountOut = numerator / denominator;
    }

    // given an output amount of an asset and pair reserves, returns a required input amount of the other asset
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) internal pure returns (uint amountIn) {
        require(amountOut > 0, 'UniswapV2Library: INSUFFICIENT_OUTPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'UniswapV2Library: INSUFFICIENT_LIQUIDITY');
        uint numerator = reserveIn.mul(amountOut).mul(1000);
        uint denominator = reserveOut.sub(amountOut).mul(997);
        amountIn = (numerator / denominator).add(1);
    }

    // performs chained getAmountOut calculations on any number of pairs
    function getAmountsOut(address factory, uint amountIn, address[] memory path) internal view returns (uint[] memory amounts) {
        require(path.length >= 2, 'UniswapV2Library: INVALID_PATH');
        amounts = new uint[](path.length);
        amounts[0] = amountIn;
        for (uint i; i < path.length - 1; i++) {
            (uint reserveIn, uint reserveOut) = getReserves(factory, path[i], path[i + 1]);
            amounts[i + 1] = getAmountOut(amounts[i], reserveIn, reserveOut);
        }
    }

    // performs chained getAmountIn calculations on any number of pairs
    function getAmountsIn(address factory, uint amountOut, address[] memory path) internal view returns (uint[] memory amounts) {
        require(path.length >= 2, 'UniswapV2Library: INVALID_PATH');
        amounts = new uint[](path.length);
        amounts[amounts.length - 1] = amountOut;
        for (uint i = path.length - 1; i > 0; i--) {
            (uint reserveIn, uint reserveOut) = getReserves(factory, path[i - 1], path[i]);
            amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut);
        }
    }
}


pragma solidity 0.7.6;

contract KommunitasPrivProject{
    using SafeMath for uint;
    
    bool public initialized;
    bool public isPaused;
    
    address public owner;
    IKommunitasPrivFactory public factory;
    enum StakingChoice { V1, V2 }
    
    uint public revenue;
    ERC20 public payment;
    
    uint public tokenProjectDecimals;
    uint public totalStakedMinPrivateSale;
    uint public target;
    uint public calculation;
    uint public sale;
    bool public buyEnded;
    uint public minPublicBuy;
    uint public maxPublicBuy;
    uint public whitelistTotalAlloc;
    address[] public buyers;
    address[] public whitelists;
    
    struct Round{
        uint start;
        uint end;
        uint price;
        uint achieve;
    }
    
    struct Invoice{
        uint buyersIndex;
        uint boosterId;
        uint boughtAt;
        uint bought;
        uint received;
    }
    
    mapping(uint => Round) public booster;
    mapping(address => Invoice[]) public invoices;
    mapping(address => string) public recipient;
    mapping(address => uint) public whitelist;
    mapping(address => mapping(uint => uint)) public purchasePerRound;
    
    modifier onlyOwner{
        require(msg.sender == owner, "You are not the owner");
        _;
    }
    
    modifier onlyFactory{
        require(msg.sender == address(factory), "You are not the factory");
        _;
    }
    
    modifier isNotInitialized{
        require(!initialized, "Already initialized");
        _;
    }
    
    modifier isNotPaused{
        require(!isPaused, "This project is paused");
        _;
    }
    
    modifier isBoosterProgress{
        require(block.timestamp >= booster[boosterProgress()].start && block.timestamp <= booster[boosterProgress()].end, "Not in any booster progress");
        _;
    }
    
    modifier ensure(uint deadline) {
        require(deadline >= block.timestamp, 'UniswapV2Router: EXPIRED');
        _;
    }
    
    event TokenBought(uint indexed booster, address indexed buyer, uint buyAmount, uint tokenReceived);
    
    constructor(){
        factory = IKommunitasPrivFactory(msg.sender);
        initialized = false;
        buyEnded = false;
        isPaused = false;
        owner = tx.origin;
    }
    
    /**
     * @dev Initialize project for raise fund
     * @param _payment Tokens to raise
     * @param _tokenProjectDecimals Token decimals of project
     * @param _sale Amount token project to sell (based on token decimals of project)
     * @param _target Target amount to raise (decimals 18)
     * @param _calculation Epoch date to start buy allocation calculation
     * @param _start Epoch date to start round 1
     * @param _price Token project price in each rounds (in 6 decimals)
     * @param _minMaxPublicBuy Min and max token to buy (in 2 decimals)
     * @param _boosterRunning Duration when booster running (in seconds)
     */
    function initialize(
        address _payment,
        uint _tokenProjectDecimals,
        uint _sale,
        uint _target,
        uint _calculation,
        uint _start,
        uint[2] memory _price,
        uint[2] memory _minMaxPublicBuy,
        uint _boosterRunning
    ) public onlyFactory isNotInitialized{
        require(_boosterRunning > 0, "Can't be 0");
        require(_calculation < _start, "Calculation must be done before booster is started");
        
        initialized = true;
        
        payment = ERC20(_payment);
        tokenProjectDecimals = _tokenProjectDecimals;
        sale = _sale;
        target = _target;
        calculation = _calculation;
        
        for(uint i=1; i<=2; i++){
            if(i==1){
                booster[i].start = _start;
            }else{
                booster[i].start = booster[i-1].end.add(1);
            }
            booster[i].end = booster[i].start.add(_boosterRunning);
            booster[i].price = _price[i-1].mul(10**payment.decimals()).div(1e6);
            booster[i].achieve = 0;
        }
        
        minPublicBuy = _minMaxPublicBuy[0].mul(10**tokenProjectDecimals).div(100);
        maxPublicBuy = _minMaxPublicBuy[1].mul(10**tokenProjectDecimals).div(100);
    }
    
    // **** VIEW AREA ****
    
    /**
     * @dev Get all whitelists length
     */
    function getWhitelistLength() public view returns(uint){
        return whitelists.length;
    }
    
    /**
     * @dev Get all buyers/participants length
     */
    function getBuyersLength() public view returns(uint){
        return buyers.length;
    }
    
    /**
     * @dev Get total number transactions of buyer
     */
    function getBuyerHistoryLength(address _buyer) public view returns(uint){
        return invoices[_buyer].length;
    }

    /**
     * @dev Get User Staked Info
     * @param _choice V1 or V2 Staking
     * @param _target User address
     */
    function getUserStakedInfo(StakingChoice _choice, address _target) internal view returns(uint userStaked, uint totalStaked){
        if(_choice == StakingChoice.V1){
            userStaked = KommunitasStaking(factory.stakingV1()).getUserStakedTokens(_target);
            totalStaked = KommunitasStaking(factory.stakingV1()).communityStaked();
        }else if(_choice == StakingChoice.V2){
            userStaked = KommunitasStakingV2(factory.stakingV2()).getUserStakedTokensBeforeDate(_target, calculation);
            totalStaked = totalStakedMinPrivateSale;
        }else{
            revert("Invalid Staking Choice. Needs to be either 0 (V1) or 1 (V2)");
        }
    }
    
    /**
     * @dev Get User Allocation (in 8 decimals)
     * @param _target User address
     */
    function getUserAllocation_d8(address _target) public view returns(uint alloc){
        alloc = 0;
        if(eligibleCheck(_target)){
            (uint userStaked, uint totalStaked) = getUserStakedToken(_target);
            alloc = userStaked.mul(10 ** 8).div(totalStaked);
        }
    }
    
    /**
     * @dev Get User Staked Token both V1 & V2
     * @param _target User address
     */
    function getUserStakedToken(address _target) internal view returns(uint userStaked, uint totalStaked){
        (uint userV1Staked, uint v1TotalStaked) = getUserStakedInfo(StakingChoice.V1, _target);
        (uint userV2Staked, uint v2TotalStaked) = getUserStakedInfo(StakingChoice.V2, _target);
        userStaked = userV1Staked.add(userV2Staked);
        totalStaked = v1TotalStaked.add(v2TotalStaked);
    }
    
    /**
     * @dev Check whether buyer/participant eligible
     * @param _user User address
     */
    function eligibleCheck(address _user) internal view returns (bool){
        if(boosterProgress() == 1 && whitelist[_user] > 0) return true;
        (uint userStaked,) = getUserStakedToken(_user);
        return (userStaked >= KommunitasStakingV2(factory.stakingV2()).minPrivateSale());
    }
    
    /**
     * @dev Check whether buyer/participant or not
     * @param _user User address
     */
    function isBuyer(address _user) public view returns (bool){
        if(buyers.length == 0) return false;
        return (invoices[_user].length > 0);
    }
    
    /**
     * @dev Get amount out of swap
     * @param _tokenIn Token to swap
     * @param _amountIn Amount to swap
     */
    function getAmountOut(address _tokenIn, uint _amountIn) public view returns(uint256 amountOut){
        address[] memory _path = new address[](2);
        _path[0] = _tokenIn;
        _path[1] = address(payment);
        amountOut = UniswapV2Library.getAmountsOut(factory.swapFactory(), _amountIn, _path)[1];
    }
    
    /**
     * @dev Get total purchase of a user
     * @param _user User address
     */
    function getTotalPurchase(address _user) public view returns(uint total){
        total = purchasePerRound[_user][1].add(purchasePerRound[_user][2]);
    }
    
    /**
     * @dev Get booster running now, 0 = no booster running
     */
    function boosterProgress() public view returns (uint running){
        running = 0;
        for(uint i=1; i<=2; i++){
            if(block.timestamp >= booster[i].start && block.timestamp <= booster[i].end){
                running = i;
            }
        }
    }
    
    /**
     * @dev Get total sold tokens
     */
    function sold() public view returns(uint total){
        total = 0;
        for(uint i=1; i<=2; i++){
            total = total.add(booster[i].achieve);
        }
    }
    
    /**
     * @dev Get User Allocation Token
     * @param _user User address
     */
    function getUserAllocToken(address _user) internal view returns(uint userAllocToken){
        if(whitelist[_user] > 0){
            userAllocToken = whitelist[_user];
        } else{
            userAllocToken = getUserAllocation_d8(_user).mul(sale.sub(whitelistTotalAlloc)).div(10 ** 8);
        }
    }
    
    /**
     * @dev Calculate amount in
     * @param _tokenReceived Token received amount
     * @param _amountIn Amount in to buy
     */
    function amountInCalc(uint _tokenReceived, uint _amountIn, address _user) internal view returns(uint amountInFinal, uint tokenReceivedFinal){
        if(boosterProgress() == 1){
            if(whitelist[_user] == 0){
                require(int(sale - sold() - whitelistTotalAlloc) > 0, "You are out of token sale");
                if(_tokenReceived > sale.sub(sold()).sub(whitelistTotalAlloc)){
                    _tokenReceived = sale.sub(sold()).sub(whitelistTotalAlloc);
                }
            }
        } else{
            require(sale.sub(sold()) > 0, "You are out of token sale");
            if(_tokenReceived > sale.sub(sold())){
                _tokenReceived = sale.sub(sold());
            }
        }
        _amountIn = _tokenReceived.mul(booster[boosterProgress()].price).div(10 ** tokenProjectDecimals);
        (amountInFinal, tokenReceivedFinal) = amountInCalcInner(_user, _tokenReceived, _amountIn);
    }
    
    /**
     * @dev Calculate amount in inner
     * @param _user User address
     * @param _tokenReceived Token received amount
     * @param _amountIn Amount in to buy
     */
    function amountInCalcInner(address _user, uint _tokenReceived, uint _amountIn) internal view returns(uint amountInFinal, uint tokenReceivedFinal){
        amountInFinal = _amountIn;

        uint alloc;
        if(boosterProgress() == 1){
            alloc = getUserAllocToken(_user);
        } else{
            require(_tokenReceived >= minPublicBuy, "You buy less than minPublicBuy");
            alloc = maxPublicBuy;
        }
        
        require(purchasePerRound[_user][boosterProgress()] < alloc, "You reached your buy allocation limit in this booster");
        if(purchasePerRound[_user][boosterProgress()].add(_tokenReceived) > alloc){
            amountInFinal = (alloc.sub(purchasePerRound[_user][boosterProgress()])).mul(booster[boosterProgress()].price).div(10 ** tokenProjectDecimals);
        }

        require(amountInFinal > 0, "Your buy amount is too small");
        tokenReceivedFinal = amountInFinal.mul(10 ** tokenProjectDecimals).div(booster[boosterProgress()].price);
    }

    /**
     * @dev Convert address to string
     * @param x Address to convert
     */
    function toAsciiString(address x) internal pure returns (string memory) {
        bytes memory s = new bytes(40);
        for (uint i = 0; i < 20; i++) {
            bytes1 b = bytes1(uint8(uint(uint160(x)) / (2**(8*(19 - i)))));
            bytes1 hi = bytes1(uint8(b) / 16);
            bytes1 lo = bytes1(uint8(b) - 16 * uint8(hi));
            s[2*i] = char(hi);
            s[2*i+1] = char(lo);            
        }
        return string(s);
    }
    
    function char(bytes1 b) internal pure returns (bytes1 c) {
        if (uint8(b) < 10) return bytes1(uint8(b) + 0x30);
        else return bytes1(uint8(b) + 0x57);
    }
    
    // **** MAIN AREA ****
    
    /**
     * @dev Move fund to devAddr
     */
    function moveFund() public {
        require(block.timestamp > booster[2].end, "Still in progress");
        if(payment.balanceOf(address(this)) > 0){
            TransferHelper.safeTransfer(address(payment), factory.devAddr(), payment.balanceOf(address(this)));
        }
        buyEnded = true;
    }
    
    /**
     * @dev Buy token project using native token
     * @param _path 'Native' to 'token to raise'
     */
    function buyTokenByETH(address[] calldata _path) payable isBoosterProgress isNotPaused public {
        require(eligibleCheck(msg.sender), "You are not eligible to buy");
        require(_path[0] == factory.weth() && _path[1] == address(payment), "Path not correct");
        require(totalStakedMinPrivateSale > 0, "TotalStakedMinPrivateSale haven't been set");
        
        uint buyerId = setBuyer(msg.sender);
        
        uint amountOut = getAmountOut(_path[0], msg.value);
        
        uint tokenReceived = amountOut.mul(10 ** tokenProjectDecimals).div(booster[boosterProgress()].price);
        
        (uint amountInFinal, uint tokenReceivedFinal) = amountInCalc(tokenReceived, amountOut, msg.sender);
        
        uint ethFinal = msg.value.mul(amountInFinal).div(amountOut);

        IWETH(factory.weth()).deposit{value: ethFinal}();
        
        if(ethFinal < msg.value){
            TransferHelper.safeTransferETH(msg.sender, msg.value.sub(ethFinal));
        }
        
        uint buyAmount = swapToAccepted(ethFinal, _path, address(this));
        
        invoices[msg.sender].push(Invoice(buyerId, boosterProgress(), block.timestamp, buyAmount, tokenReceivedFinal));
        
        revenue = revenue.add(buyAmount);
        purchasePerRound[msg.sender][boosterProgress()] = purchasePerRound[msg.sender][boosterProgress()].add(tokenReceivedFinal);
        booster[boosterProgress()].achieve = booster[boosterProgress()].achieve.add(tokenReceivedFinal);
        
        emit TokenBought(boosterProgress(), msg.sender, buyAmount, tokenReceivedFinal);
    }
    
    /**
     * @dev Buy token project using another token
     * @param _amountIn Buy amount
     * @param _path 'Token' to 'token to raise'
     */
    function buyTokenByToken(uint _amountIn, address[] calldata _path) isBoosterProgress isNotPaused public {
        require(eligibleCheck(msg.sender), "You are not eligible to buy");
        require(_path[0] != address(payment) && _path[0] == factory.allPayments(factory.getPaymentIndex(_path[0])) && _path[1] == address(payment), "Path not correct");
        require(totalStakedMinPrivateSale > 0, "TotalStakedMinPrivateSale haven't been set");
        
        uint buyerId = setBuyer(msg.sender);
        
        uint amountOut = getAmountOut(_path[0], _amountIn);
        
        uint tokenReceived = amountOut.mul(10 ** tokenProjectDecimals).div(booster[boosterProgress()].price);
        
        (uint amountInFinal, uint tokenReceivedFinal) = amountInCalc(tokenReceived, amountOut, msg.sender);
        
        uint buyAmount = swapToAccepted(_amountIn.mul(amountInFinal).div(amountOut), _path, address(this));
        
        invoices[msg.sender].push(Invoice(buyerId, boosterProgress(), block.timestamp, buyAmount, tokenReceivedFinal));
        
        revenue = revenue.add(buyAmount);
        purchasePerRound[msg.sender][boosterProgress()] = purchasePerRound[msg.sender][boosterProgress()].add(tokenReceivedFinal);
        booster[boosterProgress()].achieve = booster[boosterProgress()].achieve.add(tokenReceivedFinal);
        
        emit TokenBought(boosterProgress(), msg.sender, buyAmount, tokenReceivedFinal);
    }
    
    /**
     * @dev Buy token project using token raise
     * @param _amountIn Buy amount
     * @param _tokenIn token raise address
     */
    function buyToken(uint _amountIn, address _tokenIn) isBoosterProgress isNotPaused public {
        require(eligibleCheck(msg.sender), "You are not eligible to buy");
        require(_tokenIn == address(payment), "Token is different, move to buyTokenbyToken function");
        require(totalStakedMinPrivateSale > 0, "TotalStakedMinPrivateSale haven't been set");
        
        uint buyerId = setBuyer(msg.sender);
        
        uint tokenReceived = _amountIn.mul(10 ** tokenProjectDecimals).div(booster[boosterProgress()].price);
        
        (uint amountInFinal, uint tokenReceivedFinal) = amountInCalc(tokenReceived, _amountIn, msg.sender);
        
        TransferHelper.safeTransferFrom(address(payment), msg.sender, address(this), amountInFinal);
        
        invoices[msg.sender].push(Invoice(buyerId, boosterProgress(), block.timestamp, amountInFinal, tokenReceivedFinal));
        
        revenue = revenue.add(amountInFinal);
        purchasePerRound[msg.sender][boosterProgress()] = purchasePerRound[msg.sender][boosterProgress()].add(tokenReceivedFinal);
        booster[boosterProgress()].achieve = booster[boosterProgress()].achieve.add(tokenReceivedFinal);
        
        emit TokenBought(boosterProgress(), msg.sender, amountInFinal, tokenReceivedFinal);
    }

    /**
     * @dev Savior saves project by buy left tokens
     * @param _tokenAmount Token amount to buy
     */
    function saveMe(uint _tokenAmount) isBoosterProgress isNotPaused public {
        require(msg.sender == factory.savior() || msg.sender == owner, "Who are you?");
        require(boosterProgress() == 2, "Not now savior");

        uint buyerId = setBuyer(msg.sender);

        if(_tokenAmount > sale.sub(sold())) _tokenAmount = sale.sub(sold());

        invoices[msg.sender].push(Invoice(buyerId, boosterProgress(), block.timestamp, 0, _tokenAmount));
        
        purchasePerRound[msg.sender][boosterProgress()] = purchasePerRound[msg.sender][boosterProgress()].add(_tokenAmount);
        booster[boosterProgress()].achieve = booster[boosterProgress()].achieve.add(_tokenAmount);
        
        emit TokenBought(boosterProgress(), msg.sender, 0, _tokenAmount);
    }

    /**
     * @dev Set buyer id
     * @param _user User address
     */
    function setBuyer(address _user) internal returns(uint buyerId){
        if(!isBuyer(_user)){
            buyers.push(_user);
            buyerId = buyers.length.sub(1);
            
            if(bytes(recipient[_user]).length == 0){
                recipient[_user] = toAsciiString(_user);
            }
        }else{
            buyerId = invoices[_user][0].buyersIndex;
        }
    }
    
    /**
     * @dev Set recipient address
     * @param _recipient Recipient address
     */
    function setRecipient(string memory _recipient) isNotPaused public {
        require(bytes(_recipient).length != 0, "Not good");

        recipient[msg.sender] = _recipient;
    }
    
    /**
     * @dev Handle swap amount
     * @param _amountIn Buy amount
     * @param _path 'from' to 'to' token
     * @param _to Target address
     */
    function swapToAccepted(uint _amountIn, address[] calldata _path, address _to) internal returns(uint swapAmount){
        uint amountOut = getAmountOut(_path[0], _amountIn);
        
        // 0,5% slippage
        uint amountOutMin = amountOut.mul(995).div(1000);

        // deadline + 1 year
        uint deadline = block.timestamp.add(31536000);
        
        uint[] memory amounts;
        if(_path[0] == factory.weth()){
            amounts = swapExactETHForTokens(_amountIn, amountOutMin, _path, _to, deadline);
        }else{
            amounts = swapExactTokensForTokens(_amountIn, amountOutMin, _path, _to, deadline);
        }
        swapAmount = amounts[1];
    }
    
    // **** SWAP ****
    // requires the initial amount to have already been sent to the first pair
    function _swap(uint[] memory amounts, address[] memory path, address _to) internal virtual {
        for (uint i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0,) = UniswapV2Library.sortTokens(input, output);
            uint amountOut = amounts[i + 1];
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOut) : (amountOut, uint(0));
            address to = i < path.length - 2 ? UniswapV2Library.pairFor(factory.swapFactory(), output, path[i + 2]) : _to;
            IUniswapV2Pair(UniswapV2Library.pairFor(factory.swapFactory(), input, output)).swap(
                amount0Out, amount1Out, to, new bytes(0)
            );
        }
    }
    
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] memory path,
        address to,
        uint deadline
    ) internal ensure(deadline) virtual returns (uint[] memory amounts) {
        amounts = UniswapV2Library.getAmountsOut(factory.swapFactory(), amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, UniswapV2Library.pairFor(factory.swapFactory(), path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, to);
    }
 
    function swapExactETHForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] memory path,
        address to,
        uint deadline
    ) internal ensure(deadline) virtual returns (uint[] memory amounts) {
        require(path[0] == factory.weth(), 'UniswapV2Router: INVALID_PATH');
        amounts = UniswapV2Library.getAmountsOut(factory.swapFactory(), amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');
        assert(IWETH(factory.weth()).transfer(UniswapV2Library.pairFor(factory.swapFactory(), path[0], path[1]), amounts[0]));
        _swap(amounts, path, to);
    }
    
    // **** ADMIN AREA ****

    /**
     * @dev Set beginning total staked min private sale
     */
    function setTotalStakedMinPrivateSale(uint _finalStaked) public onlyOwner {
        require(block.timestamp >= calculation && totalStakedMinPrivateSale == 0, "Not now");
        
        totalStakedMinPrivateSale = _finalStaked;
    }

    /**
     * @dev Set whitelist allocation token in 6 decimals
     * @param _user User address
     * @param _allocation Token allocation in 6 decimals
     */
    function setWhitelist_d6(address[] memory _user, uint[] memory _allocation) public onlyOwner {
        require(block.timestamp < calculation && _user.length == _allocation.length, "Not good");
        
        for(uint i=0; i<_user.length; i++){
            whitelists.push(_user[i]);
            whitelist[_user[i]] = _allocation[i].mul(10 ** tokenProjectDecimals).div(10 ** 6);
            whitelistTotalAlloc = whitelistTotalAlloc.add(whitelist[_user[i]]);
        }
    }

    /**
     * @dev Update whitelist allocation token in 6 decimals
     * @param _user User address
     * @param _allocation Token allocation in 6 decimals
     */
    function updateWhitelist_d6(address _user, uint _allocation) public onlyOwner{
        require(boosterProgress() < 2 && purchasePerRound[_user][1] == 0 && whitelist[_user] > 0, "Change not allowed");
        uint oldAlloc = whitelist[_user];
        whitelist[_user] = _allocation.mul(10 ** tokenProjectDecimals).div(10 ** 6);
        whitelistTotalAlloc = whitelistTotalAlloc.sub(oldAlloc).add(whitelist[_user]);
    }

    /**
     * @dev Set Min & Max in FCFS
     * @param _minMaxPublicBuy Min and max token to buy (in 2 decimals)
     */
    function setMinMax_d2(uint[2] memory _minMaxPublicBuy) public onlyOwner{
        require(boosterProgress() != 2, "FCFS started");

        minPublicBuy = _minMaxPublicBuy[0].mul(10**tokenProjectDecimals).div(100);
        maxPublicBuy = _minMaxPublicBuy[1].mul(10**tokenProjectDecimals).div(100);
    }
    
    function transferOwnership(address _newOwner) public onlyOwner{
        require(_newOwner != address(0), "Can't assign to address(0)");
        owner = _newOwner;
    }
    
    function togglePause() public onlyOwner{
        isPaused = !isPaused;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"booster","type":"uint256"},{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"buyAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenReceived","type":"uint256"}],"name":"TokenBought","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"booster","outputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"achieve","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"boosterProgress","outputs":[{"internalType":"uint256","name":"running","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyEnded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountIn","type":"uint256"},{"internalType":"address","name":"_tokenIn","type":"address"}],"name":"buyToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_path","type":"address[]"}],"name":"buyTokenByETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountIn","type":"uint256"},{"internalType":"address[]","name":"_path","type":"address[]"}],"name":"buyTokenByToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"buyers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"contract IKommunitasPrivFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenIn","type":"address"},{"internalType":"uint256","name":"_amountIn","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_buyer","type":"address"}],"name":"getBuyerHistoryLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBuyersLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getTotalPurchase","outputs":[{"internalType":"uint256","name":"total","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"}],"name":"getUserAllocation_d8","outputs":[{"internalType":"uint256","name":"alloc","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWhitelistLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_payment","type":"address"},{"internalType":"uint256","name":"_tokenProjectDecimals","type":"uint256"},{"internalType":"uint256","name":"_sale","type":"uint256"},{"internalType":"uint256","name":"_target","type":"uint256"},{"internalType":"uint256","name":"_calculation","type":"uint256"},{"internalType":"uint256","name":"_start","type":"uint256"},{"internalType":"uint256[2]","name":"_price","type":"uint256[2]"},{"internalType":"uint256[2]","name":"_minMaxPublicBuy","type":"uint256[2]"},{"internalType":"uint256","name":"_boosterRunning","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"invoices","outputs":[{"internalType":"uint256","name":"buyersIndex","type":"uint256"},{"internalType":"uint256","name":"boosterId","type":"uint256"},{"internalType":"uint256","name":"boughtAt","type":"uint256"},{"internalType":"uint256","name":"bought","type":"uint256"},{"internalType":"uint256","name":"received","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isBuyer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPublicBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minPublicBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"moveFund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"payment","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"purchasePerRound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"recipient","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revenue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"saveMe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[2]","name":"_minMaxPublicBuy","type":"uint256[2]"}],"name":"setMinMax_d2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_recipient","type":"string"}],"name":"setRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_finalStaked","type":"uint256"}],"name":"setTotalStakedMinPrivateSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_user","type":"address[]"},{"internalType":"uint256[]","name":"_allocation","type":"uint256[]"}],"name":"setWhitelist_d6","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sold","outputs":[{"internalType":"uint256","name":"total","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"target","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenProjectDecimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakedMinPrivateSale","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":"_user","type":"address"},{"internalType":"uint256","name":"_allocation","type":"uint256"}],"name":"updateWhitelist_d6","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistTotalAlloc","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"whitelists","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

608060405234801561001057600080fd5b50600180546001600160a01b03191633179055600080546009805460ff191690556201000032026001600160b01b0319909116179055615188806100556000396000f3fe6080604052600436106102675760003560e01c80638e94af6511610144578063c45a0155116100b6578063d5fb6ed51161007a578063d5fb6ed514610a10578063e66d729214610a92578063f1b1486a14610aa7578063f2aa821814610bd7578063f2fde38b14610c01578063fe4d5add14610c3457610267565b8063c45a015514610983578063c4ae316814610998578063ca706bcf146109ad578063d205de28146109e6578063d4b83992146109fb57610267565b8063a13202e911610108578063a13202e914610839578063a56802711461084e578063b187bd2614610878578063b3651eea1461088d578063bc61221d14610935578063c369f38f1461096e57610267565b80638e94af651461075b5780639134709e14610785578063950da0c8146107be57806396cacf51146107d35780639b19251a1461080657610267565b806342f6487a116101dd5780636ad1fe02116101a15780636ad1fe021461062357806370e371d214610638578063767574361461064d57806377378df014610680578063795a16e3146106955780638da5cb5b1461074657610267565b806342f6487a146104ec57806347e0664d1461051d57806353a9792b1461056d57806357978a20146105a057806369e51c00146105b557610267565b80632ba786e41161022f5780632ba786e41461036857806330be0545146103a3578063348ca653146103b857806336a22e141461046a5780633e9491a21461047f5780634208f2a61461049457610267565b806302c7e7af1461026c5780630505c277146102935780630dad62fa146102bc578063158ef93e146103205780632a55feec14610335575b600080fd5b34801561027857600080fd5b50610281610c5e565b60408051918252519081900360200190f35b34801561029f57600080fd5b506102a8610c96565b604080519115158252519081900360200190f35b3480156102c857600080fd5b506102f5600480360360408110156102df57600080fd5b506001600160a01b038135169060200135610c9f565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b34801561032c57600080fd5b506102a8610ced565b34801561034157600080fd5b506102a86004803603602081101561035857600080fd5b50356001600160a01b0316610cf6565b34801561037457600080fd5b506103a16004803603604081101561038b57600080fd5b506001600160a01b038135169060200135610d2a565b005b3480156103af57600080fd5b50610281610e9d565b3480156103c457600080fd5b506103a160048036036101608110156103dc57600080fd5b6040805180820182526001600160a01b0384351693602081013593838201359360608301359360808401359360a081013593810192909161010083019160c0840190600290839083908082843760009201919091525050604080518082018252929594938181019392509060029083908390808284376000920191909152509194505090359150610ea39050565b34801561047657600080fd5b506103a161119e565b34801561048b57600080fd5b50610281611392565b3480156104a057600080fd5b506103a1600480360360408110156104b757600080fd5b604080518082018252918301929181830191839060029083908390808284376000920191909152509194506113989350505050565b3480156104f857600080fd5b5061050161147e565b604080516001600160a01b039092168252519081900360200190f35b34801561052957600080fd5b506105476004803603602081101561054057600080fd5b503561148d565b604080519485526020850193909352838301919091526060830152519081900360800190f35b34801561057957600080fd5b506102816004803603602081101561059057600080fd5b50356001600160a01b03166114b4565b3480156105ac57600080fd5b506102816114cf565b6103a1600480360360208110156105cb57600080fd5b810190602081018135600160201b8111156105e557600080fd5b8201836020820111156105f757600080fd5b803590602001918460208302840111600160201b8311171561061857600080fd5b5090925090506114d5565b34801561062f57600080fd5b50610281611aa4565b34801561064457600080fd5b50610281611aaa565b34801561065957600080fd5b506102816004803603602081101561067057600080fd5b50356001600160a01b0316611ab0565b34801561068c57600080fd5b50610281611aed565b3480156106a157600080fd5b506103a1600480360360208110156106b857600080fd5b810190602081018135600160201b8111156106d257600080fd5b8201836020820111156106e457600080fd5b803590602001918460018302840111600160201b8311171561070557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611af3945050505050565b34801561075257600080fd5b50610501611bab565b34801561076757600080fd5b506103a16004803603602081101561077e57600080fd5b5035611bc0565b34801561079157600080fd5b506103a1600480360360408110156107a857600080fd5b50803590602001356001600160a01b0316611c6f565b3480156107ca57600080fd5b50610281611ffe565b3480156107df57600080fd5b50610281600480360360208110156107f657600080fd5b50356001600160a01b0316612004565b34801561081257600080fd5b506102816004803603602081101561082957600080fd5b50356001600160a01b031661203f565b34801561084557600080fd5b50610281612051565b34801561085a57600080fd5b506103a16004803603602081101561087157600080fd5b5035612057565b34801561088457600080fd5b506102a86123d3565b34801561089957600080fd5b506108c0600480360360208110156108b057600080fd5b50356001600160a01b03166123e1565b6040805160208082528351818301528351919283929083019185019080838360005b838110156108fa5781810151838201526020016108e2565b50505050905090810190601f1680156109275780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561094157600080fd5b506102816004803603604081101561095857600080fd5b506001600160a01b03813516906020013561247c565b34801561097a57600080fd5b50610281612499565b34801561098f57600080fd5b5061050161249f565b3480156109a457600080fd5b506103a16124ae565b3480156109b957600080fd5b50610281600480360360408110156109d057600080fd5b506001600160a01b038135169060200135612528565b3480156109f257600080fd5b5061028161262c565b348015610a0757600080fd5b50610281612679565b348015610a1c57600080fd5b506103a160048036036040811015610a3357600080fd5b81359190810190604081016020820135600160201b811115610a5457600080fd5b820183602082011115610a6657600080fd5b803590602001918460208302840111600160201b83111715610a8757600080fd5b50909250905061267f565b348015610a9e57600080fd5b50610281612bb4565b348015610ab357600080fd5b506103a160048036036040811015610aca57600080fd5b810190602081018135600160201b811115610ae457600080fd5b820183602082011115610af657600080fd5b803590602001918460208302840111600160201b83111715610b1757600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610b6657600080fd5b820183602082011115610b7857600080fd5b803590602001918460208302840111600160201b83111715610b9957600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612bba945050505050565b348015610be357600080fd5b5061050160048036036020811015610bfa57600080fd5b5035612d8b565b348015610c0d57600080fd5b506103a160048036036020811015610c2457600080fd5b50356001600160a01b0316612db5565b348015610c4057600080fd5b5061050160048036036020811015610c5757600080fd5b5035612e97565b600060015b60028111610c92576000818152600f6020526040902060030154610c88908390612ea7565b9150600101610c63565b5090565b60095460ff1681565b60106020528160005260406000208181548110610cbb57600080fd5b600091825260209091206005909102018054600182015460028301546003840154600490940154929550909350919085565b60005460ff1681565b600d54600090610d0857506000610d25565b506001600160a01b03811660009081526010602052604090205415155b919050565b6000546201000090046001600160a01b03163314610d87576040805162461bcd60e51b81526020600482015260156024820152742cb7ba9030b932903737ba103a34329037bbb732b960591b604482015290519081900360640190fd5b6002610d9161262c565b108015610dc057506001600160a01b038216600090815260136020908152604080832060018452909152902054155b8015610de357506001600160a01b03821660009081526012602052604090205415155b610e29576040805162461bcd60e51b815260206004820152601260248201527110da185b99d9481b9bdd08185b1b1bddd95960721b604482015290519081900360640190fd5b6001600160a01b038216600090815260126020526040902054600454610e6290620f424090610e5c908590600a0a612f08565b90612f61565b6001600160a01b0384166000908152601260205260409020819055600c54610e959190610e8f9084612fa3565b90612ea7565b600c55505050565b600d5490565b6001546001600160a01b03163314610f02576040805162461bcd60e51b815260206004820152601760248201527f596f7520617265206e6f742074686520666163746f7279000000000000000000604482015290519081900360640190fd5b60005460ff1615610f50576040805162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015290519081900360640190fd5b60008111610f92576040805162461bcd60e51b815260206004820152600a602482015269043616e277420626520360b41b604482015290519081900360640190fd5b838510610fd05760405162461bcd60e51b8152600401808060200182810382526032815260200180614fa86032913960400191505060405180910390fd5b60008054600160ff199091168117909155600380546001600160a01b0319166001600160a01b038c1617905560048990556008889055600687905560078690555b60028111611158578060011415611038576000818152600f6020526040902085905561106a565b60001981016000908152600f6020526040902060019081015461105a91612ea7565b6000828152600f60205260409020555b6000818152600f60205260409020546110839083612ea7565b6000828152600f602090815260409182902060010192909255600354815163313ce56760e01b8152915161113493620f424093610e5c936001600160a01b03169263313ce56792600480840193919291829003018186803b1580156110e757600080fd5b505afa1580156110fb573d6000803e3d6000fd5b505050506040513d602081101561111157600080fd5b505160ff16600a0a8760001986016002811061112957fe5b602002015190612f08565b6000828152600f602052604081206002810192909255600390910155600101611011565b506111746064610e5c600454600a0a8560006002811061112957fe5b600a90815560045461119091606491610e5c910a856001611129565b600b55505050505050505050565b6002600052600f6020527fa74ba3945261e09fde15ba3db55005b205e61eeb4ad811ac0faa2b315bffeeae544211611211576040805162461bcd60e51b81526020600482015260116024820152705374696c6c20696e2070726f677265737360781b604482015290519081900360640190fd5b600354604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561125c57600080fd5b505afa158015611270573d6000803e3d6000fd5b505050506040513d602081101561128657600080fd5b50511115611383576003546001546040805163368271cb60e21b81529051611383936001600160a01b0390811693169163da09c72c916004808301926020929190829003018186803b1580156112db57600080fd5b505afa1580156112ef573d6000803e3d6000fd5b505050506040513d602081101561130557600080fd5b5051600354604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561135257600080fd5b505afa158015611366573d6000803e3d6000fd5b505050506040513d602081101561137c57600080fd5b5051612fe5565b6009805460ff19166001179055565b60025481565b6000546201000090046001600160a01b031633146113f5576040805162461bcd60e51b81526020600482015260156024820152742cb7ba9030b932903737ba103a34329037bbb732b960591b604482015290519081900360640190fd5b6113fd61262c565b60021415611441576040805162461bcd60e51b815260206004820152600c60248201526b1190d194c81cdd185c9d195960a21b604482015290519081900360640190fd5b61145c6064610e5c600454600a0a8460006002811061112957fe5b600a90815560045461147891606491610e5c910a846001611129565b600b5550565b6003546001600160a01b031681565b600f6020526000908152604090208054600182015460028301546003909301549192909184565b6001600160a01b031660009081526010602052604090205490565b600c5481565b600f60006114e161262c565b815260200190815260200160002060000154421015801561151f5750600f600061150961262c565b8152602001908152602001600020600101544211155b61155e576040805162461bcd60e51b815260206004820152601b6024820152600080516020614f28833981519152604482015290519081900360640190fd5b600054610100900460ff16156115b4576040805162461bcd60e51b8152602060048201526016602482015275151a1a5cc81c1c9bda9958dd081a5cc81c185d5cd95960521b604482015290519081900360640190fd5b6115bd3361314e565b61160e576040805162461bcd60e51b815260206004820152601b60248201527f596f7520617265206e6f7420656c696769626c6520746f206275790000000000604482015290519081900360640190fd5b600160009054906101000a90046001600160a01b03166001600160a01b0316633fc8cef36040518163ffffffff1660e01b815260040160206040518083038186803b15801561165c57600080fd5b505afa158015611670573d6000803e3d6000fd5b505050506040513d602081101561168657600080fd5b50516001600160a01b0316828260008161169c57fe5b905060200201356001600160a01b03166001600160a01b03161480156116f157506003546001600160a01b0316828260018181106116d657fe5b905060200201356001600160a01b03166001600160a01b0316145b611735576040805162461bcd60e51b815260206004820152601060248201526f14185d1a081b9bdd0818dbdc9c9958dd60821b604482015290519081900360640190fd5b6000600554116117765760405162461bcd60e51b815260040180806020018281038252602a815260200180615057602a913960400191505060405180910390fd5b600061178133613289565b905060006117ab8484600081811061179557fe5b905060200201356001600160a01b031634612528565b905060006117e8600f60006117be61262c565b815260200190815260200160002060020154610e5c600454600a0a85612f0890919063ffffffff16565b90506000806117f883853361339c565b9092509050600061180d85610e5c3486612f08565b9050600160009054906101000a90046001600160a01b03166001600160a01b0316633fc8cef36040518163ffffffff1660e01b815260040160206040518083038186803b15801561185d57600080fd5b505afa158015611871573d6000803e3d6000fd5b505050506040513d602081101561188757600080fd5b505160408051630d0e30db60e41b815290516001600160a01b039092169163d0e30db0918491600480830192600092919082900301818588803b1580156118cd57600080fd5b505af11580156118e1573d6000803e3d6000fd5b50505050503481101561190157611901336118fc3484612fa3565b613530565b600061190f828a8a30613623565b33600090815260106020908152604091829020825160a081019093528a8352929350810161193b61262c565b815242602080830191909152604080830186905260609283018890528454600181810187556000968752958390208551600590920201908155918401519482019490945592820151600280850191909155908201516003840155608090910151600490920191909155546119af9082612ea7565b6002553360009081526013602052604081206119ed918591906119d061262c565b815260200190815260200160002054612ea790919063ffffffff16565b33600090815260136020526040812090611a0561262c565b815260200190815260200160002081905550611a4783600f6000611a2761262c565b815260200190815260200160002060030154612ea790919063ffffffff16565b600f6000611a5361262c565b815260208101919091526040016000206003015533611a7061262c565b60408051848152602081018790528151600080516020614f08833981519152929181900390910190a3505050505050505050565b60085481565b60045481565b6001600160a01b038116600090815260136020908152604080832060028452909152808220546001835290822054611ae791612ea7565b92915050565b60055481565b600054610100900460ff1615611b49576040805162461bcd60e51b8152602060048201526016602482015275151a1a5cc81c1c9bda9958dd081a5cc81c185d5cd95960521b604482015290519081900360640190fd5b8051611b87576040805162461bcd60e51b8152602060048201526008602482015267139bdd0819dbdbd960c21b604482015290519081900360640190fd5b3360009081526011602090815260409091208251611ba792840190614e6f565b5050565b6000546201000090046001600160a01b031681565b6000546201000090046001600160a01b03163314611c1d576040805162461bcd60e51b81526020600482015260156024820152742cb7ba9030b932903737ba103a34329037bbb732b960591b604482015290519081900360640190fd5b6007544210158015611c2f5750600554155b611c6a576040805162461bcd60e51b81526020600482015260076024820152664e6f74206e6f7760c81b604482015290519081900360640190fd5b600555565b600f6000611c7b61262c565b8152602001908152602001600020600001544210158015611cb95750600f6000611ca361262c565b8152602001908152602001600020600101544211155b611cf8576040805162461bcd60e51b815260206004820152601b6024820152600080516020614f28833981519152604482015290519081900360640190fd5b600054610100900460ff1615611d4e576040805162461bcd60e51b8152602060048201526016602482015275151a1a5cc81c1c9bda9958dd081a5cc81c185d5cd95960521b604482015290519081900360640190fd5b611d573361314e565b611da8576040805162461bcd60e51b815260206004820152601b60248201527f596f7520617265206e6f7420656c696769626c6520746f206275790000000000604482015290519081900360640190fd5b6003546001600160a01b03828116911614611df45760405162461bcd60e51b81526004018080602001828103825260348152602001806150236034913960400191505060405180910390fd5b600060055411611e355760405162461bcd60e51b815260040180806020018281038252602a815260200180615057602a913960400191505060405180910390fd5b6000611e4033613289565b90506000611e7d600f6000611e5361262c565b815260200190815260200160002060020154610e5c600454600a0a87612f0890919063ffffffff16565b9050600080611e8d83873361339c565b6003549193509150611eaa906001600160a01b03163330856137d6565b33600090815260106020908152604091829020825160a0810190935286835291908101611ed561262c565b81524260208083019190915260408083018790526060928301869052845460018181018755600096875295839020855160059092020190815591840151948201949094559282015160028085019190915590820151600384015560809091015160049092019190915554611f499083612ea7565b600255336000908152601360205260408120611f6a918391906119d061262c565b33600090815260136020526040812090611f8261262c565b815260200190815260200160002081905550611fa481600f6000611a2761262c565b600f6000611fb061262c565b815260208101919091526040016000206003015533611fcd61262c565b60408051858152602081018590528151600080516020614f08833981519152929181900390910190a3505050505050565b60075481565b600061200f8261314e565b15610d255760008061202084613932565b909250905061203781610e5c846305f5e100612f08565b949350505050565b60126020526000908152604090205481565b600e5490565b600f600061206361262c565b81526020019081526020016000206000015442101580156120a15750600f600061208b61262c565b8152602001908152602001600020600101544211155b6120e0576040805162461bcd60e51b815260206004820152601b6024820152600080516020614f28833981519152604482015290519081900360640190fd5b600054610100900460ff1615612136576040805162461bcd60e51b8152602060048201526016602482015275151a1a5cc81c1c9bda9958dd081a5cc81c185d5cd95960521b604482015290519081900360640190fd5b600160009054906101000a90046001600160a01b03166001600160a01b031663dfa78bf56040518163ffffffff1660e01b815260040160206040518083038186803b15801561218457600080fd5b505afa158015612198573d6000803e3d6000fd5b505050506040513d60208110156121ae57600080fd5b50516001600160a01b03163314806121d657506000546201000090046001600160a01b031633145b612216576040805162461bcd60e51b815260206004820152600c60248201526b57686f2061726520796f753f60a01b604482015290519081900360640190fd5b61221e61262c565b600214612263576040805162461bcd60e51b815260206004820152600e60248201526d2737ba103737bb9039b0bb34b7b960911b604482015290519081900360640190fd5b600061226e33613289565b905061228461227b610c5e565b60085490612fa3565b8211156122995761229661227b610c5e565b91505b33600090815260106020908152604091829020825160a08101909352838352919081016122c461262c565b815242602080830191909152600060408084018290526060938401889052855460018181018855968352838320865160059092020190815585840151968101969096558481015160028701559284015160038601556080909301516004909401939093553382526013909252908120612342918491906119d061262c565b3360009081526013602052604081209061235a61262c565b81526020019081526020016000208190555061237c82600f6000611a2761262c565b600f600061238861262c565b8152602081019190915260400160002060030155336123a561262c565b6040805160008152602081018690528151600080516020614f08833981519152929181900390910190a35050565b600054610100900460ff1681565b60116020908152600091825260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845290918301828280156124745780601f1061244957610100808354040283529160200191612474565b820191906000526020600020905b81548152906001019060200180831161245757829003601f168201915b505050505081565b601360209081526000928352604080842090915290825290205481565b600b5481565b6001546001600160a01b031681565b6000546201000090046001600160a01b0316331461250b576040805162461bcd60e51b81526020600482015260156024820152742cb7ba9030b932903737ba103a34329037bbb732b960591b604482015290519081900360640190fd5b6000805461ff001981166101009182900460ff1615909102179055565b60408051600280825260608201835260009283929190602083019080368337019050509050838160008151811061255b57fe5b6001600160a01b03928316602091820292909201015260035482519116908290600190811061258657fe5b6001600160a01b0392831660209182029290920181019190915260015460408051631e513e5160e21b8152905161260f949290921692637944f94492600480840193829003018186803b1580156125dc57600080fd5b505afa1580156125f0573d6000803e3d6000fd5b505050506040513d602081101561260657600080fd5b5051848361397b565b60018151811061261b57fe5b602002602001015191505092915050565b600060015b60028111610c92576000818152600f6020526040902054421080159061266857506000818152600f60205260409020600101544211155b15612671578091505b600101612631565b60065481565b600f600061268b61262c565b81526020019081526020016000206000015442101580156126c95750600f60006126b361262c565b8152602001908152602001600020600101544211155b612708576040805162461bcd60e51b815260206004820152601b6024820152600080516020614f28833981519152604482015290519081900360640190fd5b600054610100900460ff161561275e576040805162461bcd60e51b8152602060048201526016602482015275151a1a5cc81c1c9bda9958dd081a5cc81c185d5cd95960521b604482015290519081900360640190fd5b6127673361314e565b6127b8576040805162461bcd60e51b815260206004820152601b60248201527f596f7520617265206e6f7420656c696769626c6520746f206275790000000000604482015290519081900360640190fd5b6003546001600160a01b031682826000816127cf57fe5b905060200201356001600160a01b03166001600160a01b03161415801561292457506001546001600160a01b031663c849844a816315a7584c858560008161281357fe5b905060200201356001600160a01b03166040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561286057600080fd5b505afa158015612874573d6000803e3d6000fd5b505050506040513d602081101561288a57600080fd5b5051604080516001600160e01b031960e085901b1681526004810192909252516024808301926020929190829003018186803b1580156128c957600080fd5b505afa1580156128dd573d6000803e3d6000fd5b505050506040513d60208110156128f357600080fd5b50516001600160a01b0316828260008161290957fe5b905060200201356001600160a01b03166001600160a01b0316145b801561295f57506003546001600160a01b03168282600181811061294457fe5b905060200201356001600160a01b03166001600160a01b0316145b6129a3576040805162461bcd60e51b815260206004820152601060248201526f14185d1a081b9bdd0818dbdc9c9958dd60821b604482015290519081900360640190fd5b6000600554116129e45760405162461bcd60e51b815260040180806020018281038252602a815260200180615057602a913960400191505060405180910390fd5b60006129ef33613289565b90506000612a1984846000818110612a0357fe5b905060200201356001600160a01b031686612528565b90506000612a2c600f60006117be61262c565b9050600080612a3c83853361339c565b90925090506000612a5c612a5486610e5c8c87612f08565b898930613623565b33600090815260106020908152604091829020825160a081019093528983529293508101612a8861262c565b81524260208083019190915260408083018690526060928301879052845460018181018755600096875295839020855160059092020190815591840151948201949094559282015160028085019190915590820151600384015560809091015160049092019190915554612afc9082612ea7565b600255336000908152601360205260408120612b1d918491906119d061262c565b33600090815260136020526040812090612b3561262c565b815260200190815260200160002081905550612b5782600f6000611a2761262c565b600f6000612b6361262c565b815260208101919091526040016000206003015533612b8061262c565b60408051848152602081018690528151600080516020614f08833981519152929181900390910190a3505050505050505050565b600a5481565b6000546201000090046001600160a01b03163314612c17576040805162461bcd60e51b81526020600482015260156024820152742cb7ba9030b932903737ba103a34329037bbb732b960591b604482015290519081900360640190fd5b60075442108015612c29575080518251145b612c65576040805162461bcd60e51b8152602060048201526008602482015267139bdd0819dbdbd960c21b604482015290519081900360640190fd5b60005b8251811015612d8657600e838281518110612c7f57fe5b60209081029190910181015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b039092169190911790556004548251612cf291620f424091610e5c91600a0a90869086908110612cdc57fe5b6020026020010151612f0890919063ffffffff16565b60126000858481518110612d0257fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550612d7b60126000858481518110612d4157fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054600c54612ea790919063ffffffff16565b600c55600101612c68565b505050565b600d8181548110612d9b57600080fd5b6000918252602090912001546001600160a01b0316905081565b6000546201000090046001600160a01b03163314612e12576040805162461bcd60e51b81526020600482015260156024820152742cb7ba9030b932903737ba103a34329037bbb732b960591b604482015290519081900360640190fd5b6001600160a01b038116612e6d576040805162461bcd60e51b815260206004820152601a60248201527f43616e27742061737369676e20746f2061646472657373283029000000000000604482015290519081900360640190fd5b600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b600e8181548110612d9b57600080fd5b600082820183811015612f01576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b600082612f1757506000611ae7565b82820282848281612f2457fe5b0414612f015760405162461bcd60e51b81526004018080602001828103825260218152602001806150026021913960400191505060405180910390fd5b6000612f0183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613ac7565b6000612f0183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613b69565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1781529251825160009485949389169392918291908083835b602083106130615780518252601f199092019160209182019101613042565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146130c3576040519150601f19603f3d011682016040523d82523d6000602084013e6130c8565b606091505b50915091508180156130f65750805115806130f657508080602001905160208110156130f357600080fd5b50515b613147576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b600061315861262c565b600114801561317e57506001600160a01b03821660009081526012602052604090205415155b1561318b57506001610d25565b600061319683613932565b509050600160009054906101000a90046001600160a01b03166001600160a01b031663886117366040518163ffffffff1660e01b815260040160206040518083038186803b1580156131e757600080fd5b505afa1580156131fb573d6000803e3d6000fd5b505050506040513d602081101561321157600080fd5b5051604080516305072b7560e11b815290516001600160a01b0390921691630a0e56ea91600480820192602092909190829003018186803b15801561325557600080fd5b505afa158015613269573d6000803e3d6000fd5b505050506040513d602081101561327f57600080fd5b5051111592915050565b600061329482610cf6565b61336057600d80546001808201835560008390527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb590910180546001600160a01b0319166001600160a01b03861617905590546132f091612fa3565b6001600160a01b0383166000908152601160205260409020549091506002600019610100600184161502019091160461335b5761332c82613bc3565b6001600160a01b038316600090815260116020908152604090912082516133599391929190910190614e6f565b505b610d25565b6001600160a01b0382166000908152601060205260408120805490919061338357fe5b9060005260206000209060050201600001549050919050565b6000806133a761262c565b60011415613463576001600160a01b03831660009081526012602052604090205461345e576000600c546133d9610c5e565b60085403031361342c576040805162461bcd60e51b8152602060048201526019602482015278596f7520617265206f7574206f6620746f6b656e2073616c6560381b604482015290519081900360640190fd5b613443600c5461343d61227b610c5e565b90612fa3565b85111561345e5761345b600c5461343d61227b610c5e565b94505b6134de565b600061347061227b610c5e565b116134be576040805162461bcd60e51b8152602060048201526019602482015278596f7520617265206f7574206f6620746f6b656e2073616c6560381b604482015290519081900360640190fd5b6134c961227b610c5e565b8511156134de576134db61227b610c5e565b94505b613517600454600a0a610e5c600f60006134f661262c565b81526020019081526020016000206002015488612f0890919063ffffffff16565b9350613524838686613cb8565b90969095509350505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b6020831061357c5780518252601f19909201916020918201910161355d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146135de576040519150601f19603f3d011682016040523d82523d6000602084013e6135e3565b606091505b5050905080612d865760405162461bcd60e51b81526004018080602001828103825260238152602001806150b66023913960400191505060405180910390fd5b60008061364c8585600081811061363657fe5b905060200201356001600160a01b031687612528565b905060006136626103e8610e5c846103e3612f08565b90506000613674426301e13380612ea7565b90506060600160009054906101000a90046001600160a01b03166001600160a01b0316633fc8cef36040518163ffffffff1660e01b815260040160206040518083038186803b1580156136c657600080fd5b505afa1580156136da573d6000803e3d6000fd5b505050506040513d60208110156136f057600080fd5b50516001600160a01b0316888860008161370657fe5b905060200201356001600160a01b03166001600160a01b0316141561376e5761376789848a8a808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508c9250889150613eef9050565b90506137b3565b6137b089848a8a808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508c92508891506142d29050565b90505b806001815181106137c057fe5b6020026020010151945050505050949350505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b178152925182516000948594938a169392918291908083835b6020831061385a5780518252601f19909201916020918201910161383b565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146138bc576040519150601f19603f3d011682016040523d82523d6000602084013e6138c1565b606091505b50915091508180156138ef5750805115806138ef57508080602001905160208110156138ec57600080fd5b50515b61392a5760405162461bcd60e51b81526004018080602001828103825260248152602001806151046024913960400191505060405180910390fd5b505050505050565b600080600080613943600086614495565b91509150600080613955600188614495565b90925090506139648483612ea7565b95506139708382612ea7565b945050505050915091565b60606002825110156139d4576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff811180156139ec57600080fd5b50604051908082528060200260200182016040528015613a16578160200160208202803683370190505b5090508281600081518110613a2757fe5b60200260200101818152505060005b6001835103811015613abf57600080613a7987868581518110613a5557fe5b6020026020010151878660010181518110613a6c57fe5b60200260200101516147de565b91509150613a9b848481518110613a8c57fe5b602002602001015183836148ac565b848460010181518110613aaa57fe5b60209081029190910101525050600101613a36565b509392505050565b60008183613b535760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613b18578181015183820152602001613b00565b50505050905090810190601f168015613b455780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613b5f57fe5b0495945050505050565b60008184841115613bbb5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613b18578181015183820152602001613b00565b505050900390565b60408051602880825260608281019093526000919060208201818036833701905050905060005b6014811015613cb15760008160130360080260020a856001600160a01b031681613c1057fe5b0460f81b9050600060108260f81c60ff1681613c2857fe5b0460f81b905060008160f81c6010028360f81c0360f81b9050613c4a8261497e565b858560020281518110613c5957fe5b60200101906001600160f81b031916908160001a905350613c798161497e565b858560020260010181518110613c8b57fe5b60200101906001600160f81b031916908160001a9053505060019092019150613bea9050565b5092915050565b80600080613cc461262c565b60011415613cdc57613cd5866149af565b9050613d38565b600a54851015613d33576040805162461bcd60e51b815260206004820152601e60248201527f596f7520627579206c657373207468616e206d696e5075626c69634275790000604482015290519081900360640190fd5b50600b545b6001600160a01b03861660009081526013602052604081208291613d5a61262c565b81526020019081526020016000205410613da55760405162461bcd60e51b81526004018080602001828103825260358152602001806150816035913960400191505060405180910390fd5b6001600160a01b03861660009081526013602052604081208291613dcd9188916119d061262c565b1115613e5657613e53600454600a0a610e5c600f6000613deb61262c565b815260200190815260200160002060020154613e4d601360008c6001600160a01b03166001600160a01b031681526020019081526020016000206000613e2f61262c565b81526020019081526020016000205486612fa390919063ffffffff16565b90612f08565b92505b60008311613eab576040805162461bcd60e51b815260206004820152601c60248201527f596f75722062757920616d6f756e7420697320746f6f20736d616c6c00000000604482015290519081900360640190fd5b613ee4600f6000613eba61262c565b815260200190815260200160002060020154610e5c600454600a0a86612f0890919063ffffffff16565b915050935093915050565b60608142811015613f42576040805162461bcd60e51b8152602060048201526018602482015277155b9a5cddd85c158c949bdd5d195c8e881156141254915160421b604482015290519081900360640190fd5b600160009054906101000a90046001600160a01b03166001600160a01b0316633fc8cef36040518163ffffffff1660e01b815260040160206040518083038186803b158015613f9057600080fd5b505afa158015613fa4573d6000803e3d6000fd5b505050506040513d6020811015613fba57600080fd5b505185516001600160a01b03909116908690600090613fd557fe5b60200260200101516001600160a01b031614614038576040805162461bcd60e51b815260206004820152601d60248201527f556e69737761705632526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b60015460408051631e513e5160e21b815290516140b1926001600160a01b031691637944f944916004808301926020929190829003018186803b15801561407e57600080fd5b505afa158015614092573d6000803e3d6000fd5b505050506040513d60208110156140a857600080fd5b5051888761397b565b915085826001845103815181106140c457fe5b602002602001015110156141095760405162461bcd60e51b815260040180806020018281038252602b8152602001806150d9602b913960400191505060405180910390fd5b600160009054906101000a90046001600160a01b03166001600160a01b0316633fc8cef36040518163ffffffff1660e01b815260040160206040518083038186803b15801561415757600080fd5b505afa15801561416b573d6000803e3d6000fd5b505050506040513d602081101561418157600080fd5b505160015460408051631e513e5160e21b815290516001600160a01b039384169363a9059cbb9361423093911691637944f94491600480820192602092909190829003018186803b1580156141d557600080fd5b505afa1580156141e9573d6000803e3d6000fd5b505050506040513d60208110156141ff57600080fd5b50518851899060009061420e57fe5b60200260200101518960018151811061422357fe5b6020026020010151614a17565b8460008151811061423d57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561428b57600080fd5b505af115801561429f573d6000803e3d6000fd5b505050506040513d60208110156142b557600080fd5b50516142bd57fe5b6142c8828686614abe565b5095945050505050565b60608142811015614325576040805162461bcd60e51b8152602060048201526018602482015277155b9a5cddd85c158c949bdd5d195c8e881156141254915160421b604482015290519081900360640190fd5b60015460408051631e513e5160e21b8152905161436b926001600160a01b031691637944f944916004808301926020929190829003018186803b15801561407e57600080fd5b9150858260018451038151811061437e57fe5b602002602001015110156143c35760405162461bcd60e51b815260040180806020018281038252602b8152602001806150d9602b913960400191505060405180910390fd5b6142bd856000815181106143d357fe5b60200260200101513361447b600160009054906101000a90046001600160a01b03166001600160a01b0316637944f9446040518163ffffffff1660e01b815260040160206040518083038186803b15801561442d57600080fd5b505afa158015614441573d6000803e3d6000fd5b505050506040513d602081101561445757600080fd5b505189518a9060009061446657fe5b60200260200101518a60018151811061422357fe5b8560008151811061448857fe5b60200260200101516137d6565b600080808460018111156144a557fe5b141561468457600160009054906101000a90046001600160a01b03166001600160a01b031663f556a79c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156144f957600080fd5b505afa15801561450d573d6000803e3d6000fd5b505050506040513d602081101561452357600080fd5b50516040805163570d00d160e11b81526001600160a01b0386811660048301529151919092169163ae1a01a2916024808301926020929190829003018186803b15801561456f57600080fd5b505afa158015614583573d6000803e3d6000fd5b505050506040513d602081101561459957600080fd5b505160015460408051633d55a9e760e21b815290519294506001600160a01b039091169163f556a79c91600480820192602092909190829003018186803b1580156145e357600080fd5b505afa1580156145f7573d6000803e3d6000fd5b505050506040513d602081101561460d57600080fd5b50516040805163debc431760e01b815290516001600160a01b039092169163debc431791600480820192602092909190829003018186803b15801561465157600080fd5b505afa158015614665573d6000803e3d6000fd5b505050506040513d602081101561467b57600080fd5b505190506147d7565b600184600181111561469257fe5b14156147a057600160009054906101000a90046001600160a01b03166001600160a01b031663886117366040518163ffffffff1660e01b815260040160206040518083038186803b1580156146e657600080fd5b505afa1580156146fa573d6000803e3d6000fd5b505050506040513d602081101561471057600080fd5b5051600754604080516346fce4b160e11b81526001600160a01b038781166004830152602482019390935290519190921691638df9c962916044808301926020929190829003018186803b15801561476757600080fd5b505afa15801561477b573d6000803e3d6000fd5b505050506040513d602081101561479157600080fd5b505160055490925090506147d7565b60405162461bcd60e51b815260040180806020018281038252603b815260200180614f6d603b913960400191505060405180910390fd5b9250929050565b60008060006147ed8585614d98565b5090506000806147fe888888614a17565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561483657600080fd5b505afa15801561484a573d6000803e3d6000fd5b505050506040513d606081101561486057600080fd5b5080516020909101516dffffffffffffffffffffffffffff91821693501690506001600160a01b038781169084161461489a57808261489d565b81815b90999098509650505050505050565b60008084116148ec5760405162461bcd60e51b815260040180806020018281038252602b815260200180615128602b913960400191505060405180910390fd5b6000831180156148fc5750600082115b6149375760405162461bcd60e51b8152600401808060200182810382526028815260200180614fda6028913960400191505060405180910390fd5b6000614945856103e5612f08565b905060006149538285612f08565b9050600061496783610e8f886103e8612f08565b905080828161497257fe5b04979650505050505050565b6000600a60f883901c101561499e578160f81c60300160f81b9050610d25565b8160f81c60570160f81b9050610d25565b6001600160a01b038116600090815260126020526040812054156149ec57506001600160a01b038116600090815260126020526040902054610d25565b611ae76305f5e100610e5c614a0e600c54600854612fa390919063ffffffff16565b613e4d86612004565b6000806000614a268585614d98565b91509150856001600160a01b031663e6a4390583836040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b158015614a8857600080fd5b505afa158015614a9c573d6000803e3d6000fd5b505050506040513d6020811015614ab257600080fd5b50519695505050505050565b60005b6001835103811015614d9257600080848381518110614adc57fe5b6020026020010151858460010181518110614af357fe5b6020026020010151915091506000614b0b8383614d98565b5090506000878560010181518110614b1f57fe5b60200260200101519050600080836001600160a01b0316866001600160a01b031614614b4d57826000614b51565b6000835b91509150600060028a51038810614b685788614bed565b60015460408051631e513e5160e21b81529051614bed926001600160a01b031691637944f944916004808301926020929190829003018186803b158015614bae57600080fd5b505afa158015614bc2573d6000803e3d6000fd5b505050506040513d6020811015614bd857600080fd5b50518b5188908d9060028d0190811061422357fe5b9050614c73600160009054906101000a90046001600160a01b03166001600160a01b0316637944f9446040518163ffffffff1660e01b815260040160206040518083038186803b158015614c4057600080fd5b505afa158015614c54573d6000803e3d6000fd5b505050506040513d6020811015614c6a57600080fd5b50518888614a17565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015614cb0576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015614d18578181015183820152602001614d00565b50505050905090810190601f168015614d455780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015614d6757600080fd5b505af1158015614d7b573d6000803e3d6000fd5b505060019099019850614ac1975050505050505050565b50505050565b600080826001600160a01b0316846001600160a01b03161415614dec5760405162461bcd60e51b8152600401808060200182810382526025815260200180614f486025913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b031610614e0c578284614e0f565b83835b90925090506001600160a01b0382166147d7576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f414444524553530000604482015290519081900360640190fd5b828054600181600116156101000203166002900490600052602060002090601f016020900481019282614ea55760008555614eeb565b82601f10614ebe57805160ff1916838001178555614eeb565b82800160010185558215614eeb579182015b82811115614eeb578251825591602001919060010190614ed0565b50610c929291505b80821115610c925760008155600101614ef356fe3c027c045e3796f01c651fff484d89bbb7f28cbbcc98a20de6d5cb38543a753f4e6f7420696e20616e7920626f6f737465722070726f67726573730000000000556e697377617056324c6962726172793a204944454e544943414c5f414444524553534553496e76616c6964205374616b696e672043686f6963652e204e6565647320746f2062652065697468657220302028563129206f722031202856322943616c63756c6174696f6e206d75737420626520646f6e65206265666f726520626f6f737465722069732073746172746564556e697377617056324c6962726172793a20494e53554646494349454e545f4c4951554944495459536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77546f6b656e20697320646966666572656e742c206d6f766520746f20627579546f6b656e6279546f6b656e2066756e6374696f6e546f74616c5374616b65644d696e5072697661746553616c6520686176656e2774206265656e20736574596f75207265616368656420796f75722062757920616c6c6f636174696f6e206c696d697420696e207468697320626f6f737465725472616e7366657248656c7065723a204554485f5452414e534645525f4641494c4544556e69737761705632526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544556e697377617056324c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e54a2646970667358221220a4a13b07a7b3ab15a16348ead582e503ccde7b9f46739401459ddb442d58774064736f6c63430007060033

Deployed ByteCode Sourcemap

30768:24504:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39231:173;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;31236:20;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;31749:45;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;31749:45:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30841:23;;;;;;;;;;;;;:::i;37918:158::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37918:158:0;-1:-1:-1;;;;;37918:158:0;;:::i;54131:424::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;54131:424:0;;;;;;;;:::i;:::-;;35333:91;;;;;;;;;;;;;:::i;33761:1293::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33761:1293:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33761:1293:0;;;;;;;;;;;;;;;;;-1:-1:-1;33761:1293:0;;;;;;;;;;;;;;;;;;-1:-1:-1;33761:1293:0;;-1:-1:-1;;33761:1293:0;;;-1:-1:-1;33761:1293:0;;-1:-1:-1;33761:1293:0:i;42987:309::-;;;;;;;;;;;;;:::i;31016:19::-;;;;;;;;;;;;;:::i;54689:307::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54689:307:0;;-1:-1:-1;54689:307:0;;-1:-1:-1;;;;54689:307:0:i;31042:20::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;31042:20:0;;;;;;;;;;;;;;31705:37;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31705:37:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35506:121;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35506:121:0;-1:-1:-1;;;;;35506:121:0;;:::i;31325:31::-;;;;;;;;;;;;;:::i;43426:1622::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;43426:1622:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;43426:1622:0;;;;;;;;;;-1:-1:-1;43426:1622:0;;-1:-1:-1;43426:1622:0;-1:-1:-1;43426:1622:0;:::i;31213:16::-;;;;;;;;;;;;;:::i;31075:32::-;;;;;;;;;;;;;:::i;38645:157::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38645:157:0;-1:-1:-1;;;;;38645:157:0;;:::i;31114:37::-;;;;;;;;;;;;;:::i;49657:183::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;49657:183:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;49657:183:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49657:183:0;;-1:-1:-1;49657:183:0;;-1:-1:-1;;;;;49657:183:0:i;30904:20::-;;;;;;;;;;;;;:::i;53055:238::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53055:238:0;;:::i;46833:1313::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46833:1313:0;;;;;;-1:-1:-1;;;;;46833:1313:0;;:::i;31183:23::-;;;;;;;;;;;;;:::i;36564:297::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36564:297:0;-1:-1:-1;;;;;36564:297:0;;:::i;31851:41::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31851:41:0;-1:-1:-1;;;;;31851:41:0;;:::i;35157:98::-;;;;;;;;;;;;;:::i;48273:787::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48273:787:0;;:::i;30871:20::-;;;;;;;;;;;;;:::i;31801:43::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31801:43:0;-1:-1:-1;;;;;31801:43:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31899:65;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;31899:65:0;;;;;;;;:::i;31294:24::-;;;;;;;;;;;;;:::i;30931:37::-;;;;;;;;;;;;;:::i;55191:78::-;;;;;;;;;;;;;:::i;38220:319::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;38220:319:0;;;;;;;;:::i;38893:273::-;;;;;;;;;;;;;:::i;31158:18::-;;;;;;;;;;;;;:::i;45214:1460::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;45214:1460:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;45214:1460:0;;;;;;;;;;-1:-1:-1;45214:1460:0;;-1:-1:-1;45214:1460:0;-1:-1:-1;45214:1460:0;:::i;31263:24::-;;;;;;;;;;;;;:::i;53469:483::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;53469:483:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;53469:483:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53469:483:0;;;;;;;;-1:-1:-1;53469:483:0;;-1:-1:-1;;;;;53469:483:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;53469:483:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53469:483:0;;-1:-1:-1;53469:483:0;;-1:-1:-1;;;;;53469:483:0:i;31363:23::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31363:23:0;;:::i;55008:171::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55008:171:0;-1:-1:-1;;;;;55008:171:0;;:::i;31393:27::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31393:27:0;;:::i;39231:173::-;39267:10;39320:1;39309:88;39326:1;39323;:4;39309:88;;39366:10;;;;:7;:10;;;;;:18;;;39356:29;;:5;;:9;:29::i;:::-;39348:37;-1:-1:-1;39329:3:0;;39309:88;;;;39231:173;:::o;31236:20::-;;;;;;:::o;31749:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31749:45:0;;-1:-1:-1;31749:45:0;;;:::o;30841:23::-;;;;;;:::o;37918:158::-;37990:6;:13;37971:4;;37987:35;;-1:-1:-1;38017:5:0;38010:12;;37987:35;-1:-1:-1;;;;;;38041:15:0;;38066:1;38041:15;;;:8;:15;;;;;:22;:26;;37918:158;;;;:::o;54131:424::-;32028:5;;;;;-1:-1:-1;;;;;32028:5:0;32014:10;:19;32006:53;;;;;-1:-1:-1;;;32006:53:0;;;;;;;;;;;;-1:-1:-1;;;32006:53:0;;;;;;;;;;;;;;;54247:1:::1;54227:17;:15;:17::i;:::-;:21;:56;;;;-1:-1:-1::0;;;;;;54252:23:0;::::1;;::::0;;;:16:::1;:23;::::0;;;;;;;54276:1:::1;54252:26:::0;;;;;;;;:31;54227:56:::1;:80;;;;-1:-1:-1::0;;;;;;54287:16:0;::::1;54306:1;54287:16:::0;;;:9:::1;:16;::::0;;;;;:20;;54227:80:::1;54219:111;;;::::0;;-1:-1:-1;;;54219:111:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;54219:111:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;54357:16:0;::::1;54341:13;54357:16:::0;;;:9:::1;:16;::::0;;;;;54425:20:::1;::::0;54403:56:::1;::::0;54451:7:::1;::::0;54403:43:::1;::::0;:11;;54419:2:::1;:26;54403:15;:43::i;:::-;:47:::0;::::1;:56::i;:::-;-1:-1:-1::0;;;;;54384:16:0;::::1;;::::0;;;:9:::1;:16;::::0;;;;:75;;;54492:19:::1;::::0;:55:::1;::::0;54384:75;54492:33:::1;::::0;54516:8;54492:23:::1;:33::i;:::-;:37:::0;::::1;:55::i;:::-;54470:19;:77:::0;-1:-1:-1;;;54131:424:0:o;35333:91::-;35403:6;:13;35333:91;:::o;33761:1293::-;32152:7;;-1:-1:-1;;;;;32152:7:0;32130:10;:30;32122:66;;;;;-1:-1:-1;;;32122:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;32265:11:::1;::::0;::::1;;32264:12;32256:44;;;::::0;;-1:-1:-1;;;32256:44:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;32256:44:0;;;;;;;;;;;;;::::1;;34123:1:::2;34105:15;:19;34097:42;;;::::0;;-1:-1:-1;;;34097:42:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;34097:42:0;;;;;;;;;;;;;::::2;;34173:6;34158:12;:21;34150:84;;;;-1:-1:-1::0;;;34150:84:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34255:11;:18:::0;;34269:4:::2;-1:-1:-1::0;;34255:18:0;;::::2;::::0;::::2;::::0;;;34294:7:::2;:25:::0;;-1:-1:-1;;;;;;34294:25:0::2;-1:-1:-1::0;;;;;34294:25:0;::::2;;::::0;;34330:20:::2;:44:::0;;;34385:4:::2;:12:::0;;;34408:6:::2;:16:::0;;;34435:11:::2;:26:::0;;;34482:387:::2;34499:1;34496;:4;34482:387;;34524:1;34527;34524:4;34521:149;;;34548:10;::::0;;;:7:::2;:10;::::0;;;;:25;;;34521:149:::2;;;-1:-1:-1::0;;34639:3:0;;34631:12:::2;::::0;;;:7:::2;:12;::::0;;;;34652:1:::2;34631:16:::0;;::::2;::::0;:23:::2;::::0;:20:::2;:23::i;:::-;34612:10;::::0;;;:7:::2;:10;::::0;;;;:42;34521:149:::2;34701:10;::::0;;;:7:::2;:10;::::0;;;;:16;:37:::2;::::0;34722:15;34701:20:::2;:37::i;:::-;34684:10;::::0;;;:7:::2;:10;::::0;;;;;;;;:14:::2;;:54:::0;;;;34792:7:::2;::::0;:18;;-1:-1:-1;;;34792:18:0;;;;34772:48:::2;::::0;34816:3:::2;::::0;34772:39:::2;::::0;-1:-1:-1;;;;;34792:7:0::2;::::0;:16:::2;::::0;:18:::2;::::0;;::::2;::::0;34684:10;;34792:18;;;;;;:7;:18;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;34792:18:0;34788:22:::2;;:2;:22;34772:6:::0;-1:-1:-1;;34779:3:0;;34772:11:::2;::::0;::::2;;;;;;;;::::0;;:15:::2;:39::i;:48::-;34753:10;::::0;;;:7:::2;:10;::::0;;;;:16:::2;::::0;::::2;:67:::0;;;;34835:18:::2;::::0;;::::2;:22:::0;34502:3:::2;;34482:387;;;;34904:58;34958:3;34904:49;34932:20;;34928:2;:24;34904:16;34921:1;34904:19;;;;;;:58;34889:12;:73:::0;;;35016:20:::2;::::0;34988:58:::2;::::0;35042:3:::2;::::0;34988:49:::2;::::0;35012:24:::2;34988:16:::0;35005:1:::2;34988:19;::::0;:58:::2;34973:12;:73:::0;-1:-1:-1;;;;;;;;;33761:1293:0:o;42987:309::-;43059:1;43051:10;;:7;:10;;:14;;43033:15;:32;43025:62;;;;;-1:-1:-1;;;43025:62:0;;;;;;;;;;;;-1:-1:-1;;;43025:62:0;;;;;;;;;;;;;;;43101:7;;:32;;;-1:-1:-1;;;43101:32:0;;43127:4;43101:32;;;;;;43136:1;;-1:-1:-1;;;;;43101:7:0;;:17;;:32;;;;;;;;;;;;;;:7;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43101:32:0;:36;43098:165;;;43189:7;;;43199;:17;;;-1:-1:-1;;;43199:17:0;;;;43153:98;;-1:-1:-1;;;;;43189:7:0;;;;43199;;:15;;:17;;;;;;;;;;;;;;:7;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43199:17:0;43218:7;;:32;;;-1:-1:-1;;;43218:32:0;;43244:4;43218:32;;;;;;-1:-1:-1;;;;;43218:7:0;;;;:17;;:32;;;;;43199:17;;43218:32;;;;;;;;:7;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43218:32:0;43153:27;:98::i;:::-;43273:8;:15;;-1:-1:-1;;43273:15:0;43284:4;43273:15;;;42987:309::o;31016:19::-;;;;:::o;54689:307::-;32028:5;;;;;-1:-1:-1;;;;;32028:5:0;32014:10;:19;32006:53;;;;;-1:-1:-1;;;32006:53:0;;;;;;;;;;;;-1:-1:-1;;;32006:53:0;;;;;;;;;;;;;;;54779:17:::1;:15;:17::i;:::-;54800:1;54779:22;;54771:47;;;::::0;;-1:-1:-1;;;54771:47:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;54771:47:0;;;;;;;;;;;;;::::1;;54846:58;54900:3;54846:49;54874:20;;54870:2;:24;54846:16;54863:1;54846:19;;;;;;:58;54831:12;:73:::0;;;54958:20:::1;::::0;54930:58:::1;::::0;54984:3:::1;::::0;54930:49:::1;::::0;54954:24:::1;54930:16:::0;54947:1:::1;54930:19;::::0;:58:::1;54915:12;:73:::0;-1:-1:-1;54689:307:0:o;31042:20::-;;;-1:-1:-1;;;;;31042:20:0;;:::o;31705:37::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35506:121::-;-1:-1:-1;;;;;35596:16:0;35573:4;35596:16;;;:8;:16;;;;;:23;;35506:121::o;31325:31::-;;;;:::o;43426:1622::-;32503:7;:26;32511:17;:15;:17::i;:::-;32503:26;;;;;;;;;;;:32;;;32484:15;:51;;:104;;;;;32558:7;:26;32566:17;:15;:17::i;:::-;32558:26;;;;;;;;;;;:30;;;32539:15;:49;;32484:104;32476:144;;;;;-1:-1:-1;;;32476:144:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;32476:144:0;;;;;;;;;;;;;;;32372:8:::1;::::0;::::1;::::0;::::1;;;32371:9;32363:44;;;::::0;;-1:-1:-1;;;32363:44:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;32363:44:0;;;;;;;;;;;;;::::1;;43539:25:::2;43553:10;43539:13;:25::i;:::-;43531:65;;;::::0;;-1:-1:-1;;;43531:65:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;43627:7;;;;;;;;;-1:-1:-1::0;;;;;43627:7:0::2;-1:-1:-1::0;;;;;43627:12:0::2;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;43627:14:0;-1:-1:-1;;;;;43615:26:0::2;:5:::0;;43621:1:::2;43615:8:::0;::::2;;;;;;;;;;-1:-1:-1::0;;;;;43615:8:0::2;-1:-1:-1::0;;;;;43615:26:0::2;;:58;;;;-1:-1:-1::0;43665:7:0::2;::::0;-1:-1:-1;;;;;43665:7:0::2;43645:5:::0;;43665:7;43645:8;;::::2;;;;;;;;;;;-1:-1:-1::0;;;;;43645:8:0::2;-1:-1:-1::0;;;;;43645:28:0::2;;43615:58;43607:87;;;::::0;;-1:-1:-1;;;43607:87:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;43607:87:0;;;;;;;;;;;;;::::2;;43741:1;43713:25;;:29;43705:84;;;;-1:-1:-1::0;;;43705:84:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43810:12;43825:20;43834:10;43825:8;:20::i;:::-;43810:35;;43866:14;43883:33;43896:5;;43902:1;43896:8;;;;;;;;;;;;;-1:-1:-1::0;;;;;43896:8:0::2;43906:9;43883:12;:33::i;:::-;43866:50;;43937:18;43958:79;44004:7;:26;44012:17;:15;:17::i;:::-;44004:26;;;;;;;;;;;:32;;;43958:41;43978:20;;43972:2;:26;43958:9;:13;;:41;;;;:::i;:79::-;43937:100;;44059:18;44079:23:::0;44106:50:::2;44119:13;44134:9;44145:10;44106:12;:50::i;:::-;44058:98:::0;;-1:-1:-1;44058:98:0;-1:-1:-1;44177:13:0::2;44193:43;44226:9:::0;44193:28:::2;:9;44058:98:::0;44193:13:::2;:28::i;:43::-;44177:59;;44255:7;;;;;;;;;-1:-1:-1::0;;;;;44255:7:0::2;-1:-1:-1::0;;;;;44255:12:0::2;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;44255:14:0;44249:48:::2;::::0;;-1:-1:-1;;;44249:48:0;;;;-1:-1:-1;;;;;44249:29:0;;::::2;::::0;::::2;::::0;44286:8;;44249:48:::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;;44286:8;44249:29;:48;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;44332:9;44321:8;:20;44318:118;;;44357:67;44388:10;44400:23;:9;44414:8:::0;44400:13:::2;:23::i;:::-;44357:30;:67::i;:::-;44456:14;44473:46;44488:8;44498:5;;44513:4;44473:14;:46::i;:::-;44549:10;44540:20;::::0;;;:8:::2;:20;::::0;;;;;;;;44566:83;;::::2;::::0;::::2;::::0;;;;;;44456:63;;-1:-1:-1;44566:83:0;::::2;44583:17;:15;:17::i;:::-;44566:83:::0;;44602:15:::2;44566:83;::::0;;::::2;::::0;;;;;;;;;;;;;;;;;;44540:110;;::::2;::::0;;::::2;::::0;;-1:-1:-1;44540:110:0;;;;;;;;;::::2;::::0;;::::2;;::::0;;;;;::::2;::::0;;;::::2;::::0;;;;;;::::2;::::0;::::2;::::0;;::::2;::::0;;;;;;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;;::::2;::::0;::::2;::::0;;::::2;::::0;;;;44681:7;:22:::2;::::0;44619:9;44681:11:::2;:22::i;:::-;44671:7;:32:::0;44781:10:::2;44764:28;::::0;;;:16:::2;:28;::::0;;;;:71:::2;::::0;44816:18;;44764:28;44793:17:::2;:15;:17::i;:::-;44764:47;;;;;;;;;;;;:51;;:71;;;;:::i;:::-;44731:10;44714:28;::::0;;;:16:::2;:28;::::0;;;;;44743:17:::2;:15;:17::i;:::-;44714:47;;;;;;;;;;;:121;;;;44883:58;44922:18;44883:7;:26;44891:17;:15;:17::i;:::-;44883:26;;;;;;;;;;;:34;;;:38;;:58;;;;:::i;:::-;44846:7;:26;44854:17;:15;:17::i;:::-;44846:26:::0;;::::2;::::0;::::2;::::0;;;;;;-1:-1:-1;44846:26:0;:34:::2;;:95:::0;44998:10:::2;44979:17;:15;:17::i;:::-;44967:73;::::0;;;;;::::2;::::0;::::2;::::0;;;;;-1:-1:-1;;;;;;;;;;;44967:73:0;;;;;;;;;::::2;32418:1;;;;;;;43426:1622:::0;;:::o;31213:16::-;;;;:::o;31075:32::-;;;;:::o;38645:157::-;-1:-1:-1;;;;;38767:23:0;;38706:10;38767:23;;;:16;:23;;;;;;;;38791:1;38767:26;;;;;;;;;38760:1;38736:26;;;;;;:58;;:30;:58::i;:::-;38728:66;38645:157;-1:-1:-1;;38645:157:0:o;31114:37::-;;;;:::o;49657:183::-;32372:8;;;;;;;32371:9;32363:44;;;;;-1:-1:-1;;;32363:44:0;;;;;;;;;;;;-1:-1:-1;;;32363:44:0;;;;;;;;;;;;;;;49743:24;;49735:50:::1;;;::::0;;-1:-1:-1;;;49735:50:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;49735:50:0;;;;;;;;;;;;;::::1;;49808:10;49798:21;::::0;;;:9:::1;:21;::::0;;;;;;;:34;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;49657:183:::0;:::o;30904:20::-;;;;;;-1:-1:-1;;;;;30904:20:0;;:::o;53055:238::-;32028:5;;;;;-1:-1:-1;;;;;32028:5:0;32014:10;:19;32006:53;;;;;-1:-1:-1;;;32006:53:0;;;;;;;;;;;;-1:-1:-1;;;32006:53:0;;;;;;;;;;;;;;;53167:11:::1;;53148:15;:30;;:64;;;;-1:-1:-1::0;53182:25:0::1;::::0;:30;53148:64:::1;53140:84;;;::::0;;-1:-1:-1;;;53140:84:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;53140:84:0;;;;;;;;;;;;;::::1;;53245:25;:40:::0;53055:238::o;46833:1313::-;32503:7;:26;32511:17;:15;:17::i;:::-;32503:26;;;;;;;;;;;:32;;;32484:15;:51;;:104;;;;;32558:7;:26;32566:17;:15;:17::i;:::-;32558:26;;;;;;;;;;;:30;;;32539:15;:49;;32484:104;32476:144;;;;;-1:-1:-1;;;32476:144:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;32476:144:0;;;;;;;;;;;;;;;32372:8:::1;::::0;::::1;::::0;::::1;;;32371:9;32363:44;;;::::0;;-1:-1:-1;;;32363:44:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;32363:44:0;;;;;;;;;;;;;::::1;;46941:25:::2;46955:10;46941:13;:25::i;:::-;46933:65;;;::::0;;-1:-1:-1;;;46933:65:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;47037:7;::::0;-1:-1:-1;;;;;47017:28:0;;::::2;47037:7:::0;::::2;47017:28;47009:93;;;;-1:-1:-1::0;;;47009:93:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47149:1;47121:25;;:29;47113:84;;;;-1:-1:-1::0;;;47113:84:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47218:12;47233:20;47242:10;47233:8;:20::i;:::-;47218:35;;47274:18;47295:79;47341:7;:26;47349:17;:15;:17::i;:::-;47341:26;;;;;;;;;;;:32;;;47295:41;47315:20;;47309:2;:26;47295:9;:13;;:41;;;;:::i;:79::-;47274:100;;47396:18;47416:23:::0;47443:50:::2;47456:13;47471:9;47482:10;47443:12;:50::i;:::-;47554:7;::::0;47395:98;;-1:-1:-1;47395:98:0;-1:-1:-1;47514:91:0::2;::::0;-1:-1:-1;;;;;47554:7:0::2;47564:10;47584:4;47395:98:::0;47514:31:::2;:91::i;:::-;47635:10;47626:20;::::0;;;:8:::2;:20;::::0;;;;;;;;47652:87;;::::2;::::0;::::2;::::0;;;;;;47626:20;47652:87;;::::2;47669:17;:15;:17::i;:::-;47652:87:::0;;47688:15:::2;47652:87;::::0;;::::2;::::0;;;;;;;;;;;;;;;;;;47626:114;;::::2;::::0;;::::2;::::0;;-1:-1:-1;47626:114:0;;;;;;;;;::::2;::::0;;::::2;;::::0;;;;;::::2;::::0;;;::::2;::::0;;;;;;::::2;::::0;::::2;::::0;;::::2;::::0;;;;;;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;;::::2;::::0;::::2;::::0;;::::2;::::0;;;;47771:7;:26:::2;::::0;47705:13;47771:11:::2;:26::i;:::-;47761:7;:36:::0;47875:10:::2;47858:28;::::0;;;:16:::2;:28;::::0;;;;:71:::2;::::0;47910:18;;47858:28;47887:17:::2;:15;:17::i;47858:71::-;47825:10;47808:28;::::0;;;:16:::2;:28;::::0;;;;;47837:17:::2;:15;:17::i;:::-;47808:47;;;;;;;;;;;:121;;;;47977:58;48016:18;47977:7;:26;47985:17;:15;:17::i;47977:58::-;47940:7;:26;47948:17;:15;:17::i;:::-;47940:26:::0;;::::2;::::0;::::2;::::0;;;;;;-1:-1:-1;47940:26:0;:34:::2;;:95:::0;48092:10:::2;48073:17;:15;:17::i;:::-;48061:77;::::0;;;;;::::2;::::0;::::2;::::0;;;;;-1:-1:-1;;;;;;;;;;;48061:77:0;;;;;;;;;::::2;32418:1;;;;46833:1313:::0;;:::o;31183:23::-;;;;:::o;36564:297::-;36631:10;36676:22;36690:7;36676:13;:22::i;:::-;36673:181;;;36715:15;36732:16;36752:27;36771:7;36752:18;:27::i;:::-;36714:65;;-1:-1:-1;36714:65:0;-1:-1:-1;36802:40:0;36714:65;36802:23;36714:65;36817:7;36802:14;:23::i;:40::-;36794:48;36564:297;-1:-1:-1;;;;36564:297:0:o;31851:41::-;;;;;;;;;;;;;:::o;35157:98::-;35230:10;:17;35157:98;:::o;48273:787::-;32503:7;:26;32511:17;:15;:17::i;:::-;32503:26;;;;;;;;;;;:32;;;32484:15;:51;;:104;;;;;32558:7;:26;32566:17;:15;:17::i;:::-;32558:26;;;;;;;;;;;:30;;;32539:15;:49;;32484:104;32476:144;;;;;-1:-1:-1;;;32476:144:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;32476:144:0;;;;;;;;;;;;;;;32372:8:::1;::::0;::::1;::::0;::::1;;;32371:9;32363:44;;;::::0;;-1:-1:-1;;;32363:44:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;32363:44:0;;;;;;;;;;;;;::::1;;48378:7:::2;;;;;;;;;-1:-1:-1::0;;;;;48378:7:0::2;-1:-1:-1::0;;;;;48378:14:0::2;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;48378:16:0;-1:-1:-1;;;;;48364:30:0::2;:10;:30;::::0;:53:::2;;-1:-1:-1::0;48412:5:0::2;::::0;;;::::2;-1:-1:-1::0;;;;;48412:5:0::2;48398:10;:19;48364:53;48356:78;;;::::0;;-1:-1:-1;;;48356:78:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;48356:78:0;;;;;;;;;;;;;::::2;;48453:17;:15;:17::i;:::-;48474:1;48453:22;48445:49;;;::::0;;-1:-1:-1;;;48445:49:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;48445:49:0;;;;;;;;;;;;;::::2;;48507:12;48522:20;48531:10;48522:8;:20::i;:::-;48507:35;;48573:16;48582:6;:4;:6::i;:::-;48573:4;::::0;;:8:::2;:16::i;:::-;48558:12;:31;48555:67;;;48606:16;48615:6;:4;:6::i;48606:16::-;48591:31;;48555:67;48644:10;48635:20;::::0;;;:8:::2;:20;::::0;;;;;;;;48661:69;;::::2;::::0;::::2;::::0;;;;;;48635:20;48661:69;;::::2;48678:17;:15;:17::i;:::-;48661:69:::0;;48697:15:::2;48661:69;::::0;;::::2;::::0;;;;-1:-1:-1;48661:69:0;;;;;;;;;;;;;;48635:96;;::::2;::::0;;::::2;::::0;;;;;;;;;;::::2;::::0;;::::2;;::::0;;;;;::::2;::::0;;;::::2;::::0;;;;;;::::2;::::0;::::2;::::0;::::2;::::0;;;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;;::::2;::::0;::::2;::::0;;::::2;::::0;;;;48819:10:::2;48802:28:::0;;:16:::2;:28:::0;;;;;;:65:::2;::::0;48717:12;;48802:28;48831:17:::2;:15;:17::i;48802:65::-;48769:10;48752:28;::::0;;;:16:::2;:28;::::0;;;;;48781:17:::2;:15;:17::i;:::-;48752:47;;;;;;;;;;;:115;;;;48915:52;48954:12;48915:7;:26;48923:17;:15;:17::i;48915:52::-;48878:7;:26;48886:17;:15;:17::i;:::-;48878:26:::0;;::::2;::::0;::::2;::::0;;;;;;-1:-1:-1;48878:26:0;:34:::2;;:89:::0;49024:10:::2;49005:17;:15;:17::i;:::-;48993:59;::::0;;49036:1:::2;48993:59:::0;;::::2;::::0;::::2;::::0;;;;;-1:-1:-1;;;;;;;;;;;48993:59:0;;;;;;;;;::::2;32418:1;48273:787:::0;:::o;30871:20::-;;;;;;;;;:::o;31801:43::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31801:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31899:65::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;31294:24::-;;;;:::o;30931:37::-;;;-1:-1:-1;;;;;30931:37:0;;:::o;55191:78::-;32028:5;;;;;-1:-1:-1;;;;;32028:5:0;32014:10;:19;32006:53;;;;;-1:-1:-1;;;32006:53:0;;;;;;;;;;;;-1:-1:-1;;;32006:53:0;;;;;;;;;;;;;;;55253:8:::1;::::0;;-1:-1:-1;;55241:20:0;::::1;55253:8;::::0;;;::::1;;;55252:9;55241:20:::0;;::::1;;::::0;;55191:78::o;38220:319::-;38350:16;;;38364:1;38350:16;;;;;;;;38296:17;;;;38350:16;38364:1;38350:16;;;;;;;;;;-1:-1:-1;38350:16:0;38325:41;;38388:8;38377:5;38383:1;38377:8;;;;;;;;-1:-1:-1;;;;;38377:19:0;;;:8;;;;;;;;;:19;38426:7;;38407:8;;38426:7;;;38407:5;;38426:7;;38407:8;;;;;;-1:-1:-1;;;;;38407:27:0;;;:8;;;;;;;;;;:27;;;;38488:7;;:21;;;-1:-1:-1;;;38488:21:0;;;;38457:71;;38488:7;;;;;:19;;:21;;;;;;;;;;:7;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38488:21:0;38511:9;38522:5;38457:30;:71::i;:::-;38529:1;38457:74;;;;;;;;;;;;;;38445:86;;38220:319;;;;;:::o;38893:273::-;38941:12;38998:1;38987:172;39004:1;39001;:4;38987:172;;39048:10;;;;:7;:10;;;;;:16;39029:15;:35;;;;:72;;-1:-1:-1;39087:10:0;;;;:7;:10;;;;;:14;;;39068:15;:33;;39029:72;39026:122;;;39131:1;39121:11;;39026:122;39007:3;;38987:172;;31158:18;;;;:::o;45214:1460::-;32503:7;:26;32511:17;:15;:17::i;:::-;32503:26;;;;;;;;;;;:32;;;32484:15;:51;;:104;;;;;32558:7;:26;32566:17;:15;:17::i;:::-;32558:26;;;;;;;;;;;:30;;;32539:15;:49;;32484:104;32476:144;;;;;-1:-1:-1;;;32476:144:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;32476:144:0;;;;;;;;;;;;;;;32372:8:::1;::::0;::::1;::::0;::::1;;;32371:9;32363:44;;;::::0;;-1:-1:-1;;;32363:44:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;32363:44:0;;;;;;;;;;;;;::::1;;45337:25:::2;45351:10;45337:13;:25::i;:::-;45329:65;;;::::0;;-1:-1:-1;;;45329:65:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;45433:7;::::0;-1:-1:-1;;;;;45433:7:0::2;45413:5:::0;;45433:7:::2;45413:8:::0;::::2;;;;;;;;;;-1:-1:-1::0;;;;;45413:8:0::2;-1:-1:-1::0;;;;;45413:28:0::2;;;:98;;;;-1:-1:-1::0;45457:7:0::2;::::0;-1:-1:-1;;;;;45457:7:0::2;:19;:7:::0;45477:23:::2;45501:5:::0;;45457:7:::2;45501:8:::0;::::2;;;;;;;;;;-1:-1:-1::0;;;;;45501:8:0::2;45477:33;;;;;;;;;;;;;-1:-1:-1::0;;;;;45477:33:0::2;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;45477:33:0;45457:54:::2;::::0;;-1:-1:-1;;;;;;45457:54:0::2;::::0;;;;;;::::2;::::0;::::2;::::0;;;;;;;;;;45477:33:::2;::::0;45457:54;;;;;;;;;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;45457:54:0;-1:-1:-1;;;;;45445:66:0::2;:5:::0;;45451:1:::2;45445:8:::0;::::2;;;;;;;;;;-1:-1:-1::0;;;;;45445:8:0::2;-1:-1:-1::0;;;;;45445:66:0::2;;45413:98;:130;;;;-1:-1:-1::0;45535:7:0::2;::::0;-1:-1:-1;;;;;45535:7:0::2;45515:5:::0;;45535:7;45515:8;;::::2;;;;;;;;;;;-1:-1:-1::0;;;;;45515:8:0::2;-1:-1:-1::0;;;;;45515:28:0::2;;45413:130;45405:159;;;::::0;;-1:-1:-1;;;45405:159:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;45405:159:0;;;;;;;;;;;;;::::2;;45611:1;45583:25;;:29;45575:84;;;;-1:-1:-1::0;;;45575:84:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45680:12;45695:20;45704:10;45695:8;:20::i;:::-;45680:35;;45736:14;45753:33;45766:5;;45772:1;45766:8;;;;;;;;;;;;;-1:-1:-1::0;;;;;45766:8:0::2;45776:9;45753:12;:33::i;:::-;45736:50;;45807:18;45828:79;45874:7;:26;45882:17;:15;:17::i;45828:79::-;45807:100;;45929:18;45949:23:::0;45976:50:::2;45989:13;46004:9;46015:10;45976:12;:50::i;:::-;45928:98:::0;;-1:-1:-1;45928:98:0;-1:-1:-1;46047:14:0::2;46064:81;46079:43;46112:9:::0;46079:28:::2;:9:::0;45928:98;46079:13:::2;:28::i;:43::-;46124:5;;46139:4;46064:14;:81::i;:::-;46175:10;46166:20;::::0;;;:8:::2;:20;::::0;;;;;;;;46192:83;;::::2;::::0;::::2;::::0;;;;;;46047:98;;-1:-1:-1;46192:83:0;::::2;46209:17;:15;:17::i;:::-;46192:83:::0;;46228:15:::2;46192:83;::::0;;::::2;::::0;;;;;;;;;;;;;;;;;;46166:110;;::::2;::::0;;::::2;::::0;;-1:-1:-1;46166:110:0;;;;;;;;;::::2;::::0;;::::2;;::::0;;;;;::::2;::::0;;;::::2;::::0;;;;;;::::2;::::0;::::2;::::0;;::::2;::::0;;;;;;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;;::::2;::::0;::::2;::::0;;::::2;::::0;;;;46307:7;:22:::2;::::0;46245:9;46307:11:::2;:22::i;:::-;46297:7;:32:::0;46407:10:::2;46390:28;::::0;;;:16:::2;:28;::::0;;;;:71:::2;::::0;46442:18;;46390:28;46419:17:::2;:15;:17::i;46390:71::-;46357:10;46340:28;::::0;;;:16:::2;:28;::::0;;;;;46369:17:::2;:15;:17::i;:::-;46340:47;;;;;;;;;;;:121;;;;46509:58;46548:18;46509:7;:26;46517:17;:15;:17::i;46509:58::-;46472:7;:26;46480:17;:15;:17::i;:::-;46472:26:::0;;::::2;::::0;::::2;::::0;;;;;;-1:-1:-1;46472:26:0;:34:::2;;:95:::0;46624:10:::2;46605:17;:15;:17::i;:::-;46593:73;::::0;;;;;::::2;::::0;::::2;::::0;;;;;-1:-1:-1;;;;;;;;;;;46593:73:0;;;;;;;;;::::2;32418:1;;;;;;45214:1460:::0;;;:::o;31263:24::-;;;;:::o;53469:483::-;32028:5;;;;;-1:-1:-1;;;;;32028:5:0;32014:10;:19;32006:53;;;;;-1:-1:-1;;;32006:53:0;;;;;;;;;;;;-1:-1:-1;;;32006:53:0;;;;;;;;;;;;;;;53599:11:::1;;53581:15;:29;:67;;;;;53630:11;:18;53614:5;:12;:34;53581:67;53573:88;;;::::0;;-1:-1:-1;;;53573:88:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;53573:88:0;;;;;;;;;;;;;::::1;;53686:6;53682:263;53698:5;:12;53696:1;:14;53682:263;;;53731:10;53747:5;53753:1;53747:8;;;;;;;;;::::0;;::::1;::::0;;;;;;;53731:25;;::::1;::::0;::::1;::::0;;-1:-1:-1;53731:25:0;;;;;;;::::1;::::0;;-1:-1:-1;;;;;;53731:25:0::1;-1:-1:-1::0;;;;;53731:25:0;;::::1;::::0;;;::::1;::::0;;53818:20:::1;::::0;53793:14;;:59:::1;::::0;53844:7:::1;::::0;53793:46:::1;::::0;53812:2:::1;:26;::::0;53793:14;;53805:1;;53793:14;::::1;;;;;;;;;;;:18;;:46;;;;:::i;:59::-;53771:9;:19;53781:5;53787:1;53781:8;;;;;;;;;;;;;;-1:-1:-1::0;;;;;53771:19:0::1;-1:-1:-1::0;;;;;53771:19:0::1;;;;;;;;;;;;:81;;;;53889:44;53913:9;:19;53923:5;53929:1;53923:8;;;;;;;;;;;;;;-1:-1:-1::0;;;;;53913:19:0::1;-1:-1:-1::0;;;;;53913:19:0::1;;;;;;;;;;;;;53889;;:23;;:44;;;;:::i;:::-;53867:19;:66:::0;53712:3:::1;;53682:263;;;;53469:483:::0;;:::o;31363:23::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31363:23:0;;-1:-1:-1;31363:23:0;:::o;55008:171::-;32028:5;;;;;-1:-1:-1;;;;;32028:5:0;32014:10;:19;32006:53;;;;;-1:-1:-1;;;32006:53:0;;;;;;;;;;;;-1:-1:-1;;;32006:53:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;55089:23:0;::::1;55081:62;;;::::0;;-1:-1:-1;;;55081:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;55154:5;:17:::0;;-1:-1:-1;;;;;55154:17:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;55154:17:0;;::::1;::::0;;;::::1;::::0;;55008:171::o;31393:27::-;;;;;;;;;;;;4570:181;4628:7;4660:5;;;4684:6;;;;4676:46;;;;;-1:-1:-1;;;4676:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;4742:1;4570:181;-1:-1:-1;;;4570:181:0:o;5924:471::-;5982:7;6227:6;6223:47;;-1:-1:-1;6257:1:0;6250:8;;6223:47;6294:5;;;6298:1;6294;:5;:1;6318:5;;;;;:10;6310:56;;;;-1:-1:-1;;;6310:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6871:132;6929:7;6956:39;6960:1;6963;6956:39;;;;;;;;;;;;;;;;;:3;:39::i;5034:136::-;5092:7;5119:43;5123:1;5126;5119:43;;;;;;;;;;;;;;;;;:3;:43::i;22421:361::-;22616:45;;;-1:-1:-1;;;;;22616:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22616:45:0;-1:-1:-1;;;22616:45:0;;;22605:57;;;;22570:12;;;;22605:10;;;;22616:45;22605:57;;;22616:45;22605:57;;22616:45;22605:57;;;;;;;;;;-1:-1:-1;;22605:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22569:93;;;;22681:7;:57;;;;-1:-1:-1;22693:11:0;;:16;;:44;;;22724:4;22713:24;;;;;;;;;;;;;;;-1:-1:-1;22713:24:0;22693:44;22673:101;;;;;-1:-1:-1;;;22673:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;22421:361;;;;;:::o;37507:295::-;37568:4;37587:17;:15;:17::i;:::-;37608:1;37587:22;:46;;;;-1:-1:-1;;;;;;37613:16:0;;37632:1;37613:16;;;:9;:16;;;;;;:20;;37587:46;37584:62;;;-1:-1:-1;37642:4:0;37635:11;;37584:62;37658:15;37678:25;37697:5;37678:18;:25::i;:::-;37657:46;;;37756:7;;;;;;;;;-1:-1:-1;;;;;37756:7:0;-1:-1:-1;;;;;37756:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37756:19:0;37736:57;;;-1:-1:-1;;;37736:57:0;;;;-1:-1:-1;;;;;37736:55:0;;;;;;:57;;;;;37756:19;;37736:57;;;;;;;;:55;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37736:57:0;-1:-1:-1;37722:71:0;;37507:295;-1:-1:-1;;37507:295:0:o;49146:402::-;49196:12;49224:14;49232:5;49224:7;:14::i;:::-;49220:321;;49254:6;:18;;;;;;;;-1:-1:-1;49254:18:0;;;;;;;;;-1:-1:-1;;;;;;49254:18:0;-1:-1:-1;;;;;49254:18:0;;;;;49297:13;;:20;;:17;:20::i;:::-;-1:-1:-1;;;;;49355:16:0;;;;;;:9;:16;;;;;49349:30;49287;;-1:-1:-1;49349:30:0;-1:-1:-1;;49349:30:0;;;;;;;;;;;49346:113;;49423:20;49437:5;49423:13;:20::i;:::-;-1:-1:-1;;;;;49404:16:0;;;;;;:9;:16;;;;;;;;:39;;;;:16;;:39;;;;;;:::i;:::-;;49346:113;49220:321;;;-1:-1:-1;;;;;49499:15:0;;;;;;:8;:15;;;;;:18;;:15;;;:18;;;;;;;;;;;;;;:30;;;49489:40;;49146:402;;;:::o;39974:949::-;40070:18;40090:23;40128:17;:15;:17::i;:::-;40149:1;40128:22;40125:584;;;-1:-1:-1;;;;;40169:16:0;;;;;;:9;:16;;;;;;40166:323;;40261:1;40238:19;;40229:6;:4;:6::i;:::-;40222:4;;:13;:35;40218:44;40210:82;;;;;-1:-1:-1;;;40210:82:0;;;;;;;;;;;;-1:-1:-1;;;40210:82:0;;;;;;;;;;;;;;;40331:41;40352:19;;40331:16;40340:6;:4;:6::i;40331:16::-;:20;;:41::i;:::-;40314:14;:58;40311:163;;;40413:41;40434:19;;40413:16;40422:6;:4;:6::i;40413:41::-;40396:58;;40311:163;40125:584;;;40547:1;40528:16;40537:6;:4;:6::i;40528:16::-;:20;40520:58;;;;;-1:-1:-1;;;40520:58:0;;;;;;;;;;;;-1:-1:-1;;;40520:58:0;;;;;;;;;;;;;;;40613:16;40622:6;:4;:6::i;40613:16::-;40596:14;:33;40593:105;;;40666:16;40675:6;:4;:6::i;40666:16::-;40649:33;;40593:105;40731:84;40794:20;;40788:2;:26;40731:52;40750:7;:26;40758:17;:15;:17::i;:::-;40750:26;;;;;;;;;;;:32;;;40731:14;:18;;:52;;;;:::i;:84::-;40719:96;;40864:51;40882:5;40889:14;40905:9;40864:17;:51::i;:::-;40826:89;;;;-1:-1:-1;39974:949:0;-1:-1:-1;;;;39974:949:0:o;23200:195::-;23308:12;;;23270;23308;;;;;;;;;-1:-1:-1;;;;;23287:7:0;;;23301:5;;23287:34;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;23287:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23269:52;;;23340:7;23332:55;;;;-1:-1:-1;;;23332:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50014:697;50110:15;50137:14;50154:33;50167:5;;50173:1;50167:8;;;;;;;;;;;;;-1:-1:-1;;;;;50167:8:0;50177:9;50154:12;:33::i;:::-;50137:50;-1:-1:-1;50234:17:0;50254:28;50277:4;50254:18;50137:50;50268:3;50254:13;:18::i;:28::-;50234:48;-1:-1:-1;50325:13:0;50341:29;:15;50361:8;50341:19;:29::i;:::-;50325:45;;50391:21;50438:7;;;;;;;;;-1:-1:-1;;;;;50438:7:0;-1:-1:-1;;;;;50438:12:0;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50438:14:0;-1:-1:-1;;;;;50426:26:0;:5;;50432:1;50426:8;;;;;;;;;;;-1:-1:-1;;;;;50426:8:0;-1:-1:-1;;;;;50426:26:0;;50423:247;;;50478:68;50500:9;50511:12;50525:5;;50478:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50532:3:0;;-1:-1:-1;50537:8:0;;-1:-1:-1;50478:21:0;;-1:-1:-1;50478:68:0:i;:::-;50468:78;;50423:247;;;50587:71;50612:9;50623:12;50637:5;;50587:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50644:3:0;;-1:-1:-1;50649:8:0;;-1:-1:-1;50587:24:0;;-1:-1:-1;50587:71:0:i;:::-;50577:81;;50423:247;50693:7;50701:1;50693:10;;;;;;;;;;;;;;50680:23;;50014:697;;;;;;;;;;:::o;22790:402::-;23015:51;;;-1:-1:-1;;;;;23015:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23015:51:0;-1:-1:-1;;;23015:51:0;;;23004:63;;;;22969:12;;;;23004:10;;;;23015:51;23004:63;;;23015:51;23004:63;;23015:51;23004:63;;;;;;;;;;-1:-1:-1;;23004:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22968:99;;;;23086:7;:57;;;;-1:-1:-1;23098:11:0;;:16;;:44;;;23129:4;23118:24;;;;;;;;;;;;;;;-1:-1:-1;23118:24:0;23098:44;23078:106;;;;-1:-1:-1;;;23078:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22790:402;;;;;;:::o;36975:414::-;37042:15;37059:16;37088:17;37107:18;37129:44;37147:16;37165:7;37129:17;:44::i;:::-;37087:86;;;;37185:17;37204:18;37226:44;37244:16;37262:7;37226:17;:44::i;:::-;37184:86;;-1:-1:-1;37184:86:0;-1:-1:-1;37294:30:0;:12;37184:86;37294:16;:30::i;:::-;37281:43;-1:-1:-1;37349:32:0;:13;37367;37349:17;:32::i;:::-;37335:46;;36975:414;;;;;;;:::o;29609:511::-;29710:21;29767:1;29752:4;:11;:16;;29744:59;;;;;-1:-1:-1;;;29744:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;29835:4;:11;29824:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29824:23:0;;29814:33;;29871:8;29858:7;29866:1;29858:10;;;;;;;;;;;;;:21;;;;;29895:6;29890:223;29921:1;29907:4;:11;:15;29903:1;:19;29890:223;;;29945:14;29961:15;29980:42;29992:7;30001:4;30006:1;30001:7;;;;;;;;;;;;;;30010:4;30015:1;30019;30015:5;30010:11;;;;;;;;;;;;;;29980;:42::i;:::-;29944:78;;;;30054:47;30067:7;30075:1;30067:10;;;;;;;;;;;;;;30079:9;30090:10;30054:12;:47::i;:::-;30037:7;30045:1;30049;30045:5;30037:14;;;;;;;;;;;;;;;;;:64;-1:-1:-1;;29924:3:0;;29890:223;;;;29609:511;;;;;:::o;7499:278::-;7585:7;7620:12;7613:5;7605:28;;;;-1:-1:-1;;;7605:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7644:9;7660:1;7656;:5;;;;;;;7499:278;-1:-1:-1;;;;;7499:278:0:o;5473:192::-;5559:7;5595:12;5587:6;;;;5579:29;;;;-1:-1:-1;;;5579:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5631:5:0;;;5473:192::o;42243:463::-;42343:13;;;42353:2;42343:13;;;42300;42343;;;;;;42326:14;;42343:13;;;;;;;;;;;-1:-1:-1;42343:13:0;42326:30;;42372:6;42367:305;42388:2;42384:1;:6;42367:305;;;42412:8;42468:1;42463:2;:6;42460:1;:10;42456:1;:15;42449:1;-1:-1:-1;;;;;42436:16:0;:36;;;;;;42423:51;;42412:62;;42489:9;42519:2;42514:1;42508:8;;:13;;;;;;;;42501:21;;42489:33;;42537:9;42578:2;42572:9;;42567:2;:14;42562:1;42556:8;;:25;42549:33;;42537:45;;42606:8;42611:2;42606:4;:8::i;:::-;42597:1;42601;42599;:3;42597:6;;;;;;;;;;;:17;-1:-1:-1;;;;;42597:17:0;;;;;;;;;42640:8;42645:2;42640:4;:8::i;:::-;42629:1;42633;42631;:3;42635:1;42631:5;42629:8;;;;;;;;;;;:19;-1:-1:-1;;;;;42629:19:0;;;;;;;;-1:-1:-1;;42392:3:0;;;;;-1:-1:-1;42367:305:0;;-1:-1:-1;42367:305:0;;-1:-1:-1;42696:1:0;42243:463;-1:-1:-1;;42243:463:0:o;41120:1022::-;41292:9;41221:18;;41338:17;:15;:17::i;:::-;41359:1;41338:22;41335:225;;;41384:24;41402:5;41384:17;:24::i;:::-;41376:32;;41335:225;;;41466:12;;41448:14;:30;;41440:73;;;;;-1:-1:-1;;;41440:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41536:12:0;;41335:225;-1:-1:-1;;;;;41588:23:0;;;;;;:16;:23;;;;;41633:5;;41612:17;:15;:17::i;:::-;41588:42;;;;;;;;;;;;:50;41580:116;;;;-1:-1:-1;;;41580:116:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41710:23:0;;;;;;:16;:23;;;;;41775:5;;41710:62;;41757:14;;41734:17;:15;:17::i;41710:62::-;:70;41707:242;;;41812:125;41916:20;;41910:2;:26;41812:93;41872:7;:26;41880:17;:15;:17::i;:::-;41872:26;;;;;;;;;;;:32;;;41813:53;41823:16;:23;41840:5;-1:-1:-1;;;;;41823:23:0;-1:-1:-1;;;;;41823:23:0;;;;;;;;;;;;:42;41847:17;:15;:17::i;:::-;41823:42;;;;;;;;;;;;41813:5;:9;;:53;;;;:::i;:::-;41812:59;;:93::i;:125::-;41796:141;;41707:242;41985:1;41969:13;:17;41961:58;;;;;-1:-1:-1;;;41961:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;42051:83;42101:7;:26;42109:17;:15;:17::i;:::-;42101:26;;;;;;;;;;;:32;;;42051:45;42075:20;;42069:2;:26;42051:13;:17;;:45;;;;:::i;:83::-;42030:104;;41120:1022;;;;;;;:::o;52255:682::-;52465:21;52438:8;32714:15;32702:8;:27;;32694:64;;;;;-1:-1:-1;;;32694:64:0;;;;;;;;;;;;-1:-1:-1;;;32694:64:0;;;;;;;;;;;;;;;52518:7:::1;;;;;;;;;-1:-1:-1::0;;;;;52518:7:0::1;-1:-1:-1::0;;;;;52518:12:0::1;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;52518:14:0;52507:7;;-1:-1:-1;;;;;52507:25:0;;::::1;::::0;:4;;52512:1:::1;::::0;52507:7:::1;;;;;;;;;;-1:-1:-1::0;;;;;52507:25:0::1;;52499:67;;;::::0;;-1:-1:-1;;;52499:67:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;52618:7;::::0;:21:::1;::::0;;-1:-1:-1;;;52618:21:0;;;;52587:69:::1;::::0;-1:-1:-1;;;;;52618:7:0::1;::::0;:19:::1;::::0;:21:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:7;:21;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;52618:21:0;52641:8;52651:4;52587:30:::1;:69::i;:::-;52577:79;;52706:12;52675:7;52700:1;52683:7;:14;:18;52675:27;;;;;;;;;;;;;;:43;;52667:99;;;;-1:-1:-1::0;;;52667:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52790:7;;;;;;;;;-1:-1:-1::0;;;;;52790:7:0::1;-1:-1:-1::0;;;;;52790:12:0::1;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;52790:14:0;52840:7:::1;::::0;:21:::1;::::0;;-1:-1:-1;;;52840:21:0;;;;-1:-1:-1;;;;;52784:30:0;;::::1;::::0;::::1;::::0;52815:65:::1;::::0;52840:7;::::1;::::0;:19:::1;::::0;:21:::1;::::0;;::::1;::::0;52790:14:::1;::::0;52840:21;;;;;;;;:7;:21;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;52840:21:0;52863:7;;:4;;52868:1:::1;::::0;52863:7:::1;;;;;;;;;;52872:4;52877:1;52872:7;;;;;;;;;;;;;;52815:24;:65::i;:::-;52882:7;52890:1;52882:10;;;;;;;;;;;;;;52784:109;;;;;;;;;;;;;-1:-1:-1::0;;;;;52784:109:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;52784:109:0;52777:117:::1;;;;52905:24;52911:7;52920:4;52926:2;52905:5;:24::i;:::-;52255:682:::0;;;;;;;;:::o;51601:645::-;51814:21;51787:8;32714:15;32702:8;:27;;32694:64;;;;;-1:-1:-1;;;32694:64:0;;;;;;;;;;;;-1:-1:-1;;;32694:64:0;;;;;;;;;;;;;;;51889:7:::1;::::0;:21:::1;::::0;;-1:-1:-1;;;51889:21:0;;;;51858:69:::1;::::0;-1:-1:-1;;;;;51889:7:0::1;::::0;:19:::1;::::0;:21:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:7;:21;::::1;;::::0;::::1;;;;::::0;::::1;51858:69;51848:79;;51977:12;51946:7;51971:1;51954:7;:14;:18;51946:27;;;;;;;;;;;;;;:43;;51938:99;;;;-1:-1:-1::0;;;51938:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52048:155;52094:4;52099:1;52094:7;;;;;;;;;;;;;;52103:10;52115:65;52140:7;;;;;;;;;-1:-1:-1::0;;;;;52140:7:0::1;-1:-1:-1::0;;;;;52140:19:0::1;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;52140:21:0;52163:7;;:4;;52168:1:::1;::::0;52163:7:::1;;;;;;;;;;52172:4;52177:1;52172:7;;;;;;;52115:65;52182:7;52190:1;52182:10;;;;;;;;;;;;;;52048:31;:155::i;35763:686::-:0;35852:15;;;35900:7;:27;;;;;;;;;35897:545;;;35974:7;;;;;;;;;-1:-1:-1;;;;;35974:7:0;-1:-1:-1;;;;;35974:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35974:19:0;35956:67;;;-1:-1:-1;;;35956:67:0;;-1:-1:-1;;;;;35956:67:0;;;;;;;;;:58;;;;;;;:67;;;;;35974:19;;35956:67;;;;;;;:58;:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35956:67:0;36070:7;;:19;;;-1:-1:-1;;;36070:19:0;;;;35956:67;;-1:-1:-1;;;;;;36070:7:0;;;;:17;;:19;;;;;35956:67;;36070:19;;;;;;;;:7;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36070:19:0;36052:56;;;-1:-1:-1;;;36052:56:0;;;;-1:-1:-1;;;;;36052:54:0;;;;;;:56;;;;;36070:19;;36052:56;;;;;;;;:54;:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36052:56:0;;-1:-1:-1;35897:545:0;;;36139:16;36128:7;:27;;;;;;;;;36125:317;;;36204:7;;;;;;;;;-1:-1:-1;;;;;36204:7:0;-1:-1:-1;;;;;36204:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36204:19:0;36264:11;;36184:92;;;-1:-1:-1;;;36184:92:0;;-1:-1:-1;;;;;36184:92:0;;;;;;;;;;;;;;;;:70;;;;;;;:92;;;;;36204:19;;36184:92;;;;;;;:70;:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36184:92:0;36305:25;;36184:92;;-1:-1:-1;36305:25:0;-1:-1:-1;36125:317:0;;;36361:69;;-1:-1:-1;;;36361:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36125:317;35763:686;;;;;:::o;27470:391::-;27563:13;27578;27605:14;27624:26;27635:6;27643;27624:10;:26::i;:::-;27604:46;;;27662:13;27677;27710:32;27718:7;27727:6;27735;27710:7;:32::i;:::-;-1:-1:-1;;;;;27695:60:0;;:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27695:62:0;;;;;;;27661:96;;;;;-1:-1:-1;27661:96:0;;-1:-1:-1;;;;;;27791:16:0;;;;;;;:62;;27834:8;27844;27791:62;;;27811:8;27821;27791:62;27768:85;;;;-1:-1:-1;27470:391:0;-1:-1:-1;;;;;;;27470:391:0:o;28417:517::-;28510:14;28556:1;28545:8;:12;28537:68;;;;-1:-1:-1;;;28537:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28636:1;28624:9;:13;:31;;;;;28654:1;28641:10;:14;28624:31;28616:84;;;;-1:-1:-1;;;28616:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28711:20;28734:17;:8;28747:3;28734:12;:17::i;:::-;28711:40;-1:-1:-1;28762:14:0;28779:31;28711:40;28799:10;28779:19;:31::i;:::-;28762:48;-1:-1:-1;28821:16:0;28840:40;28864:15;28840:19;:9;28854:4;28840:13;:19::i;:40::-;28821:59;;28915:11;28903:9;:23;;;;;;;28417:517;-1:-1:-1;;;;;;;28417:517:0:o;42718:171::-;42765:8;42801:2;42790:8;;;;:13;42786:95;;;42825:1;42819:8;;42830:4;42819:15;42812:23;;42805:30;;;;42786:95;42871:1;42865:8;;42876:4;42865:15;42858:23;;42851:30;;;;39507:310;-1:-1:-1;;;;;39605:16:0;;39571:19;39605:16;;;:9;:16;;;;;;:20;39602:208;;-1:-1:-1;;;;;;39658:16:0;;;;;;:9;:16;;;;;;39602:208;;;39723:75;39790:7;39723:62;39755:29;39764:19;;39755:4;;:8;;:29;;;;:::i;:::-;39723:27;39744:5;39723:20;:27::i;27161:251::-;27250:12;27276:14;27292;27310:26;27321:6;27329;27310:10;:26::i;:::-;27275:61;;;;27372:7;-1:-1:-1;;;;;27354:34:0;;27389:6;27397;27354:50;;;;;;;;;;;;;-1:-1:-1;;;;;27354:50:0;;;;;;-1:-1:-1;;;;;27354:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27354:50:0;;27161:251;-1:-1:-1;;;;;;27161:251:0:o;50826:763::-;50933:6;50928:654;50959:1;50945:4;:11;:15;50941:1;:19;50928:654;;;50983:13;50998:14;51017:4;51022:1;51017:7;;;;;;;;;;;;;;51026:4;51031:1;51035;51031:5;51026:11;;;;;;;;;;;;;;50982:56;;;;51054:14;51073:42;51101:5;51108:6;51073:27;:42::i;:::-;51053:62;;;51130:14;51147:7;51155:1;51159;51155:5;51147:14;;;;;;;;;;;;;;51130:31;;51177:15;51194;51222:6;-1:-1:-1;;;;;51213:15:0;:5;-1:-1:-1;;;;;51213:15:0;;:61;;51255:9;51271:1;51213:61;;;51237:1;51241:9;51213:61;51176:98;;;;51289:10;51320:1;51306:4;:11;:15;51302:1;:19;:96;;51395:3;51302:96;;;51349:7;;:21;;;-1:-1:-1;;;51349:21:0;;;;51324:68;;-1:-1:-1;;;;;51349:7:0;;:19;;:21;;;;;;;;;;;;;;:7;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51349:21:0;51380:11;;51372:6;;51380:4;;51389:1;51385:5;;;51380:11;;;;;51324:68;51289:109;;51428:62;51453:7;;;;;;;;;-1:-1:-1;;;;;51453:7:0;-1:-1:-1;;;;;51453:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51453:21:0;51476:5;51483:6;51428:24;:62::i;:::-;-1:-1:-1;;;;;51413:83:0;;51515:10;51527;51539:2;51553:1;51543:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51543:12:0;;51413:157;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51413:157:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;50962:3:0;;;;;-1:-1:-1;50928:654:0;;-1:-1:-1;;;;;;;;50928:654:0;;;50826:763;;;:::o;26751:349::-;26826:14;26842;26887:6;-1:-1:-1;;;;;26877:16:0;:6;-1:-1:-1;;;;;26877:16:0;;;26869:66;;;;-1:-1:-1;;;26869:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26974:6;-1:-1:-1;;;;;26965:15:0;:6;-1:-1:-1;;;;;26965:15:0;;:53;;27003:6;27011;26965:53;;;26984:6;26992;26965:53;26946:72;;-1:-1:-1;26946:72:0;-1:-1:-1;;;;;;27037:20:0;;27029:63;;;;;-1:-1:-1;;;27029:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

ipfs://a4a13b07a7b3ab15a16348ead582e503ccde7b9f46739401459ddb442d587740
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.