Contract 0x014dea5dd7CE12Ce494b553F133739873247021f 2

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x0d51305bbaaf7f06688945e5b5471daf56f381fb1fd36a265abf1c2c7cfc78b9Set Vote51673552022-01-28 11:09:401 hr 27 mins ago0x2dc55c094ee20b08ea028e56c9dd628aa050ceb8 IN  0x014dea5dd7ce12ce494b553f133739873247021f0 ETH0.00092133306 ETH
0x656a84976811ae7f1487c994c334f47aced80b00cd65c55aa0fab444f7650c4fSet Vote51672762022-01-28 11:05:011 hr 31 mins ago0x2cd61418c3d3d38da2313dab3ab64cd549d7b71e IN  0x014dea5dd7ce12ce494b553f133739873247021f0 ETH0.000913086477 ETH
0x07c482661c0c6b57d9231f73dd26efbea417dbf386280aa99e399fb710c4cd59Weight Vote51672542022-01-28 11:05:011 hr 31 mins ago0x2cd61418c3d3d38da2313dab3ab64cd549d7b71e IN  0x014dea5dd7ce12ce494b553f133739873247021f0 ETH0.000835438206 ETH
0xbb6422b31769a1eeab754c714e931c5c2f9a3e6903ad5292b2354e68a1eed1c1Weight Vote51672282022-01-28 11:03:071 hr 33 mins ago0x2dc55c094ee20b08ea028e56c9dd628aa050ceb8 IN  0x014dea5dd7ce12ce494b553f133739873247021f0 ETH0.00083868371 ETH
0xa11fd1f5ee2f027bd066e8689adb25fcaf83bab434d7282267156b870828b35dWeight Vote51670002022-01-28 10:52:561 hr 43 mins ago0x0db1f475e841948777eaaa6519efeb6e4d01648c IN  0x014dea5dd7ce12ce494b553f133739873247021f0 ETH0.000839320235 ETH
0x5fb1f8e715fc32895980d8a00c17cc09c2595dec4157057e97c8591570c39711Set Vote51666052022-01-28 10:27:162 hrs 9 mins ago0x1361a45abc727743b551594f27d1ee185178e890 IN  0x014dea5dd7ce12ce494b553f133739873247021f0 ETH0.000931143604 ETH
0xc4a3c9b5f08550ea765e38f02c6df0d5147701e9b4a9481eeec46d0de5d09202Set Vote51650642022-01-28 9:16:343 hrs 20 mins ago0x8358fc2dd62c00c1a9cd0fcb577309a4cead2471 IN  0x014dea5dd7ce12ce494b553f133739873247021f0 ETH0.000931745875 ETH
0xb906356f7adaeeed05663611346695162f19de5d5312c6ab0c12577b950091e9Set Vote51641732022-01-28 8:41:153 hrs 55 mins ago0x172b64e148ea2712eb4d3a649e7ec6371ae9ae5c IN  0x014dea5dd7ce12ce494b553f133739873247021f0 ETH0.000951864476 ETH
0x58857f215e12727733c96342f8c05f89fe8e0213ad8ae2255a96384368beea69Weight Vote51637462022-01-28 8:26:124 hrs 10 mins ago0x94a84d5edf8cbbeb7cea2d7cbd9d789ac30f3a1f IN  0x014dea5dd7ce12ce494b553f133739873247021f0 ETH0.000833333247 ETH
0x57cffdad9cbf6d18efc02f843bba2292345495e47176449bae8f3067df7e48c2Set Vote51635822022-01-28 8:20:524 hrs 15 mins ago0x255be6d417d25d553414fb9608ef6303af9eb771 IN  0x014dea5dd7ce12ce494b553f133739873247021f0 ETH0.000954311246 ETH
0x6ebb87eef4a3d9062ca5037ea6ea7cefd8fb97101adf8cc9b240b193b962e86fSet Vote51633282022-01-28 8:14:194 hrs 22 mins ago0x14aa7cfdacec1aeb55175dc31adcfddfe467f567 IN  0x014dea5dd7ce12ce494b553f133739873247021f0 ETH0.000955517909 ETH
0x7094639becd71cf9d8de727e327d584ef405a5ac723cea43782b991d19e3a5daSet Vote51622562022-01-28 7:44:344 hrs 52 mins ago0xac516cfc8a5170b4d003312adbade589f4e93ece IN  0x014dea5dd7ce12ce494b553f133739873247021f0 ETH0.00095548179 ETH
0x838cd22f209be1acc9e5ddb770903ac354258cb8db013da87eabc09b57467580Set Vote51621492022-01-28 7:40:334 hrs 56 mins ago0x7f33c1c8079869b84b0c39f29b1652badaf1a85c IN  0x014dea5dd7ce12ce494b553f133739873247021f0 ETH0.000955523261 ETH
0x5cc3a387c8bc15e2d2b3f2325511c81e10b9aebcc0aa24dcfa23731918e31c45Weight Vote51618472022-01-28 7:26:035 hrs 10 mins ago0x7f33c1c8079869b84b0c39f29b1652badaf1a85c IN  0x014dea5dd7ce12ce494b553f133739873247021f0 ETH0.000870235463 ETH
0x5f4baeeac34848b67b21d9384c79ddf79c5a69fdb3bf91f803f02f38b7a30dbaSet Vote51617442022-01-28 7:21:285 hrs 15 mins ago0x0824710837c9911ce41f5ae1baea333638a48c13 IN  0x014dea5dd7ce12ce494b553f133739873247021f0 ETH0.000953661093 ETH
0x364d855d41478ecb957bf46b3390c652311a14bda98d5a4b46243a85d118d62fSet Vote51617262022-01-28 7:18:545 hrs 17 mins ago0xafc2abce0816f60d63967842980edcdc7ad20fd7 IN  0x014dea5dd7ce12ce494b553f133739873247021f0 ETH0.000955551354 ETH
0x00cf1bc910c27c82d934f91bdde63e68ceb31c8e5756ad3368a4203ac0953b67Set Vote51615812022-01-28 7:11:465 hrs 24 mins ago0xbc4a9727fa5fa40cf90ae754f2b52a756d84246b IN  0x014dea5dd7ce12ce494b553f133739873247021f0 ETH0.000953729319 ETH
0x4d786c10283af46de475f504b3db6205dc250fa7fca68d66bd76a919a61f3dd2Set Vote51610222022-01-28 6:49:265 hrs 47 mins ago0x53b3e37dc077b64a61f31c14717bd98c80deac77 IN  0x014dea5dd7ce12ce494b553f133739873247021f0 ETH0.000955501856 ETH
0x16eff9da3d92100121fbba812c25cf5a3a99f857f8ca684eeac60e48f4127ae7Set Vote51605412022-01-28 6:30:586 hrs 5 mins ago0x9795a9baac2f17e7c7f11686bc6bc2afc3d84612 IN  0x014dea5dd7ce12ce494b553f133739873247021f0 ETH0.000963217118 ETH
0xffafbe3a7d7b044eb1ef29a0c74c867bb8ecbcaa4dfd46923b78713b204c88a3Set Vote51603962022-01-28 6:22:056 hrs 14 mins ago0xe18e779ae480092698c390e849c3ff48088047a1 IN  0x014dea5dd7ce12ce494b553f133739873247021f0 ETH0.000978436728 ETH
0x29d02e6203100fa24bab8bdb413409eee5b3d88f203d5a795e00ef9c2ed4c93aWeight Vote51590772022-01-28 5:12:437 hrs 24 mins ago0x03ba4b9973039d6e7fe93c34535caf4516ebaa3f IN  0x014dea5dd7ce12ce494b553f133739873247021f0 ETH0.000889328478 ETH
0xef32c65598bcc10607699e75cd0913c57063ac39f7ca7a6d0e2e6f0662d8604bSet Vote51583592022-01-28 4:42:227 hrs 54 mins ago0x5df3b5e9d4c9d447d115d59e7111b809eab0ed46 IN  0x014dea5dd7ce12ce494b553f133739873247021f0 ETH0.000976513175 ETH
0xdfeb642b541506f1a6c0fc4673e8daaa628103e72ac6e460d193a7e2e581808aSet Vote51563092022-01-28 3:18:239 hrs 18 mins ago0x422c0348af9e58ce790fdce6ba9014f46cf533a1 IN  0x014dea5dd7ce12ce494b553f133739873247021f0 ETH0.000975644129 ETH
0x3f3ee6dd9ff63c1e299055590374629a5fe496fe35405ec6c24506d9a258f01eSet Vote51562502022-01-28 3:17:039 hrs 19 mins ago0x8d7a001cfc096c3c6b747fb9d56ddfafdce27524 IN  0x014dea5dd7ce12ce494b553f133739873247021f0 ETH0.000977561079 ETH
0x0a3accc263fbd7b6687d6de513d90e90c3628650ec4f95412740cc9db32354bfSet Vote51530812022-01-28 1:08:0911 hrs 28 mins ago0x5d63095cd6a33b626ba08d121c889bd987dbba1c IN  0x014dea5dd7ce12ce494b553f133739873247021f0 ETH0.000973177682 ETH
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PricingSession

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at arbiscan.io on 2022-01-12
*/

// Sources flattened with hardhat v2.8.2 https://hardhat.org

// File contracts/helpers/ReentrancyGuard.sol

pragma solidity ^0.8.0;

/**
 * @title Helps contracts guard against reentrancy attacks.
 * @author Remco Bloemen <[email protected]π.com>, Eenae <[email protected]>
 * @dev If you mark a function `nonReentrant`, you should also
 * mark it `external`.
 */
contract ReentrancyGuard {

  /// @dev counter to allow mutex lock with only one SSTORE operation
  uint256 private _guardCounter = 1;

  /**
   * @dev Prevents a contract from calling itself, directly or indirectly.
   * If you mark a function `nonReentrant`, you should also
   * mark it `external`. Calling one `nonReentrant` function from
   * another is not supported. Instead, you can implement a
   * `private` function doing the actual work, and an `external`
   * wrapper marked as `nonReentrant`.
   */
  modifier nonReentrant() {
    _guardCounter += 1;
    uint256 localCounter = _guardCounter;
    _;
    require(localCounter == _guardCounter);
  }

}


// File contracts/interfaces/IABCTreasury.sol

pragma solidity ^0.8.0;

interface IABCTreasury {
    function sendABCToken(address recipient, uint _amount) external;

    function getTokensClaimed() external view returns(uint);
    
    function updateNftPriced() external;
    
    function updateProfitGenerated(uint _amount) external;

}


// File contracts/libraries/SafeMath.sol

pragma solidity ^0.8.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) {
        // Solidity only automatically asserts when dividing by 0
        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;
    }
}


// File contracts/libraries/sqrtLibrary.sol

// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.0;

library sqrtLibrary {
    
    function sqrt(uint x) pure internal returns (uint y) {
        uint z = (x + 1) / 2;
        y = x;
        while (z < y) {
            y = z;
            z = (x / z + z) / 2;
        }
    }
}


// File hardhat/[email protected]

pragma solidity >= 0.4.22 <0.9.0;

library console {
	address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);

	function _sendLogPayload(bytes memory payload) private view {
		uint256 payloadLength = payload.length;
		address consoleAddress = CONSOLE_ADDRESS;
		assembly {
			let payloadStart := add(payload, 32)
			let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)
		}
	}

	function log() internal view {
		_sendLogPayload(abi.encodeWithSignature("log()"));
	}

	function logInt(int p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(int)", p0));
	}

	function logUint(uint p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
	}

	function logString(string memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
	}

	function logBool(bool p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
	}

	function logAddress(address p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
	}

	function logBytes(bytes memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
	}

	function logBytes1(bytes1 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
	}

	function logBytes2(bytes2 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
	}

	function logBytes3(bytes3 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
	}

	function logBytes4(bytes4 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
	}

	function logBytes5(bytes5 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
	}

	function logBytes6(bytes6 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
	}

	function logBytes7(bytes7 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
	}

	function logBytes8(bytes8 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
	}

	function logBytes9(bytes9 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
	}

	function logBytes10(bytes10 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
	}

	function logBytes11(bytes11 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
	}

	function logBytes12(bytes12 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
	}

	function logBytes13(bytes13 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
	}

	function logBytes14(bytes14 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
	}

	function logBytes15(bytes15 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
	}

	function logBytes16(bytes16 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
	}

	function logBytes17(bytes17 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
	}

	function logBytes18(bytes18 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
	}

	function logBytes19(bytes19 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
	}

	function logBytes20(bytes20 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
	}

	function logBytes21(bytes21 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
	}

	function logBytes22(bytes22 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
	}

	function logBytes23(bytes23 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
	}

	function logBytes24(bytes24 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
	}

	function logBytes25(bytes25 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
	}

	function logBytes26(bytes26 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
	}

	function logBytes27(bytes27 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
	}

	function logBytes28(bytes28 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
	}

	function logBytes29(bytes29 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
	}

	function logBytes30(bytes30 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
	}

	function logBytes31(bytes31 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
	}

	function logBytes32(bytes32 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
	}

	function log(uint p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
	}

	function log(string memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
	}

	function log(bool p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
	}

	function log(address p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
	}

	function log(uint p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1));
	}

	function log(uint p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1));
	}

	function log(uint p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1));
	}

	function log(uint p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1));
	}

	function log(string memory p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1));
	}

	function log(string memory p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
	}

	function log(string memory p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
	}

	function log(string memory p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
	}

	function log(bool p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1));
	}

	function log(bool p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
	}

	function log(bool p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
	}

	function log(bool p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
	}

	function log(address p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1));
	}

	function log(address p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
	}

	function log(address p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
	}

	function log(address p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
	}

	function log(uint p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2));
	}

	function log(uint p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2));
	}

	function log(uint p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2));
	}

	function log(uint p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2));
	}

	function log(uint p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2));
	}

	function log(uint p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2));
	}

	function log(uint p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2));
	}

	function log(uint p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2));
	}

	function log(uint p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2));
	}

	function log(uint p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2));
	}

	function log(uint p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2));
	}

	function log(uint p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
	}

	function log(string memory p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2));
	}

	function log(string memory p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
	}

	function log(string memory p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
	}

	function log(string memory p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
	}

	function log(bool p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2));
	}

	function log(bool p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2));
	}

	function log(bool p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2));
	}

	function log(bool p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
	}

	function log(bool p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2));
	}

	function log(bool p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
	}

	function log(bool p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
	}

	function log(bool p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
	}

	function log(bool p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2));
	}

	function log(bool p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
	}

	function log(bool p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
	}

	function log(bool p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
	}

	function log(address p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2));
	}

	function log(address p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2));
	}

	function log(address p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2));
	}

	function log(address p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2));
	}

	function log(address p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2));
	}

	function log(address p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
	}

	function log(address p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
	}

	function log(address p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
	}

	function log(address p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2));
	}

	function log(address p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
	}

	function log(address p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
	}

	function log(address p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
	}

	function log(address p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2));
	}

	function log(address p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
	}

	function log(address p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
	}

	function log(address p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
	}

	function log(uint p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
	}

}


// File contracts/libraries/PostSessionLibrary.sol


pragma solidity ^0.8.0;


library PostSessionLibrary {

    using sqrtLibrary for *;


    function collusionCheck(uint correct, uint incorrect, uint spread) pure internal returns (bool) {
        if(correct * 100 / (correct + incorrect) >= (95-spread)) {
            return true;
        }
        else {
            return false;
        }
    }

    /////////////////////
    /// Session Bound ///
    /////////////////////

    function calculateTotalValue(
        uint values,
        uint[] memory appraisals, 
        uint finalAppraisal
    ) pure internal returns (uint totalValue) {
        for(uint j = 0; j < 30; j++) {
            if (j == values) { 
                break;
            }
            if(appraisals[j] > finalAppraisal) {
                totalValue += (appraisals[j] - finalAppraisal) ** 2;
            }
            else {
                totalValue += (finalAppraisal - appraisals[j]) ** 2;
            }
        }
    }

    function calculateBound(uint finalAppraisalValue, uint stdev, uint defender) pure internal returns (uint upperBound) {
        upperBound = finalAppraisalValue + (3 * (stdev + 20e18/finalAppraisalValue) / (defender + 1) * 2);
    }

    /////////////////////
    ///      Base     ///
    /////////////////////

    function calculateBase(uint finalAppraisalValue, uint userAppraisalValue, uint spread) pure internal returns(uint){
        uint base = 1;
        uint userVal = 100 * userAppraisalValue;
        for(uint i=spread; i >= 1; i--) {
            uint lowerOver = (100 + (i - 1)) * finalAppraisalValue;
            uint upperOver = (100 + i) * finalAppraisalValue;
            uint lowerUnder = (100 - i) * finalAppraisalValue;
            uint upperUnder = (100 - i + 1) * finalAppraisalValue;
            if (lowerOver < userVal && userVal <= upperOver) {
                return base; 
            }
            if (lowerUnder < userVal && userVal <= upperUnder) {
                return base;
            }
            base += 1;
        }
        if(userVal == 100*finalAppraisalValue) {
            return spread + 1;
        }
        return 0;
    }

    /////////////////////
    ///    Harvest    ///
    /////////////////////

    // function harvestUserOver(uint _stake, uint _userAppraisal, uint _finalAppraisal) pure internal returns(uint) {
    //     return _stake * (_userAppraisal*100 - 105*_finalAppraisal)/(_finalAppraisal*100);
    // }
    
    // function harvestUserUnder(uint _stake, uint _userAppraisal, uint _finalAppraisal) pure internal returns(uint) {
    //     return _stake * (95*_finalAppraisal - 100*_userAppraisal)/(_finalAppraisal*100);
    // }

    function harvest(uint _stake, uint _userAppraisal, uint _finalAppraisal, uint riskFactor, uint spread) pure internal returns(uint) {
        if(
            (_userAppraisal*100 > (100 + spread)*_finalAppraisal 
            && (_userAppraisal*100 - (100 + spread)*_finalAppraisal)/(_finalAppraisal) > (100 + spread))
            || _userAppraisal == 0
        ) {
            return _stake;
        }
        else if(_userAppraisal*100 > (100 + spread)*_finalAppraisal) {
            if (_stake * (_userAppraisal*100 - (100 + spread)*_finalAppraisal)/(_finalAppraisal*100) * riskFactor > _stake) {
                return _stake;
            }
            else {
                return _stake * (_userAppraisal*100 - (100 + spread)*_finalAppraisal)/(_finalAppraisal*100) * riskFactor;
            }
        }
        else if(_userAppraisal*100 < (100 - spread)*_finalAppraisal) {
            if (_stake * ((100 - spread)*_finalAppraisal - 100*_userAppraisal)/(_finalAppraisal*100) * riskFactor > _stake) {
                return _stake;
            }
            else {
                return _stake * ((100 - spread)*_finalAppraisal - 100*_userAppraisal)/(_finalAppraisal*100) * riskFactor;
            }
        }
        else {
            return 0;
        }
    }

    /////////////////////
    ///   Commission  ///
    /////////////////////   
    function setCommission(uint _treasurySize) pure internal returns(uint) {
        if (_treasurySize < 25000 ether) {
            return 500;
        }
        else if(_treasurySize >= 25000 ether && _treasurySize < 50000 ether) {
            return 400;
        }
        else if(_treasurySize >= 50000 ether && _treasurySize < 100000 ether) {
            return 300;
        }
        else if(_treasurySize >= 100000 ether && _treasurySize < 2000000 ether) {
            return 200;
        }
        else if(_treasurySize >= 200000 ether && _treasurySize < 400000 ether) {
            return 100;
        }
        else if(_treasurySize >= 400000 ether && _treasurySize < 700000 ether) {
            return 50;
        }
        else {
            return 25;
        }
    }


}


// File contracts/interfaces/IERC20.sol

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


// File contracts/ABCTreasury.sol

pragma solidity ^0.8.0;


/// @author Medici
/// @title Treasury contract for Abacus
contract ABCTreasury is  ReentrancyGuard {
    
    /* ======== UINT ======== */

    uint public nftsPriced;
    uint public profitGenerated;
    uint public tokensClaimed;
    uint public riskFactor;
    uint public spread;
    uint public defender;
    uint public commissionRate;
    uint public payoutMultiplier;

    /* ======== BOOL ======== */

    bool public tokenStatus;
    bool public auctionStatus;

    /* ======== ADDRESS ======== */

    address public auction;
    address public pricingSession;
    address public admin;
    address public ABCToken;
    address public multisig;
    address public creditStore;

    /* ======== EVENTS ======== */

    event ethClaimedByUser(address user_, uint ethClaimed);
    event ethToABCExchange(address user_, uint ethExchanged, uint ppSent);

    /* ======== CONSTRUCTOR ======== */

    constructor(address _creditStore) {
        admin = msg.sender;
        creditStore = _creditStore;
        auctionStatus = true;
        riskFactor = 2;
        spread = 10;
        defender = 2;
        commissionRate = 500;
        payoutMultiplier = 200;
    }

    /* ======== ADMIN FUNCTIONS ======== */

    /// @notice set the auction status based on the active/inactive status of the bounty auction
    /// @param status desired auction status to be stored and referenced in contract
    function setAuctionStatus(bool status) onlyAdmin external {
        auctionStatus = status;
    }

    /// @notice set the auction status based on the active/inactive status of the bounty auction
    /// @param _commissionRate desired commission percentage the protocol would like to take
    function setCommissionRate(uint _commissionRate) onlyAdmin external {
        commissionRate = _commissionRate;
    }

    function setPayoutMultiplier(uint _multiplier) onlyAdmin external {
        payoutMultiplier = _multiplier;
    }

    /// @notice set protocol risk factor
    /// @param _risk the protocol risk factor is a multiplier applied to any losses harvested
    function setRiskFactor(uint _risk) onlyAdmin external {
        riskFactor = _risk;
    }

    /// @notice set the protocol spread
    /// @param _spread the protocol spread is the margin of error that correctness is based on
    function setSpread(uint _spread) onlyAdmin external {
        spread = _spread;
    }

    /// @notice set the protocol defender level
    /** @dev the defender is used to determined the amount of
    recursive bound exclusions enforced per session. 
    
    For example, in times of a high volume of extreme value attacks,
    the community can set the defender to level 3 in which case every session
    will have the _boundCheck happen 3 times. What this means is there will be
    one bound check, the final appraisal will be adjusted, then a second check,
    final appraisal will be re-adjusted, then a third, and final appraisal will
    be adjusted one final time. 

    Any values that are removed result in removal from final appraisal affect 
    AND their stake is completely lost. 
    */
    /// @param _defender the defender is a value that determines the amount of recursive bound exclusions enforced per session
    function setDefender(uint _defender) onlyAdmin external {
        defender = _defender;
    }

    /// @notice set ABC token contract address 
    /// @param _ABCToken desired ABC token to be stored and referenced in contract
    function setABCTokenAddress(address _ABCToken) onlyAdmin external {
        ABCToken = _ABCToken;
    }

    function setMultisig(address _multisig) onlyAdmin external {
        multisig = _multisig;
    }

    /// @notice allow admin to withdraw funds to multisig in the case of emergency (ONLY USED IN THE CASE OF EMERGENCY)
    /// @param _amountEth value of ETH to be withdrawn from the treasury to multisig (ONLY USED IN THE CASE OF EMERGENCY)
    function withdrawEth(uint _amountEth) onlyAdmin external {
        (bool sent, ) = payable(multisig).call{value: _amountEth}("");
        require(sent, "Failed to send Ether");
    }

    /// @notice allow admin to withdraw funds to multisig in the case of emergency (ONLY USED IN THE CASE OF EMERGENCY)
    /// @param _amountAbc value of ABC to be withdrawn from the treasury to multisig (ONLY USED IN THE CASE OF EMERGENCY)
    function withdrawAbc(uint _amountAbc) onlyAdmin external {
        bool sent = IERC20(ABCToken).transfer(multisig, _amountAbc);
        require(sent);
    }

    /// @notice set newAdmin (or burn admin when the time comes)
    /// @param _newAdmin desired admin address to be stored and referenced in contract
    function setAdmin(address _newAdmin) onlyAdmin external {
        admin = _newAdmin;
    }

    /// @notice set pricing factory address to allow for updates
    /// @param _pricingFactory desired pricing session principle address to be stored and referenced in contract
    function setPricingSession(address _pricingFactory) onlyAdmin external {
        pricingSession = _pricingFactory;
    }

    /// @notice set auction contract for bounty auction period
    /// @param _auction desired auction address to be stored and referenced in contract
    function setAuction(address _auction) onlyAdmin external {
        auction = _auction;
    }

    function setCreditStore(address _creditStore) onlyAdmin external {
        creditStore = _creditStore;
    }

    /* ======== CHILD FUNCTIONS ======== */
    
    /// @notice send ABC to users that earn 
    /// @param recipient the user that will be receiving ABC 
    /// @param _amount the amount of ABC to be transferred to the recipient
    function sendABCToken(address recipient, uint _amount) public {
        require(msg.sender == creditStore || msg.sender == admin);
        if(msg.sender == creditStore) {
            IERC20(ABCToken).transfer(recipient, payoutMultiplier * _amount / 100);
        }
        else {
            IERC20(ABCToken).transfer(recipient, _amount);
        }
    }

    /// @notice track amount of nfts priced
    function updateNftPriced() isFactory external {
        nftsPriced++;
    }

    /// @notice track total profits generated by the protocol through fees
    function updateTotalProfitsGenerated(uint _amount) isFactory external {
        profitGenerated += _amount;
    }

    /* ======== FALLBACKS ======== */

    receive() external payable {}
    fallback() external payable {}

    /* ======== MODIFIERS ======== */

    ///@notice check that msg.sender is admin
    modifier onlyAdmin() {
        require(admin == msg.sender, "not admin");
        _;
    }
    
    ///@notice check that msg.sender is factory
    modifier isFactory() {
        require(msg.sender == pricingSession, "not session contract");
        _;
    }

    ///@notice check that msg.sender is factory
    modifier isCreditStore() {
        require(msg.sender == creditStore, "not credit store contract");
        _;
    }
}


// File contracts/CreditVault.sol

pragma solidity ^0.8.0;



/// @author Medici
/// @title Treasury contract for Abacus
contract CreditVault is  ReentrancyGuard {

    /* ======== UINT ======== */

    uint public tokensClaimed;

    /* ======== BOOL ======== */

    bool public tokenStatus;

    /* ======== ADDRESS ======== */

    address public auction;
    address public pricingSession;
    address public admin;
    address public token;
    address public multisig;
    address public treasury;

    /* ======== MAPPING ======== */

    /// @notice maps each user to their total profit earned
    mapping(address => uint) public profitStored;

    /// @notice maps each user to their principal stored
    mapping(address => uint) public principalStored;

    /// @notice maps each user to their history of profits earned 
    mapping(address => uint) public totalProfitEarned;

    /* ======== EVENTS ======== */

    event ethClaimedByUser(address user_, uint ethClaimed);
    event ethToABCExchange(address user_, uint ethExchanged, uint ppSent);

    /* ======== CONSTRUCTOR ======== */

    constructor() {
        admin = msg.sender;
    }

    /* ======== ADMIN FUNCTIONS ======== */

    function setTokenStatus(bool _status) onlyAdmin external {
        tokenStatus = _status;
    }

    /// @notice set ABC token contract address 
    /// @param _ABCToken desired ABC token to be stored and referenced in contract
    function setABCTokenAddress(address _ABCToken) onlyAdmin external {
        token = _ABCToken;
    }

    function setMultisig(address _multisig) onlyAdmin external {
        multisig = _multisig;
    }

    function setTreasury(address _treasury) onlyAdmin external {
        treasury = _treasury;
    }

    /// @notice set newAdmin (or burn admin when the time comes)
    /// @param _newAdmin desired admin address to be stored and referenced in contract
    function setAdmin(address _newAdmin) onlyAdmin external {
        admin = _newAdmin;
    }

    /// @notice set pricing factory address to allow for updates
    /// @param _pricingFactory desired pricing session principle address to be stored and referenced in contract
    function setPricingSession(address _pricingFactory) onlyAdmin external {
        pricingSession = _pricingFactory;
    }

    /// @notice set auction contract for bounty auction period
    /// @param _auction desired auction address to be stored and referenced in contract
    function setAuction(address _auction) onlyAdmin external {
        auction = _auction;
    }

    /* ======== USER FUNCTIONS ======== */

    /// @notice user deposits principal
    function depositPrincipal() nonReentrant payable external {
        principalStored[msg.sender] += msg.value;
    }

    /// @notice allows user to reclaim principalUsed in batches
    function claimPrincipalUsed(uint _amount) nonReentrant external {
        require(_amount <= principalStored[msg.sender]);
        principalStored[msg.sender] -= _amount;
        (bool sent, ) = msg.sender.call{value: _amount}("");
        require(sent, "Failed to send Ether");
    }

    /// @notice allows user to claim batched earnings
    /// @param trigger denotes whether the user desires it in ETH (1) or ABC (2)
    function claimProfitsEarned(uint trigger, uint _amount) nonReentrant external {
        require(trigger == 1 || trigger == 2);
        require(profitStored[msg.sender] >= _amount);
        if(trigger == 1) {
            (bool sent, ) = msg.sender.call{value: _amount}("");
            require(sent, "Failed to send Ether");
            profitStored[msg.sender] -= _amount;
            emit ethClaimedByUser(msg.sender, _amount);
        }
        else if(trigger == 2) {
            require(tokenStatus);
            uint abcAmount = _amount * ethToAbc();
            tokensClaimed += abcAmount;
            profitStored[msg.sender] -= _amount;
            ABCTreasury(payable(treasury)).sendABCToken(msg.sender, abcAmount);
            emit ethToABCExchange(msg.sender, _amount, abcAmount);
        }
    } 

    /* ======== CHILD FUNCTIONS ======== */

    /// @notice Allows Factory contract to update the profit generated value
    /// @param _amount the amount of profit to update profitGenerated count
    function increasePrincipalStored(address _user, uint _amount) isFactory external { 
        principalStored[_user] += _amount;
    }

    /// @notice decrease credit stored
    function decreasePrincipalStored(address _user, uint _amount) isFactory external {
        require(principalStored[_user] >= _amount);
        principalStored[_user] -= _amount;
    }
    
    /// @notice track profits earned by a user
    function updateProfitStored(address _user, uint _amount) isFactory external {
        profitStored[_user] += _amount;
        totalProfitEarned[_user] += _amount;
    }

    function sendToTreasury(uint _amount) isFactory external {
        payable(treasury).transfer(_amount);
    }

    /* ======== VIEW FUNCTIONS ======== */

    /// @notice returns the current spot exchange rate of ETH to ABC
    function ethToAbc() view public returns(uint) {
        return 1e18 / (0.00005 ether + 0.000015 ether * ((ABCTreasury(payable(treasury)).tokensClaimed()/2) / (1000000*1e18)));
    }

    /* ======== FALLBACKS ======== */

    receive() external payable {}
    fallback() external payable {}

    /* ======== MODIFIERS ======== */

    ///@notice check that msg.sender is admin
    modifier onlyAdmin() {
        require(admin == msg.sender, "not admin");
        _;
    }
    
    ///@notice check that msg.sender is factory
    modifier isFactory() {
        require(msg.sender == pricingSession, "not session contract");
        _;
    }
}


// File contracts/PricingSession.sol

pragma solidity ^0.8.0;








/// @author Medici
/// @title Pricing session contract for Abacus
contract PricingSession is ReentrancyGuard {

    using SafeMath for uint;

    /* ======== ADDRESS ======== */

    address ABCToken;
    ABCTreasury Treasury;
    address admin;
    address auction;
    address creditStore;
    
    /* ======== MAPPINGS ======== */

    /// @notice maps each NFT to its current nonce value
    mapping(address => mapping (uint => uint)) public nftNonce; 

    mapping(uint => mapping(address => mapping(uint => address[]))) NftSessionVoters;

    mapping(uint => mapping(address => mapping(uint => VotingSessionMapping))) NftSessionMap;

    /// @notice maps each NFT pricing session (nonce dependent) to its necessary session checks (i.e. checking session progression)
    /// @dev nonce => tokenAddress => tokenId => session metadata
    mapping(uint => mapping(address => mapping(uint => VotingSessionChecks))) public NftSessionCheck;

    /// @notice maps each NFT pricing session (nonce dependent) to its necessary session core values (i.e. total participants, total stake, etc...)
    mapping(uint => mapping(address => mapping(uint => VotingSessionCore))) public NftSessionCore;

    /// @notice maps each NFT pricing session (nonce dependent) to its final appraisal value output
    mapping(uint => mapping(address => mapping(uint => uint))) public finalAppraisalValue;
    
    /* ======== STRUCTS ======== */

    /// @notice tracks all of the mappings necessary to operate a session
    struct VotingSessionMapping {

        mapping (address => uint) voterCheck;
        mapping (address => uint) winnerPoints;
        mapping (address => uint) secondaryPoint;
        mapping (address => uint) amountHarvested;
        mapping (address => Voter) nftVotes;
    }

    /// @notice track necessary session checks (i.e. whether its time to weigh votes or harvest)
    struct VotingSessionChecks {

        uint revealedStake;
        uint sessionProgression;
        uint calls;
        uint correct;
        uint incorrect;
        uint defender;
        uint spread;
        uint riskFactor;
        uint finalStdev;
        uint secondaryPoints;
    }

    /// @notice track the core values of a session (max appraisal value, total session stake, etc...)
    struct VotingSessionCore {

        uint endTime;
        uint bounty;
        uint keeperReward;
        uint lowestStake;
        uint maxAppraisal;
        uint totalAppraisalValue;
        uint totalSessionStake;
        uint totalProfit;
        uint totalWinnerPoints;
        uint totalVotes;
        uint uniqueVoters;
        uint votingTime;
    }

    /// @notice track voter information
    struct Voter {

        bytes32 concealedAppraisal;
        uint base;
        uint appraisal;
        uint stake;
    }

    /* ======== EVENTS ======== */

    event PricingSessionCreated(address creator_, uint nonce, address nftAddress_, uint tokenid_, uint initialAppraisal_, uint bounty_);
    event newAppraisalAdded(address voter_, uint nonce, address nftAddress_, uint tokenid_, uint stake_, bytes32 userHash_);
    event voteWeighed(address user_, uint nonce, address nftAddress_, uint tokenid_, uint appraisal);
    event finalAppraisalDetermined(uint nonce, address nftAddress_, uint tokenid_, uint finalAppraisal, uint amountOfParticipants, uint totalStake);
    event sessionEnded(address nftAddress, uint tokenid, uint nonce);

    /* ======== CONSTRUCTOR ======== */

    constructor(address _treasury, address _auction, address _creditStore) {
        Treasury = ABCTreasury(payable(_treasury));
        auction = _auction;
        admin = msg.sender;
        creditStore = _creditStore;
    }

    /// @notice set the auction address to be referenced throughout the contract
    /// @param _auction desired auction address to be stored and referenced in contract
    function setAuction(address _auction) onlyAdmin external {
        auction = _auction;
    }

    /// @notice set the treasury address
    /// @param treasury desired treasury address to be stored and referenced in contract
    function setTreasury(address treasury) onlyAdmin external {
        Treasury = ABCTreasury(payable(treasury));
    }

    /// @notice set ABC token address
    function setABCToken(address _token) onlyAdmin external {
        ABCToken = _token;
    }

    /// @notice Allow user to create new session and attach initial bounty
    /**
    @dev NFT sessions are indexed using a nonce per specific nft.
    The mapping is done by mapping a nonce to an NFT address to the 
    NFT token id. 
    */ 
    /// @param nftAddress NFT contract address of desired NFT to be priced
    /// @param tokenid NFT token id of desired NFT to be priced 
    /// @param _initialAppraisal appraisal value for max value to be instantiated against
    /// @param _votingTime voting window duration
    function createNewSession(
        address nftAddress,
        uint tokenid,
        uint _initialAppraisal,
        uint _votingTime
    ) stopOverwrite(nftAddress, tokenid) external payable {
        require(_votingTime <= 1 days && (!Treasury.auctionStatus() || msg.sender == auction));
        VotingSessionCore storage sessionCore = NftSessionCore[nftNonce[nftAddress][tokenid]][nftAddress][tokenid];
        if(msg.sender == auction) {}
        else {
            uint abcCost = 0.005 ether *(CreditVault(payable(creditStore)).ethToAbc());
            (bool abcSent) = IERC20(ABCToken).transferFrom(msg.sender, address(Treasury), abcCost);
            require(abcSent);
        }
        if(nftNonce[nftAddress][tokenid] == 0 || getStatus(nftAddress, tokenid) == 5) {}
        else if(block.timestamp > sessionCore.endTime + sessionCore.votingTime * 3) {
            CreditVault(payable(creditStore)).sendToTreasury(sessionCore.totalSessionStake);
            sessionCore.totalSessionStake = 0;
            emit sessionEnded(nftAddress, tokenid, nftNonce[nftAddress][tokenid]);
        }
        nftNonce[nftAddress][tokenid]++;
        VotingSessionCore storage sessionCoreNew = NftSessionCore[nftNonce[nftAddress][tokenid]][nftAddress][tokenid];
        VotingSessionChecks storage sessionCheck = NftSessionCheck[nftNonce[nftAddress][tokenid]][nftAddress][tokenid];
        sessionCoreNew.votingTime = _votingTime;
        sessionCoreNew.maxAppraisal = 69420 * _initialAppraisal / 1000;
        sessionCoreNew.lowestStake = 100000 ether;
        sessionCoreNew.endTime = block.timestamp + _votingTime;
        sessionCoreNew.bounty = msg.value;
        sessionCheck.defender = Treasury.defender();
        sessionCheck.spread = Treasury.spread();
        sessionCheck.riskFactor = Treasury.riskFactor();
        payable(creditStore).transfer(sessionCoreNew.bounty);
        emit PricingSessionCreated(msg.sender, nftNonce[nftAddress][tokenid], nftAddress, tokenid, _initialAppraisal, msg.value);
    }

    /* ======== USER VOTE FUNCTIONS ======== */
    
    /// @notice Allows user to set vote in party 
    /** 
    @dev Users appraisal is hashed so users can't track final appraisal and submit vote right before session ends.
    Therefore, users must remember their appraisal in order to reveal their appraisal in the next function.
    */
    /// @param nftAddress NFT contract address of NFT being appraised
    /// @param tokenid NFT tokenid of NFT being appraised
    /// @param concealedAppraisal concealed bid that is a hash of the appraisooooors appraisal value, wallet address, and seed number
    function setVote(
        address nftAddress,
        uint tokenid,
        uint stake,
        bytes32 concealedAppraisal
    ) properVote(nftAddress, tokenid, stake) external {
        uint nonce = nftNonce[nftAddress][tokenid];
        VotingSessionCore storage sessionCore = NftSessionCore[nonce][nftAddress][tokenid];
        VotingSessionMapping storage sessionMap = NftSessionMap[nonce][nftAddress][tokenid];
        require(sessionCore.endTime > block.timestamp && stake <= CreditVault(payable(creditStore)).principalStored(msg.sender));
        sessionMap.voterCheck[msg.sender] = 1;
        CreditVault(payable(creditStore)).decreasePrincipalStored(msg.sender, stake);
        stake -= 0.004 ether;
        sessionCore.keeperReward += 0.002 ether;
        sessionCore.bounty += 0.002 ether;
        if (stake < sessionCore.lowestStake) {
            sessionCore.lowestStake = stake;
        }
        sessionCore.uniqueVoters++;
        sessionCore.totalSessionStake = sessionCore.totalSessionStake.add(stake);
        sessionMap.nftVotes[msg.sender].concealedAppraisal = concealedAppraisal;
        sessionMap.nftVotes[msg.sender].stake = stake;
        emit newAppraisalAdded(msg.sender, nonce, nftAddress, tokenid, stake, concealedAppraisal);
    }

    /// @notice allow user to update value inputs of their vote while voting is still active
    /// @param nftAddress NFT contract address of NFT being appraised
    /// @param tokenid NFT tokenid of NFT being appraised
    /// @param concealedAppraisal concealed bid that is a hash of the appraisooooors new appraisal value, wallet address, and seed number
    function updateVote(
        address nftAddress,
        uint tokenid,
        bytes32 concealedAppraisal
    ) external {
        uint nonce = nftNonce[nftAddress][tokenid];
        VotingSessionCore storage sessionCore = NftSessionCore[nonce][nftAddress][tokenid];
        VotingSessionMapping storage sessionMap = NftSessionMap[nonce][nftAddress][tokenid];
        require(sessionMap.voterCheck[msg.sender] == 1);
        require(sessionCore.endTime > block.timestamp);
        sessionMap.nftVotes[msg.sender].concealedAppraisal = concealedAppraisal;
    }

    /// @notice Reveals user vote and weights based on the sessions lowest stake
    /**
    @dev calculation can be found in the weightVoteLibrary.sol file. 
    Votes are weighted as sqrt(userStake/lowestStake). Depending on a votes weight
    it is then added as multiple votes of that appraisal (i.e. if someoneone has
    voting weight of 8, 8 votes are submitted using their appraisal).
    */
    /// @param nftAddress NFT contract address of NFT being appraised
    /// @param tokenid NFT tokenid of NFT being appraised
    /// @param appraisal appraisooooor appraisal value used to unlock concealed appraisal
    /// @param seedNum appraisooooor seed number used to unlock concealed appraisal
    function weightVote(address nftAddress, uint tokenid, uint appraisal, uint seedNum) checkParticipation(nftAddress, tokenid) nonReentrant external {
        uint nonce = nftNonce[nftAddress][tokenid];
        VotingSessionCore storage sessionCore = NftSessionCore[nonce][nftAddress][tokenid];
        VotingSessionMapping storage sessionMap = NftSessionMap[nonce][nftAddress][tokenid];
        VotingSessionChecks storage sessionCheck = NftSessionCheck[nonce][nftAddress][tokenid];
        address[] storage voters = NftSessionVoters[nonce][nftAddress][tokenid];
        require(sessionCheck.sessionProgression < 2
                && sessionCore.endTime < block.timestamp
                && sessionMap.voterCheck[msg.sender] == 1
                && sessionMap.nftVotes[msg.sender].concealedAppraisal == keccak256(abi.encodePacked(appraisal, msg.sender, seedNum))
                && sessionCore.maxAppraisal >= appraisal
        );
        sessionMap.voterCheck[msg.sender] = 2;
        if(sessionCheck.sessionProgression == 0) {
            sessionCheck.sessionProgression = 1;
        }
        sessionCheck.revealedStake += sessionMap.nftVotes[msg.sender].stake;
        voters.push(msg.sender);
        _weigh(nftAddress, tokenid, appraisal);
        emit voteWeighed(msg.sender, nonce, nftAddress, tokenid, appraisal);
        if(sessionCheck.calls == sessionCore.uniqueVoters || block.timestamp > sessionCore.endTime + sessionCore.votingTime) {
            sessionCheck.sessionProgression = 2;
            sessionCore.uniqueVoters = sessionCheck.calls;
            sessionCheck.calls = 0;
        }
    }
    
    /// @notice takes average of appraisals and outputs a final appraisal value.
    /// @param nftAddress NFT contract address of NFT being appraised
    /// @param tokenid NFT tokenid of NFT being appraised
    function setFinalAppraisal(address nftAddress, uint tokenid) public {
        uint nonce = nftNonce[nftAddress][tokenid];
        VotingSessionCore storage sessionCore = NftSessionCore[nonce][nftAddress][tokenid];
        VotingSessionChecks storage sessionCheck = NftSessionCheck[nonce][nftAddress][tokenid];
        require(
            (block.timestamp > sessionCore.endTime + sessionCore.votingTime || sessionCheck.sessionProgression == 2)
            && sessionCheck.sessionProgression <= 2
        );
        CreditVault(payable(creditStore)).updateProfitStored(msg.sender, sessionCore.keeperReward/2 ether);
        _boundCheck(nftAddress, tokenid);
        sessionCore.totalProfit += sessionCore.bounty + (sessionCore.totalSessionStake - sessionCheck.revealedStake);
        sessionCheck.calls = 0;
        finalAppraisalValue[nonce][nftAddress][tokenid] = (sessionCore.totalAppraisalValue)/(sessionCore.totalVotes);
        sessionCheck.sessionProgression = 3;
        emit finalAppraisalDetermined(nftNonce[nftAddress][tokenid], nftAddress, tokenid, finalAppraisalValue[nftNonce[nftAddress][tokenid]][nftAddress][tokenid], sessionCore.uniqueVoters, sessionCore.totalSessionStake);
    }

    /// @notice Calculates users base and harvests their loss before returning remaining stake
    /**
    @dev A couple notes:
    1. Base is calculated based on margin of error.
        > +/- 5% = 1
        > +/- 4% = 2
        > +/- 3% = 3
        > +/- 2% = 4
        > +/- 1% = 5
        > Exact = 6
    2. winnerPoints are calculated based on --> base * stake
    3. Losses are harvested based on --> (margin of error - 5%) * stake
    */
    /// @param nftAddress NFT contract address of NFT being appraised
    /// @param tokenid NFT tokenid of NFT being appraised
    function harvest(address nftAddress, uint tokenid) checkParticipation(nftAddress, tokenid) nonReentrant external returns(uint256){
        uint nonce = nftNonce[nftAddress][tokenid];
        VotingSessionCore storage sessionCore = NftSessionCore[nonce][nftAddress][tokenid];
        VotingSessionChecks storage sessionCheck = NftSessionCheck[nonce][nftAddress][tokenid];
        address[] storage voters = NftSessionVoters[nonce][nftAddress][tokenid];
        require(sessionCheck.sessionProgression == 3);
        address user;
        for(uint i = 0; i < 20; i++) {
            user = voters[sessionCheck.calls];
            CreditVault(payable(creditStore)).updateProfitStored(msg.sender, 0.0005 ether);
            sessionCheck.calls++;
            _harvest(user, nftAddress, tokenid);
            if(sessionCheck.calls == sessionCore.uniqueVoters) {
                sessionCheck.sessionProgression = 4;
                sessionCore.uniqueVoters = sessionCheck.calls;
                sessionCheck.calls = 0;
                return 1;
            }
        }
        return 1;
    }

    /// @notice User claims principal stake along with any earned profits in ETH or ABC form
    /**
    @dev 
    1. Calculates user principal return value
    2. Enacts sybil defense mechanism
    3. Edits totalProfits and totalSessionStake to reflect claim
    5. Pays out principal
    6. Adds profit credit to profitStored
    */
    /// @param nftAddress NFT contract address of NFT being appraised
    /// @param tokenid NFT tokenid of NFT being appraised
    function claim(address nftAddress, uint tokenid) checkParticipation(nftAddress, tokenid) nonReentrant external returns(uint) {
        uint nonce = nftNonce[nftAddress][tokenid];
        VotingSessionCore storage sessionCore = NftSessionCore[nonce][nftAddress][tokenid];
        VotingSessionChecks storage sessionCheck = NftSessionCheck[nonce][nftAddress][tokenid];
        address[] storage voters = NftSessionVoters[nonce][nftAddress][tokenid];
        require(sessionCheck.sessionProgression == 4);
        address user;
        for(uint i = 0; i < 20; i++) {
            user = voters[sessionCheck.calls];
            CreditVault(payable(creditStore)).updateProfitStored(msg.sender, 0.0005 ether);
            sessionCheck.calls++;
            _claim(user, nftAddress, tokenid);
            if(sessionCheck.calls == sessionCore.uniqueVoters) {
                sessionCore.totalSessionStake = 0;
                sessionCheck.sessionProgression = 5;
                emit sessionEnded(nftAddress, tokenid, nonce);
                return 1;
            }
        }
        return 1;
    }

    /* ======== INTERNAL FUNCTIONS ======== */

    ///@notice user vote is weighed
    /**
    @dev a voters weight is determined by the following formula:
        sqrt(voterStake/lowestStake)
    this value is then used to
    */
    /// @param nftAddress NFT contract address of NFT being appraised
    /// @param tokenid NFT tokenid of NFT being appraised
    /// @param appraisal the voters appraisal value 
    function _weigh(address nftAddress, uint tokenid, uint appraisal) internal {
        uint nonce = nftNonce[nftAddress][tokenid];
        VotingSessionCore storage sessionCore = NftSessionCore[nonce][nftAddress][tokenid];
        VotingSessionMapping storage sessionMap = NftSessionMap[nonce][nftAddress][tokenid];
        VotingSessionChecks storage sessionCheck = NftSessionCheck[nonce][nftAddress][tokenid];
        sessionMap.nftVotes[msg.sender].appraisal = appraisal;
        uint weight = sqrtLibrary.sqrt(sessionMap.nftVotes[msg.sender].stake/sessionCore.lowestStake);
        sessionCore.totalVotes += weight;
        sessionCheck.calls++;
        
        sessionCore.totalAppraisalValue += weight * appraisal;
    }

    /// @notice user vote is checked against the post-determined lower and upper bound 
    /**
    @dev the upper bound for acceptable votes are set using the following equation:

    Calculate margin
        uint256 margin = 3 * stdev + 20e18 / final_appraisal;

    Calculate inclusion bound
        uint256 upper_bound = final_appraisal + margin;
    
    This function is used to root out extreme entries that may be malicious or accidental.
    */
    /// @param nftAddress NFT contract address of NFT being appraised
    /// @param tokenid NFT tokenid of NFT being appraised
    function _boundCheck(address nftAddress, uint tokenid) internal {
        uint nonce = nftNonce[nftAddress][tokenid];
        VotingSessionCore storage sessionCore = NftSessionCore[nonce][nftAddress][tokenid];
        VotingSessionChecks storage sessionCheck = NftSessionCheck[nonce][nftAddress][tokenid];
        VotingSessionMapping storage sessionMap = NftSessionMap[nonce][nftAddress][tokenid];
        address[] storage voters = NftSessionVoters[nonce][nftAddress][tokenid];
        if(sessionCheck.calls != 0) {
            sessionCore.uniqueVoters = sessionCheck.calls;
        }
        uint rounds = sessionCore.uniqueVoters / 20 + 1;
        uint totalValue;
        uint voterCount;
        uint invalidCount; 
        for(uint a = 0; a <= sessionCheck.defender; a++) {
            uint finalAppraisal = (sessionCore.totalAppraisalValue)/(sessionCore.totalVotes);
            voterCount = 0;
            for(uint i = 0; i < rounds; i++) {
                for(uint j = 0; j < 20; j++) {
                    if (voterCount == sessionCore.uniqueVoters) { 
                        break; 
                    }
                    if(sessionMap.nftVotes[voters[voterCount]].appraisal == 0) {}
                    else if(sessionMap.nftVotes[voters[voterCount]].appraisal > finalAppraisal) { 
                        totalValue += (sessionMap.nftVotes[voters[voterCount]].appraisal - finalAppraisal) ** 2;
                    }
                    else { 
                        totalValue += (finalAppraisal - sessionMap.nftVotes[voters[voterCount]].appraisal) ** 2;
                    }
                    voterCount++;
                }
            }
            uint stdev = sqrtLibrary.sqrt(totalValue/(sessionCore.uniqueVoters - invalidCount));
            totalValue = 0;
            sessionCheck.finalStdev = stdev;
            if(a == sessionCheck.defender) {
                break;
            }
            voterCount = 0;
            uint upper = PostSessionLibrary.calculateBound(finalAppraisal, stdev, sessionCheck.defender);
            uint weight;
            for(uint i = 0; i < rounds; i++) {
                for(uint j = 0; j < 20; j++) {
                    if (voterCount == sessionCore.uniqueVoters) {
                        break;
                    }
                    weight = sqrtLibrary.sqrt(sessionMap.nftVotes[voters[voterCount]].stake/sessionCore.lowestStake);
                    if(sessionMap.nftVotes[voters[voterCount]].appraisal > upper) {
                        sessionCore.totalVotes -= weight * (sessionMap.nftVotes[voters[voterCount]].appraisal == 0? 0:1);
                        sessionCore.totalAppraisalValue -= weight * sessionMap.nftVotes[voters[voterCount]].appraisal;
                        sessionMap.nftVotes[voters[voterCount]].appraisal = 0;
                        invalidCount++;
                    }
                    voterCount++;
                }
            }
        }
    }

    /// @notice Calculates users base and harvests their loss before returning remaining stake
    /**
    @dev A couple notes:
    1. Base is calculated based on margin of error.
        > +/- 5% = 1
        > +/- 4% = 2
        > +/- 3% = 3
        > +/- 2% = 4
        > +/- 1% = 5
        > Exact = 6
    2. winnerPoints are calculated based on --> base * stake
    3. Losses are harvested based on --> (margin of error - 5%) * stake
    */
    /// @param nftAddress NFT contract address of NFT being appraised
    /// @param tokenid NFT tokenid of NFT being appraised
    /// @param _user the user that harvest is being called on
    function _harvest(address _user, address nftAddress, uint tokenid) internal {
        uint nonce = nftNonce[nftAddress][tokenid];
        VotingSessionCore storage sessionCore = NftSessionCore[nonce][nftAddress][tokenid];
        VotingSessionChecks storage sessionCheck = NftSessionCheck[nonce][nftAddress][tokenid];
        VotingSessionMapping storage sessionMap = NftSessionMap[nonce][nftAddress][tokenid];
        uint finalAppraisal = finalAppraisalValue[nftNonce[nftAddress][tokenid]][nftAddress][tokenid];
        sessionMap.nftVotes[_user].base = 
            PostSessionLibrary.calculateBase(
                finalAppraisal, 
                sessionMap.nftVotes[_user].appraisal,
                sessionCheck.spread
            );
        uint weight = sqrtLibrary.sqrt(sessionMap.nftVotes[_user].stake/sessionCore.lowestStake);
        if(sessionMap.nftVotes[_user].base > 0) {
            sessionCore.totalWinnerPoints += sessionMap.nftVotes[_user].base * weight;
            sessionMap.winnerPoints[_user] = sessionMap.nftVotes[_user].base * weight;
            sessionCheck.correct += weight;
        }
        else if(
            sessionMap.nftVotes[_user].appraisal < finalAppraisal + sessionCheck.finalStdev 
            && sessionMap.nftVotes[_user].appraisal > (finalAppraisal < sessionCheck.finalStdev ? 0 : finalAppraisal - sessionCheck.finalStdev)
        ) {
            sessionMap.secondaryPoint[_user] += sessionMap.nftVotes[_user].stake;
            sessionCheck.secondaryPoints += sessionMap.nftVotes[_user].stake;
            sessionCheck.incorrect += weight;
        }
        else {
            sessionCheck.incorrect += weight;
        }
        
        sessionMap.amountHarvested[_user] = PostSessionLibrary.harvest( 
            sessionMap.nftVotes[_user].stake, 
            sessionMap.nftVotes[_user].appraisal,
            finalAppraisalValue[nftNonce[nftAddress][tokenid]][nftAddress][tokenid],
            sessionCheck.riskFactor,
            sessionCheck.spread
        );

        sessionMap.nftVotes[_user].stake -= sessionMap.amountHarvested[_user];
        uint commission = sessionMap.amountHarvested[_user] * 500 / 10000;
        sessionCore.totalSessionStake -= commission;
        sessionMap.amountHarvested[_user] -= commission;
        sessionCore.totalProfit += sessionMap.amountHarvested[_user];
        CreditVault(payable(creditStore)).sendToTreasury(commission);
    }


    /// @notice User claims principal stake along with any earned profits in ETH or ABC form
    /**
    @dev 
    1. Calculates user principal return value
    2. Enacts sybil defense mechanism
    3. Edits totalProfits and totalSessionStake to reflect claim
    5. Pays out principal
    6. Adds profit credit to profitStored
    */
    /// @param nftAddress NFT contract address of NFT being appraised
    /// @param tokenid NFT tokenid of NFT being appraised
    /// @param _user the user that harvest is being called on
    function _claim(address _user, address nftAddress, uint tokenid) internal {
        uint nonce = nftNonce[nftAddress][tokenid];
        VotingSessionCore storage sessionCore = NftSessionCore[nonce][nftAddress][tokenid];
        VotingSessionChecks storage sessionCheck = NftSessionCheck[nonce][nftAddress][tokenid];
        VotingSessionMapping storage sessionMap = NftSessionMap[nonce][nftAddress][tokenid];
        uint principalReturn;
        if(sessionCheck.correct * 100 / (sessionCheck.correct + sessionCheck.incorrect) >= (95-sessionCheck.spread)) {
            principalReturn += sessionMap.nftVotes[_user].stake + sessionMap.amountHarvested[_user];
        }
        else {
            principalReturn += sessionMap.nftVotes[_user].stake;
        }
        uint payout;
        if(sessionCheck.correct * 100 / (sessionCheck.correct + sessionCheck.incorrect) >= (95-sessionCheck.spread)) {
            payout = sessionCore.bounty/sessionCore.uniqueVoters;
        }
        else if(sessionCheck.secondaryPoints + sessionCore.totalWinnerPoints == 0) {
            payout = 0;
        }
        else if (sessionCore.totalWinnerPoints == 0) {
            payout = sessionCore.totalProfit * sessionMap.secondaryPoint[_user] / sessionCheck.secondaryPoints;
            sessionCheck.secondaryPoints -= sessionMap.secondaryPoint[_user];
            sessionMap.secondaryPoint[_user] = 0;
        }
        else {
            payout = sessionCore.totalProfit * sessionMap.winnerPoints[_user] / sessionCore.totalWinnerPoints;
            sessionCore.totalWinnerPoints -= sessionMap.winnerPoints[_user];
            sessionMap.winnerPoints[_user] = 0;
        }
        sessionCore.totalProfit -= payout;
        Treasury.updateTotalProfitsGenerated(payout);
        CreditVault(payable(creditStore)).increasePrincipalStored(_user, principalReturn);
        CreditVault(payable(creditStore)).updateProfitStored(_user, payout);
    }

    /* ======== VIEW FUNCTIONS ======== */

    /// @notice returns the status of the session in question
    /// @param nftAddress NFT contract address of NFT being appraised
    /// @param tokenid NFT tokenid of NFT being appraised
    function getStatus(address nftAddress, uint tokenid) view public returns(uint) {
        return NftSessionCheck[nftNonce[nftAddress][tokenid]][nftAddress][tokenid].sessionProgression;
    }

    // /// @notice check the users status in terms of session interaction
    // /// @param nftAddress NFT contract address of NFT being appraised
    // /// @param tokenid NFT tokenid of NFT being appraised
    // /// @param _user appraisooooor who's session progress is of interest
    function getVoterCheck(address nftAddress, uint tokenid, address _user) view external returns(uint) {
        return NftSessionMap[nftNonce[nftAddress][tokenid]][nftAddress][tokenid].voterCheck[_user];
    }

    /* ======== FALLBACK FUNCTIONS ======== */

    receive() external payable {}
    fallback() external payable {}

    /* ======== MODIFIERS ======== */

    /// @notice stop users from being able to create multiple sessions for the same NFT at the same time
    modifier stopOverwrite(
        address nftAddress, 
        uint tokenid
    ) {
        require(
            nftNonce[nftAddress][tokenid] == 0 
            || getStatus(nftAddress, tokenid) == 5
            || block.timestamp > NftSessionCore[nftNonce[nftAddress][tokenid]][nftAddress][tokenid].endTime + 2 * NftSessionCore[nftNonce[nftAddress][tokenid]][nftAddress][tokenid].votingTime
        );
        _;
    }
    
    /// @notice makes sure that a user that submits a vote satisfies the proper voting parameters
    modifier properVote(
        address nftAddress,
        uint tokenid,
        uint stake
    ) {
        require(
            NftSessionMap[nftNonce[nftAddress][tokenid]][nftAddress][tokenid].voterCheck[msg.sender] == 0
            && stake >= 0.009 ether
        );
        _;
    }
    
    /// @notice checks the participation of the msg.sender 
    modifier checkParticipation(
        address nftAddress,
        uint tokenid
    ) {
        require(NftSessionMap[nftNonce[nftAddress][tokenid]][nftAddress][tokenid].voterCheck[msg.sender] > 0);
        _;
    }

    modifier onlyAdmin() {
        require(msg.sender == admin);
        _;
    }
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_treasury","type":"address"},{"internalType":"address","name":"_auction","type":"address"},{"internalType":"address","name":"_creditStore","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"creator_","type":"address"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"address","name":"nftAddress_","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenid_","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"initialAppraisal_","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bounty_","type":"uint256"}],"name":"PricingSessionCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"address","name":"nftAddress_","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenid_","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"finalAppraisal","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOfParticipants","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalStake","type":"uint256"}],"name":"finalAppraisalDetermined","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"voter_","type":"address"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"address","name":"nftAddress_","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenid_","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stake_","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"userHash_","type":"bytes32"}],"name":"newAppraisalAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"nftAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"sessionEnded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user_","type":"address"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"address","name":"nftAddress_","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenid_","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"appraisal","type":"uint256"}],"name":"voteWeighed","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"NftSessionCheck","outputs":[{"internalType":"uint256","name":"revealedStake","type":"uint256"},{"internalType":"uint256","name":"sessionProgression","type":"uint256"},{"internalType":"uint256","name":"calls","type":"uint256"},{"internalType":"uint256","name":"correct","type":"uint256"},{"internalType":"uint256","name":"incorrect","type":"uint256"},{"internalType":"uint256","name":"defender","type":"uint256"},{"internalType":"uint256","name":"spread","type":"uint256"},{"internalType":"uint256","name":"riskFactor","type":"uint256"},{"internalType":"uint256","name":"finalStdev","type":"uint256"},{"internalType":"uint256","name":"secondaryPoints","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"NftSessionCore","outputs":[{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"bounty","type":"uint256"},{"internalType":"uint256","name":"keeperReward","type":"uint256"},{"internalType":"uint256","name":"lowestStake","type":"uint256"},{"internalType":"uint256","name":"maxAppraisal","type":"uint256"},{"internalType":"uint256","name":"totalAppraisalValue","type":"uint256"},{"internalType":"uint256","name":"totalSessionStake","type":"uint256"},{"internalType":"uint256","name":"totalProfit","type":"uint256"},{"internalType":"uint256","name":"totalWinnerPoints","type":"uint256"},{"internalType":"uint256","name":"totalVotes","type":"uint256"},{"internalType":"uint256","name":"uniqueVoters","type":"uint256"},{"internalType":"uint256","name":"votingTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"nftAddress","type":"address"},{"internalType":"uint256","name":"tokenid","type":"uint256"}],"name":"claim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"nftAddress","type":"address"},{"internalType":"uint256","name":"tokenid","type":"uint256"},{"internalType":"uint256","name":"_initialAppraisal","type":"uint256"},{"internalType":"uint256","name":"_votingTime","type":"uint256"}],"name":"createNewSession","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"finalAppraisalValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"nftAddress","type":"address"},{"internalType":"uint256","name":"tokenid","type":"uint256"}],"name":"getStatus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"nftAddress","type":"address"},{"internalType":"uint256","name":"tokenid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"getVoterCheck","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"nftAddress","type":"address"},{"internalType":"uint256","name":"tokenid","type":"uint256"}],"name":"harvest","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"nftNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"setABCToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_auction","type":"address"}],"name":"setAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"nftAddress","type":"address"},{"internalType":"uint256","name":"tokenid","type":"uint256"}],"name":"setFinalAppraisal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"treasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"nftAddress","type":"address"},{"internalType":"uint256","name":"tokenid","type":"uint256"},{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"bytes32","name":"concealedAppraisal","type":"bytes32"}],"name":"setVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"nftAddress","type":"address"},{"internalType":"uint256","name":"tokenid","type":"uint256"},{"internalType":"bytes32","name":"concealedAppraisal","type":"bytes32"}],"name":"updateVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"nftAddress","type":"address"},{"internalType":"uint256","name":"tokenid","type":"uint256"},{"internalType":"uint256","name":"appraisal","type":"uint256"},{"internalType":"uint256","name":"seedNum","type":"uint256"}],"name":"weightVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405260016000553480156200001657600080fd5b50604051620062053803806200620583398181016040528101906200003c919062000160565b82600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505062000204565b6000815190506200015a81620001ea565b92915050565b6000806000606084860312156200017657600080fd5b6000620001868682870162000149565b9350506020620001998682870162000149565b9250506040620001ac8682870162000149565b9150509250925092565b6000620001c382620001ca565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b620001f581620001b6565b81146200020157600080fd5b50565b615ff180620002146000396000f3fe6080604052600436106100f75760003560e01c80638fec87611161008a578063c0fffaf011610059578063c0fffaf01461037f578063da7ea9fe146103bc578063f0f44260146103e5578063f3b6ddea1461040e576100fe565b80638fec8761146102b3578063a98302bf146102dc578063aad3ec9614610319578063b8c6f57914610356576100fe565b806341e115e4116100c657806341e115e4146101dc5780634ce0ef95146102055780638ab88529146102425780638c4ab3fc1461028a576100fe565b8063018ee9b7146101005780631ecb093b1461013d5780632171d26e1461018357806335d55930146101c0576100fe565b366100fe57005b005b34801561010c57600080fd5b5061012760048036038101906101229190615434565b610437565b604051610134919061596c565b60405180910390f35b34801561014957600080fd5b50610164600480360381019061015f9190615626565b610898565b60405161017a9a999897969594939291906159e8565b60405180910390f35b34801561018f57600080fd5b506101aa60048036038101906101a59190615434565b610906565b6040516101b7919061596c565b60405180910390f35b6101da60048036038101906101d59190615571565b61092b565b005b3480156101e857600080fd5b5061020360048036038101906101fe9190615434565b6115d1565b005b34801561021157600080fd5b5061022c60048036038101906102279190615434565b6119fa565b604051610239919061596c565b60405180910390f35b34801561024e57600080fd5b5061026960048036038101906102649190615626565b611ab9565b6040516102819c9b9a99989796959493929190615a84565b60405180910390f35b34801561029657600080fd5b506102b160048036038101906102ac919061540b565b611b33565b005b3480156102bf57600080fd5b506102da60048036038101906102d59190615571565b611bd1565b005b3480156102e857600080fd5b5061030360048036038101906102fe9190615470565b6121a4565b604051610310919061596c565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b9190615434565b6122a1565b60405161034d919061596c565b60405180910390f35b34801561036257600080fd5b5061037d6004803603810190610378919061540b565b612730565b005b34801561038b57600080fd5b506103a660048036038101906103a19190615626565b6127ce565b6040516103b3919061596c565b60405180910390f35b3480156103c857600080fd5b506103e360048036038101906103de91906154bf565b612800565b005b3480156103f157600080fd5b5061040c6004803603810190610407919061540b565b6129ce565b005b34801561041a57600080fd5b506104356004803603810190610430919061550e565b612a6c565b005b60008282600060086000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002054815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060000160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541161053957600080fd5b600160008082825461054b9190615b4f565b925050819055506000805490506000600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000205490506000600a600083815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000888152602001908152602001600020905060006009600084815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000898152602001908152602001600020905060006007600085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a8152602001908152602001600020905060038260010154146106ed57600080fd5b600080600090505b6014811015610876578284600201548154811061073b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663955bbe9f336601c6bf526340006040518363ffffffff1660e01b81526004016107cc9291906157ae565b600060405180830381600087803b1580156107e657600080fd5b505af11580156107fa573d6000803e3d6000fd5b5050505083600201600081548092919061081390615e70565b9190505550610823828d8d612fc2565b84600a0154846002015414156108635760048460010181905550836002015485600a01819055506000846002018190555060019950505050505050610881565b808061086e90615e70565b9150506106f5565b506001985050505050505b600054811461088f57600080fd5b50505092915050565b60096020528260005260406000206020528160005260406000206020528060005260406000206000925092505050806000015490806001015490806002015490806003015490806004015490806005015490806006015490806007015490806008015490806009015490508a565b6006602052816000526040600020602052806000526040600020600091509150505481565b83836000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000205414806109955750600561099383836119fa565b145b80610b1e5750600a6000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828152602001908152602001600020600b01546002610a5c9190615d47565b600a6000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002054815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060000154610b1b9190615b4f565b42115b610b2757600080fd5b620151808311158015610c2f5750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d6a0f286040518163ffffffff1660e01b815260040160206040518083038186803b158015610b9d57600080fd5b505afa158015610bb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd591906155d4565b1580610c2e5750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b5b610c3857600080fd5b6000600a6000600660008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600089815260200190815260200160002054815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000209050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415610d4857610ee2565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d57decfe6040518163ffffffff1660e01b815260040160206040518083038186803b158015610db257600080fd5b505afa158015610dc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dea91906155fd565b6611c37937e08000610dfc9190615d47565b90506000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856040518463ffffffff1660e01b8152600401610e8193929190615777565b602060405180830381600087803b158015610e9b57600080fd5b505af1158015610eaf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed391906155d4565b905080610edf57600080fd5b50505b6000600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000888152602001908152602001600020541480610f4a57506005610f4888886119fa565b145b15610f54576110a3565b600381600b0154610f659190615d47565b8160000154610f749190615b4f565b4211156110a257600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dbcddeb582600601546040518263ffffffff1660e01b8152600401610fda919061596c565b600060405180830381600087803b158015610ff457600080fd5b505af1158015611008573d6000803e3d6000fd5b50505050600081600601819055507f924fae12512295cfa19a3652e038bf0451474177b5475e685c8e763fa5fc3a808787600660008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a81526020019081526020016000205460405161109993929190615915565b60405180910390a15b5b600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000878152602001908152602001600020600081548092919061110490615e70565b91905055506000600a6000600660008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a815260200190815260200160002054815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008881526020019081526020016000209050600060096000600660008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008b815260200190815260200160002054815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600089815260200190815260200160002090508582600b01819055506103e88762010f2c61128e9190615d47565b6112989190615ba5565b826004018190555069152d02c7e14af6800000826003018190555085426112bf9190615b4f565b8260000181905550348260010181905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637f4c91c56040518163ffffffff1660e01b815260040160206040518083038186803b15801561133857600080fd5b505afa15801561134c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137091906155fd565b8160050181905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c25c76c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156113e057600080fd5b505afa1580156113f4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061141891906155fd565b8160060181905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166304c46c136040518163ffffffff1660e01b815260040160206040518083038186803b15801561148857600080fd5b505afa15801561149c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c091906155fd565b8160070181905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc83600101549081150290604051600060405180830381858888f19350505050158015611534573d6000803e3d6000fd5b507f477ad29eb622f3791efc4b67caa89e4a8300c9cd4c6e6fda01315c5699abdab833600660008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008b8152602001908152602001600020548b8b8b346040516115be969594939291906158b4565b60405180910390a1505050505050505050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000205490506000600a600083815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020905060006009600084815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858152602001908152602001600020905081600b015482600001546117049190615b4f565b421180611715575060028160010154145b801561172657506002816001015411155b61172f57600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663955bbe9f33671bc16d674ec8000085600201546117869190615ba5565b6040518363ffffffff1660e01b81526004016117a39291906157d7565b600060405180830381600087803b1580156117bd57600080fd5b505af11580156117d1573d6000803e3d6000fd5b505050506117df8585613a5e565b806000015482600601546117f39190615da1565b82600101546118029190615b4f565b8260070160008282546118159190615b4f565b92505081905550600081600201819055508160090154826005015461183a9190615ba5565b600b600085815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086815260200190815260200160002081905550600381600101819055507f67453d0f9b986e49877629ed0fb8e1d26cc8b479bef035d5f433a1dcca7f9da7600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000868152602001908152602001600020548686600b6000600660008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008b815260200190815260200160002054815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008981526020019081526020016000205486600a015487600601546040516119eb96959493929190615987565b60405180910390a15050505050565b600060096000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002054815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060010154905092915050565b600a602052826000526040600020602052816000526040600020602052806000526040600020600092509250505080600001549080600101549080600201549080600301549080600401549080600501549080600601549080600701549080600801549080600901549080600a01549080600b015490508c565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b8d57600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b8383600060086000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002054815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060000160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611cd157600080fd5b6001600080828254611ce39190615b4f565b925050819055506000805490506000600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008881526020019081526020016000205490506000600a600083815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000898152602001908152602001600020905060006008600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a8152602001908152602001600020905060006009600085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008b8152602001908152602001600020905060006007600086815260200190815260200160002060008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008c8152602001908152602001600020905060028260010154108015611ef05750428460000154105b8015611f3d575060018360000160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054145b8015611fb6575089338a604051602001611f599392919061571f565b604051602081830303815290604052805190602001208360040160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154145b8015611fc6575089846004015410155b611fcf57600080fd5b60028360000160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060008260010154141561202e57600182600101819055505b8260040160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301548260000160008282546120869190615b4f565b9250508190555080339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506120fa8c8c8c6144d5565b7f56499269f29291ec993c21cf722c8f3ff9e36667fa4fd8ce00cb0b937243265f33868e8e8e604051612131959493929190615800565b60405180910390a183600a015482600201541480612161575083600b0154846000015461215e9190615b4f565b42115b156121885760028260010181905550816002015484600a0181905550600082600201819055505b5050505050600054811461219b57600080fd5b50505050505050565b600060086000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086815260200190815260200160002054815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490509392505050565b60008282600060086000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002054815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060000160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054116123a357600080fd5b60016000808282546123b59190615b4f565b925050819055506000805490506000600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000205490506000600a600083815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000888152602001908152602001600020905060006009600084815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000898152602001908152602001600020905060006007600085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a81526020019081526020016000209050600482600101541461255757600080fd5b600080600090505b601481101561270e57828460020154815481106125a5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663955bbe9f336601c6bf526340006040518363ffffffff1660e01b81526004016126369291906157ae565b600060405180830381600087803b15801561265057600080fd5b505af1158015612664573d6000803e3d6000fd5b5050505083600201600081548092919061267d90615e70565b919050555061268d828d8d614767565b84600a0154846002015414156126fb5760008560060181905550600584600101819055507f924fae12512295cfa19a3652e038bf0451474177b5475e685c8e763fa5fc3a808c8c886040516126e493929190615915565b60405180910390a160019950505050505050612719565b808061270690615e70565b91505061255f565b506001985050505050505b600054811461272757600080fd5b50505092915050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461278a57600080fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60205282600052604060002060205281600052604060002060205280600052604060002060009250925050505481565b6000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000205490506000600a600083815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858152602001908152602001600020905060006008600084815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000868152602001908152602001600020905060018160000160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541461296d57600080fd5b4282600001541161297d57600080fd5b838160040160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550505050505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612a2857600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b838383600060086000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086815260200190815260200160002054815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060000160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054148015612b775750661ff973cafa80008110155b612b8057600080fd5b6000600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008881526020019081526020016000205490506000600a600083815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000898152602001908152602001600020905060006008600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a81526020019081526020016000209050428260000154118015612d5c5750600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663903aae40336040518263ffffffff1660e01b8152600401612d08919061575c565b60206040518083038186803b158015612d2057600080fd5b505afa158015612d34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d5891906155fd565b8811155b612d6557600080fd5b60018160000160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663832a5b0a338a6040518363ffffffff1660e01b8152600401612e099291906157d7565b600060405180830381600087803b158015612e2357600080fd5b505af1158015612e37573d6000803e3d6000fd5b50505050660e35fa931a000088612e4e9190615da1565b975066071afd498d0000826002016000828254612e6b9190615b4f565b9250508190555066071afd498d0000826001016000828254612e8d9190615b4f565b925050819055508160030154881015612eaa578782600301819055505b81600a016000815480929190612ebf90615e70565b9190505550612edb888360060154614e9f90919063ffffffff16565b8260060181905550868160040160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550878160040160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301819055507f3b5b5996d253333df335684c7d0c7ffb86f6bb889bf6d7bc7964b78a650a98d033848c8c8c8c604051612fae96959493929190615853565b60405180910390a150505050505050505050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000205490506000600a600083815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020905060006009600084815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858152602001908152602001600020905060006008600085815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086815260200190815260200160002090506000600b6000600660008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600089815260200190815260200160002054815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600087815260200190815260200160002054905061324f818360040160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201548560060154614efd565b8260040160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555060006132f585600301548460040160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301546132f09190615ba5565b615050565b905060008360040160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154111561346357808360040160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546133949190615d47565b8560080160008282546133a79190615b4f565b92505081905550808360040160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546133fe9190615d47565b8360010160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808460030160008282546134579190615b4f565b92505081905550613667565b8360080154826134739190615b4f565b8360040160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015410801561352a5750836008015482106134e0578360080154826134db9190615da1565b6134e3565b60005b8360040160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154115b1561364a578260040160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301548360020160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546135c49190615b4f565b925050819055508260040160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301548460090160008282546136239190615b4f565b925050819055508084600401600082825461363e9190615b4f565b92505081905550613666565b8084600401600082825461365e9190615b4f565b925050819055505b5b6137b58360040160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301548460040160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154600b6000600660008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008d815260200190815260200160002054815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008b815260200190815260200160002054876007015488600601546150ad565b8360030160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508260030160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548360040160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301600082825461388f9190615da1565b9250508190555060006127106101f48560030160008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546138ea9190615d47565b6138f49190615ba5565b90508086600601600082825461390a9190615da1565b92505081905550808460030160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546139629190615da1565b925050819055508360030160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548660070160008282546139be9190615b4f565b92505081905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dbcddeb5826040518263ffffffff1660e01b8152600401613a20919061596c565b600060405180830381600087803b158015613a3a57600080fd5b505af1158015613a4e573d6000803e3d6000fd5b5050505050505050505050505050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000205490506000600a600083815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020905060006009600084815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858152602001908152602001600020905060006008600085815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000868152602001908152602001600020905060006007600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600087815260200190815260200160002090506000836002015414613c6157826002015484600a01819055505b60006001601486600a0154613c769190615ba5565b613c809190615b4f565b9050600080600080600090505b876005015481116144c757600089600901548a60050154613cae9190615ba5565b90506000935060005b868110156140145760005b6014811015614000578b600a0154861415613cdc57614000565b60008a60040160008b8981548110613d1d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201541415613d9157613fdf565b828a60040160008b8981548110613dd1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201541115613f11576002838b60040160008c8a81548110613e82577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154613ef59190615da1565b613eff9190615c29565b87613f0a9190615b4f565b9650613fde565b60028a60040160008b8981548110613f52577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015484613fc69190615da1565b613fd09190615c29565b87613fdb9190615b4f565b96505b5b8580613fea90615e70565b9650508080613ff890615e70565b915050613cc2565b50808061400c90615e70565b915050613cb7565b50600061403a848c600a015461402a9190615da1565b876140359190615ba5565b615050565b905060009550808a60080181905550896005015483141561405c5750506144c7565b60009450600061407183838d6005015461533d565b9050600080600090505b898110156144af5760005b601481101561449b578e600a01548914156140a05761449b565b61415f8f600301548e60040160008f8d815481106140e7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206003015461415a9190615ba5565b615050565b9250838d60040160008e8c815481106141a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154111561447a5760008d60040160008e8c81548110614251577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154146142c65760016142c9565b60005b60ff16836142d79190615d47565b8f60090160008282546142ea9190615da1565b925050819055508c60040160008d8b81548110614330577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154836143a49190615d47565b8f60050160008282546143b79190615da1565b9250508190555060008d60040160008e8c815481106143ff577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550878061447690615e70565b9850505b888061448590615e70565b995050808061449390615e70565b915050614086565b5080806144a790615e70565b91505061407b565b505050505080806144bf90615e70565b915050613c8d565b505050505050505050505050565b6000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000205490506000600a600083815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858152602001908152602001600020905060006008600084815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000868152602001908152602001600020905060006009600085815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000209050848260040160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550600061470084600301548460040160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301546146fb9190615ba5565b615050565b9050808460090160008282546147169190615b4f565b9250508190555081600201600081548092919061473290615e70565b919050555085816147439190615d47565b8460050160008282546147569190615b4f565b925050819055505050505050505050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000205490506000600a600083815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020905060006009600084815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858152602001908152602001600020905060006008600085815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000868152602001908152602001600020905060008260060154605f6148fe9190615da1565b836004015484600301546149129190615b4f565b606485600301546149239190615d47565b61492d9190615ba5565b106149d5578160030160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548260040160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301546149c39190615b4f565b816149ce9190615b4f565b9050614a28565b8160040160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206003015481614a259190615b4f565b90505b60008360060154605f614a3b9190615da1565b84600401548560030154614a4f9190615b4f565b60648660030154614a609190615d47565b614a6a9190615ba5565b10614a8a5784600a01548560010154614a839190615ba5565b9050614cce565b600085600801548560090154614aa09190615b4f565b1415614aaf5760009050614ccd565b600085600801541415614bc65783600901548360020160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548660070154614b129190615d47565b614b1c9190615ba5565b90508260020160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054846009016000828254614b739190615da1565b9250508190555060008360020160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614ccc565b84600801548360010160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548660070154614c1c9190615d47565b614c269190615ba5565b90508260010160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054856008016000828254614c7d9190615da1565b9250508190555060008360010160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b5b80856007016000828254614ce29190615da1565b92505081905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633dce7dd3826040518263ffffffff1660e01b8152600401614d44919061596c565b600060405180830381600087803b158015614d5e57600080fd5b505af1158015614d72573d6000803e3d6000fd5b50505050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166346d7e1fd8a846040518363ffffffff1660e01b8152600401614dd39291906157d7565b600060405180830381600087803b158015614ded57600080fd5b505af1158015614e01573d6000803e3d6000fd5b50505050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663955bbe9f8a836040518363ffffffff1660e01b8152600401614e629291906157d7565b600060405180830381600087803b158015614e7c57600080fd5b505af1158015614e90573d6000803e3d6000fd5b50505050505050505050505050565b6000808284614eae9190615b4f565b905083811015614ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614eea9061594c565b60405180910390fd5b8091505092915050565b600080600190506000846064614f139190615d47565b905060008490505b6001811061501757600087600183614f339190615da1565b6064614f3f9190615b4f565b614f499190615d47565b9050600088836064614f5b9190615b4f565b614f659190615d47565b9050600089846064614f779190615da1565b614f819190615d47565b905060008a6001866064614f959190615da1565b614f9f9190615b4f565b614fa99190615d47565b90508584108015614fba5750828611155b15614fce5786975050505050505050615049565b8582108015614fdd5750808611155b15614ff15786975050505050505050615049565b600187614ffe9190615b4f565b965050505050808061500f90615e46565b915050614f1b565b508560646150259190615d47565b811415615042576001846150399190615b4f565b92505050615049565b6000925050505b9392505050565b60008060026001846150629190615b4f565b61506c9190615ba5565b90508291505b818110156150a757809150600281828561508c9190615ba5565b6150969190615b4f565b6150a09190615ba5565b9050615072565b50919050565b6000838260646150bd9190615b4f565b6150c79190615d47565b6064866150d49190615d47565b11801561512557508160646150e99190615b4f565b84858460646150f89190615b4f565b6151029190615d47565b60648861510f9190615d47565b6151199190615da1565b6151239190615ba5565b115b806151305750600085145b1561513d57859050615334565b8382606461514b9190615b4f565b6151559190615d47565b6064866151629190615d47565b11156152365785836064866151779190615d47565b868560646151859190615b4f565b61518f9190615d47565b60648961519c9190615d47565b6151a69190615da1565b896151b19190615d47565b6151bb9190615ba5565b6151c59190615d47565b11156151d357859050615334565b826064856151e19190615d47565b858460646151ef9190615b4f565b6151f99190615d47565b6064886152069190615d47565b6152109190615da1565b8861521b9190615d47565b6152259190615ba5565b61522f9190615d47565b9050615334565b838260646152449190615da1565b61524e9190615d47565b60648661525b9190615d47565b101561532f5785836064866152709190615d47565b87606461527d9190615d47565b8786606461528b9190615da1565b6152959190615d47565b61529f9190615da1565b896152aa9190615d47565b6152b49190615ba5565b6152be9190615d47565b11156152cc57859050615334565b826064856152da9190615d47565b8660646152e79190615d47565b868560646152f59190615da1565b6152ff9190615d47565b6153099190615da1565b886153149190615d47565b61531e9190615ba5565b6153289190615d47565b9050615334565b600090505b95945050505050565b6000600260018361534e9190615b4f565b856801158e460913d000006153639190615ba5565b8561536e9190615b4f565b600361537a9190615d47565b6153849190615ba5565b61538e9190615d47565b846153999190615b4f565b90509392505050565b6000813590506153b181615f5f565b92915050565b6000815190506153c681615f76565b92915050565b6000813590506153db81615f8d565b92915050565b6000813590506153f081615fa4565b92915050565b60008151905061540581615fa4565b92915050565b60006020828403121561541d57600080fd5b600061542b848285016153a2565b91505092915050565b6000806040838503121561544757600080fd5b6000615455858286016153a2565b9250506020615466858286016153e1565b9150509250929050565b60008060006060848603121561548557600080fd5b6000615493868287016153a2565b93505060206154a4868287016153e1565b92505060406154b5868287016153a2565b9150509250925092565b6000806000606084860312156154d457600080fd5b60006154e2868287016153a2565b93505060206154f3868287016153e1565b9250506040615504868287016153cc565b9150509250925092565b6000806000806080858703121561552457600080fd5b6000615532878288016153a2565b9450506020615543878288016153e1565b9350506040615554878288016153e1565b9250506060615565878288016153cc565b91505092959194509250565b6000806000806080858703121561558757600080fd5b6000615595878288016153a2565b94505060206155a6878288016153e1565b93505060406155b7878288016153e1565b92505060606155c8878288016153e1565b91505092959194509250565b6000602082840312156155e657600080fd5b60006155f4848285016153b7565b91505092915050565b60006020828403121561560f57600080fd5b600061561d848285016153f6565b91505092915050565b60008060006060848603121561563b57600080fd5b6000615649868287016153e1565b935050602061565a868287016153a2565b925050604061566b868287016153e1565b9150509250925092565b61567e81615dd5565b82525050565b61569561569082615dd5565b615eb9565b82525050565b6156a481615df3565b82525050565b6156b381615e34565b82525050565b60006156c6601b83615b3e565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b61570281615e1d565b82525050565b61571961571482615e1d565b615edd565b82525050565b600061572b8286615708565b60208201915061573b8285615684565b60148201915061574b8284615708565b602082019150819050949350505050565b60006020820190506157716000830184615675565b92915050565b600060608201905061578c6000830186615675565b6157996020830185615675565b6157a660408301846156f9565b949350505050565b60006040820190506157c36000830185615675565b6157d060208301846156aa565b9392505050565b60006040820190506157ec6000830185615675565b6157f960208301846156f9565b9392505050565b600060a0820190506158156000830188615675565b61582260208301876156f9565b61582f6040830186615675565b61583c60608301856156f9565b61584960808301846156f9565b9695505050505050565b600060c0820190506158686000830189615675565b61587560208301886156f9565b6158826040830187615675565b61588f60608301866156f9565b61589c60808301856156f9565b6158a960a083018461569b565b979650505050505050565b600060c0820190506158c96000830189615675565b6158d660208301886156f9565b6158e36040830187615675565b6158f060608301866156f9565b6158fd60808301856156f9565b61590a60a08301846156f9565b979650505050505050565b600060608201905061592a6000830186615675565b61593760208301856156f9565b61594460408301846156f9565b949350505050565b60006020820190508181036000830152615965816156b9565b9050919050565b600060208201905061598160008301846156f9565b92915050565b600060c08201905061599c60008301896156f9565b6159a96020830188615675565b6159b660408301876156f9565b6159c360608301866156f9565b6159d060808301856156f9565b6159dd60a08301846156f9565b979650505050505050565b6000610140820190506159fe600083018d6156f9565b615a0b602083018c6156f9565b615a18604083018b6156f9565b615a25606083018a6156f9565b615a3260808301896156f9565b615a3f60a08301886156f9565b615a4c60c08301876156f9565b615a5960e08301866156f9565b615a676101008301856156f9565b615a756101208301846156f9565b9b9a5050505050505050505050565b600061018082019050615a9a600083018f6156f9565b615aa7602083018e6156f9565b615ab4604083018d6156f9565b615ac1606083018c6156f9565b615ace608083018b6156f9565b615adb60a083018a6156f9565b615ae860c08301896156f9565b615af560e08301886156f9565b615b036101008301876156f9565b615b116101208301866156f9565b615b1f6101408301856156f9565b615b2d6101608301846156f9565b9d9c50505050505050505050505050565b600082825260208201905092915050565b6000615b5a82615e1d565b9150615b6583615e1d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115615b9a57615b99615ee7565b5b828201905092915050565b6000615bb082615e1d565b9150615bbb83615e1d565b925082615bcb57615bca615f16565b5b828204905092915050565b6000808291508390505b6001851115615c2057808604811115615bfc57615bfb615ee7565b5b6001851615615c0b5780820291505b8081029050615c1985615f52565b9450615be0565b94509492505050565b6000615c3482615e1d565b9150615c3f83615e27565b9250615c6c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484615c74565b905092915050565b600082615c845760019050615d40565b81615c925760009050615d40565b8160018114615ca85760028114615cb257615ce1565b6001915050615d40565b60ff841115615cc457615cc3615ee7565b5b8360020a915084821115615cdb57615cda615ee7565b5b50615d40565b5060208310610133831016604e8410600b8410161715615d165782820a905083811115615d1157615d10615ee7565b5b615d40565b615d238484846001615bd6565b92509050818404811115615d3a57615d39615ee7565b5b81810290505b9392505050565b6000615d5282615e1d565b9150615d5d83615e1d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615d9657615d95615ee7565b5b828202905092915050565b6000615dac82615e1d565b9150615db783615e1d565b925082821015615dca57615dc9615ee7565b5b828203905092915050565b6000615de082615dfd565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000615e3f82615e1d565b9050919050565b6000615e5182615e1d565b91506000821415615e6557615e64615ee7565b5b600182039050919050565b6000615e7b82615e1d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615eae57615ead615ee7565b5b600182019050919050565b6000615ec482615ecb565b9050919050565b6000615ed682615f45565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008160601b9050919050565b60008160011c9050919050565b615f6881615dd5565b8114615f7357600080fd5b50565b615f7f81615de7565b8114615f8a57600080fd5b50565b615f9681615df3565b8114615fa157600080fd5b50565b615fad81615e1d565b8114615fb857600080fd5b5056fea2646970667358221220e87ca8b583b4d404455cb14b767cc1dc92c021578ab694ea93e6ad74ca88959964736f6c6343000800003300000000000000000000000093dcf21284b78163ec218def37471c4b77ccc6e1000000000000000000000000396dd1f7e3c8044784937935f834c3f8d58eb497000000000000000000000000b3f1069b04726c145197853db772483bd6b9650d

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

00000000000000000000000093dcf21284b78163ec218def37471c4b77ccc6e1000000000000000000000000396dd1f7e3c8044784937935f834c3f8d58eb497000000000000000000000000b3f1069b04726c145197853db772483bd6b9650d

-----Decoded View---------------
Arg [0] : _treasury (address): 0x93dcf21284b78163ec218def37471c4b77ccc6e1
Arg [1] : _auction (address): 0x396dd1f7e3c8044784937935f834c3f8d58eb497
Arg [2] : _creditStore (address): 0xb3f1069b04726c145197853db772483bd6b9650d

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 00000000000000000000000093dcf21284b78163ec218def37471c4b77ccc6e1
Arg [1] : 000000000000000000000000396dd1f7e3c8044784937935f834c3f8d58eb497
Arg [2] : 000000000000000000000000b3f1069b04726c145197853db772483bd6b9650d


Deployed ByteCode Sourcemap

91809:29753:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;106014:1104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92608:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;92154:58;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;96740:2042;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;104207:1211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;119373:191;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92862:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;96105:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;102350:1633;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;119860:209;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;107600:1109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;95706:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;93065:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;101059:570;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;95940:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;99404:1284;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;106014:1104;106135:7;106084:10;106096:7;121449:1;121358:13;:44;121372:8;:20;121381:10;121372:20;;;;;;;;;;;;;;;:29;121393:7;121372:29;;;;;;;;;;;;121358:44;;;;;;;;;;;:56;121403:10;121358:56;;;;;;;;;;;;;;;:65;121415:7;121358:65;;;;;;;;;;;:76;;:88;121435:10;121358:88;;;;;;;;;;;;;;;;:92;121350:101;;;;;;945:1:::1;928:13;::::0;:18:::1;;;;;;;:::i;:::-;;;;;;;;953:20;976:13:::0;::::1;953:36;;106154:10:::2;106167:8;:20;106176:10;106167:20;;;;;;;;;;;;;;;:29;106188:7;106167:29;;;;;;;;;;;;106154:42;;106207:37;106247:14;:21;106262:5;106247:21;;;;;;;;;;;:33;106269:10;106247:33;;;;;;;;;;;;;;;:42;106281:7;106247:42;;;;;;;;;;;106207:82;;106300:40;106343:15;:22;106359:5;106343:22;;;;;;;;;;;:34;106366:10;106343:34;;;;;;;;;;;;;;;:43;106378:7;106343:43;;;;;;;;;;;106300:86;;106397:24;106424:16;:23;106441:5;106424:23;;;;;;;;;;;:35;106448:10;106424:35;;;;;;;;;;;;;;;:44;106460:7;106424:44;;;;;;;;;;;106397:71;;106522:1;106487:12;:31;;;:36;106479:45;;;::::0;::::2;;106535:12;106562:6:::0;106571:1:::2;106562:10;;106558:534;106578:2;106574:1;:6;106558:534;;;106609:6;106616:12;:18;;;106609:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;106602:33;;106670:11;;;;;;;;;;;106650:52;;;106703:10;106715:12;106650:78;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;106743:12;:18;;;:20;;;;;;;;;:::i;:::-;;;;;;106778:35;106787:4;106793:10;106805:7;106778:8;:35::i;:::-;106853:11;:24;;;106831:12;:18;;;:46;106828:253;;;106932:1;106898:12;:31;;:35;;;;106979:12;:18;;;106952:11;:24;;:45;;;;107037:1;107016:12;:18;;:22;;;;107064:1;107057:8;;;;;;;;;;106828:253;106582:3;;;;;:::i;:::-;;;;106558:534;;;;107109:1;107102:8;;;;;;;996:1;1028:13:::1;;1012:12;:29;1004:38;;;::::0;::::1;;121462:1;106014:1104:::0;;;;;;:::o;92608:96::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;92154:58::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;96740:2042::-;96899:10;96911:7;120496:1;120463:8;:20;120472:10;120463:20;;;;;;;;;;;;;;;:29;120484:7;120463:29;;;;;;;;;;;;:34;:87;;;;120549:1;120515:30;120525:10;120537:7;120515:9;:30::i;:::-;:35;120463:87;:280;;;;120666:14;:45;120681:8;:20;120690:10;120681:20;;;;;;;;;;;;;;;:29;120702:7;120681:29;;;;;;;;;;;;120666:45;;;;;;;;;;;:57;120712:10;120666:57;;;;;;;;;;;;;;;:66;120724:7;120666:66;;;;;;;;;;;:77;;;120662:1;:81;;;;:::i;:::-;120585:14;:45;120600:8;:20;120609:10;120600:20;;;;;;;;;;;;;;;:29;120621:7;120600:29;;;;;;;;;;;;120585:45;;;;;;;;;;;:57;120631:10;120585:57;;;;;;;;;;;;;;;:66;120643:7;120585:66;;;;;;;;;;;:74;;;:158;;;;:::i;:::-;120567:15;:176;120463:280;120441:313;;;;;;96971:6:::1;96956:11;:21;;:77;;;;;96983:8;;;;;;;;;;;:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;96982:25;:50;;;;97025:7;;;;;;;;;;;97011:21;;:10;:21;;;96982:50;96956:77;96948:86;;;::::0;::::1;;97045:37;97085:14;:45;97100:8;:20;97109:10;97100:20;;;;;;;;;;;;;;;:29;97121:7;97100:29;;;;;;;;;;;;97085:45;;;;;;;;;;;:57;97131:10;97085:57;;;;;;;;;;;;;;;:66;97143:7;97085:66;;;;;;;;;;;97045:106;;97179:7;;;;;;;;;;;97165:21;;:10;:21;;;97162:276;;;;;;97220:12;97269:11;;;;;;;;;;;97249:42;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;97235:11;:59;;;;:::i;:::-;97220:74;;97310:12;97333:8;;;;;;;;;;;97326:29;;;97356:10;97376:8;;;;;;;;;;;97387:7;97326:69;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;97309:86;;97418:7;97410:16;;;::::0;::::1;;97162:276;;;97484:1;97451:8;:20;97460:10;97451:20;;;;;;;;;;;;;;;:29;97472:7;97451:29;;;;;;;;;;;;:34;:73;;;;97523:1;97489:30;97499:10;97511:7;97489:9;:30::i;:::-;:35;97451:73;97448:404;;;;;;97611:1;97586:11;:22;;;:26;;;;:::i;:::-;97564:11;:19;;;:48;;;;:::i;:::-;97546:15;:66;97543:309;;;97649:11;;;;;;;;;;;97629:48;;;97678:11;:29;;;97629:79;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;97755:1;97723:11;:29;;:33;;;;97776:64;97789:10;97801:7;97810:8;:20;97819:10;97810:20;;;;;;;;;;;;;;;:29;97831:7;97810:29;;;;;;;;;;;;97776:64;;;;;;;;:::i;:::-;;;;;;;;97543:309;97448:404;97862:8;:20;97871:10;97862:20;;;;;;;;;;;;;;;:29;97883:7;97862:29;;;;;;;;;;;;:31;;;;;;;;;:::i;:::-;;;;;;97904:40;97947:14;:45;97962:8;:20;97971:10;97962:20;;;;;;;;;;;;;;;:29;97983:7;97962:29;;;;;;;;;;;;97947:45;;;;;;;;;;;:57;97993:10;97947:57;;;;;;;;;;;;;;;:66;98005:7;97947:66;;;;;;;;;;;97904:109;;98024:40;98067:15;:46;98083:8;:20;98092:10;98083:20;;;;;;;;;;;;;;;:29;98104:7;98083:29;;;;;;;;;;;;98067:46;;;;;;;;;;;:58;98114:10;98067:58;;;;;;;;;;;;;;;:67;98126:7;98067:67;;;;;;;;;;;98024:110;;98173:11;98145:14;:25;;:39;;;;98253:4;98233:17;98225:5;:25;;;;:::i;:::-;:32;;;;:::i;:::-;98195:14;:27;;:62;;;;98297:12;98268:14;:26;;:41;;;;98363:11;98345:15;:29;;;;:::i;:::-;98320:14;:22;;:54;;;;98409:9;98385:14;:21;;:33;;;;98453:8;;;;;;;;;;;:17;;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;98429:12;:21;;:43;;;;98505:8;;;;;;;;;;;:15;;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;98483:12;:19;;:39;;;;98559:8;;;;;;;;;;;:19;;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;98533:12;:23;;:47;;;;98599:11;;;;;;;;;;;98591:29;;:52;98621:14;:21;;;98591:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;98659:115;98681:10;98693:8;:20;98702:10;98693:20;;;;;;;;;;;;;;;:29;98714:7;98693:29;;;;;;;;;;;;98724:10;98736:7;98745:17;98764:9;98659:115;;;;;;;;;;;:::i;:::-;;;;;;;;120765:1;;;96740:2042:::0;;;;;;:::o;104207:1211::-;104286:10;104299:8;:20;104308:10;104299:20;;;;;;;;;;;;;;;:29;104320:7;104299:29;;;;;;;;;;;;104286:42;;104339:37;104379:14;:21;104394:5;104379:21;;;;;;;;;;;:33;104401:10;104379:33;;;;;;;;;;;;;;;:42;104413:7;104379:42;;;;;;;;;;;104339:82;;104432:40;104475:15;:22;104491:5;104475:22;;;;;;;;;;;:34;104498:10;104475:34;;;;;;;;;;;;;;;:43;104510:7;104475:43;;;;;;;;;;;104432:86;;104592:11;:22;;;104570:11;:19;;;:44;;;;:::i;:::-;104552:15;:62;:102;;;;104653:1;104618:12;:31;;;:36;104552:102;104551:157;;;;;104707:1;104672:12;:31;;;:36;;104551:157;104529:190;;;;;;104750:11;;;;;;;;;;;104730:52;;;104783:10;104820:7;104795:11;:24;;;:32;;;;:::i;:::-;104730:98;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;104839:32;104851:10;104863:7;104839:11;:32::i;:::-;104963:12;:26;;;104931:11;:29;;;:58;;;;:::i;:::-;104909:11;:18;;;:81;;;;:::i;:::-;104882:11;:23;;;:108;;;;;;;:::i;:::-;;;;;;;;105022:1;105001:12;:18;;:22;;;;105119:11;:22;;;105085:11;:31;;;105084:58;;;;:::i;:::-;105034:19;:26;105054:5;105034:26;;;;;;;;;;;:38;105061:10;105034:38;;;;;;;;;;;;;;;:47;105073:7;105034:47;;;;;;;;;;;:108;;;;105187:1;105153:12;:31;;:35;;;;105204:206;105229:8;:20;105238:10;105229:20;;;;;;;;;;;;;;;:29;105250:7;105229:29;;;;;;;;;;;;105260:10;105272:7;105281:19;:50;105301:8;:20;105310:10;105301:20;;;;;;;;;;;;;;;:29;105322:7;105301:29;;;;;;;;;;;;105281:50;;;;;;;;;;;:62;105332:10;105281:62;;;;;;;;;;;;;;;:71;105344:7;105281:71;;;;;;;;;;;;105354:11;:24;;;105380:11;:29;;;105204:206;;;;;;;;;;;:::i;:::-;;;;;;;;104207:1211;;;;;:::o;119373:191::-;119446:4;119470:15;:46;119486:8;:20;119495:10;119486:20;;;;;;;;;;;;;;;:29;119507:7;119486:29;;;;;;;;;;;;119470:46;;;;;;;;;;;:58;119517:10;119470:58;;;;;;;;;;;;;;;:67;119529:7;119470:67;;;;;;;;;;;:86;;;119463:93;;119373:191;;;;:::o;92862:93::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;96105:92::-;121533:5;;;;;;;;;;;121519:19;;:10;:19;;;121511:28;;;;;;96183:6:::1;96172:8;;:17;;;;;;;;;;;;;;;;;;96105:92:::0;:::o;102350:1633::-;102453:10;102465:7;121449:1;121358:13;:44;121372:8;:20;121381:10;121372:20;;;;;;;;;;;;;;;:29;121393:7;121372:29;;;;;;;;;;;;121358:44;;;;;;;;;;;:56;121403:10;121358:56;;;;;;;;;;;;;;;:65;121415:7;121358:65;;;;;;;;;;;:76;;:88;121435:10;121358:88;;;;;;;;;;;;;;;;:92;121350:101;;;;;;945:1:::1;928:13;::::0;:18:::1;;;;;;;:::i;:::-;;;;;;;;953:20;976:13:::0;::::1;953:36;;102507:10:::2;102520:8;:20;102529:10;102520:20;;;;;;;;;;;;;;;:29;102541:7;102520:29;;;;;;;;;;;;102507:42;;102560:37;102600:14;:21;102615:5;102600:21;;;;;;;;;;;:33;102622:10;102600:33;;;;;;;;;;;;;;;:42;102634:7;102600:42;;;;;;;;;;;102560:82;;102653:39;102695:13;:20;102709:5;102695:20;;;;;;;;;;;:32;102716:10;102695:32;;;;;;;;;;;;;;;:41;102728:7;102695:41;;;;;;;;;;;102653:83;;102747:40;102790:15;:22;102806:5;102790:22;;;;;;;;;;;:34;102813:10;102790:34;;;;;;;;;;;;;;;:43;102825:7;102790:43;;;;;;;;;;;102747:86;;102844:24;102871:16;:23;102888:5;102871:23;;;;;;;;;;;:35;102895:10;102871:35;;;;;;;;;;;;;;;:44;102907:7;102871:44;;;;;;;;;;;102844:71;;102968:1;102934:12;:31;;;:35;:93;;;;;103012:15;102990:11;:19;;;:37;102934:93;:152;;;;;103085:1;103048:10;:21;;:33;103070:10;103048:33;;;;;;;;;;;;;;;;:38;102934:152;:286;;;;;103188:9;103199:10;103211:7;103171:48;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;103161:59;;;;;;103107:10;:19;;:31;103127:10;103107:31;;;;;;;;;;;;;;;:50;;;:113;102934:286;:344;;;;;103269:9;103241:11;:24;;;:37;;102934:344;102926:363;;;::::0;::::2;;103336:1;103300:10;:21;;:33;103322:10;103300:33;;;;;;;;;;;;;;;:37;;;;103386:1;103351:12;:31;;;:36;103348:103;;;103438:1;103404:12;:31;;:35;;;;103348:103;103491:10;:19;;:31;103511:10;103491:31;;;;;;;;;;;;;;;:37;;;103461:12;:26;;;:67;;;;;;;:::i;:::-;;;;;;;;103539:6;103551:10;103539:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;103573:38;103580:10;103592:7;103601:9;103573:6;:38::i;:::-;103627:62;103639:10;103651:5;103658:10;103670:7;103679:9;103627:62;;;;;;;;;;:::i;:::-;;;;;;;;103725:11;:24;;;103703:12;:18;;;:46;:112;;;;103793:11;:22;;;103771:11;:19;;;:44;;;;:::i;:::-;103753:15;:62;103703:112;103700:276;;;103866:1;103832:12;:31;;:35;;;;103909:12;:18;;;103882:11;:24;;:45;;;;103963:1;103942:12;:18;;:22;;;;103700:276;996:1;;;;;1028:13:::1;;1012:12;:29;1004:38;;;::::0;::::1;;121462:1;102350:1633:::0;;;;;;:::o;119860:209::-;119954:4;119978:13;:44;119992:8;:20;120001:10;119992:20;;;;;;;;;;;;;;;:29;120013:7;119992:29;;;;;;;;;;;;119978:44;;;;;;;;;;;:56;120023:10;119978:56;;;;;;;;;;;;;;;:65;120035:7;119978:65;;;;;;;;;;;:76;;:83;120055:5;119978:83;;;;;;;;;;;;;;;;119971:90;;119860:209;;;;;:::o;107600:1109::-;107719:4;107668:10;107680:7;121449:1;121358:13;:44;121372:8;:20;121381:10;121372:20;;;;;;;;;;;;;;;:29;121393:7;121372:29;;;;;;;;;;;;121358:44;;;;;;;;;;;:56;121403:10;121358:56;;;;;;;;;;;;;;;:65;121415:7;121358:65;;;;;;;;;;;:76;;:88;121435:10;121358:88;;;;;;;;;;;;;;;;:92;121350:101;;;;;;945:1:::1;928:13;::::0;:18:::1;;;;;;;:::i;:::-;;;;;;;;953:20;976:13:::0;::::1;953:36;;107736:10:::2;107749:8;:20;107758:10;107749:20;;;;;;;;;;;;;;;:29;107770:7;107749:29;;;;;;;;;;;;107736:42;;107789:37;107829:14;:21;107844:5;107829:21;;;;;;;;;;;:33;107851:10;107829:33;;;;;;;;;;;;;;;:42;107863:7;107829:42;;;;;;;;;;;107789:82;;107882:40;107925:15;:22;107941:5;107925:22;;;;;;;;;;;:34;107948:10;107925:34;;;;;;;;;;;;;;;:43;107960:7;107925:43;;;;;;;;;;;107882:86;;107979:24;108006:16;:23;108023:5;108006:23;;;;;;;;;;;:35;108030:10;108006:35;;;;;;;;;;;;;;;:44;108042:7;108006:44;;;;;;;;;;;107979:71;;108104:1;108069:12;:31;;;:36;108061:45;;;::::0;::::2;;108117:12;108144:6:::0;108153:1:::2;108144:10;;108140:543;108160:2;108156:1;:6;108140:543;;;108191:6;108198:12;:18;;;108191:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;108184:33;;108252:11;;;;;;;;;;;108232:52;;;108285:10;108297:12;108232:78;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;108325:12;:18;;;:20;;;;;;;;;:::i;:::-;;;;;;108360:33;108367:4;108373:10;108385:7;108360:6;:33::i;:::-;108433:11;:24;;;108411:12;:18;;;:46;108408:264;;;108510:1;108478:11;:29;;:33;;;;108564:1;108530:12;:31;;:35;;;;108589:40;108602:10;108614:7;108623:5;108589:40;;;;;;;;:::i;:::-;;;;;;;;108655:1;108648:8;;;;;;;;;;108408:264;108164:3;;;;;:::i;:::-;;;;108140:543;;;;108700:1;108693:8;;;;;;;996:1;1028:13:::1;;1012:12;:29;1004:38;;;::::0;::::1;;121462:1;107600:1109:::0;;;;;;:::o;95706:94::-;121533:5;;;;;;;;;;;121519:19;;:10;:19;;;121511:28;;;;;;95784:8:::1;95774:7;;:18;;;;;;;;;;;;;;;;;;95706:94:::0;:::o;93065:85::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;101059:570::-;101195:10;101208:8;:20;101217:10;101208:20;;;;;;;;;;;;;;;:29;101229:7;101208:29;;;;;;;;;;;;101195:42;;101248:37;101288:14;:21;101303:5;101288:21;;;;;;;;;;;:33;101310:10;101288:33;;;;;;;;;;;;;;;:42;101322:7;101288:42;;;;;;;;;;;101248:82;;101341:39;101383:13;:20;101397:5;101383:20;;;;;;;;;;;:32;101404:10;101383:32;;;;;;;;;;;;;;;:41;101416:7;101383:41;;;;;;;;;;;101341:83;;101480:1;101443:10;:21;;:33;101465:10;101443:33;;;;;;;;;;;;;;;;:38;101435:47;;;;;;101523:15;101501:11;:19;;;:37;101493:46;;;;;;101603:18;101550:10;:19;;:31;101570:10;101550:31;;;;;;;;;;;;;;;:50;;:71;;;;101059:570;;;;;;:::o;95940:118::-;121533:5;;;;;;;;;;;121519:19;;:10;:19;;;121511:28;;;;;;96040:8:::1;96009;;:41;;;;;;;;;;;;;;;;;;95940:118:::0;:::o;99404:1284::-;99549:10;99561:7;99570:5;121110:1;121018:13;:44;121032:8;:20;121041:10;121032:20;;;;;;;;;;;;;;;:29;121053:7;121032:29;;;;;;;;;;;;121018:44;;;;;;;;;;;:56;121063:10;121018:56;;;;;;;;;;;;;;;:65;121075:7;121018:65;;;;;;;;;;;:76;;:88;121095:10;121018:88;;;;;;;;;;;;;;;;:93;:130;;;;;121137:11;121128:5;:20;;121018:130;120996:163;;;;;;99597:10:::1;99610:8;:20;99619:10;99610:20;;;;;;;;;;;;;;;:29;99631:7;99610:29;;;;;;;;;;;;99597:42;;99650:37;99690:14;:21;99705:5;99690:21;;;;;;;;;;;:33;99712:10;99690:33;;;;;;;;;;;;;;;:42;99724:7;99690:42;;;;;;;;;;;99650:82;;99743:39;99785:13;:20;99799:5;99785:20;;;;;;;;;;;:32;99806:10;99785:32;;;;;;;;;;;;;;;:41;99818:7;99785:41;;;;;;;;;;;99743:83;;99867:15;99845:11;:19;;;:37;:111;;;;;99915:11;;;;;;;;;;;99895:49;;;99945:10;99895:61;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;99886:5;:70;;99845:111;99837:120;;;::::0;::::1;;100004:1;99968:10;:21;;:33;99990:10;99968:33;;;;;;;;;;;;;;;:37;;;;100036:11;;;;;;;;;;;100016:57;;;100074:10;100086:5;100016:76;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;100112:11;100103:20;;;;;:::i;:::-;;;100162:11;100134;:24;;;:39;;;;;;;:::i;:::-;;;;;;;;100206:11;100184;:18;;;:33;;;;;;;:::i;:::-;;;;;;;;100240:11;:23;;;100232:5;:31;100228:95;;;100306:5;100280:11;:23;;:31;;;;100228:95;100333:11;:24;;;:26;;;;;;;;;:::i;:::-;;;;;;100402:40;100436:5;100402:11;:29;;;:33;;:40;;;;:::i;:::-;100370:11;:29;;:72;;;;100506:18;100453:10;:19;;:31;100473:10;100453:31;;;;;;;;;;;;;;;:50;;:71;;;;100575:5;100535:10;:19;;:31;100555:10;100535:31;;;;;;;;;;;;;;;:37;;:45;;;;100596:84;100614:10;100626:5;100633:10;100645:7;100654:5;100661:18;100596:84;;;;;;;;;;;:::i;:::-;;;;;;;;121170:1;;;99404:1284:::0;;;;;;;:::o;114148:2468::-;114235:10;114248:8;:20;114257:10;114248:20;;;;;;;;;;;;;;;:29;114269:7;114248:29;;;;;;;;;;;;114235:42;;114288:37;114328:14;:21;114343:5;114328:21;;;;;;;;;;;:33;114350:10;114328:33;;;;;;;;;;;;;;;:42;114362:7;114328:42;;;;;;;;;;;114288:82;;114381:40;114424:15;:22;114440:5;114424:22;;;;;;;;;;;:34;114447:10;114424:34;;;;;;;;;;;;;;;:43;114459:7;114424:43;;;;;;;;;;;114381:86;;114478:39;114520:13;:20;114534:5;114520:20;;;;;;;;;;;:32;114541:10;114520:32;;;;;;;;;;;;;;;:41;114553:7;114520:41;;;;;;;;;;;114478:83;;114572:19;114594;:50;114614:8;:20;114623:10;114614:20;;;;;;;;;;;;;;;:29;114635:7;114614:29;;;;;;;;;;;;114594:50;;;;;;;;;;;:62;114645:10;114594:62;;;;;;;;;;;;;;;:71;114657:7;114594:71;;;;;;;;;;;;114572:93;;114724:174;114775:14;114809:10;:19;;:26;114829:5;114809:26;;;;;;;;;;;;;;;:36;;;114864:12;:19;;;114724:32;:174::i;:::-;114676:10;:19;;:26;114696:5;114676:26;;;;;;;;;;;;;;;:31;;:222;;;;114909:11;114923:74;114973:11;:23;;;114940:10;:19;;:26;114960:5;114940:26;;;;;;;;;;;;;;;:32;;;:56;;;;:::i;:::-;114923:16;:74::i;:::-;114909:88;;115045:1;115011:10;:19;;:26;115031:5;115011:26;;;;;;;;;;;;;;;:31;;;:35;115008:837;;;115130:6;115096:10;:19;;:26;115116:5;115096:26;;;;;;;;;;;;;;;:31;;;:40;;;;:::i;:::-;115063:11;:29;;;:73;;;;;;;:::i;:::-;;;;;;;;115218:6;115184:10;:19;;:26;115204:5;115184:26;;;;;;;;;;;;;;;:31;;;:40;;;;:::i;:::-;115151:10;:23;;:30;115175:5;115151:30;;;;;;;;;;;;;;;:73;;;;115263:6;115239:12;:20;;;:30;;;;;;;:::i;:::-;;;;;;;;115008:837;;;115369:12;:23;;;115352:14;:40;;;;:::i;:::-;115313:10;:19;;:26;115333:5;115313:26;;;;;;;;;;;;;;;:36;;;:79;:225;;;;;115467:12;:23;;;115450:14;:40;:87;;115514:12;:23;;;115497:14;:40;;;;:::i;:::-;115450:87;;;115493:1;115450:87;115410:10;:19;;:26;115430:5;115410:26;;;;;;;;;;;;;;;:36;;;:128;115313:225;115296:549;;;115601:10;:19;;:26;115621:5;115601:26;;;;;;;;;;;;;;;:32;;;115565:10;:25;;:32;115591:5;115565:32;;;;;;;;;;;;;;;;:68;;;;;;;:::i;:::-;;;;;;;;115680:10;:19;;:26;115700:5;115680:26;;;;;;;;;;;;;;;:32;;;115648:12;:28;;;:64;;;;;;;:::i;:::-;;;;;;;;115753:6;115727:12;:22;;;:32;;;;;;;:::i;:::-;;;;;;;;115296:549;;;115827:6;115801:12;:22;;;:32;;;;;;;:::i;:::-;;;;;;;;115296:549;115008:837;115901:295;115943:10;:19;;:26;115963:5;115943:26;;;;;;;;;;;;;;;:32;;;115991:10;:19;;:26;116011:5;115991:26;;;;;;;;;;;;;;;:36;;;116042:19;:50;116062:8;:20;116071:10;116062:20;;;;;;;;;;;;;;;:29;116083:7;116062:29;;;;;;;;;;;;116042:50;;;;;;;;;;;:62;116093:10;116042:62;;;;;;;;;;;;;;;:71;116105:7;116042:71;;;;;;;;;;;;116128:12;:23;;;116166:12;:19;;;115901:26;:295::i;:::-;115865:10;:26;;:33;115892:5;115865:33;;;;;;;;;;;;;;;:331;;;;116245:10;:26;;:33;116272:5;116245:33;;;;;;;;;;;;;;;;116209:10;:19;;:26;116229:5;116209:26;;;;;;;;;;;;;;;:32;;;:69;;;;;;;:::i;:::-;;;;;;;;116289:15;116349:5;116343:3;116307:10;:26;;:33;116334:5;116307:33;;;;;;;;;;;;;;;;:39;;;;:::i;:::-;:47;;;;:::i;:::-;116289:65;;116398:10;116365:11;:29;;;:43;;;;;;;:::i;:::-;;;;;;;;116456:10;116419;:26;;:33;116446:5;116419:33;;;;;;;;;;;;;;;;:47;;;;;;;:::i;:::-;;;;;;;;116504:10;:26;;:33;116531:5;116504:33;;;;;;;;;;;;;;;;116477:11;:23;;;:60;;;;;;;:::i;:::-;;;;;;;;116568:11;;;;;;;;;;;116548:48;;;116597:10;116548:60;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;114148:2468;;;;;;;;;;:::o;110481:3008::-;110556:10;110569:8;:20;110578:10;110569:20;;;;;;;;;;;;;;;:29;110590:7;110569:29;;;;;;;;;;;;110556:42;;110609:37;110649:14;:21;110664:5;110649:21;;;;;;;;;;;:33;110671:10;110649:33;;;;;;;;;;;;;;;:42;110683:7;110649:42;;;;;;;;;;;110609:82;;110702:40;110745:15;:22;110761:5;110745:22;;;;;;;;;;;:34;110768:10;110745:34;;;;;;;;;;;;;;;:43;110780:7;110745:43;;;;;;;;;;;110702:86;;110799:39;110841:13;:20;110855:5;110841:20;;;;;;;;;;;:32;110862:10;110841:32;;;;;;;;;;;;;;;:41;110874:7;110841:41;;;;;;;;;;;110799:83;;110893:24;110920:16;:23;110937:5;110920:23;;;;;;;;;;;:35;110944:10;110920:35;;;;;;;;;;;;;;;:44;110956:7;110920:44;;;;;;;;;;;110893:71;;111000:1;110978:12;:18;;;:23;110975:100;;111045:12;:18;;;111018:11;:24;;:45;;;;110975:100;111085:11;111131:1;111126:2;111099:11;:24;;;:29;;;;:::i;:::-;:33;;;;:::i;:::-;111085:47;;111143:15;111169;111195:17;111228:6;111237:1;111228:10;;111224:2258;111245:12;:21;;;111240:1;:26;111224:2258;;111288:19;111345:11;:22;;;111311:11;:31;;;111310:58;;;;:::i;:::-;111288:80;;111396:1;111383:14;;111416:6;111412:761;111432:6;111428:1;:10;111412:761;;;111468:6;111464:694;111484:2;111480:1;:6;111464:694;;;111534:11;:24;;;111520:10;:38;111516:102;;;111588:5;;111516:102;111696:1;111643:10;:19;;:39;111663:6;111670:10;111663:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;111643:39;;;;;;;;;;;;;;;:49;;;:54;111640:464;;;;;;111783:14;111731:10;:19;;:39;111751:6;111758:10;111751:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;111731:39;;;;;;;;;;;;;;;:49;;;:66;111728:376;;;111913:1;111894:14;111842:10;:19;;:39;111862:6;111869:10;111862:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;111842:39;;;;;;;;;;;;;;;:49;;;:66;;;;:::i;:::-;111841:73;;;;:::i;:::-;111827:87;;;;;:::i;:::-;;;111728:376;;;112079:1;112025:10;:19;;:39;112045:6;112052:10;112045:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;112025:39;;;;;;;;;;;;;;;:49;;;112008:14;:66;;;;:::i;:::-;112007:73;;;;:::i;:::-;111993:87;;;;;:::i;:::-;;;111728:376;111640:464;112126:12;;;;;:::i;:::-;;;;111488:3;;;;;:::i;:::-;;;;111464:694;;;;111440:3;;;;;:::i;:::-;;;;111412:761;;;;112187:10;112200:70;112256:12;112229:11;:24;;;:39;;;;:::i;:::-;112217:10;:52;;;;:::i;:::-;112200:16;:70::i;:::-;112187:83;;112298:1;112285:14;;112340:5;112314:12;:23;;:31;;;;112368:12;:21;;;112363:1;:26;112360:71;;;112410:5;;;;112360:71;112458:1;112445:14;;112474:10;112487:79;112521:14;112537:5;112544:12;:21;;;112487:33;:79::i;:::-;112474:92;;112581:11;112611:6;112620:1;112611:10;;112607:864;112627:6;112623:1;:10;112607:864;;;112663:6;112659:797;112679:2;112675:1;:6;112659:797;;;112729:11;:24;;;112715:10;:38;112711:100;;;112782:5;;112711:100;112842:87;112905:11;:23;;;112859:10;:19;;:39;112879:6;112886:10;112879:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;112859:39;;;;;;;;;;;;;;;:45;;;:69;;;;:::i;:::-;112842:16;:87::i;:::-;112833:96;;113007:5;112955:10;:19;;:39;112975:6;112982:10;112975:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;112955:39;;;;;;;;;;;;;;;:49;;;:57;112952:450;;;113130:1;113077:10;:19;;:39;113097:6;113104:10;113097:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;113077:39;;;;;;;;;;;;;;;:49;;;:54;:59;;113135:1;113077:59;;;113133:1;113077:59;113067:70;;:6;:70;;;;:::i;:::-;113041:11;:22;;;:96;;;;;;;:::i;:::-;;;;;;;;113208:10;:19;;:39;113228:6;113235:10;113228:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;113208:39;;;;;;;;;;;;;;;:49;;;113199:6;:58;;;;:::i;:::-;113164:11;:31;;;:93;;;;;;;:::i;:::-;;;;;;;;113336:1;113284:10;:19;;:39;113304:6;113311:10;113304:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;113284:39;;;;;;;;;;;;;;;:49;;:53;;;;113364:14;;;;;:::i;:::-;;;;112952:450;113424:12;;;;;:::i;:::-;;;;112683:3;;;;;:::i;:::-;;;;112659:797;;;;112635:3;;;;;:::i;:::-;;;;112607:864;;;;111224:2258;;;;111268:3;;;;;:::i;:::-;;;;111224:2258;;;;110481:3008;;;;;;;;;;;:::o;109141:736::-;109227:10;109240:8;:20;109249:10;109240:20;;;;;;;;;;;;;;;:29;109261:7;109240:29;;;;;;;;;;;;109227:42;;109280:37;109320:14;:21;109335:5;109320:21;;;;;;;;;;;:33;109342:10;109320:33;;;;;;;;;;;;;;;:42;109354:7;109320:42;;;;;;;;;;;109280:82;;109373:39;109415:13;:20;109429:5;109415:20;;;;;;;;;;;:32;109436:10;109415:32;;;;;;;;;;;;;;;:41;109448:7;109415:41;;;;;;;;;;;109373:83;;109467:40;109510:15;:22;109526:5;109510:22;;;;;;;;;;;:34;109533:10;109510:34;;;;;;;;;;;;;;;:43;109545:7;109510:43;;;;;;;;;;;109467:86;;109608:9;109564:10;:19;;:31;109584:10;109564:31;;;;;;;;;;;;;;;:41;;:53;;;;109628:11;109642:79;109697:11;:23;;;109659:10;:19;;:31;109679:10;109659:31;;;;;;;;;;;;;;;:37;;;:61;;;;:::i;:::-;109642:16;:79::i;:::-;109628:93;;109758:6;109732:11;:22;;;:32;;;;;;;:::i;:::-;;;;;;;;109775:12;:18;;;:20;;;;;;;;;:::i;:::-;;;;;;109860:9;109851:6;:18;;;;:::i;:::-;109816:11;:31;;;:53;;;;;;;:::i;:::-;;;;;;;;109141:736;;;;;;;;:::o;117163:1963::-;117248:10;117261:8;:20;117270:10;117261:20;;;;;;;;;;;;;;;:29;117282:7;117261:29;;;;;;;;;;;;117248:42;;117301:37;117341:14;:21;117356:5;117341:21;;;;;;;;;;;:33;117363:10;117341:33;;;;;;;;;;;;;;;:42;117375:7;117341:42;;;;;;;;;;;117301:82;;117394:40;117437:15;:22;117453:5;117437:22;;;;;;;;;;;:34;117460:10;117437:34;;;;;;;;;;;;;;;:43;117472:7;117437:43;;;;;;;;;;;117394:86;;117491:39;117533:13;:20;117547:5;117533:20;;;;;;;;;;;:32;117554:10;117533:32;;;;;;;;;;;;;;;:41;117566:7;117533:41;;;;;;;;;;;117491:83;;117585:20;117703:12;:19;;;117700:2;:22;;;;:::i;:::-;117672:12;:22;;;117649:12;:20;;;:45;;;;:::i;:::-;117642:3;117619:12;:20;;;:26;;;;:::i;:::-;:76;;;;:::i;:::-;:104;117616:316;;117794:10;:26;;:33;117821:5;117794:33;;;;;;;;;;;;;;;;117759:10;:19;;:26;117779:5;117759:26;;;;;;;;;;;;;;;:32;;;:68;;;;:::i;:::-;117740:87;;;;;:::i;:::-;;;117616:316;;;117888:10;:19;;:26;117908:5;117888:26;;;;;;;;;;;;;;;:32;;;117869:51;;;;;:::i;:::-;;;117616:316;117942:11;118051:12;:19;;;118048:2;:22;;;;:::i;:::-;118020:12;:22;;;117997:12;:20;;;:45;;;;:::i;:::-;117990:3;117967:12;:20;;;:26;;;;:::i;:::-;:76;;;;:::i;:::-;:104;117964:886;;118116:11;:24;;;118097:11;:18;;;:43;;;;:::i;:::-;118088:52;;117964:886;;;118234:1;118201:11;:29;;;118170:12;:28;;;:60;;;;:::i;:::-;:65;118167:683;;;118261:1;118252:10;;118167:683;;;118326:1;118293:11;:29;;;:34;118289:561;;;118414:12;:28;;;118379:10;:25;;:32;118405:5;118379:32;;;;;;;;;;;;;;;;118353:11;:23;;;:58;;;;:::i;:::-;:89;;;;:::i;:::-;118344:98;;118489:10;:25;;:32;118515:5;118489:32;;;;;;;;;;;;;;;;118457:12;:28;;;:64;;;;;;;:::i;:::-;;;;;;;;118571:1;118536:10;:25;;:32;118562:5;118536:32;;;;;;;;;;;;;;;:36;;;;118289:561;;;118682:11;:29;;;118649:10;:23;;:30;118673:5;118649:30;;;;;;;;;;;;;;;;118623:11;:23;;;:56;;;;:::i;:::-;:88;;;;:::i;:::-;118614:97;;118759:10;:23;;:30;118783:5;118759:30;;;;;;;;;;;;;;;;118726:11;:29;;;:63;;;;;;;:::i;:::-;;;;;;;;118837:1;118804:10;:23;;:30;118828:5;118804:30;;;;;;;;;;;;;;;:34;;;;118289:561;118167:683;117964:886;118887:6;118860:11;:23;;;:33;;;;;;;:::i;:::-;;;;;;;;118904:8;;;;;;;;;;;:36;;;118941:6;118904:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;118979:11;;;;;;;;;;;118959:57;;;119017:5;119024:15;118959:81;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;119071:11;;;;;;;;;;;119051:52;;;119104:5;119111:6;119051:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;117163:1963;;;;;;;;;:::o;2321:181::-;2379:7;2399:9;2415:1;2411;:5;;;;:::i;:::-;2399:17;;2440:1;2435;:6;;2427:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;2493:1;2486:8;;;2321:181;;;;:::o;72112:871::-;72221:4;72237:9;72249:1;72237:13;;72261:12;72282:18;72276:3;:24;;;;:::i;:::-;72261:39;;72315:6;72322;72315:13;;72311:553;72335:1;72330;:6;72311:553;;72358:14;72393:19;72387:1;72383;:5;;;;:::i;:::-;72376:3;:13;;;;:::i;:::-;72375:37;;;;:::i;:::-;72358:54;;72427:14;72456:19;72451:1;72445:3;:7;;;;:::i;:::-;72444:31;;;;:::i;:::-;72427:48;;72490:15;72520:19;72515:1;72509:3;:7;;;;:::i;:::-;72508:31;;;;:::i;:::-;72490:49;;72554:15;72588:19;72583:1;72579;72573:3;:7;;;;:::i;:::-;:11;;;;:::i;:::-;72572:35;;;;:::i;:::-;72554:53;;72638:7;72626:9;:19;:43;;;;;72660:9;72649:7;:20;;72626:43;72622:96;;;72697:4;72690:11;;;;;;;;;;;72622:96;72749:7;72736:10;:20;:45;;;;;72771:10;72760:7;:21;;72736:45;72732:97;;;72809:4;72802:11;;;;;;;;;;;72732:97;72851:1;72843:9;;;;;:::i;:::-;;;72311:553;;;;72338:3;;;;;:::i;:::-;;;;72311:553;;;;72892:19;72888:3;:23;;;;:::i;:::-;72877:7;:34;72874:83;;;72944:1;72935:6;:10;;;;:::i;:::-;72928:17;;;;;;72874:83;72974:1;72967:8;;;;72112:871;;;;;;:::o;6940:198::-;6985:6;7004;7023:1;7018;7014;:5;;;;:::i;:::-;7013:11;;;;:::i;:::-;7004:20;;7039:1;7035:5;;7051:80;7062:1;7058;:5;7051:80;;;7084:1;7080:5;;7118:1;7113;7109;7105;:5;;;;:::i;:::-;:9;;;;:::i;:::-;7104:15;;;;:::i;:::-;7100:19;;7051:80;;;6940:198;;;;:::o;73528:1293::-;73653:4;73724:15;73716:6;73710:3;:12;;;;:::i;:::-;73709:30;;;;:::i;:::-;73703:3;73688:14;:18;;;;:::i;:::-;:51;:157;;;;;73838:6;73832:3;:12;;;;:::i;:::-;73812:15;73794;73786:6;73780:3;:12;;;;:::i;:::-;73779:30;;;;:::i;:::-;73773:3;73758:14;:18;;;;:::i;:::-;:51;;;;:::i;:::-;73757:71;;;;:::i;:::-;:88;73688:157;73687:195;;;;73881:1;73863:14;:19;73687:195;73670:1144;;;73916:6;73909:13;;;;73670:1144;73988:15;73980:6;73974:3;:12;;;;:::i;:::-;73973:30;;;;:::i;:::-;73967:3;73952:14;:18;;;;:::i;:::-;:51;73949:865;;;74124:6;74111:10;74104:3;74088:15;:19;;;;:::i;:::-;74070:15;74062:6;74056:3;:12;;;;:::i;:::-;74055:30;;;;:::i;:::-;74049:3;74034:14;:18;;;;:::i;:::-;:51;;;;:::i;:::-;74024:6;:62;;;;:::i;:::-;:84;;;;:::i;:::-;:97;;;;:::i;:::-;:106;74020:318;;;74158:6;74151:13;;;;74020:318;74312:10;74305:3;74289:15;:19;;;;:::i;:::-;74271:15;74263:6;74257:3;:12;;;;:::i;:::-;74256:30;;;;:::i;:::-;74250:3;74235:14;:18;;;;:::i;:::-;:51;;;;:::i;:::-;74225:6;:62;;;;:::i;:::-;:84;;;;:::i;:::-;:97;;;;:::i;:::-;74218:104;;;;73949:865;74403:15;74395:6;74389:3;:12;;;;:::i;:::-;74388:30;;;;:::i;:::-;74382:3;74367:14;:18;;;;:::i;:::-;:51;74364:450;;;74539:6;74526:10;74519:3;74503:15;:19;;;;:::i;:::-;74486:14;74482:3;:18;;;;:::i;:::-;74464:15;74456:6;74450:3;:12;;;;:::i;:::-;74449:30;;;;:::i;:::-;:51;;;;:::i;:::-;74439:6;:62;;;;:::i;:::-;:84;;;;:::i;:::-;:97;;;;:::i;:::-;:106;74435:318;;;74573:6;74566:13;;;;74435:318;74727:10;74720:3;74704:15;:19;;;;:::i;:::-;74687:14;74683:3;:18;;;;:::i;:::-;74665:15;74657:6;74651:3;:12;;;;:::i;:::-;74650:30;;;;:::i;:::-;:51;;;;:::i;:::-;74640:6;:62;;;;:::i;:::-;:84;;;;:::i;:::-;:97;;;;:::i;:::-;74633:104;;;;74364:450;74801:1;74794:8;;73528:1293;;;;;;;;:::o;71788:233::-;71888:15;72011:1;72006;71995:8;:12;;;;:::i;:::-;71971:19;71965:5;:25;;;;:::i;:::-;71957:5;:33;;;;:::i;:::-;71952:1;:39;;;;:::i;:::-;:56;;;;:::i;:::-;:60;;;;:::i;:::-;71929:19;:84;;;;:::i;:::-;71916:97;;71788:233;;;;;:::o;7:139:1:-;;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;59:87;;;;:::o;152:137::-;;237:6;231:13;222:22;;253:30;277:5;253:30;:::i;:::-;212:77;;;;:::o;295:139::-;;379:6;366:20;357:29;;395:33;422:5;395:33;:::i;:::-;347:87;;;;:::o;440:139::-;;524:6;511:20;502:29;;540:33;567:5;540:33;:::i;:::-;492:87;;;;:::o;585:143::-;;673:6;667:13;658:22;;689:33;716:5;689:33;:::i;:::-;648:80;;;;:::o;734:262::-;;842:2;830:9;821:7;817:23;813:32;810:2;;;858:1;855;848:12;810:2;901:1;926:53;971:7;962:6;951:9;947:22;926:53;:::i;:::-;916:63;;872:117;800:196;;;;:::o;1002:407::-;;;1127:2;1115:9;1106:7;1102:23;1098:32;1095:2;;;1143:1;1140;1133:12;1095:2;1186:1;1211:53;1256:7;1247:6;1236:9;1232:22;1211:53;:::i;:::-;1201:63;;1157:117;1313:2;1339:53;1384:7;1375:6;1364:9;1360:22;1339:53;:::i;:::-;1329:63;;1284:118;1085:324;;;;;:::o;1415:552::-;;;;1557:2;1545:9;1536:7;1532:23;1528:32;1525:2;;;1573:1;1570;1563:12;1525:2;1616:1;1641:53;1686:7;1677:6;1666:9;1662:22;1641:53;:::i;:::-;1631:63;;1587:117;1743:2;1769:53;1814:7;1805:6;1794:9;1790:22;1769:53;:::i;:::-;1759:63;;1714:118;1871:2;1897:53;1942:7;1933:6;1922:9;1918:22;1897:53;:::i;:::-;1887:63;;1842:118;1515:452;;;;;:::o;1973:552::-;;;;2115:2;2103:9;2094:7;2090:23;2086:32;2083:2;;;2131:1;2128;2121:12;2083:2;2174:1;2199:53;2244:7;2235:6;2224:9;2220:22;2199:53;:::i;:::-;2189:63;;2145:117;2301:2;2327:53;2372:7;2363:6;2352:9;2348:22;2327:53;:::i;:::-;2317:63;;2272:118;2429:2;2455:53;2500:7;2491:6;2480:9;2476:22;2455:53;:::i;:::-;2445:63;;2400:118;2073:452;;;;;:::o;2531:698::-;;;;;2690:3;2678:9;2669:7;2665:23;2661:33;2658:2;;;2707:1;2704;2697:12;2658:2;2750:1;2775:53;2820:7;2811:6;2800:9;2796:22;2775:53;:::i;:::-;2765:63;;2721:117;2877:2;2903:53;2948:7;2939:6;2928:9;2924:22;2903:53;:::i;:::-;2893:63;;2848:118;3005:2;3031:53;3076:7;3067:6;3056:9;3052:22;3031:53;:::i;:::-;3021:63;;2976:118;3133:2;3159:53;3204:7;3195:6;3184:9;3180:22;3159:53;:::i;:::-;3149:63;;3104:118;2648:581;;;;;;;:::o;3235:698::-;;;;;3394:3;3382:9;3373:7;3369:23;3365:33;3362:2;;;3411:1;3408;3401:12;3362:2;3454:1;3479:53;3524:7;3515:6;3504:9;3500:22;3479:53;:::i;:::-;3469:63;;3425:117;3581:2;3607:53;3652:7;3643:6;3632:9;3628:22;3607:53;:::i;:::-;3597:63;;3552:118;3709:2;3735:53;3780:7;3771:6;3760:9;3756:22;3735:53;:::i;:::-;3725:63;;3680:118;3837:2;3863:53;3908:7;3899:6;3888:9;3884:22;3863:53;:::i;:::-;3853:63;;3808:118;3352:581;;;;;;;:::o;3939:278::-;;4055:2;4043:9;4034:7;4030:23;4026:32;4023:2;;;4071:1;4068;4061:12;4023:2;4114:1;4139:61;4192:7;4183:6;4172:9;4168:22;4139:61;:::i;:::-;4129:71;;4085:125;4013:204;;;;:::o;4223:284::-;;4342:2;4330:9;4321:7;4317:23;4313:32;4310:2;;;4358:1;4355;4348:12;4310:2;4401:1;4426:64;4482:7;4473:6;4462:9;4458:22;4426:64;:::i;:::-;4416:74;;4372:128;4300:207;;;;:::o;4513:552::-;;;;4655:2;4643:9;4634:7;4630:23;4626:32;4623:2;;;4671:1;4668;4661:12;4623:2;4714:1;4739:53;4784:7;4775:6;4764:9;4760:22;4739:53;:::i;:::-;4729:63;;4685:117;4841:2;4867:53;4912:7;4903:6;4892:9;4888:22;4867:53;:::i;:::-;4857:63;;4812:118;4969:2;4995:53;5040:7;5031:6;5020:9;5016:22;4995:53;:::i;:::-;4985:63;;4940:118;4613:452;;;;;:::o;5071:118::-;5158:24;5176:5;5158:24;:::i;:::-;5153:3;5146:37;5136:53;;:::o;5195:157::-;5300:45;5320:24;5338:5;5320:24;:::i;:::-;5300:45;:::i;:::-;5295:3;5288:58;5278:74;;:::o;5358:118::-;5445:24;5463:5;5445:24;:::i;:::-;5440:3;5433:37;5423:53;;:::o;5482:175::-;5591:59;5644:5;5591:59;:::i;:::-;5586:3;5579:72;5569:88;;:::o;5663:325::-;;5826:67;5890:2;5885:3;5826:67;:::i;:::-;5819:74;;5923:29;5919:1;5914:3;5910:11;5903:50;5979:2;5974:3;5970:12;5963:19;;5809:179;;;:::o;5994:118::-;6081:24;6099:5;6081:24;:::i;:::-;6076:3;6069:37;6059:53;;:::o;6118:157::-;6223:45;6243:24;6261:5;6243:24;:::i;:::-;6223:45;:::i;:::-;6218:3;6211:58;6201:74;;:::o;6281:538::-;;6464:75;6535:3;6526:6;6464:75;:::i;:::-;6564:2;6559:3;6555:12;6548:19;;6577:75;6648:3;6639:6;6577:75;:::i;:::-;6677:2;6672:3;6668:12;6661:19;;6690:75;6761:3;6752:6;6690:75;:::i;:::-;6790:2;6785:3;6781:12;6774:19;;6810:3;6803:10;;6453:366;;;;;;:::o;6825:222::-;;6956:2;6945:9;6941:18;6933:26;;6969:71;7037:1;7026:9;7022:17;7013:6;6969:71;:::i;:::-;6923:124;;;;:::o;7053:442::-;;7240:2;7229:9;7225:18;7217:26;;7253:71;7321:1;7310:9;7306:17;7297:6;7253:71;:::i;:::-;7334:72;7402:2;7391:9;7387:18;7378:6;7334:72;:::i;:::-;7416;7484:2;7473:9;7469:18;7460:6;7416:72;:::i;:::-;7207:288;;;;;;:::o;7501:376::-;;7682:2;7671:9;7667:18;7659:26;;7695:71;7763:1;7752:9;7748:17;7739:6;7695:71;:::i;:::-;7776:94;7866:2;7855:9;7851:18;7842:6;7776:94;:::i;:::-;7649:228;;;;;:::o;7883:332::-;;8042:2;8031:9;8027:18;8019:26;;8055:71;8123:1;8112:9;8108:17;8099:6;8055:71;:::i;:::-;8136:72;8204:2;8193:9;8189:18;8180:6;8136:72;:::i;:::-;8009:206;;;;;:::o;8221:664::-;;8464:3;8453:9;8449:19;8441:27;;8478:71;8546:1;8535:9;8531:17;8522:6;8478:71;:::i;:::-;8559:72;8627:2;8616:9;8612:18;8603:6;8559:72;:::i;:::-;8641;8709:2;8698:9;8694:18;8685:6;8641:72;:::i;:::-;8723;8791:2;8780:9;8776:18;8767:6;8723:72;:::i;:::-;8805:73;8873:3;8862:9;8858:19;8849:6;8805:73;:::i;:::-;8431:454;;;;;;;;:::o;8891:775::-;;9162:3;9151:9;9147:19;9139:27;;9176:71;9244:1;9233:9;9229:17;9220:6;9176:71;:::i;:::-;9257:72;9325:2;9314:9;9310:18;9301:6;9257:72;:::i;:::-;9339;9407:2;9396:9;9392:18;9383:6;9339:72;:::i;:::-;9421;9489:2;9478:9;9474:18;9465:6;9421:72;:::i;:::-;9503:73;9571:3;9560:9;9556:19;9547:6;9503:73;:::i;:::-;9586;9654:3;9643:9;9639:19;9630:6;9586:73;:::i;:::-;9129:537;;;;;;;;;:::o;9672:775::-;;9943:3;9932:9;9928:19;9920:27;;9957:71;10025:1;10014:9;10010:17;10001:6;9957:71;:::i;:::-;10038:72;10106:2;10095:9;10091:18;10082:6;10038:72;:::i;:::-;10120;10188:2;10177:9;10173:18;10164:6;10120:72;:::i;:::-;10202;10270:2;10259:9;10255:18;10246:6;10202:72;:::i;:::-;10284:73;10352:3;10341:9;10337:19;10328:6;10284:73;:::i;:::-;10367;10435:3;10424:9;10420:19;10411:6;10367:73;:::i;:::-;9910:537;;;;;;;;;:::o;10453:442::-;;10640:2;10629:9;10625:18;10617:26;;10653:71;10721:1;10710:9;10706:17;10697:6;10653:71;:::i;:::-;10734:72;10802:2;10791:9;10787:18;10778:6;10734:72;:::i;:::-;10816;10884:2;10873:9;10869:18;10860:6;10816:72;:::i;:::-;10607:288;;;;;;:::o;10901:419::-;;11105:2;11094:9;11090:18;11082:26;;11154:9;11148:4;11144:20;11140:1;11129:9;11125:17;11118:47;11182:131;11308:4;11182:131;:::i;:::-;11174:139;;11072:248;;;:::o;11326:222::-;;11457:2;11446:9;11442:18;11434:26;;11470:71;11538:1;11527:9;11523:17;11514:6;11470:71;:::i;:::-;11424:124;;;;:::o;11554:775::-;;11825:3;11814:9;11810:19;11802:27;;11839:71;11907:1;11896:9;11892:17;11883:6;11839:71;:::i;:::-;11920:72;11988:2;11977:9;11973:18;11964:6;11920:72;:::i;:::-;12002;12070:2;12059:9;12055:18;12046:6;12002:72;:::i;:::-;12084;12152:2;12141:9;12137:18;12128:6;12084:72;:::i;:::-;12166:73;12234:3;12223:9;12219:19;12210:6;12166:73;:::i;:::-;12249;12317:3;12306:9;12302:19;12293:6;12249:73;:::i;:::-;11792:537;;;;;;;;;:::o;12335:1219::-;;12718:3;12707:9;12703:19;12695:27;;12732:71;12800:1;12789:9;12785:17;12776:6;12732:71;:::i;:::-;12813:72;12881:2;12870:9;12866:18;12857:6;12813:72;:::i;:::-;12895;12963:2;12952:9;12948:18;12939:6;12895:72;:::i;:::-;12977;13045:2;13034:9;13030:18;13021:6;12977:72;:::i;:::-;13059:73;13127:3;13116:9;13112:19;13103:6;13059:73;:::i;:::-;13142;13210:3;13199:9;13195:19;13186:6;13142:73;:::i;:::-;13225;13293:3;13282:9;13278:19;13269:6;13225:73;:::i;:::-;13308;13376:3;13365:9;13361:19;13352:6;13308:73;:::i;:::-;13391;13459:3;13448:9;13444:19;13435:6;13391:73;:::i;:::-;13474;13542:3;13531:9;13527:19;13518:6;13474:73;:::i;:::-;12685:869;;;;;;;;;;;;;:::o;13560:1445::-;;14001:3;13990:9;13986:19;13978:27;;14015:71;14083:1;14072:9;14068:17;14059:6;14015:71;:::i;:::-;14096:72;14164:2;14153:9;14149:18;14140:6;14096:72;:::i;:::-;14178;14246:2;14235:9;14231:18;14222:6;14178:72;:::i;:::-;14260;14328:2;14317:9;14313:18;14304:6;14260:72;:::i;:::-;14342:73;14410:3;14399:9;14395:19;14386:6;14342:73;:::i;:::-;14425;14493:3;14482:9;14478:19;14469:6;14425:73;:::i;:::-;14508;14576:3;14565:9;14561:19;14552:6;14508:73;:::i;:::-;14591;14659:3;14648:9;14644:19;14635:6;14591:73;:::i;:::-;14674;14742:3;14731:9;14727:19;14718:6;14674:73;:::i;:::-;14757;14825:3;14814:9;14810:19;14801:6;14757:73;:::i;:::-;14840:74;14909:3;14898:9;14894:19;14884:7;14840:74;:::i;:::-;14924;14993:3;14982:9;14978:19;14968:7;14924:74;:::i;:::-;13968:1037;;;;;;;;;;;;;;;:::o;15011:169::-;;15129:6;15124:3;15117:19;15169:4;15164:3;15160:14;15145:29;;15107:73;;;;:::o;15186:305::-;;15245:20;15263:1;15245:20;:::i;:::-;15240:25;;15279:20;15297:1;15279:20;:::i;:::-;15274:25;;15433:1;15365:66;15361:74;15358:1;15355:81;15352:2;;;15439:18;;:::i;:::-;15352:2;15483:1;15480;15476:9;15469:16;;15230:261;;;;:::o;15497:185::-;;15554:20;15572:1;15554:20;:::i;:::-;15549:25;;15588:20;15606:1;15588:20;:::i;:::-;15583:25;;15627:1;15617:2;;15632:18;;:::i;:::-;15617:2;15674:1;15671;15667:9;15662:14;;15539:143;;;;:::o;15688:848::-;;;15780:6;15771:15;;15804:5;15795:14;;15818:712;15839:1;15829:8;15826:15;15818:712;;;15934:4;15929:3;15925:14;15919:4;15916:24;15913:2;;;15943:18;;:::i;:::-;15913:2;15993:1;15983:8;15979:16;15976:2;;;16408:4;16401:5;16397:16;16388:25;;15976:2;16458:4;16452;16448:15;16440:23;;16488:32;16511:8;16488:32;:::i;:::-;16476:44;;15818:712;;;15761:775;;;;;;;:::o;16542:281::-;;16624:23;16642:4;16624:23;:::i;:::-;16616:31;;16668:25;16684:8;16668:25;:::i;:::-;16656:37;;16712:104;16749:66;16739:8;16733:4;16712:104;:::i;:::-;16703:113;;16606:217;;;;:::o;16829:1073::-;;17074:8;17064:2;;17095:1;17086:10;;17097:5;;17064:2;17123:4;17113:2;;17140:1;17131:10;;17142:5;;17113:2;17209:4;17257:1;17252:27;;;;17293:1;17288:191;;;;17202:277;;17252:27;17270:1;17261:10;;17272:5;;;17288:191;17333:3;17323:8;17320:17;17317:2;;;17340:18;;:::i;:::-;17317:2;17389:8;17386:1;17382:16;17373:25;;17424:3;17417:5;17414:14;17411:2;;;17431:18;;:::i;:::-;17411:2;17464:5;;;17202:277;;17588:2;17578:8;17575:16;17569:3;17563:4;17560:13;17556:36;17538:2;17528:8;17525:16;17520:2;17514:4;17511:12;17507:35;17491:111;17488:2;;;17644:8;17638:4;17634:19;17625:28;;17679:3;17672:5;17669:14;17666:2;;;17686:18;;:::i;:::-;17666:2;17719:5;;17488:2;17759:42;17797:3;17787:8;17781:4;17778:1;17759:42;:::i;:::-;17744:57;;;;17833:4;17828:3;17824:14;17817:5;17814:25;17811:2;;;17842:18;;:::i;:::-;17811:2;17891:4;17884:5;17880:16;17871:25;;16889:1013;;;;;;:::o;17908:348::-;;17971:20;17989:1;17971:20;:::i;:::-;17966:25;;18005:20;18023:1;18005:20;:::i;:::-;18000:25;;18193:1;18125:66;18121:74;18118:1;18115:81;18110:1;18103:9;18096:17;18092:105;18089:2;;;18200:18;;:::i;:::-;18089:2;18248:1;18245;18241:9;18230:20;;17956:300;;;;:::o;18262:191::-;;18322:20;18340:1;18322:20;:::i;:::-;18317:25;;18356:20;18374:1;18356:20;:::i;:::-;18351:25;;18395:1;18392;18389:8;18386:2;;;18400:18;;:::i;:::-;18386:2;18445:1;18442;18438:9;18430:17;;18307:146;;;;:::o;18459:96::-;;18525:24;18543:5;18525:24;:::i;:::-;18514:35;;18504:51;;;:::o;18561:90::-;;18638:5;18631:13;18624:21;18613:32;;18603:48;;;:::o;18657:77::-;;18723:5;18712:16;;18702:32;;;:::o;18740:126::-;;18817:42;18810:5;18806:54;18795:65;;18785:81;;;:::o;18872:77::-;;18938:5;18927:16;;18917:32;;;:::o;18955:86::-;;19030:4;19023:5;19019:16;19008:27;;18998:43;;;:::o;19047:135::-;;19152:24;19170:5;19152:24;:::i;:::-;19139:37;;19129:53;;;:::o;19188:171::-;;19250:24;19268:5;19250:24;:::i;:::-;19241:33;;19296:4;19289:5;19286:15;19283:2;;;19304:18;;:::i;:::-;19283:2;19351:1;19344:5;19340:13;19333:20;;19231:128;;;:::o;19365:233::-;;19427:24;19445:5;19427:24;:::i;:::-;19418:33;;19473:66;19466:5;19463:77;19460:2;;;19543:18;;:::i;:::-;19460:2;19590:1;19583:5;19579:13;19572:20;;19408:190;;;:::o;19604:100::-;;19672:26;19692:5;19672:26;:::i;:::-;19661:37;;19651:53;;;:::o;19710:94::-;;19778:20;19792:5;19778:20;:::i;:::-;19767:31;;19757:47;;;:::o;19810:79::-;;19878:5;19867:16;;19857:32;;;:::o;19895:180::-;19943:77;19940:1;19933:88;20040:4;20037:1;20030:15;20064:4;20061:1;20054:15;20081:180;20129:77;20126:1;20119:88;20226:4;20223:1;20216:15;20250:4;20247:1;20240:15;20267:94;;20348:5;20344:2;20340:14;20319:35;;20309:52;;;:::o;20367:102::-;;20456:5;20453:1;20449:13;20428:34;;20418:51;;;:::o;20475:122::-;20548:24;20566:5;20548:24;:::i;:::-;20541:5;20538:35;20528:2;;20587:1;20584;20577:12;20528:2;20518:79;:::o;20603:116::-;20673:21;20688:5;20673:21;:::i;:::-;20666:5;20663:32;20653:2;;20709:1;20706;20699:12;20653:2;20643:76;:::o;20725:122::-;20798:24;20816:5;20798:24;:::i;:::-;20791:5;20788:35;20778:2;;20837:1;20834;20827:12;20778:2;20768:79;:::o;20853:122::-;20926:24;20944:5;20926:24;:::i;:::-;20919:5;20916:35;20906:2;;20965:1;20962;20955:12;20906:2;20896:79;:::o

Swarm Source

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