More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 208,264 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Remove Liquidity... | 43623365 | 8 hrs ago | IN | 0 ETH | 0.0000153 | ||||
Remove Liquidity... | 43441767 | 2 days ago | IN | 0 ETH | 0.00001559 | ||||
Remove Liquidity... | 43418554 | 2 days ago | IN | 0 ETH | 0.00001622 | ||||
Remove Liquidity... | 43404812 | 3 days ago | IN | 0 ETH | 0.00001589 | ||||
Remove Liquidity... | 43404475 | 3 days ago | IN | 0 ETH | 0.00001393 | ||||
Remove Liquidity... | 43346934 | 3 days ago | IN | 0 ETH | 0.00001156 | ||||
Remove Liquidity... | 43321820 | 4 days ago | IN | 0 ETH | 0.00001546 | ||||
Remove Liquidity... | 43292193 | 4 days ago | IN | 0 ETH | 0.00000865 | ||||
Remove Liquidity... | 43292193 | 4 days ago | IN | 0 ETH | 0.00000867 | ||||
Remove Liquidity... | 43292185 | 4 days ago | IN | 0 ETH | 0.00001571 | ||||
Remove Liquidity... | 43280925 | 4 days ago | IN | 0 ETH | 0.0000092 | ||||
Remove Liquidity... | 43279367 | 4 days ago | IN | 0 ETH | 0.0000156 | ||||
Remove Liquidity... | 43275691 | 4 days ago | IN | 0 ETH | 0.00001534 | ||||
Remove Liquidity | 43273162 | 4 days ago | IN | 0 ETH | 0.00001319 | ||||
Remove Liquidity | 43268163 | 4 days ago | IN | 0 ETH | 0.00001233 | ||||
Remove Liquidity... | 43268124 | 4 days ago | IN | 0 ETH | 0.00001548 | ||||
Remove Liquidity... | 43139843 | 6 days ago | IN | 0 ETH | 0.00001522 | ||||
Remove Liquidity... | 43077006 | 7 days ago | IN | 0 ETH | 0.00001132 | ||||
Remove Liquidity... | 43076046 | 7 days ago | IN | 0 ETH | 0.00001107 | ||||
Remove Liquidity... | 43069886 | 7 days ago | IN | 0 ETH | 0.00001529 | ||||
Remove Liquidity... | 43067847 | 7 days ago | IN | 0 ETH | 0.00001544 | ||||
Remove Liquidity... | 43064604 | 7 days ago | IN | 0 ETH | 0.00001556 | ||||
Remove Liquidity... | 43040513 | 7 days ago | IN | 0 ETH | 0.00001506 | ||||
Remove Liquidity | 43038636 | 7 days ago | IN | 0 ETH | 0.00001289 | ||||
Remove Liquidity... | 43027468 | 7 days ago | IN | 0 ETH | 0.00001522 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
43623365 | 8 hrs ago | 0.00065436 ETH | ||||
43623365 | 8 hrs ago | 0.00065436 ETH | ||||
43441767 | 2 days ago | 0.00302287 ETH | ||||
43441767 | 2 days ago | 0.00302287 ETH | ||||
43418554 | 2 days ago | 0.00171643 ETH | ||||
43418554 | 2 days ago | 0.00171643 ETH | ||||
43404812 | 3 days ago | 0.03918251 ETH | ||||
43404812 | 3 days ago | 0.03918251 ETH | ||||
43404475 | 3 days ago | 0.01733403 ETH | ||||
43404475 | 3 days ago | 0.01733403 ETH | ||||
43346934 | 3 days ago | 0.0020203 ETH | ||||
43346934 | 3 days ago | 0.0020203 ETH | ||||
43321820 | 4 days ago | 0.03342772 ETH | ||||
43321820 | 4 days ago | 0.03342772 ETH | ||||
43292193 | 4 days ago | 0.00044922 ETH | ||||
43292193 | 4 days ago | 0.00044922 ETH | ||||
43292193 | 4 days ago | 0.00044921 ETH | ||||
43292193 | 4 days ago | 0.00044921 ETH | ||||
43292185 | 4 days ago | 0.00044922 ETH | ||||
43292185 | 4 days ago | 0.00044922 ETH | ||||
43280925 | 4 days ago | 0.00760313 ETH | ||||
43280925 | 4 days ago | 0.00760313 ETH | ||||
43279367 | 4 days ago | 0.00581002 ETH | ||||
43279367 | 4 days ago | 0.00581002 ETH | ||||
43275691 | 4 days ago | 0.00969994 ETH |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
Router
Compiler Version
v0.8.17+commit.8df45f5f
ZkSolc Version
v1.3.5
Contract Source Code (Solidity)
/** *Submitted for verification at era.zksync.network on 2024-01-04 */ pragma solidity ^0.8.13; // : MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol) /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0); } } } // : MIT // OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol) /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } } interface IERC20 { function totalSupply() external view returns (uint256); function transfer(address recipient, uint amount) external returns (bool); function decimals() external view returns (uint8); function symbol() external view returns (string memory); function balanceOf(address) external view returns (uint); function transferFrom( address sender, address recipient, uint amount ) external returns (bool); function allowance( address owner, address spender ) external view returns (uint); function approve(address spender, uint value) external returns (bool); event Transfer(address indexed from, address indexed to, uint value); event Approval(address indexed owner, address indexed spender, uint value); } interface IPair { function metadata() external view returns ( uint dec0, uint dec1, uint r0, uint r1, bool st, address t0, address t1 ); function setExternalBribe(address _externalBribe) external; function setHasGauge(bool value) external; function tokens() external returns (address, address); function transferFrom( address src, address dst, uint amount ) external returns (bool); function permit( address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s ) external; function swap( uint amount0Out, uint amount1Out, address to, bytes calldata data ) external; function burn(address to) external returns (uint amount0, uint amount1); function mint(address to) external returns (uint liquidity); function getReserves() external view returns (uint _reserve0, uint _reserve1, uint _blockTimestampLast); function getAmountOut(uint, address) external view returns (uint); } interface IPairFactory { function allPairsLength() external view returns (uint); function isPair(address pair) external view returns (bool); function voter() external view returns (address); function tank() external view returns (address); function getInitializable() external view returns (address, address, bool); function getFee(bool _stable) external view returns (uint256); function isPaused() external view returns (bool); function getPair( address tokenA, address token, bool stable ) external view returns (address); function createPair( address tokenA, address tokenB, bool stable ) external returns (address pair); } interface IRouter { function pairFor( address tokenA, address tokenB, bool stable ) external view returns (address pair); } interface IWETH { function deposit() external payable; function transfer(address to, uint256 value) external returns (bool); function withdraw(uint256) external; } // : MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) /** * @dev Interface of the ERC20 standard as defined in the EIP. */ // : MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol) /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // : MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // : MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/utils/SafeERC20.sol) /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value)); } /** * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value)); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Compatible with tokens that require the approval to be set to * 0 before setting it to a non-zero value. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0)); _callOptionalReturn(token, approvalCall); } } /** * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`. * Revert on invalid signature. */ function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token)); } } interface IBribe { function _deposit(uint256 amount, uint256 tokenId) external; function _withdraw(uint256 amount, uint256 tokenId) external; function getRewardForOwner( uint256 tokenId, address[] memory tokens ) external; function notifyRewardAmount(address token, uint256 amount) external; //keep same as external bribe function left(address token) external view returns (uint256); } interface IGauge { function notifyRewardAmount(address token, uint amount) external; function getReward(address account, address[] memory tokens) external; function left(address token) external view returns (uint); function isForPair() external view returns (bool); function stake() external view returns (address); } interface IVoter { function _ve() external view returns (address); function governor() external view returns (address); function emergencyCouncil() external view returns (address); function attachTokenToGauge(uint _tokenId, address account) external; function detachTokenFromGauge(uint _tokenId, address account) external; function emitDeposit(uint _tokenId, address account, uint amount) external; function emitWithdraw(uint _tokenId, address account, uint amount) external; function isWhitelisted(address token) external view returns (bool); function notifyRewardAmount(uint amount) external; function distribute(address _gauge) external; } interface IVotingEscrow { struct Point { int128 bias; int128 slope; // # -dweight / dt uint256 ts; uint256 blk; // block } function token() external view returns (address); function team() external returns (address); function epoch() external view returns (uint); function point_history(uint loc) external view returns (Point memory); function user_point_history( uint tokenId, uint loc ) external view returns (Point memory); function user_point_epoch(uint tokenId) external view returns (uint); function ownerOf(uint) external view returns (address); function isApprovedOrOwner(address, uint) external view returns (bool); function transferFrom(address, address, uint) external; function voting(uint tokenId) external; function abstain(uint tokenId) external; function attach(uint tokenId) external; function detach(uint tokenId) external; function checkpoint() external; function deposit_for(uint tokenId, uint value) external; function create_lock_for(uint, uint, address) external returns (uint); function balanceOfNFT(uint) external view returns (uint); function totalSupply() external view returns (uint); } uint256 constant VELOCORE_EPOCH_DURATION = 7 days; // : MIT // Bribes pay out rewards for a given pool based on the votes that were received from the user (goes hand in hand with Voter.vote()) contract ExternalBribe is IBribe { address public voter; // only voter can modify balances (since it only happens on vote()) address public _ve; // 天使ã®ãŸã¾ã” uint256 internal constant DURATION = VELOCORE_EPOCH_DURATION; // rewards are released over the voting period uint256 internal constant MAX_REWARD_TOKENS = 16; uint256 public totalSupply; mapping(uint256 => uint256) public balanceOf; mapping(address => mapping(uint256 => uint256)) public tokenRewardsPerEpoch; mapping(address => uint256) public periodFinish; mapping(address => mapping(uint256 => uint256)) public lastEarn; address[] public rewards; mapping(address => bool) public isReward; /// @notice A checkpoint for marking balance struct Checkpoint { uint256 timestamp; uint256 balanceOf; } /// @notice A checkpoint for marking supply struct SupplyCheckpoint { uint256 timestamp; uint256 supply; } /// @notice A record of balance checkpoints for each account, by index mapping(uint256 => mapping(uint256 => Checkpoint)) public checkpoints; /// @notice The number of checkpoints for each account mapping(uint256 => uint256) public numCheckpoints; /// @notice A record of balance checkpoints for each token, by index mapping(uint256 => SupplyCheckpoint) public supplyCheckpoints; /// @notice The number of checkpoints uint256 public supplyNumCheckpoints; event Deposit(address indexed from, uint256 tokenId, uint256 amount); event Withdraw(address indexed from, uint256 tokenId, uint256 amount); event NotifyReward( address indexed from, address indexed reward, uint256 epoch, uint256 amount ); event ClaimRewards( address indexed from, address indexed reward, uint256 amount ); bool initialized; constructor() { initialized = true; } function initialize( address _voter, address[] memory _allowedRewardTokens ) external { require(!initialized, "1322"); initialized = true; voter = _voter; _unlocked = 1; _ve = IVoter(_voter)._ve(); for (uint256 i; i < _allowedRewardTokens.length; i++) { if (_allowedRewardTokens[i] != address(0)) { isReward[_allowedRewardTokens[i]] = true; rewards.push(_allowedRewardTokens[i]); } } } // simple re-entrancy check uint256 internal _unlocked; modifier lock() { require(_unlocked == 1); _unlocked = 2; _; _unlocked = 1; } function _bribeStart(uint256 timestamp) internal pure returns (uint256) { return timestamp - (timestamp % (7 days)); } function getEpochStart(uint256 timestamp) public pure returns (uint256) { uint256 bribeStart = _bribeStart(timestamp); uint256 bribeEnd = bribeStart + DURATION; return timestamp < bribeEnd ? bribeStart : bribeStart + 7 days; } /** * @notice Determine the prior balance for an account as of a block number * @dev Block number must be a finalized block or else this function will revert to prevent misinformation. * @param tokenId The token of the NFT to check * @param timestamp The timestamp to get the balance at * @return The balance the account had as of the given block */ function getPriorBalanceIndex( uint256 tokenId, uint256 timestamp ) public view returns (uint256) { uint256 nCheckpoints = numCheckpoints[tokenId]; if (nCheckpoints == 0) { return 0; } // First check most recent balance if (checkpoints[tokenId][nCheckpoints - 1].timestamp <= timestamp) { return (nCheckpoints - 1); } // Next check implicit zero balance if (checkpoints[tokenId][0].timestamp > timestamp) { return 0; } uint256 lower = 0; uint256 upper = nCheckpoints - 1; while (upper > lower) { uint256 center = upper - (upper - lower) / 2; // ceil, avoiding overflow Checkpoint memory cp = checkpoints[tokenId][center]; if (cp.timestamp == timestamp) { return center; } else if (cp.timestamp < timestamp) { lower = center; } else { upper = center - 1; } } return lower; } function getPriorSupplyIndex( uint256 timestamp ) public view returns (uint256) { uint256 nCheckpoints = supplyNumCheckpoints; if (nCheckpoints == 0) { return 0; } // First check most recent balance if (supplyCheckpoints[nCheckpoints - 1].timestamp <= timestamp) { return (nCheckpoints - 1); } // Next check implicit zero balance if (supplyCheckpoints[0].timestamp > timestamp) { return 0; } uint256 lower = 0; uint256 upper = nCheckpoints - 1; while (upper > lower) { uint256 center = upper - (upper - lower) / 2; // ceil, avoiding overflow SupplyCheckpoint memory cp = supplyCheckpoints[center]; if (cp.timestamp == timestamp) { return center; } else if (cp.timestamp < timestamp) { lower = center; } else { upper = center - 1; } } return lower; } function _writeCheckpoint(uint256 tokenId, uint256 balance) internal { uint256 _timestamp = block.timestamp; uint256 _nCheckPoints = numCheckpoints[tokenId]; if ( _nCheckPoints > 0 && checkpoints[tokenId][_nCheckPoints - 1].timestamp == _timestamp ) { checkpoints[tokenId][_nCheckPoints - 1].balanceOf = balance; } else { checkpoints[tokenId][_nCheckPoints] = Checkpoint( _timestamp, balance ); numCheckpoints[tokenId] = _nCheckPoints + 1; } } function _writeSupplyCheckpoint() internal { uint256 _nCheckPoints = supplyNumCheckpoints; uint256 _timestamp = block.timestamp; if ( _nCheckPoints > 0 && supplyCheckpoints[_nCheckPoints - 1].timestamp == _timestamp ) { supplyCheckpoints[_nCheckPoints - 1].supply = totalSupply; } else { supplyCheckpoints[_nCheckPoints] = SupplyCheckpoint( _timestamp, totalSupply ); supplyNumCheckpoints = _nCheckPoints + 1; } } function rewardsListLength() external view returns (uint256) { return rewards.length; } // returns the last time the reward was modified or periodFinish if the reward has ended function lastTimeRewardApplicable( address token ) public view returns (uint256) { return Math.min(block.timestamp, periodFinish[token]); } // allows a user to claim rewards for a given token function getReward(uint256 tokenId, address[] memory tokens) external lock { require(IVotingEscrow(_ve).isApprovedOrOwner(msg.sender, tokenId)); for (uint256 i = 0; i < tokens.length; i++) { uint256 _reward = earned(tokens[i], tokenId); lastEarn[tokens[i]][tokenId] = block.timestamp; if (_reward > 0) _safeTransfer(tokens[i], msg.sender, _reward); emit ClaimRewards(msg.sender, tokens[i], _reward); } } // used by Voter to allow batched reward claims function getRewardForOwner( uint256 tokenId, address[] memory tokens ) external lock { require(msg.sender == voter); address _owner = IVotingEscrow(_ve).ownerOf(tokenId); for (uint256 i = 0; i < tokens.length; i++) { uint256 _reward = earned(tokens[i], tokenId); lastEarn[tokens[i]][tokenId] = block.timestamp; if (_reward > 0) _safeTransfer(tokens[i], _owner, _reward); emit ClaimRewards(_owner, tokens[i], _reward); } } function earned( address token, uint256 tokenId ) public view returns (uint256) { uint256 _startTimestamp = lastEarn[token][tokenId]; if (numCheckpoints[tokenId] == 0) { return 0; } uint256 _startIndex = getPriorBalanceIndex(tokenId, _startTimestamp); uint256 _endIndex = numCheckpoints[tokenId] - 1; uint256 reward = 0; // you only earn once per epoch (after it's over) Checkpoint memory prevRewards; // reuse struct to avoid stack too deep prevRewards.timestamp = _bribeStart(_startTimestamp); uint256 _prevSupply = 1; if (_endIndex > 0) { for (uint256 i = _startIndex; i <= _endIndex - 1; i++) { Checkpoint memory cp0 = checkpoints[tokenId][i]; uint256 _nextEpochStart = _bribeStart(cp0.timestamp); // check that you've earned it // this won't happen until a week has passed if (_nextEpochStart > prevRewards.timestamp) { reward += prevRewards.balanceOf; } prevRewards.timestamp = _nextEpochStart; _prevSupply = supplyCheckpoints[ getPriorSupplyIndex(_nextEpochStart + DURATION) ].supply; prevRewards.balanceOf = (cp0.balanceOf * tokenRewardsPerEpoch[token][_nextEpochStart]) / _prevSupply; } } Checkpoint memory cp = checkpoints[tokenId][_endIndex]; uint256 _lastEpochStart = _bribeStart(cp.timestamp); uint256 _lastEpochEnd = _lastEpochStart + DURATION; if (block.timestamp > _lastEpochEnd) { reward += (cp.balanceOf * tokenRewardsPerEpoch[token][_lastEpochStart]) / supplyCheckpoints[getPriorSupplyIndex(_lastEpochEnd)].supply; } return reward; } // This is an external function, but internal notation is used since it can only be called "internally" from Gauges function _deposit(uint256 amount, uint256 tokenId) external { require(msg.sender == voter); totalSupply += amount; balanceOf[tokenId] += amount; _writeCheckpoint(tokenId, balanceOf[tokenId]); _writeSupplyCheckpoint(); emit Deposit(msg.sender, tokenId, amount); } function _withdraw(uint256 amount, uint256 tokenId) external { require(msg.sender == voter); totalSupply -= amount; balanceOf[tokenId] -= amount; _writeCheckpoint(tokenId, balanceOf[tokenId]); _writeSupplyCheckpoint(); emit Withdraw(msg.sender, tokenId, amount); } function left(address token) external view returns (uint256) { uint256 adjustedTstamp = getEpochStart(block.timestamp); return tokenRewardsPerEpoch[token][adjustedTstamp]; } function notifyRewardAmount(address token, uint256 amount) external lock { require(amount > 0); if (!isReward[token]) { require( IVoter(voter).isWhitelisted(token), "bribe tokens must be whitelisted" ); require( rewards.length < MAX_REWARD_TOKENS, "too many rewards tokens" ); } // bribes kick in at the start of next bribe period uint256 adjustedTstamp = getEpochStart(block.timestamp); uint256 epochRewards = tokenRewardsPerEpoch[token][adjustedTstamp]; _safeTransferFrom(token, msg.sender, address(this), amount); tokenRewardsPerEpoch[token][adjustedTstamp] = epochRewards + amount; periodFinish[token] = adjustedTstamp + DURATION; if (!isReward[token]) { isReward[token] = true; rewards.push(token); } emit NotifyReward(msg.sender, token, adjustedTstamp, amount); } function swapOutRewardToken( uint256 i, address oldToken, address newToken ) external { require(msg.sender == IVotingEscrow(_ve).team(), "only team"); require(rewards[i] == oldToken); isReward[oldToken] = false; isReward[newToken] = true; rewards[i] = newToken; } function _safeTransfer(address token, address to, uint256 value) internal { require(token.code.length > 0); (bool success, bytes memory data) = token.call( abi.encodeWithSelector(IERC20.transfer.selector, to, value) ); require(success && (data.length == 0 || abi.decode(data, (bool)))); } function _safeTransferFrom( address token, address from, address to, uint256 value ) internal { require(token.code.length > 0); (bool success, bytes memory data) = token.call( abi.encodeWithSelector( IERC20.transferFrom.selector, from, to, value ) ); require(success && (data.length == 0 || abi.decode(data, (bool)))); } } contract WrappedBribe { address public immutable voter; address public immutable _ve; ExternalBribe public underlying_bribe; uint256 internal constant DURATION = 7 days; // rewards are released over the voting period uint256 internal constant MAX_REWARD_TOKENS = 4; mapping(address => mapping(uint256 => uint256)) public tokenRewardsPerEpoch; mapping(address => uint256) public periodFinish; mapping(address => mapping(uint256 => uint256)) public lastEarn; address[] public rewards; mapping(address => bool) public isReward; mapping(address => uint256) public tokenRewardBalance; /// @notice A checkpoint for marking balance struct RewardCheckpoint { uint256 timestamp; uint256 balance; } event NotifyReward(address indexed from, address indexed reward, uint256 epoch, uint256 amount); event ClaimRewards(address indexed from, address indexed reward, uint256 amount); event HandleLeftOverRewards(address indexed reward, uint256 originalEpoch, uint256 updatedEpoch, uint256 amount); constructor(address _voter, address _old_bribe) { voter = _voter; _ve = IVoter(_voter)._ve(); underlying_bribe = ExternalBribe(_old_bribe); for (uint256 i; i < underlying_bribe.rewardsListLength(); i++) { address underlying_reward = underlying_bribe.rewards(i); if (underlying_reward != address(0)) { isReward[underlying_reward] = true; rewards.push(underlying_reward); } } } // simple re-entrancy check uint256 internal _unlocked = 1; modifier lock() { require(_unlocked == 1); _unlocked = 2; _; _unlocked = 1; } function _bribeStart(uint256 timestamp) internal pure returns (uint256) { return timestamp - (timestamp % (7 days)); } function getEpochStart(uint256 timestamp) public pure returns (uint256) { uint256 bribeStart = _bribeStart(timestamp); uint256 bribeEnd = bribeStart + DURATION; return timestamp < bribeEnd ? bribeStart : bribeStart + 7 days; } function rewardsListLength() external view returns (uint256) { return rewards.length; } // returns the last time the reward was modified or periodFinish if the reward has ended function lastTimeRewardApplicable(address token) public view returns (uint256) { return Math.min(block.timestamp, periodFinish[token]); } // allows a user to claim rewards for a given token function getReward(uint256 tokenId, address[] memory tokens) external lock { require(IVotingEscrow(_ve).isApprovedOrOwner(msg.sender, tokenId)); uint256 balanceBefore; for (uint256 i = 0; i < tokens.length; i++) { uint256 _reward = earned(tokens[i], tokenId); lastEarn[tokens[i]][tokenId] = block.timestamp; if (_reward > 0) { balanceBefore = IERC20(tokens[i]).balanceOf(address(this)); _safeTransfer(tokens[i], msg.sender, _reward); tokenRewardBalance[tokens[i]] -= balanceBefore - IERC20(tokens[i]).balanceOf(address(this)); } emit ClaimRewards(msg.sender, tokens[i], _reward); } } // used by Voter to allow batched reward claims function getRewardForOwner(uint256 tokenId, address[] memory tokens) external lock { require(msg.sender == voter); address _owner = IVotingEscrow(_ve).ownerOf(tokenId); uint256 balanceBefore; for (uint256 i = 0; i < tokens.length; i++) { uint256 _reward = earned(tokens[i], tokenId); lastEarn[tokens[i]][tokenId] = block.timestamp; if (_reward > 0) { balanceBefore = IERC20(tokens[i]).balanceOf(address(this)); _safeTransfer(tokens[i], _owner, _reward); tokenRewardBalance[tokens[i]] -= balanceBefore - IERC20(tokens[i]).balanceOf(address(this)); } emit ClaimRewards(_owner, tokens[i], _reward); } } function earned(address token, uint256 tokenId) public view returns (uint256) { if (underlying_bribe.numCheckpoints(tokenId) == 0) { return 0; } uint256 reward = 0; uint256 _ts = 0; uint256 _bal = 0; uint256 _supply = 1; uint256 _index = 0; uint256 _currTs = _bribeStart(lastEarn[token][tokenId]); // take epoch last claimed in as starting point _index = underlying_bribe.getPriorBalanceIndex(tokenId, _currTs); (_ts, _bal) = underlying_bribe.checkpoints(tokenId, _index); // accounts for case where lastEarn is before first checkpoint _currTs = Math.max(_currTs, _bribeStart(_ts)); // get epochs between current epoch and first checkpoint in same epoch as last claim uint256 numEpochs = (_bribeStart(block.timestamp) - _currTs) / DURATION; if (numEpochs > 0) { for (uint256 i = 0; i < numEpochs; i++) { // get index of last checkpoint in this epoch _index = underlying_bribe.getPriorBalanceIndex(tokenId, _currTs + DURATION); // get checkpoint in this epoch (_ts, _bal) = underlying_bribe.checkpoints(tokenId, _index); // get supply of last checkpoint in this epoch (, _supply) = underlying_bribe.supplyCheckpoints(underlying_bribe.getPriorSupplyIndex(_currTs + DURATION)); if (_supply != 0) { reward += (_bal * tokenRewardsPerEpoch[token][_currTs]) / _supply; } _currTs += DURATION; } } return reward; } function left(address token) external view returns (uint256) { uint256 adjustedTstamp = getEpochStart(block.timestamp); return tokenRewardsPerEpoch[token][adjustedTstamp]; } function notifyRewardAmount(address token, uint256 amount) external lock { require(amount > 0); if (!isReward[token]) { require(IVoter(voter).isWhitelisted(token), "bribe tokens must be whitelisted"); require(rewards.length < MAX_REWARD_TOKENS, "too many rewards tokens"); } // bribes kick in at the start of next bribe period uint256 adjustedTstamp = getEpochStart(block.timestamp); uint256 epochRewards = tokenRewardsPerEpoch[token][adjustedTstamp]; uint256 balanceBefore = IERC20(token).balanceOf(address(this)); _safeTransferFrom(token, msg.sender, address(this), amount); uint256 balanceAfter = IERC20(token).balanceOf(address(this)); amount = balanceAfter - balanceBefore; tokenRewardsPerEpoch[token][adjustedTstamp] = epochRewards + amount; tokenRewardBalance[token] += amount; periodFinish[token] = adjustedTstamp + DURATION; if (!isReward[token]) { isReward[token] = true; rewards.push(token); } emit NotifyReward(msg.sender, token, adjustedTstamp, amount); } function updateRewardAmount(address[] memory tokens) external lock { uint256 length = tokens.length; uint256 adjustedTstamp = getEpochStart(block.timestamp); uint256 rewardBalance; uint256 difference; for (uint256 i = 0; i < length;) { rewardBalance = tokenRewardBalance[tokens[i]]; difference = IERC20(tokens[i]).balanceOf(address(this)) - rewardBalance; if (difference != 0) { tokenRewardsPerEpoch[tokens[i]][adjustedTstamp] += difference; tokenRewardBalance[tokens[i]] = rewardBalance + difference; periodFinish[tokens[i]] = adjustedTstamp + DURATION; emit NotifyReward(msg.sender, tokens[i], adjustedTstamp, difference); } unchecked { ++i; } } } // This is an external function that can only be called by teams to handle unclaimed rewards due to zero vote function handleLeftOverRewards(uint256 epochTimestamp, address[] memory tokens) external { require(msg.sender == IVotingEscrow(_ve).team(), "only team"); // require that supply of that epoch to be ZERO uint256 epochStart = getEpochStart(epochTimestamp); (uint256 _ts, uint256 _supply) = underlying_bribe.supplyCheckpoints(underlying_bribe.getPriorSupplyIndex(epochStart + DURATION)); if (epochStart + DURATION > _bribeStart(_ts)) { require(_supply == 0, "this epoch has votes"); } // do sth like notifyRewardAmount uint256 length = tokens.length; for (uint256 i = 0; i < length;) { // check bribe amount uint256 previousEpochRewards = tokenRewardsPerEpoch[tokens[i]][epochStart]; require(previousEpochRewards != 0, "no bribes for this epoch"); // get timestamp of current epoch uint256 adjustedTstamp = getEpochStart(block.timestamp); // get notified reward of current epoch uint256 currentEpochRewards = tokenRewardsPerEpoch[tokens[i]][adjustedTstamp]; // add previous unclaimed rewards to current epoch tokenRewardsPerEpoch[tokens[i]][adjustedTstamp] = currentEpochRewards + previousEpochRewards; // remove token rewards from previous epoch tokenRewardsPerEpoch[tokens[i]][epochStart] = 0; // amend period finish periodFinish[tokens[i]] = adjustedTstamp + DURATION; emit HandleLeftOverRewards(tokens[i], epochStart, adjustedTstamp, previousEpochRewards); unchecked { ++i; } } } function swapOutRewardToken(uint256 i, address oldToken, address newToken) external { require(msg.sender == IVotingEscrow(_ve).team(), "only team"); require(rewards[i] == oldToken); isReward[oldToken] = false; isReward[newToken] = true; rewards[i] = newToken; } function _safeTransfer(address token, address to, uint256 value) internal { require(token.code.length > 0); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transfer.selector, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool)))); } function _safeTransferFrom(address token, address from, address to, uint256 value) internal { require(token.code.length > 0); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool)))); } } contract WrappedBribeFactory { using SafeERC20 for IERC20; address public immutable voter; mapping(address => address) public oldBribeToNew; address public last_bribe; constructor(address _voter) { voter = _voter; } function notifyRewardAmount(address existing_bribe, IERC20 token, uint256 amount) external returns (address) { if (oldBribeToNew[existing_bribe] == address(0)) { createBribe(existing_bribe); } token.safeTransferFrom(msg.sender, address(this), amount); token.approve(oldBribeToNew[existing_bribe], amount); WrappedBribe(oldBribeToNew[existing_bribe]).notifyRewardAmount(address(token), amount); } function createBribe(address existing_bribe) public returns (address) { require(oldBribeToNew[existing_bribe] == address(0), "Wrapped bribe already created"); last_bribe = address(new WrappedBribe(voter, existing_bribe)); oldBribeToNew[existing_bribe] = last_bribe; return last_bribe; } } interface IPairCallee { function hook( address sender, uint amount0, uint amount1, bytes calldata data ) external; } contract Pair is IPair { string public name; string public symbol; uint8 public constant decimals = 18; // Used to denote stable or volatile pair, not immutable since construction happens in the initialize method for CREATE2 deterministic addresses bool public immutable stable; uint256 public totalSupply = 0; mapping(address => mapping(address => uint256)) public allowance; mapping(address => uint256) public balanceOf; bytes32 internal DOMAIN_SEPARATOR; // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); bytes32 internal constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; mapping(address => uint256) public nonces; uint256 internal constant MINIMUM_LIQUIDITY = 10 ** 3; address public immutable token0; address public immutable token1; address immutable factory; address public externalBribe; address public voter; bool public hasGauge; // Structure to capture time period obervations every 30 minutes, used for local oracles struct Observation { uint256 timestamp; uint256 reserve0Cumulative; uint256 reserve1Cumulative; } // Capture oracle reading every 30 minutes uint256 constant periodSize = 1800; Observation[] public observations; uint256 internal immutable decimals0; uint256 internal immutable decimals1; uint256 public reserve0; uint256 public reserve1; uint256 public blockTimestampLast; uint256 public reserve0CumulativeLast; uint256 public reserve1CumulativeLast; event TankFees(address indexed token, uint256 amount, address tank); event GaugeFees(address indexed token, uint256 amount, address externalBribe); event Mint(address indexed sender, uint256 amount0, uint256 amount1); event Burn(address indexed sender, uint256 amount0, uint256 amount1, address indexed to); event Swap( address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out, uint256 amount1Out, address indexed to ); event Sync(uint256 reserve0, uint256 reserve1); event Transfer(address indexed from, address indexed to, uint256 amount); event Approval(address indexed owner, address indexed spender, uint256 amount); event ExternalBribeSet(address indexed externalBribe); event HasGaugeSet(bool value); constructor() { factory = msg.sender; voter = IPairFactory(msg.sender).voter(); (address _token0, address _token1, bool _stable) = IPairFactory(msg.sender).getInitializable(); (token0, token1, stable) = (_token0, _token1, _stable); if (_stable) { name = string(abi.encodePacked("StableV1 AMM - ", IERC20(_token0).symbol(), "/", IERC20(_token1).symbol())); symbol = string(abi.encodePacked("sAMM-", IERC20(_token0).symbol(), "/", IERC20(_token1).symbol())); } else { name = string(abi.encodePacked("VolatileV1 AMM - ", IERC20(_token0).symbol(), "/", IERC20(_token1).symbol())); symbol = string(abi.encodePacked("vAMM-", IERC20(_token0).symbol(), "/", IERC20(_token1).symbol())); } decimals0 = 10 ** IERC20(_token0).decimals(); decimals1 = 10 ** IERC20(_token1).decimals(); observations.push(Observation(block.timestamp, 0, 0)); } // simple re-entrancy check uint256 internal _unlocked = 1; modifier lock() { require(_unlocked == 1); _unlocked = 2; _; _unlocked = 1; } function _safeApprove(address token, address spender, uint256 value) internal { require(token.code.length > 0); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.approve.selector, spender, value)); require(success && (data.length == 0 || abi.decode(data, (bool)))); } function tank() public view returns (address) { return IPairFactory(factory).tank(); } function setExternalBribe(address _externalBribe) external { require(externalBribe == address(0), "External bribe has already been set."); require(msg.sender == voter, "Only voter can set external bribe"); externalBribe = _externalBribe; _safeApprove(token0, externalBribe, type(uint256).max); _safeApprove(token1, externalBribe, type(uint256).max); emit ExternalBribeSet(_externalBribe); } function setHasGauge(bool value) external { require(msg.sender == voter, "Only voter can set has gauge"); hasGauge = value; emit HasGaugeSet(value); } function observationLength() external view returns (uint256) { return observations.length; } function lastObservation() public view returns (Observation memory) { return observations[observations.length - 1]; } function metadata() external view returns (uint256 dec0, uint256 dec1, uint256 r0, uint256 r1, bool st, address t0, address t1) { return (decimals0, decimals1, reserve0, reserve1, stable, token0, token1); } function tokens() external view returns (address, address) { return (token0, token1); } function _sendTokenFees(address token, uint256 amount) internal { if (amount != 0) { if (hasGauge) { IBribe(externalBribe).notifyRewardAmount(token, amount); // transfer fees to exBribes emit GaugeFees(token, amount, externalBribe); } else { address _tank = tank(); _safeTransfer(token, _tank, amount); // transfer the fees to tank MSig for gaugeless LPs emit TankFees(token, amount, _tank); } } } function getReserves() public view returns (uint256 _reserve0, uint256 _reserve1, uint256 _blockTimestampLast) { _reserve0 = reserve0; _reserve1 = reserve1; _blockTimestampLast = blockTimestampLast; } // update reserves and, on the first call per block, price accumulators function _update(uint256 balance0, uint256 balance1, uint256 _reserve0, uint256 _reserve1) internal { uint256 blockTimestamp = block.timestamp; uint256 timeElapsed = blockTimestamp - blockTimestampLast; // overflow is desired if (timeElapsed > 0 && _reserve0 != 0 && _reserve1 != 0) { reserve0CumulativeLast += _reserve0 * timeElapsed; reserve1CumulativeLast += _reserve1 * timeElapsed; } Observation memory _point = lastObservation(); timeElapsed = blockTimestamp - _point.timestamp; // compare the last observation with current timestamp, if greater than 30 minutes, record a new event if (timeElapsed > periodSize) { observations.push(Observation(blockTimestamp, reserve0CumulativeLast, reserve1CumulativeLast)); } reserve0 = balance0; reserve1 = balance1; blockTimestampLast = blockTimestamp; emit Sync(reserve0, reserve1); } // produces the cumulative price using counterfactuals to save gas and avoid a call to sync. function currentCumulativePrices() public view returns (uint256 reserve0Cumulative, uint256 reserve1Cumulative, uint256 blockTimestamp) { blockTimestamp = block.timestamp; reserve0Cumulative = reserve0CumulativeLast; reserve1Cumulative = reserve1CumulativeLast; // if time has elapsed since the last update on the pair, mock the accumulated price values (uint256 _reserve0, uint256 _reserve1, uint256 _blockTimestampLast) = getReserves(); if (_blockTimestampLast != blockTimestamp) { // subtraction overflow is desired uint256 timeElapsed = blockTimestamp - _blockTimestampLast; reserve0Cumulative += _reserve0 * timeElapsed; reserve1Cumulative += _reserve1 * timeElapsed; } } // gives the current twap price measured from amountIn * tokenIn gives amountOut function current(address tokenIn, uint256 amountIn) external view returns (uint256 amountOut) { Observation memory _observation = lastObservation(); (uint256 reserve0Cumulative, uint256 reserve1Cumulative,) = currentCumulativePrices(); if (block.timestamp == _observation.timestamp) { _observation = observations[observations.length - 2]; } uint256 timeElapsed = block.timestamp - _observation.timestamp; uint256 _reserve0 = (reserve0Cumulative - _observation.reserve0Cumulative) / timeElapsed; uint256 _reserve1 = (reserve1Cumulative - _observation.reserve1Cumulative) / timeElapsed; amountOut = _getAmountOut(amountIn, tokenIn, _reserve0, _reserve1); } // as per `current`, however allows user configured granularity, up to the full window size function quote(address tokenIn, uint256 amountIn, uint256 granularity) external view returns (uint256 amountOut) { uint256[] memory _prices = sample(tokenIn, amountIn, granularity, 1); uint256 priceAverageCumulative; for (uint256 i = 0; i < _prices.length; i++) { priceAverageCumulative += _prices[i]; } return priceAverageCumulative / granularity; } // returns a memory set of twap prices function prices(address tokenIn, uint256 amountIn, uint256 points) external view returns (uint256[] memory) { return sample(tokenIn, amountIn, points, 1); } function sample(address tokenIn, uint256 amountIn, uint256 points, uint256 window) public view returns (uint256[] memory) { uint256[] memory _prices = new uint[](points); uint256 length = observations.length - 1; uint256 i = length - (points * window); uint256 nextIndex = 0; uint256 index = 0; for (; i < length; i += window) { nextIndex = i + window; uint256 timeElapsed = observations[nextIndex].timestamp - observations[i].timestamp; uint256 _reserve0 = (observations[nextIndex].reserve0Cumulative - observations[i].reserve0Cumulative) / timeElapsed; uint256 _reserve1 = (observations[nextIndex].reserve1Cumulative - observations[i].reserve1Cumulative) / timeElapsed; _prices[index] = _getAmountOut(amountIn, tokenIn, _reserve0, _reserve1); // index < length; length cannot overflow unchecked { index = index + 1; } } return _prices; } // this low-level function should be called by addLiquidity functions in Router.sol, which performs important safety checks // standard uniswap v2 implementation function mint(address to) external lock returns (uint256 liquidity) { (uint256 _reserve0, uint256 _reserve1) = (reserve0, reserve1); uint256 _balance0 = IERC20(token0).balanceOf(address(this)); uint256 _balance1 = IERC20(token1).balanceOf(address(this)); uint256 _amount0 = _balance0 - _reserve0; uint256 _amount1 = _balance1 - _reserve1; uint256 _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee if (_totalSupply == 0) { liquidity = Math.sqrt(_amount0 * _amount1) - MINIMUM_LIQUIDITY; _mint(address(0), MINIMUM_LIQUIDITY); // permanently lock the first MINIMUM_LIQUIDITY tokens } else { liquidity = Math.min((_amount0 * _totalSupply) / _reserve0, (_amount1 * _totalSupply) / _reserve1); } require(liquidity > 0, "ILM"); // Pair: INSUFFICIENT_LIQUIDITY_MINTED _mint(to, liquidity); _update(_balance0, _balance1, _reserve0, _reserve1); emit Mint(msg.sender, _amount0, _amount1); } // this low-level function should be called from a contract which performs important safety checks // standard uniswap v2 implementation function burn(address to) external lock returns (uint256 amount0, uint256 amount1) { (uint256 _reserve0, uint256 _reserve1) = (reserve0, reserve1); (address _token0, address _token1) = (token0, token1); uint256 _balance0 = IERC20(_token0).balanceOf(address(this)); uint256 _balance1 = IERC20(_token1).balanceOf(address(this)); uint256 _liquidity = balanceOf[address(this)]; uint256 _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee amount0 = (_liquidity * _balance0) / _totalSupply; // using balances ensures pro-rata distribution amount1 = (_liquidity * _balance1) / _totalSupply; // using balances ensures pro-rata distribution require(amount0 > 0 && amount1 > 0, "ILB"); // Pair: INSUFFICIENT_LIQUIDITY_BURNED _burn(address(this), _liquidity); _safeTransfer(_token0, to, amount0); _safeTransfer(_token1, to, amount1); _balance0 = IERC20(_token0).balanceOf(address(this)); _balance1 = IERC20(_token1).balanceOf(address(this)); _update(_balance0, _balance1, _reserve0, _reserve1); emit Burn(msg.sender, amount0, amount1, to); } // this low-level function should be called from a contract which performs important safety checks function swap(uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data) external lock { require(!IPairFactory(factory).isPaused()); require(amount0Out > 0 || amount1Out > 0, "IOA"); // Pair: INSUFFICIENT_OUTPUT_AMOUNT (uint256 _reserve0, uint256 _reserve1) = (reserve0, reserve1); require(amount0Out < _reserve0 && amount1Out < _reserve1, "IL"); // Pair: INSUFFICIENT_LIQUIDITY uint256 _balance0; uint256 _balance1; { // scope for _token{0,1}, avoids stack too deep errors (address _token0, address _token1) = (token0, token1); require(to != _token0 && to != _token1, "IT"); // Pair: INVALID_TO if (amount0Out > 0) _safeTransfer(_token0, to, amount0Out); // optimistically transfer tokens if (amount1Out > 0) _safeTransfer(_token1, to, amount1Out); // optimistically transfer tokens if (data.length > 0) { IPairCallee(to).hook(msg.sender, amount0Out, amount1Out, data); } // callback, used for flash loans _balance0 = IERC20(_token0).balanceOf(address(this)); _balance1 = IERC20(_token1).balanceOf(address(this)); } uint256 amount0In = _balance0 > _reserve0 - amount0Out ? _balance0 - (_reserve0 - amount0Out) : 0; uint256 amount1In = _balance1 > _reserve1 - amount1Out ? _balance1 - (_reserve1 - amount1Out) : 0; require(amount0In > 0 || amount1In > 0, "IIA"); // Pair: INSUFFICIENT_INPUT_AMOUNT { // scope for reserve{0,1}Adjusted, avoids stack too deep errors (address _token0, address _token1) = (token0, token1); if (amount0In > 0) { _sendTokenFees(token0, (amount0In * IPairFactory(factory).getFee(stable)) / 10000); } if (amount1In > 0) { _sendTokenFees(token1, (amount1In * IPairFactory(factory).getFee(stable)) / 10000); } _balance0 = IERC20(_token0).balanceOf(address(this)); // since we removed tokens, we need to reconfirm balances, can also simply use previous balance - amountIn/ 10000, but doing balanceOf again as safety check _balance1 = IERC20(_token1).balanceOf(address(this)); // The curve, either x3y+y3x for stable pools, or x*y for volatile pools require(_k(_balance0, _balance1) >= _k(_reserve0, _reserve1), "K"); // Pair: K } _update(_balance0, _balance1, _reserve0, _reserve1); emit Swap(msg.sender, amount0In, amount1In, amount0Out, amount1Out, to); } // force balances to match reserves function skim(address to) external lock { (address _token0, address _token1) = (token0, token1); _safeTransfer(_token0, to, IERC20(_token0).balanceOf(address(this)) - (reserve0)); _safeTransfer(_token1, to, IERC20(_token1).balanceOf(address(this)) - (reserve1)); } // force reserves to match balances function sync() external lock { _update(IERC20(token0).balanceOf(address(this)), IERC20(token1).balanceOf(address(this)), reserve0, reserve1); } function _f(uint256 x0, uint256 y) internal pure returns (uint256) { return (x0 * ((((y * y) / 1e18) * y) / 1e18)) / 1e18 + (((((x0 * x0) / 1e18) * x0) / 1e18) * y) / 1e18; } function _d(uint256 x0, uint256 y) internal pure returns (uint256) { return (3 * x0 * ((y * y) / 1e18)) / 1e18 + ((((x0 * x0) / 1e18) * x0) / 1e18); } function _get_y(uint256 x0, uint256 xy, uint256 y) internal pure returns (uint256) { for (uint256 i = 0; i < 255; i++) { uint256 y_prev = y; uint256 k = _f(x0, y); if (k < xy) { uint256 dy = ((xy - k) * 1e18) / _d(x0, y); y = y + dy; } else { uint256 dy = ((k - xy) * 1e18) / _d(x0, y); y = y - dy; } if (y > y_prev) { if (y - y_prev <= 1) { return y; } } else { if (y_prev - y <= 1) { return y; } } } return y; } function getAmountOut(uint256 amountIn, address tokenIn) external view returns (uint256) { (uint256 _reserve0, uint256 _reserve1) = (reserve0, reserve1); amountIn -= (amountIn * IPairFactory(factory).getFee(stable)) / 10000; // remove fee from amount received return _getAmountOut(amountIn, tokenIn, _reserve0, _reserve1); } function _getAmountOut(uint256 amountIn, address tokenIn, uint256 _reserve0, uint256 _reserve1) internal view returns (uint256) { if (stable) { uint256 xy = _k(_reserve0, _reserve1); _reserve0 = (_reserve0 * 1e18) / decimals0; _reserve1 = (_reserve1 * 1e18) / decimals1; (uint256 reserveA, uint256 reserveB) = tokenIn == token0 ? (_reserve0, _reserve1) : (_reserve1, _reserve0); amountIn = tokenIn == token0 ? (amountIn * 1e18) / decimals0 : (amountIn * 1e18) / decimals1; uint256 y = reserveB - _get_y(amountIn + reserveA, xy, reserveB); return (y * (tokenIn == token0 ? decimals1 : decimals0)) / 1e18; } else { (uint256 reserveA, uint256 reserveB) = tokenIn == token0 ? (_reserve0, _reserve1) : (_reserve1, _reserve0); return (amountIn * reserveB) / (reserveA + amountIn); } } function _k(uint256 x, uint256 y) internal view returns (uint256) { if (stable) { uint256 _x = (x * 1e18) / decimals0; uint256 _y = (y * 1e18) / decimals1; uint256 _a = (_x * _y) / 1e18; uint256 _b = ((_x * _x) / 1e18 + (_y * _y) / 1e18); return (_a * _b) / 1e18; // x3y+y3x >= k } else { return x * y; // xy >= k } } function _mint(address dst, uint256 amount) internal { totalSupply += amount; balanceOf[dst] += amount; emit Transfer(address(0), dst, amount); } function _burn(address dst, uint256 amount) internal { totalSupply -= amount; balanceOf[dst] -= amount; emit Transfer(dst, address(0), amount); } function approve(address spender, uint256 amount) external returns (bool) { allowance[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external { require(deadline >= block.timestamp, "Pair: EXPIRED"); DOMAIN_SEPARATOR = keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(name)), keccak256(bytes("1")), block.chainid, address(this) ) ); bytes32 digest = keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR, keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline)) ) ); address recoveredAddress = ecrecover(digest, v, r, s); require(recoveredAddress != address(0) && recoveredAddress == owner, "Pair: INVALID_SIGNATURE"); allowance[owner][spender] = value; emit Approval(owner, spender, value); } function transfer(address dst, uint256 amount) external returns (bool) { _transferTokens(msg.sender, dst, amount); return true; } function transferFrom(address src, address dst, uint256 amount) external returns (bool) { address spender = msg.sender; uint256 spenderAllowance = allowance[src][spender]; if (spender != src && spenderAllowance != type(uint256).max) { uint256 newAllowance = spenderAllowance - amount; allowance[src][spender] = newAllowance; emit Approval(src, spender, newAllowance); } _transferTokens(src, dst, amount); return true; } function _transferTokens(address src, address dst, uint256 amount) internal { balanceOf[src] -= amount; balanceOf[dst] += amount; emit Transfer(src, dst, amount); } function _safeTransfer(address token, address to, uint256 value) internal { require(token.code.length > 0); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transfer.selector, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool)))); } } contract WrappedExternalBribe { address public voter; address public _ve; ExternalBribe public underlying_bribe; uint256 internal constant DURATION = VELOCORE_EPOCH_DURATION; //7 days; // rewards are released over the voting period uint256 internal constant MAX_REWARD_TOKENS = 16; uint256 internal constant PRECISION = 10 ** 18; mapping(address => mapping(uint256 => uint256)) public tokenRewardsPerEpoch; mapping(address => uint256) public periodFinish; mapping(address => mapping(uint256 => uint256)) public lastEarn; address[] public rewards; mapping(address => bool) public isReward; /// @notice A checkpoint for marking balance struct RewardCheckpoint { uint256 timestamp; uint256 balance; } event NotifyReward( address indexed from, address indexed reward, uint256 epoch, uint256 amount ); event ClaimRewards( address indexed from, address indexed reward, uint256 amount ); bool initialized; constructor() { initialized = true; } function initialize(address _voter, address _old_bribe) external { require(!initialized, "1022"); initialized = true; _unlocked = 1; voter = _voter; _ve = IVoter(_voter)._ve(); underlying_bribe = ExternalBribe(_old_bribe); for (uint256 i; i < underlying_bribe.rewardsListLength(); i++) { address underlying_reward = underlying_bribe.rewards(i); if (underlying_reward != address(0)) { isReward[underlying_reward] = true; rewards.push(underlying_reward); } } } // simple re-entrancy check uint256 internal _unlocked; modifier lock() { require(_unlocked == 1); _unlocked = 2; _; _unlocked = 1; } function _bribeStart(uint256 timestamp) internal pure returns (uint256) { return timestamp - (timestamp % (7 days)); } function getEpochStart(uint256 timestamp) public pure returns (uint256) { uint256 bribeStart = _bribeStart(timestamp); uint256 bribeEnd = bribeStart + DURATION; return timestamp < bribeEnd ? bribeStart : bribeStart + 7 days; } function rewardsListLength() external view returns (uint256) { return rewards.length; } // returns the last time the reward was modified or periodFinish if the reward has ended function lastTimeRewardApplicable( address token ) public view returns (uint256) { return Math.min(block.timestamp, periodFinish[token]); } // allows a user to claim rewards for a given token function getReward(uint256 tokenId, address[] memory tokens) external lock { require(IVotingEscrow(_ve).isApprovedOrOwner(msg.sender, tokenId)); for (uint256 i = 0; i < tokens.length; i++) { uint256 _reward = earned(tokens[i], tokenId); lastEarn[tokens[i]][tokenId] = block.timestamp; if (_reward > 0) _safeTransfer(tokens[i], msg.sender, _reward); emit ClaimRewards(msg.sender, tokens[i], _reward); } } // used by Voter to allow batched reward claims function getRewardForOwner( uint256 tokenId, address[] memory tokens ) external lock { require(msg.sender == voter); address _owner = IVotingEscrow(_ve).ownerOf(tokenId); for (uint256 i = 0; i < tokens.length; i++) { uint256 _reward = earned(tokens[i], tokenId); lastEarn[tokens[i]][tokenId] = block.timestamp; if (_reward > 0) _safeTransfer(tokens[i], _owner, _reward); emit ClaimRewards(_owner, tokens[i], _reward); } } function earned( address token, uint256 tokenId ) public view returns (uint256) { uint256 _startTimestamp = lastEarn[token][tokenId]; if (underlying_bribe.numCheckpoints(tokenId) == 0) { return 0; } uint256 _startIndex = underlying_bribe.getPriorBalanceIndex( tokenId, _startTimestamp ); uint256 _endIndex = underlying_bribe.numCheckpoints(tokenId) - 1; uint256 reward = 0; // you only earn once per epoch (after it's over) RewardCheckpoint memory prevRewards; prevRewards.timestamp = _bribeStart(_startTimestamp); uint256 _prevTs = 0; uint256 _prevBal = 0; uint256 _prevSupply = 1; if (_endIndex > 0) { for (uint256 i = _startIndex; i <= _endIndex - 1; i++) { (_prevTs, _prevBal) = underlying_bribe.checkpoints(tokenId, i); uint256 _nextEpochStart = _bribeStart(_prevTs); // check that you've earned it // this won't happen until a week has passed if (_nextEpochStart > prevRewards.timestamp) { reward += prevRewards.balance; } prevRewards.timestamp = _nextEpochStart; (, _prevSupply) = underlying_bribe.supplyCheckpoints( underlying_bribe.getPriorSupplyIndex( _nextEpochStart + DURATION ) ); prevRewards.balance = (_prevBal * tokenRewardsPerEpoch[token][_nextEpochStart]) / _prevSupply; } } (_prevTs, _prevBal) = underlying_bribe.checkpoints(tokenId, _endIndex); uint256 _lastEpochStart = _bribeStart(_prevTs); uint256 _lastEpochEnd = _lastEpochStart + DURATION; if ( block.timestamp > _lastEpochEnd && _startTimestamp < _lastEpochEnd ) { (, _prevSupply) = underlying_bribe.supplyCheckpoints( underlying_bribe.getPriorSupplyIndex(_lastEpochEnd) ); reward += (_prevBal * tokenRewardsPerEpoch[token][_lastEpochStart]) / _prevSupply; } return reward; } function left(address token) external view returns (uint256) { uint256 adjustedTstamp = getEpochStart(block.timestamp); return tokenRewardsPerEpoch[token][adjustedTstamp]; } function notifyRewardAmount(address token, uint256 amount) external lock { require(amount > 0); if (!isReward[token]) { require( IVoter(voter).isWhitelisted(token), "bribe tokens must be whitelisted" ); require( rewards.length < MAX_REWARD_TOKENS, "too many rewards tokens" ); } // bribes kick in at the start of next bribe period uint256 adjustedTstamp = getEpochStart(block.timestamp); uint256 epochRewards = tokenRewardsPerEpoch[token][adjustedTstamp]; uint256 balanceBefore = IERC20(token).balanceOf(address(this)); _safeTransferFrom(token, msg.sender, address(this), amount); uint256 balanceAfter = IERC20(token).balanceOf(address(this)); amount = balanceAfter - balanceBefore; tokenRewardsPerEpoch[token][adjustedTstamp] = epochRewards + amount; periodFinish[token] = adjustedTstamp + DURATION; if (!isReward[token]) { isReward[token] = true; rewards.push(token); } emit NotifyReward(msg.sender, token, adjustedTstamp, amount); } function swapOutRewardToken( uint256 i, address oldToken, address newToken ) external { require(msg.sender == IVotingEscrow(_ve).team(), "only team"); require(rewards[i] == oldToken); isReward[oldToken] = false; isReward[newToken] = true; rewards[i] = newToken; } function _safeTransfer(address token, address to, uint256 value) internal { require(token.code.length > 0); (bool success, bytes memory data) = token.call( abi.encodeWithSelector(IERC20.transfer.selector, to, value) ); require(success && (data.length == 0 || abi.decode(data, (bool)))); } function _safeTransferFrom( address token, address from, address to, uint256 value ) internal { require(token.code.length > 0); (bool success, bytes memory data) = token.call( abi.encodeWithSelector( IERC20.transferFrom.selector, from, to, value ) ); require(success && (data.length == 0 || abi.decode(data, (bool)))); } } // : MIT contract Router is IRouter, ReentrancyGuard { struct route { address from; address to; bool stable; } address public immutable factory; IWETH public immutable weth; uint256 internal constant MINIMUM_LIQUIDITY = 10 ** 3; modifier ensure(uint256 deadline) { require(deadline >= block.timestamp, "Router: EXPIRED"); _; } constructor(address _factory, address _weth) { factory = _factory; weth = IWETH(_weth); } receive() external payable { assert(msg.sender == address(weth)); // only accept ETH via fallback from the WETH contract } function sortTokens(address tokenA, address tokenB) public pure returns (address token0, address token1) { require(tokenA != tokenB, "Router: IDENTICAL_ADDRESSES"); (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); require(token0 != address(0), "Router: ZERO_ADDRESS"); } // calculates the CREATE2 address for a pair without making any external nonReentrant calls function pairFor(address tokenA, address tokenB, bool stable) public view returns (address pair) { (address token0, address token1) = sortTokens(tokenA, tokenB); pair = IPairFactory(factory).getPair(tokenA, tokenB, stable); require(pair != address(0), "pair na"); return pair; } function unsafePairFor(address tokenA, address tokenB, bool stable) public view returns (address pair) { (address token0, address token1) = sortTokens(tokenA, tokenB); pair = IPairFactory(factory).getPair(tokenA, tokenB, stable); return pair; } // given some amount of an asset and pair reserves, returns an equivalent amount of the other asset function quoteLiquidity(uint256 amountA, uint256 reserveA, uint256 reserveB) internal pure returns (uint256 amountB) { require(amountA > 0, "Router: INSUFFICIENT_AMOUNT"); require(reserveA > 0 && reserveB > 0, "Router: INSUFFICIENT_LIQUIDITY"); amountB = (amountA * reserveB) / reserveA; } // fetches and sorts the reserves for a pair function getReserves(address tokenA, address tokenB, bool stable) public view returns (uint256 reserveA, uint256 reserveB) { (address token0,) = sortTokens(tokenA, tokenB); (uint256 reserve0, uint256 reserve1,) = Pair(unsafePairFor(tokenA, tokenB, stable)).getReserves(); (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0); } // performs chained getAmountOut calculations on any number of pairs function getAmountOut(uint256 amountIn, address tokenIn, address tokenOut) external view returns (uint256 amount, bool stable) { address pair = unsafePairFor(tokenIn, tokenOut, true); uint256 amountStable; uint256 amountVolatile; if (IPairFactory(factory).isPair(pair)) { amountStable = Pair(pair).getAmountOut(amountIn, tokenIn); } pair = unsafePairFor(tokenIn, tokenOut, false); if (IPairFactory(factory).isPair(pair)) { amountVolatile = Pair(pair).getAmountOut(amountIn, tokenIn); } return amountStable > amountVolatile ? (amountStable, true) : (amountVolatile, false); } // performs chained getAmountOut calculations on any number of pairs function getAmountsOut(uint256 amountIn, route[] memory routes) public view returns (uint256[] memory amounts) { require(routes.length >= 1, "Router: INVALID_PATH"); amounts = new uint256[](routes.length + 1); amounts[0] = amountIn; for (uint256 i = 0; i < routes.length; i++) { address pair = unsafePairFor(routes[i].from, routes[i].to, routes[i].stable); if (IPairFactory(factory).isPair(pair)) { amounts[i + 1] = Pair(pair).getAmountOut(amounts[i], routes[i].from); } } } function isPair(address pair) external view returns (bool) { return IPairFactory(factory).isPair(pair); } function quoteAddLiquidity( address tokenA, address tokenB, bool stable, uint256 amountADesired, uint256 amountBDesired ) external view returns (uint256 amountA, uint256 amountB, uint256 liquidity) { // create the pair if it doesn't exist yet address _pair = IPairFactory(factory).getPair(tokenA, tokenB, stable); (uint256 reserveA, uint256 reserveB) = (0, 0); uint256 _totalSupply = 0; if (_pair != address(0)) { _totalSupply = IERC20(_pair).totalSupply(); (reserveA, reserveB) = getReserves(tokenA, tokenB, stable); } if (reserveA == 0 && reserveB == 0) { (amountA, amountB) = (amountADesired, amountBDesired); liquidity = Math.sqrt(amountA * amountB) - MINIMUM_LIQUIDITY; } else { uint256 amountBOptimal = quoteLiquidity(amountADesired, reserveA, reserveB); if (amountBOptimal <= amountBDesired) { (amountA, amountB) = (amountADesired, amountBOptimal); liquidity = Math.min((amountA * _totalSupply) / reserveA, (amountB * _totalSupply) / reserveB); } else { uint256 amountAOptimal = quoteLiquidity(amountBDesired, reserveB, reserveA); (amountA, amountB) = (amountAOptimal, amountBDesired); liquidity = Math.min((amountA * _totalSupply) / reserveA, (amountB * _totalSupply) / reserveB); } } } function quoteRemoveLiquidity(address tokenA, address tokenB, bool stable, uint256 liquidity) external view returns (uint256 amountA, uint256 amountB) { // create the pair if it doesn't exist yet address _pair = IPairFactory(factory).getPair(tokenA, tokenB, stable); if (_pair == address(0)) { return (0, 0); } (uint256 reserveA, uint256 reserveB) = getReserves(tokenA, tokenB, stable); uint256 _totalSupply = IERC20(_pair).totalSupply(); amountA = (liquidity * reserveA) / _totalSupply; // using balances ensures pro-rata distribution amountB = (liquidity * reserveB) / _totalSupply; // using balances ensures pro-rata distribution } function _addLiquidity( address tokenA, address tokenB, bool stable, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin ) internal returns (uint256 amountA, uint256 amountB) { require(amountADesired >= amountAMin); require(amountBDesired >= amountBMin); // create the pair if it doesn't exist yet address _pair = IPairFactory(factory).getPair(tokenA, tokenB, stable); if (_pair == address(0)) { _pair = IPairFactory(factory).createPair(tokenA, tokenB, stable); } (uint256 reserveA, uint256 reserveB) = getReserves(tokenA, tokenB, stable); if (reserveA == 0 && reserveB == 0) { (amountA, amountB) = (amountADesired, amountBDesired); } else { uint256 amountBOptimal = quoteLiquidity(amountADesired, reserveA, reserveB); if (amountBOptimal <= amountBDesired) { require(amountBOptimal >= amountBMin, "Router: INSUFFICIENT_B_AMOUNT"); (amountA, amountB) = (amountADesired, amountBOptimal); } else { uint256 amountAOptimal = quoteLiquidity(amountBDesired, reserveB, reserveA); assert(amountAOptimal <= amountADesired); require(amountAOptimal >= amountAMin, "Router: INSUFFICIENT_A_AMOUNT"); (amountA, amountB) = (amountAOptimal, amountBDesired); } } } function addLiquidity( address tokenA, address tokenB, bool stable, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external nonReentrant ensure(deadline) returns (uint256 amountA, uint256 amountB, uint256 liquidity) { (amountA, amountB) = _addLiquidity(tokenA, tokenB, stable, amountADesired, amountBDesired, amountAMin, amountBMin); address pair = pairFor(tokenA, tokenB, stable); _safeTransferFrom(tokenA, msg.sender, pair, amountA); _safeTransferFrom(tokenB, msg.sender, pair, amountB); liquidity = Pair(pair).mint(to); } function addLiquidityETH( address token, bool stable, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable nonReentrant ensure(deadline) returns (uint256 amountToken, uint256 amountETH, uint256 liquidity) { (amountToken, amountETH) = _addLiquidity(token, address(weth), stable, amountTokenDesired, msg.value, amountTokenMin, amountETHMin); address pair = pairFor(token, address(weth), stable); _safeTransferFrom(token, msg.sender, pair, amountToken); weth.deposit{value: amountETH}(); assert(weth.transfer(pair, amountETH)); liquidity = Pair(pair).mint(to); // refund dust eth, if any if (msg.value > amountETH) { _safeTransferETH(msg.sender, msg.value - amountETH); } } // **** REMOVE LIQUIDITY **** function removeLiquidity( address tokenA, address tokenB, bool stable, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) public nonReentrant ensure(deadline) returns (uint256 amountA, uint256 amountB) { address pair = pairFor(tokenA, tokenB, stable); require(Pair(pair).transferFrom(msg.sender, pair, liquidity)); // send liquidity to pair uint256 balanceBeforeA = IERC20(tokenA).balanceOf(to); uint256 balanceBeforeB = IERC20(tokenB).balanceOf(to); Pair(pair).burn(to); amountA = IERC20(tokenA).balanceOf(to) - balanceBeforeA; amountB = IERC20(tokenB).balanceOf(to) - balanceBeforeB; require(amountA >= amountAMin, "Router: INSUFFICIENT_A_AMOUNT"); require(amountB >= amountBMin, "Router: INSUFFICIENT_B_AMOUNT"); } function removeLiquidityETH( address token, bool stable, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) public ensure(deadline) returns (uint256 amountToken, uint256 amountETH) { (amountToken, amountETH) = removeLiquidity( token, address(weth), stable, liquidity, amountTokenMin, amountETHMin, address(this), deadline ); _safeTransfer(token, to, amountToken); weth.withdraw(amountETH); _safeTransferETH(to, amountETH); } function removeLiquidityWithPermit( address tokenA, address tokenB, bool stable, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external nonReentrant returns (uint256 amountA, uint256 amountB) { address pair = pairFor(tokenA, tokenB, stable); { uint256 value = approveMax ? type(uint256).max : liquidity; Pair(pair).permit(msg.sender, address(this), value, deadline, v, r, s); } (amountA, amountB) = removeLiquidity(tokenA, tokenB, stable, liquidity, amountAMin, amountBMin, to, deadline); } function removeLiquidityETHWithPermit( address token, bool stable, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external nonReentrant returns (uint256 amountToken, uint256 amountETH) { address pair = pairFor(token, address(weth), stable); uint256 value = approveMax ? type(uint256).max : liquidity; Pair(pair).permit(msg.sender, address(this), value, deadline, v, r, s); (amountToken, amountETH) = removeLiquidityETH(token, stable, liquidity, amountTokenMin, amountETHMin, to, deadline); } // **** SWAP **** // requires the initial amount to have already been sent to the first pair function _swap(route[] memory routes, address _to) internal virtual { for (uint256 i = 0; i < routes.length; i++) { (address token0,) = sortTokens(routes[i].from, routes[i].to); Pair pair = Pair(pairFor(routes[i].from, routes[i].to, routes[i].stable)); (uint256 reserve0, uint256 reserve1,) = pair.getReserves(); (uint256 reserveInput,) = routes[i].from == token0 ? (reserve0, reserve1) : (reserve1, reserve0); uint256 amountIn = IERC20(routes[i].from).balanceOf(address(pair)) - reserveInput; uint256 amountOut = pair.getAmountOut(amountIn, routes[i].from); (uint256 amount0Out, uint256 amount1Out) = routes[i].from == token0 ? (uint256(0), amountOut) : (amountOut, uint256(0)); address to = i < routes.length - 1 ? pairFor(routes[i + 1].from, routes[i + 1].to, routes[i + 1].stable) : _to; Pair(pairFor(routes[i].from, routes[i].to, routes[i].stable)).swap(amount0Out, amount1Out, to, new bytes(0)); } } function swapExactTokensForTokensSimple( uint256 amountIn, uint256 amountOutMin, address tokenFrom, address tokenTo, bool stable, address to, uint256 deadline ) external nonReentrant ensure(deadline) returns (uint256) { route[] memory routes = new route[](1); routes[0].from = tokenFrom; routes[0].to = tokenTo; routes[0].stable = stable; uint256 balanceBefore = IERC20(tokenTo).balanceOf(to); address pair = pairFor(routes[0].from, routes[0].to, routes[0].stable); WrappedExternalBribe weBribe = WrappedExternalBribe(Pair(pair).externalBribe()); if (address(weBribe) != address(0) && Pair(pair).hasGauge()) { uint256 fee = (routes[0].stable ? 2 : 25) * amountIn / 10000; amountIn -= fee; _safeTransferFrom(routes[0].from, msg.sender, address(this), fee); uint256 bribeAmount = IERC20(routes[0].from).balanceOf(address(this)); WrappedBribe bribe = WrappedBribe( WrappedBribeFactory(0xe490695Fafe699E85ff4b23bC9986cFE454B65F4).oldBribeToNew( address(weBribe.underlying_bribe()) ) ); if (address(bribe) == address(0)) { bribe = WrappedBribe( WrappedBribeFactory(0xe490695Fafe699E85ff4b23bC9986cFE454B65F4).createBribe( address(weBribe.underlying_bribe()) ) ); } IERC20(routes[0].from).approve(address(bribe), bribeAmount); bribe.notifyRewardAmount(routes[0].from, bribeAmount); } _safeTransferFrom(routes[0].from, msg.sender, pair, amountIn); _swap(routes, to); uint256 amountOut = IERC20(tokenTo).balanceOf(to) - balanceBefore; require(amountOut >= amountOutMin, "Router: INSUFFICIENT_OUTPUT_AMOUNT"); return amountOut; } function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, route[] calldata routes, address to, uint256 deadline ) external nonReentrant ensure(deadline) returns (uint256) { address tokenOut = routes[routes.length - 1].to; uint256 balanceBefore = IERC20(tokenOut).balanceOf(to); address pair = pairFor(routes[0].from, routes[0].to, routes[0].stable); WrappedExternalBribe weBribe = WrappedExternalBribe(Pair(pair).externalBribe()); if (address(weBribe) != address(0) && Pair(pair).hasGauge()) { uint256 fee = (routes[0].stable ? 2 : 25) * amountIn / 10000; amountIn -= fee; _safeTransferFrom(routes[0].from, msg.sender, address(this), fee); uint256 bribeAmount = IERC20(routes[0].from).balanceOf(address(this)); WrappedBribe bribe = WrappedBribe( WrappedBribeFactory(0xe490695Fafe699E85ff4b23bC9986cFE454B65F4).oldBribeToNew( address(weBribe.underlying_bribe()) ) ); if (address(bribe) == address(0)) { bribe = WrappedBribe( WrappedBribeFactory(0xe490695Fafe699E85ff4b23bC9986cFE454B65F4).createBribe( address(weBribe.underlying_bribe()) ) ); } IERC20(routes[0].from).approve(address(bribe), bribeAmount); bribe.notifyRewardAmount(routes[0].from, bribeAmount); } _safeTransferFrom(routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amountIn); _swap(routes, to); uint256 amountOut = IERC20(tokenOut).balanceOf(to) - balanceBefore; require(amountOut >= amountOutMin, "Router: INSUFFICIENT_OUTPUT_AMOUNT"); return amountOut; } function swapExactETHForTokens(uint256 amountOutMin, route[] calldata routes, address to, uint256 deadline) external payable nonReentrant ensure(deadline) returns (uint256) { require(routes[0].from == address(weth), "Router: INVALID_PATH"); address tokenOut = routes[routes.length - 1].to; uint256 balanceBefore = IERC20(tokenOut).balanceOf(to); weth.deposit{value: msg.value}(); address pair = pairFor(routes[0].from, routes[0].to, routes[0].stable); WrappedExternalBribe weBribe = WrappedExternalBribe(Pair(pair).externalBribe()); uint256 amountIn = msg.value; if (address(weBribe) != address(0) && Pair(pair).hasGauge()) { uint256 fee = (routes[0].stable ? 2 : 25) * amountIn / 10000; amountIn -= fee; uint256 bribeAmount = fee; WrappedBribe bribe = WrappedBribe( WrappedBribeFactory(0xe490695Fafe699E85ff4b23bC9986cFE454B65F4).oldBribeToNew( address(weBribe.underlying_bribe()) ) ); if (address(bribe) == address(0)) { bribe = WrappedBribe( WrappedBribeFactory(0xe490695Fafe699E85ff4b23bC9986cFE454B65F4).createBribe( address(weBribe.underlying_bribe()) ) ); } IERC20(routes[0].from).approve(address(bribe), bribeAmount); bribe.notifyRewardAmount(routes[0].from, bribeAmount); } assert(weth.transfer(pairFor(routes[0].from, routes[0].to, routes[0].stable), amountIn)); _swap(routes, to); uint256 amountOut = IERC20(tokenOut).balanceOf(to) - balanceBefore; require(amountOut >= amountOutMin, "Router: INSUFFICIENT_OUTPUT_AMOUNT"); return amountOut; } function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, route[] calldata routes, address to, uint256 deadline ) external nonReentrant ensure(deadline) returns (uint256) { require(routes[routes.length - 1].to == address(weth), "Router: INVALID_PATH"); uint256 balanceBefore = IERC20(address(weth)).balanceOf(address(this)); address pair = pairFor(routes[0].from, routes[0].to, routes[0].stable); WrappedExternalBribe weBribe = WrappedExternalBribe(Pair(pair).externalBribe()); if (address(weBribe) != address(0) && Pair(pair).hasGauge()) { uint256 fee = (routes[0].stable ? 2 : 25) * amountIn / 10000; amountIn -= fee; _safeTransferFrom(routes[0].from, msg.sender, address(this), fee); uint256 bribeAmount = IERC20(routes[0].from).balanceOf(address(this)); WrappedBribe bribe = WrappedBribe( WrappedBribeFactory(0xe490695Fafe699E85ff4b23bC9986cFE454B65F4).oldBribeToNew( address(weBribe.underlying_bribe()) ) ); if (address(bribe) == address(0)) { bribe = WrappedBribe( WrappedBribeFactory(0xe490695Fafe699E85ff4b23bC9986cFE454B65F4).createBribe( address(weBribe.underlying_bribe()) ) ); } IERC20(routes[0].from).approve(address(bribe), bribeAmount); bribe.notifyRewardAmount(routes[0].from, bribeAmount); } _safeTransferFrom(routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amountIn); _swap(routes, address(this)); uint256 amountOut = IERC20(address(weth)).balanceOf(address(this)) - balanceBefore; weth.withdraw(amountOut); _safeTransferETH(to, amountOut); require(amountOut >= amountOutMin, "Router: INSUFFICIENT_OUTPUT_AMOUNT"); return amountOut; } function UNSAFE_swapExactTokensForTokens( uint256[] memory amounts, route[] calldata routes, address to, uint256 deadline ) external nonReentrant ensure(deadline) returns (uint256[] memory) { _safeTransferFrom( routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0] ); _swap(routes, to); return amounts; } function _safeTransferETH(address to, uint256 value) internal { (bool success,) = to.call{value: value}(new bytes(0)); require(success, "TransferHelper: ETH_TRANSFER_FAILED"); } function _safeTransfer(address token, address to, uint256 value) internal { require(token.code.length > 0); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transfer.selector, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool)))); } function _safeTransferFrom(address token, address from, address to, uint256 value) internal { require(token.code.length > 0); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool)))); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_weth","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct Router.route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"UNSAFE_swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"stable","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct Router.route[]","name":"routes","type":"tuple[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"getReserves","outputs":[{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"isPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"pairFor","outputs":[{"internalType":"address","name":"pair","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"}],"name":"quoteAddLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"name":"quoteRemoveLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"sortTokens","outputs":[{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct Router.route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct Router.route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct Router.route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address","name":"tokenFrom","type":"address"},{"internalType":"address","name":"tokenTo","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSimple","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"unsafePairFor","outputs":[{"internalType":"address","name":"pair","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"contract IWETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
9c4d535b000000000000000000000000000000000000000000000000000000000000000001000da5f12396586848d3280dd2d1ff5d739312f1f1f2fed2b3c3baca249a3b00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000040000000000000000000000000e140eac2bb748c8f456719a457f26636617bb0e90000000000000000000000005aea5775959fbc2557cc8789bc1bf90a239d9a91
Deployed Bytecode
0x000400000000000200020000000000020000000003010019000000600330027000000d4e043001970003000000410355000200000001035500000d4e0030019d000100000000001f00000001012001900000000c0000c13d353400f50000040f0000000001000416000000000110004c000000450000c13d0000000001000031000000df02100039000000200300008a000000000232016f000000bf0320008c0000001c0000213d00000d520100004100000000001004350000004101000039000000040010043f00000024020000390000000001000019353400ec0000040f000000400020043f0000001f0210018f000000020300036700000005041002720000002a0000613d00000000050000190000000506500210000000000763034f000000000707043b000000c00660003900000000007604350000000105500039000000000645004b000000220000413d000000000520004c000000390000613d0000000504400210000000000343034f0000000302200210000000c004400039000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f000000000024043500000d4f02000041000000400310008c0000000003000019000000000302401900000d4f01100197000000000410004c000000000200a01900000d4f0110009c00000000010300190000000001026019000000000110004c000000480000613d00000000010000190000000002000019353400ec0000040f000000c001000039000200000001001d35342e0f0000040f000100000001001d000000e00100003935342e0f0000040f0000000102000039000000000020041b0000000102000029000000800020043f00000d5001100197000000a00010043f000000800100043d000001400000044300000160001004430000002001000039000000a00200043d0000018000100443000001a000200443000001000010044300000002010000390000012000100443000001000100003900000d51030000410000000202000029353400e20000040f0002000000000002000200000006001d000100000005001d00000d4e0500004100000d4e0630009c0000000003058019000000400330021000000d4e0640009c00000000040580190000006004400210000000000334019f00000d4e0410009c0000000001058019000000c001100210000000000113019f3534352a0000040f00000001090000290000000003010019000000600330027000000d4e033001970000000205000029000000000453004b00000000050340190000001f0450018f0000000505500272000000850000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b0000007d0000413d000000010220018f000000000640004c000000950000613d0000000505500210000000000651034f00000000055900190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000100000003001f00030000000103550000000001020019000000000001042d0002000000000002000200000006001d000100000005001d00000d4e0500004100000d4e0630009c0000000003058019000000400330021000000d4e0640009c00000000040580190000006004400210000000000334019f00000d4e0410009c0000000001058019000000c001100210000000000113019f3534352f0000040f00000001090000290000000003010019000000600330027000000d4e033001970000000205000029000000000453004b00000000050340190000001f0450018f0000000505500272000000bc0000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000000b40000413d000000010220018f000000000640004c000000cc0000613d0000000505500210000000000651034f00000000055900190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000100000003001f00030000000103550000000001020019000000000001042d000000000301001900000d4e01000041000000000400041400000d4e0540009c0000000001044019000000c0011002100000006002200210000000000112001900000d530110004100000000020300193534352f0000040f0000000102200190000000df0000613d000000000101043b000000000001042d00000000010000190000000002000019353400ec0000040f00000d4e0400004100000d4e0510009c00000000010480190000004001100210000000000131001900000d4e0320009c000000000204801900000060022002100000000001210019000035350001042e00000d4e0300004100000d4e0420009c000000000203801900000d4e0410009c000000000103801900000040011002100000006002200210000000000112019f000035360001043000120000000000020000008001000039000000400010043f0000000002000031000000040120008c000000000900041200000000060004110000018b0000413d001200000000001d0000000203000367000000000103043b000000e00110027000000d550410009c000007af0000613d00000d560410009c0000000005000410000005bc0000613d00000d570410009c000005790000613d00000d580410009c000008110000613d00000d590410009c000006d00000613d00000d5a0410009c000004f10000613d00000d5b0410009c000001a00000613d00000d5c0410009c000004060000613d00000d5d0410009c000001c00000613d00000d5e0410009c0000061c0000613d00000d5f0410009c0000028b0000613d00000d600410009c000002340000613d00000d610310009c000006f50000613d00000d620310009c000002ad0000613d00000d630310009c0000073e0000613d00000d640310009c000004700000613d000e00000009001d00000d650310009c0000067e0000613d00000d660210009c0000059b0000613d00000d670210009c0000026b0000613d001000000005001d00000d680210009c000004270000613d00000d690210009c0000000e05000029000003b20000613d00000d6a0110009c000029400000c13d0000000001000416000000000110004c000029400000c13d000000000100003135342e510000040f000c00000001001d000b00000002001d000e00000003001d001100000004001d000d00000005001d000f00000006001d353431ba0000040f00000d6b0100004100000000001004390000800b010000390000000402000039353400d00000040f0000000f02000029000000000112004b00000000010000190000000101008039353431a90000040f0000001102000029000000000120004c000005940000613d00000060212000c90000000e020000290000000001210019000000400110008a0000000201100367000000000101043b000f00000001001d00000d500110009c000029400000213d000000400300043d00000d6c0100004100000000001304350000000d0100002900000d50021001970000000401300039000900000002001d000000000021043500000000010004140000000f02000029000000040420008c000009db0000613d00000024040000390000002006000039000a00000003001d0000000a05000029353400990000040f0000000a03000029000000000110004c000009db0000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f000000030330036700000005044002720000017a0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000001720000413d000000000520004c000001890000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f000000000120004c000029400000c13d00000d5401000041000000000010043900000004009004430000002001000039000000240010044300008005010000390000004402000039001100000006001d353400d00000040f00000d50011001970000001102000029000000000112004b0000000001000019000000010100603935342f050000040f000000000100001900000000020000190000000003000019353400e20000040f0000000001000416000000000110004c000029400000c13d000000040100008a000000000110003100000d4f02000041000000600310008c0000000003000019000000000302401900000d4f01100197000000000410004c000000000200a01900000d4f0110009c00000000010300190000000001026019000000000110004c000029400000c13d35342e160000040f001100000001001d35342e1f0000040f001000000001001d35342e280000040f00000000030100190000001101000029000000100200002935342f380000040f00000d5002100197000000400100043d000000000021043500000020020000390000000003000019353400e20000040f0000000001000416000000000110004c000029400000c13d000000040100008a000000000110003100000d4f02000041000001200310008c0000000003000019000000000302401900000d4f01100197000000000410004c000000000200a01900000d4f0110009c00000000010300190000000001026019000000000110004c000029400000c13d000000020100036700110000000103530000000401100370000000000101043b001000000001001d00000d500110009c000029400000213d000000110100035f0000002401100370000000000101043b000f00000001001d00000d500110009c000029400000213d000000110100035f0000004401100370000000000201043b000000000120004c0000000001000019000000010100c039000e00000002001d000000000112004b000029400000c13d000000110100035f000000e401100370000000000101043b000d00000001001d00000d500110009c000029400000213d353431ba0000040f000000110100035f0000010401100370000000000101043b001100000001001d00000d6b0100004100000000001004390000800b010000390000000402000039353400d00000040f0000001102000029000000000112004b00000000010000190000000101008039353431a90000040f0000000201000367000000c402100370000000000702043b000000a402100370000000000602043b0000008402100370000000000502043b0000006401100370000000000401043b00000010010000290000000f020000290000000e03000029353431f00000040f000c00000001001d000b00000002001d00000010010000290000000f020000290000000e0300002935342f380000040f0000000003010019001100000003001d0000000002000411000e00000002001d00000010010000290000000c04000029353434d40000040f0000000f010000290000000e0200002900000011030000290000000b04000029353434d40000040f00000d8301000041000000400300043d000000000013043500000004013000390000000d02000029000000000021043500000000010004140000001202000029001000000002001d000000110200002900000d5005200197000000040250008c001100000003001d00000dfa0000613d0000001002000029000000000220004c00000da00000c13d0000002404000039000000200600003900000000020500190000000005030019353400620000040f0000001103000029000000000201001900000dd30000013d000000040120008a00000d4f04000041000000800510008c0000000005000019000000000504401900000d4f01100197000000000610004c000000000400a01900000d4f0110009c00000000010500190000000001046019000000000110004c000029400000c13d0000002401300370000000000101043b00000d6d0310009c000029400000213d0000000401100039000e00000009001d35342e340000040f000f00000001001d001100000002001d000000020100036700100000000103530000004401100370000000000101043b000d00000001001d00000d500110009c000029400000213d353431ba0000040f000000100100035f0000006401100370000000000101043b001000000001001d00000d6b0100004100000000001004390000800b010000390000000402000039000c00000002001d353400d00000040f0000001002000029000000000112004b00000000010000190000000101008039353431a90000040f0000001101000029000000000110004c00000aa20000c13d00000d520100004100000000001004350000003201000039000000040010043f00000024020000390000000001000019353400ec0000040f0000000001000416000000000110004c000029400000c13d000000040100008a000000000110003100000d4f02000041000000600310008c0000000003000019000000000302401900000d4f01100197000000000410004c000000000200a01900000d4f0110009c00000000010300190000000001026019000000000110004c000029400000c13d35342e160000040f001100000001001d35342e1f0000040f001000000001001d35342e280000040f00000000030100190000001101000029000000100200002935342fb40000040f00000d5002100197000000400100043d000000000021043500000020020000390000000003000019353400e20000040f0000000001000416000000000110004c000029400000c13d000000040100008a000000000110003100000d4f02000041000000600310008c0000000003000019000000000302401900000d4f01100197000000000410004c000000000200a01900000d4f0110009c00000000010300190000000001026019000000000110004c000029400000c13d35342e160000040f001100000001001d35342e1f0000040f001000000001001d35342e280000040f000000000301001900000011010000290000001002000029353430370000040f000000400300043d000000200430003900000000002404350000000000130435000000400200003900000000010300190000000003000019353400e20000040f0000000001000416000000000110004c000029400000c13d0000000003000031000000040130008a00000d4f02000041000000400410008c0000000004000019000000000402401900000d4f01100197000000000510004c000000000200a01900000d4f0110009c00000000010400190000000001026019000000000110004c000029400000c13d00000002020003670000002401200370000000000101043b00000d6d0410009c000029400000213d000000230410003900000d4f05000041000000000634004b0000000006000019000000000605801900000d4f0730019700000d4f04400197000000000874004b0000000005008019000000000474013f00000d4f0440009c00000000040600190000000004056019000000000440004c000029400000c13d000e00000009001d0000000404100039000000000242034f000000000202043b000000240110003935342e8c0000040f000f00000001001d0000000002010433000000000120004c0000000001000019000000010100c039353430930000040f0000000f010000290000000001010433000000010110003a000000000200001900000001020060390000000102200190000005940000c13d00000d6d0210009c000009980000213d00000005031002100000003f02300039000000200400008a000000000242016f000000400400043d0000000002240019001000000004001d000000000442004b0000000004000019000000010400403900000d6d0520009c000009980000213d0000000104400190000009980000c13d000000400020043f000000100200002900000000001204350000001f0130018f0000002007200039000000000200003100000002022003670000000503300272000003070000613d000000000400001900000005054002100000000006570019000000000552034f000000000505043b00000000005604350000000104400039000000000534004b000002ff0000413d000000000410004c000003160000613d0000000503300210000000000232034f00000000033700190000000301100210000000000403043300000000041401cf000000000414022f000000000202043b0000010001100089000000000212022f00000000011201cf000000000141019f000000000013043500000010010000290000000001010433000000000110004c000002640000613d00000004010000390000000201100367000000000101043b00000000001704350000001201000029001100000001001d00000d540100004100000000001004390000000e010000290000000400100443000000240000044300008005010000390000004402000039000900000007001d353400d00000040f0000000f020000290000002002200039000a00000002001d000000110200002900000d5001100197000c00000001001d0000000f010000290000000001010433000000000112004b000010d30000813d001100000002001d00000005022002100000000a01000029000d00000002001d0000000001210019000e00000001001d0000000003010433000000000103043300000d50011001970000002002300039000000000202043300000d500220019700000040033000390000000003030433000000000330004c0000000003000019000000010300c03935342fb40000040f00000d7902000041000000400500043d000000000025043500000d50071001970000000401500039000000000071043500000000010004140000000c02000029000000040220008c0000035b0000613d000000240400003900000020060000390000000c020000290000000003050019000b00000005001d0000000b05000029000800000007001d353400990000040f0000000b050000290000000807000029000000000110004c000011e60000613d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000000003520019000000000223004b0000000002000019000000010200403900000d6d0430009c0000000904000029000009980000213d0000000102200190000009980000c13d000000400030043f000000200110008c000029400000413d0000000001050433000000000210004c0000000002000019000000010200c039000000000221004b000029400000c13d000000000110004c00000011020000290000000106200039000003b00000613d00000010010000290000000001010433000000000121004b000002640000a13d0000000f010000290000000001010433000000000121004b000002640000a13d0000000d01000029000000000114001900000000020104330000000e010000290000000001010433000000000101043300000d8904000041000000000043043500000d500510019700000024043000390000000001000414000000000054043500000004043000390000000000240435000000040270008c0000039a0000613d0000004404000039000e00000006001d00000020060000390000000002070019001100000003001d0000001105000029353400990000040f0000000e060000290000001103000029000000000110004c000013e20000613d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f000000000232001900000d6d0420009c000009980000213d000000400020043f000000200110008c000029400000413d00000010010000290000000001010433000000000161004b000002640000a13d00000005016002100000001002000029000000000121001900000020011000390000000002030433000000000021043500000000020600190000032f0000013d0000000001000416000000000110004c000029400000c13d000000040100008a000000000110003100000d4f02000041000000200310008c0000000003000019000000000302401900000d4f01100197000000000410004c000000000200a01900000d4f0110009c00000000010300190000000001026019000000000110004c000029400000c13d00000004010000390000000201100367000000000101043b00000d500210009c000029400000213d000000400300043d00000d79020000410000000000230435001100000003001d000000040230003900000000001204350000000001000414001000000001001d00000d540100004100000000001004390000000400500443000000240000044300008005010000390000004402000039353400d00000040f00000d5002100197000000040120008c000009be0000613d00000024040000390000002006000039000000100100002900000011030000290000000005030019353400990000040f000000000110004c000009be0000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f00000003033003670000000504400272000003f50000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000003ed0000413d000000000520004c000004040000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f0000000001000416000000000110004c000029400000c13d000000040100008a000000000110003100000d4f02000041000000400310008c0000000003000019000000000302401900000d4f01100197000000000410004c000000000200a01900000d4f0110009c00000000010300190000000001026019000000000110004c000029400000c13d35342e160000040f001100000001001d35342e1f0000040f0000000002010019000000110100002935342f0f0000040f00000d5002200197000000400300043d0000002004300039000000000024043500000d50011001970000000000130435000000400200003900000000010300190000000003000019353400e20000040f0000000001000416000000000110004c0000000e02000029000029400000c13d0000000001000031001100000006001d35342edc0000040f00000d6b080000410000000000800439000f00000001001d000c00000002001d000d00000003001d000900000004001d000a00000005001d000800000006001d000b00000007001d0000800b010000390000000402000039353400d00000040f0000000b02000029000000000112004b00000000010000190000000101008039000b00000001001d353431a90000040f353431ba0000040f0000000b01000029353431a90000040f00000d540100004100000000001004390000000e0100002900000004001004430000002001000039000b00000001001d000000240010044300008005010000390000004402000039353400d00000040f00000d50021001970000000f010000290000000c0300002935342f380000040f00000d7a02000041000000400900043d0000000000290435000000110200002900000d50042001970000000002010019000000040590003900000000010004140000001203000029000000000045043500000044049000390000000d05000029000000000054043500000d500420019700000024029000390000000000420435001100000004001d000000040240008c000008e90000613d000000000230004c000c00000009001d000008900000c13d00000064040000390000002006000039000000110200002900000000030900190000000005090019353400620000040f0000000c090000290000000002010019000008c30000013d001000000005001d0000000001000416000000000110004c000029400000c13d000000040100008a000000000110003100000d4f02000041000001800310008c0000000003000019000000000302401900000d4f01100197000000000410004c000000000200a01900000d4f0110009c00000000010300190000000001026019000000000110004c000029400000c13d00000002010003670000000402100370000000000202043b000f00000002001d00000d500220009c000029400000213d0000002402100370000000000202043b000e00000002001d00000d500220009c000029400000213d0000004402100370000000000302043b000000000230004c0000000002000019000000010200c039000d00000003001d000000000223004b000029400000c13d0000006402100370000000000202043b000c00000002001d000000c402100370000000000202043b000b00000002001d00000d500220009c000029400000213d000000e402100370000000000202043b000a00000002001d0000010402100370000000000302043b000000000230004c0000000002000019000000010200c039000900000003001d000000000223004b000029400000c13d0000012401100370000000000101043b000800000001001d000000ff0110008c000029400000213d001100000006001d353431ba0000040f0000000f010000290000000e020000290000000d0300002935342f380000040f00000d7702000041000000000020043900000d5001100197000700000001001d000000040010044300008002010000390000002402000039353400d00000040f0000001107000029000000000110004c000029400000613d000000010100008a0000000902000029000000000220004c0000000c02000029000000000201c019000000400800043d00000d84010000410000000000180435000000000100041400000002030003670000014404300370000000000404043b0000016403300370000000000503043b000000c40680003900000012030000290000000000560435000000a405800039000000000045043500000084048000390000000805000029000000000054043500000064048000390000000a05000029000000000054043500000044048000390000000000240435000000100200002900000d50022001970000002404800039000000000024043500000d5004700197000900000008001d0000000402800039001000000004001d00000000004204350000001202000029001100000002001d0000000702000029000000040220008c000012660000613d000000000230004c0000120a0000c13d000000e4040000390000000702000029000000090300002900000000050300190000001106000029353400620000040f00000000020100190000123f0000013d001000000005001d0000000001000416000000000110004c000029400000c13d000000040100008a000000000110003100000d4f02000041000001600310008c0000000003000019000000000302401900000d4f01100197000000000410004c000000000200a01900000d4f0110009c00000000010300190000000001026019000000000110004c000029400000c13d00000002010003670000000402100370000000000202043b000f00000002001d00000d500220009c000029400000213d0000002402100370000000000302043b000000000230004c0000000002000019000000010200c039000d00000003001d000000000223004b000029400000c13d0000004402100370000000000202043b000c00000002001d000000a402100370000000000202043b000b00000002001d00000d500220009c000029400000213d000000c402100370000000000202043b000a00000002001d000000e402100370000000000302043b000000000230004c0000000002000019000000010200c039000900000003001d000000000223004b000029400000c13d0000010401100370000000000101043b000800000001001d000000ff0110008c000029400000213d000e00000009001d001100000006001d353431ba0000040f00000d540100004100000000001004390000000e0100002900000004001004430000002001000039000000240010044300008005010000390000004402000039000600000002001d353400d00000040f00000d50021001970000000f01000029000700000002001d0000000d0300002935342f380000040f00000d7702000041000000000020043900000d5001100197000e00000001001d000000040010044300008002010000390000002402000039353400d00000040f0000001107000029000000000110004c000029400000613d000000010100008a0000000902000029000000000220004c0000000c02000029000000000201c019000000400800043d00000d84010000410000000000180435000000000100041400000002030003670000012404300370000000000404043b0000014403300370000000000503043b000000c40680003900000012030000290000000000560435000000a405800039000000000045043500000084048000390000000805000029000000000054043500000064048000390000000a05000029000000000054043500000044048000390000000000240435000000100200002900000d50022001970000002404800039000000000024043500000d50047001970000000402800039000800000004001d00000000004204350000001202000029001100000002001d0000000e02000029000000040220008c000900000008001d000011390000613d000000000230004c000010dc0000c13d000000e4040000390000000e02000029000000090300002900000000050300190000001106000029353400620000040f0000000002010019000011110000013d001000000005001d0000000001000416000000000110004c000029400000c13d000e00000009001d000000000100003135342e510000040f000c00000001001d000b00000002001d000d00000003001d001100000004001d000a00000005001d000f00000006001d353431ba0000040f00000d6b0100004100000000001004390000800b010000390000000402000039353400d00000040f0000000f02000029000000000112004b00000000010000190000000101008039353431a90000040f0000001102000029000000000120004c000008330000c13d00000d520100004100000000001004350000001101000039000000040010043f00000024020000390000000001000019353400ec0000040f0000000001000416000000000110004c0000000e05000029000029400000c13d000000040100008a000000000110003100000d4f02000041000000000310004c0000000003000019000000000302401900000d4f01100197000000000410004c000000000200a01900000d4f0110009c00000000010300190000000001026019000000000110004c000029400000c13d000000400100043d001100000001001d00000d540100004100000000001004390000000400500443000000240000044300008005010000390000004402000039353400d00000040f00000d50021001970000001101000029000000000021043500000020020000390000000003000019353400e20000040f001000000005001d0000000001000416000000000110004c000029400000c13d000000040100008a000000000110003100000d4f02000041000000e00310008c0000000003000019000000000302401900000d4f01100197000000000410004c000000000200a01900000d4f0110009c00000000010300190000000001026019000000000110004c000029400000c13d000000020100036700110000000103530000004401100370000000000101043b000f00000001001d00000d500110009c000029400000213d000000110100035f0000006401100370000000000101043b000e00000001001d00000d500110009c000029400000213d000000110100035f0000008401100370000000000201043b000000000120004c0000000001000019000000010100c039000d00000002001d000000000112004b000029400000c13d000000110100035f000000a401100370000000000101043b000c00000001001d00000d500110009c000029400000213d353431ba0000040f000000110100035f000000c401100370000000000101043b000b00000001001d00000d6b0100004100000000001004390000800b010000390000000402000039001100000002001d353400d00000040f0000000b02000029000000000112004b00000000010000190000000101008039353431a90000040f00000011010000290000000201100367000000000101043b000a00000001001d000000400100043d000b00000001001d00000d8a0110009c000009980000213d0000000b060000290000004001600039000000400010043f0000000105000039000000000056043500000020076000390000001201000029000000200210008c00000d4e0000813d000000400200043d00000d8b0320009c00000e920000813d0000006003200039000000400030043f00000012030000290000000000320435000000200320003900000012040000290000000000430435000000400320003900000012040000290000000000430435000000000317001900000000002304350000002001100039000006090000013d0000000001000416000000000110004c000029400000c13d000000040100008a000000000110003100000d4f02000041000000600310008c0000000003000019000000000302401900000d4f01100197000000000410004c000000000200a01900000d4f0110009c00000000010300190000000001026019000000000110004c000029400000c13d00000002010003670000002402100370000000000202043b001100000002001d00000d500220009c000029400000213d0000004401100370000000000101043b001000000001001d00000d500110009c000029400000213d00000011010000290000001002000029000e00000009001d35342f0f0000040f00000d8601000041000000400200043d0000000000120435000000040120003900000011030000290000000000310435000000240120003900000010030000290000000000310435000f00000002001d0000004401200039000000010200003900000000002104350000000001000414000d00000001001d00000d540100004100000000001004390000000e010000290000000400100443000000240000044300008005010000390000004402000039353400d00000040f00000d5002100197000000040120008c00000af80000613d000000640400003900000020060000390000000d010000290000000f030000290000000005030019353400990000040f000000000110004c00000af80000c13d0000000302000367000000400100043d00000001040000310000001f0340018f00000005044002720000066d0000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b000006650000413d000000000530004c0000067c0000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f00000000002404350000000102000031353400ec0000040f000000000102001935342edc0000040f001100000001001d000f00000002001d000b00000003001d000d00000004001d000c00000005001d000a00000006001d001000000007001d353431ba0000040f00000d6b0100004100000000001004390000800b010000390000000402000039353400d00000040f0000001002000029000000000112004b00000000010000190000000101008039353431a90000040f00000d540100004100000000001004390000000e0100002900000004001004430000002001000039000000240010044300008005010000390000004402000039353400d00000040f000000000500041600000d5002100197001000000002001d00000011010000290000000f030000290000000b040000290000000d060000290000000c07000029353431f00000040f000e00000001001d000d00000002001d000000110100002900000010020000290000000f0300002935342f380000040f000000000301001900000000020004110000001101000029000c00000002001d001100000003001d0000000e04000029353434d40000040f00000d770100004100000000001004390000001001000029000000040010044300008002010000390000002402000039353400d00000040f000000000110004c000029400000613d000000400900043d00000d81010000410000000000190435000000000100041400000012060000290000001002000029000000040220008c000f00000009001d000b00000006001d000009960000613d0000000d03000029000000000230004c0000093d0000c13d0000000404000039000000100200002900000000030900190000000005090019353400620000040f0000000b0a0000290000000f090000290000000002010019000009700000013d0000000001000416000000000110004c000029400000c13d000000040100008a000000000110003100000d4f02000041000000800310008c0000000003000019000000000302401900000d4f01100197000000000410004c000000000200a01900000d4f0110009c00000000010300190000000001026019000000000110004c000029400000c13d35342e160000040f001100000001001d35342e1f0000040f001000000001001d35342e280000040f00000064020000390000000202200367000000000402043b000000000301001900000011010000290000001002000029353430ea0000040f000000400300043d000000200430003900000000002404350000000000130435000000400200003900000000010300190000000003000019353400e20000040f0000000001000416000000000110004c000029400000c13d0000000002000031000000040120008a00000d4f03000041000000800410008c0000000004000019000000000403401900000d4f01100197000000000510004c000000000300a01900000d4f0110009c00000000010400190000000001036019000000000110004c000029400000c13d00000002030003670000000401300370000000000101043b00000d6d0410009c000029400000213d000000230410003900000d4f05000041000000000624004b0000000006000019000000000605801900000d4f0220019700000d4f04400197000000000724004b0000000005008019000000000224013f00000d4f0220009c00000000020600190000000002056019000000000220004c000029400000c13d0000000402100039000000000223034f000000000202043b00000d6d0320009c000009980000213d00000005032002100000003f04300039000000200500008a000000000454016f000000400500043d0000000004450019001100000005001d000000000554004b0000000005000019000000010500403900000d6d0640009c000009980000213d0000000105500190000009980000c13d000000400040043f00000011040000290000000000240435000000240110003900000000023100190000000003000031000000000332004b00000c4c0000213d0000000003040019000000000421004b00000c470000813d0000000204100367000000000404043b000000200330003900000000004304350000002001100039000007360000013d0000000001000416000000000110004c000029400000c13d000000040100008a000000000110003100000d4f02000041000000a00310008c0000000003000019000000000302401900000d4f01100197000000000410004c000000000200a01900000d4f0110009c00000000010300190000000001026019000000000110004c000029400000c13d00000002010003670000000402100370000000000202043b001100000002001d00000d500220009c000029400000213d0000002402100370000000000202043b001000000002001d00000d500220009c000029400000213d0000004402100370000000000302043b000000000230004c0000000002000019000000010200c039000f00000003001d000000000223004b000029400000c13d0000008402100370000000000202043b000a00000002001d0000006401100370000000000101043b000b00000001001d000000400200043d000d00000002001d00000d860100004100000000001204350000000001000414000c00000001001d00000d540100004100000000001004390000000400900443000000240000044300008005010000390000004402000039353400d00000040f0000000d0500002900000044025000390000000f03000029000000000032043500000024025000390000001003000029000000000032043500000004025000390000001103000029000000000032043500000d5002100197000000040120008c00000bc90000613d000000640400003900000020060000390000000c0100002900000000030500190000000d05000029353400990000040f0000000d05000029000000000110004c00000bc90000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f000000030330036700000005044002720000079e0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000007960000413d000000000520004c000007ad0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f0000000001000416000000000110004c000029400000c13d000000040100008a000000000110003100000d4f02000041000001000310008c0000000003000019000000000302401900000d4f01100197000000000410004c000000000200a01900000d4f0110009c00000000010300190000000001026019000000000110004c000029400000c13d000000020100036700100000000103530000000401100370000000000101043b000f00000001001d00000d500110009c000029400000213d000000100100035f0000002401100370000000000101043b000e00000001001d00000d500110009c000029400000213d000000100100035f0000004401100370000000000201043b000000000120004c0000000001000019000000010100c039000d00000002001d000000000112004b000029400000c13d000000100100035f000000c401100370000000000101043b000c00000001001d00000d500110009c000029400000213d001100000006001d353431ba0000040f000000100100035f000000e401100370000000000101043b001000000001001d00000d6b0100004100000000001004390000800b010000390000000402000039353400d00000040f0000001002000029000000000112004b00000000010000190000000101008039353431a90000040f0000000f010000290000000e020000290000000d0300002935342f380000040f00000d7a02000041000000400900043d00000000002904350000000002010019000000640300003900000000010004140000000203300367000000000403043b000000440590003900000012030000290000000000450435000000110400002900000d50044001970000000405900039000000000045043500000d500420019700000024029000390000000000420435001100000004001d000000040240008c00000e730000613d000000000230004c000d00000009001d00000e1b0000c13d00000064040000390000002006000039000000110200002900000000030900190000000005090019353400620000040f0000000d09000029000000000201001900000e4d0000013d0000000001000416000000000110004c000029400000c13d000000040100008a000000000110003100000d4f02000041000000000310004c0000000003000019000000000302401900000d4f01100197000000000410004c000000000200a01900000d4f0110009c00000000010300190000000001026019000000000110004c000029400000c13d000000400100043d001100000001001d00000d5401000041000000000010043900000004009004430000002001000039001000000001001d000000240010044300008005010000390000004402000039353400d00000040f00000d50021001970000001101000029000000000021043500000010020000290000000003000019353400e20000040f00000060212000c90000000d020000290000000001120019000000400110008a0000000201100367000000000101043b000f00000001001d00000d500110009c0000000e03000029000029400000213d00000d5401000041000800000001001d000000000010043900000004003004430000002001000039000900000001001d00000024001004430000800501000039000600000001001d0000004402000039000700000002001d353400d00000040f0000000f02000029000000000121013f00000d500110019800000000010000190000000101006039353430930000040f00000d6c01000041000000400200043d0000000000120435000f00000002001d0000000401200039000000100200002900000000002104350000000001000414000500000001001d000000080100002900000000001004390000000e0100002900000004001004430000000901000029000000240010044300000006010000290000000702000029353400d00000040f00000d5002100197000000040120008c00000a3d0000613d0000002404000039000000200600003900000005010000290000000f030000290000000005030019353400990000040f000000000110004c00000a3d0000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f000000030330036700000005044002720000087f0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000008770000413d000000000520004c0000088e0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f00000d4e0200004100000d4e0490009c0000000004020019000000000409401900000d4e0510009c0000000001028019000000c0011002100000004002400210000000000112019f00000d7b011001c70000800902000039000000110400002900000000050000193534352a0000040f0000000c090000290000000003010019000000600330027000000d4e03300197000000200430008c000000200500003900000000050340190000001f0450018f0000000505500272000008b10000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000008a90000413d000000000640004c000008c00000613d0000000505500210000000000651034f00000000055900190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c000008e90000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f00000003033003670000000504400272000008d80000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000008d00000413d000000000520004c000008e70000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f00000000040900190000000003920019000000000223004b00000000020000190000000102004039000d00000003001d00000d6d0330009c000009980000213d0000000102200190000009980000c13d0000000d02000029000000400020043f000000200110008c000029400000413d0000000001040433000000000210004c0000000002000019000000010200c039000000000221004b000029400000c13d000000000110004c00000c4c0000613d00000d6c010000410000000d03000029000000000013043500000004013000390000001002000029000000000021043500000000010004140000000f0200002900000d5002200197000000040420008c000700000002001d00000bf60000613d000000240400003900000020060000390000000d05000029353400990000040f0000000d030000290000000702000029000000000110004c00000bf60000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f000000030330036700000005044002720000092c0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000009240000413d000000000520004c0000093b0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f00000d4e0200004100000d4e0410009c000000000102801900000d4e0490009c00000000020940190000004002200210000000c001100210000000000121019f00000d82011001c70000800902000039000000100400002900000000050000193534352a0000040f0000000b0a0000290000000f090000290000000003010019000000600330027000000d4e033001970000000004a3004b00000000050a001900000000050340190000001f0450018f00000005055002720000095e0000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000009560000413d000000000640004c0000096d0000613d0000000505500210000000000651034f00000000055900190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c000009960000c13d00000001040000310000000001a40019000000000141004b000029400000213d000000400100043d0000001f0240018f0000000b0300002900000003033003670000000504400272000009850000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b0000097d0000413d000000000520004c000009940000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f00000d6d0190009c0000099f0000a13d00000d520100004100000000001004350000004101000039000000040010043f00000024020000390000000001000019353400ec0000040f0000000f09000029000000400090043f0000000b02000029000000000120004c00000aa00000c13d00000d7d0100004100000000001904350000002402900039000000000100041400000012030000290000000d040000290000000000420435000000110200002900000d50042001970000000402900039000b00000004001d00000000004204350000001002000029000000040220008c00000bab0000613d000000000230004c00000b520000c13d00000044040000390000002006000039000000100200002900000000030900190000000005090019353400620000040f0000000f09000029000000000201001900000b850000013d0000000102000031000000200120008c000000200100003900000000010240190000001f01100039000000600310018f000000110100002900000000050100190000000001130019000000000331004b0000000003000019000000010300403900000d6d0410009c000009980000213d0000000103300190000009980000c13d000000400010043f000000200220008c000029400000413d0000000002050433000000000320004c0000000003000019000000010300c039000000000332004b000029400000c13d000000000021043500000020020000390000000003000019353400e20000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600420018f00000000050300190000000002340019000000000342004b0000000003000019000000010300403900000d6d0420009c000009980000213d0000000103300190000009980000c13d000000400020043f000000200110008c000029400000413d00000002030003670000000e01000029000000000113034f0000000002050433000a00000002001d000000000101043b00000d500210009c000029400000213d0000000e020000290000002002200039000800000002001d000000000223034f000000000202043b00000d500420009c000029400000213d0000000e040000290000004004400039000600000004001d000000000343034f000000000303043b000000000430004c0000000004000019000000010400c039000000000443004b000029400000c13d35342f380000040f00000d6e02000041000000400300043d000700000003001d00000000002304350000000002010019000000000100041400000d5002200197000500000002001d000000040220008c00000ec30000613d00000004040000390000002006000039000000050200002900000007030000290000000005030019353400990000040f000000000110004c00000ec30000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f0000000303300367000000050440027200000a2c0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00000a240000413d000000000520004c00000a3b0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600320018f0000000f0200002900000000050200190000000002230019000000000332004b0000000003000019000000010300403900000d6d0420009c000009980000213d0000000103300190000009980000c13d000000400020043f000000200110008c000029400000413d00000002030003670000000d01000029000000000113034f0000000002050433000f00000002001d000000000101043b00000d500210009c000029400000213d0000000d020000290000002002200039000800000002001d000000000223034f000000000202043b00000d500420009c000029400000213d0000000d040000290000004004400039000600000004001d000000000343034f000000000303043b000000000430004c0000000004000019000000010400c039000000000443004b000029400000c13d35342f380000040f00000d6e02000041000000400300043d000700000003001d00000000002304350000000002010019000000000100041400000d5002200197000500000002001d000000040220008c00000f380000613d00000004040000390000002006000039000000050200002900000007030000290000000005030019353400990000040f000000000110004c00000f380000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f0000000303300367000000050440027200000a8f0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00000a870000413d000000000520004c00000a9e0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f0000000001020019353400ec0000040f0000000f010000290000000201100367000000000101043b001000000001001d00000d500110009c0000000e02000029000029400000213d00000d5401000041000000000010043900000004002004430000002001000039000b00000001001d000000240010044300008005010000390000004402000039353400d00000040f0000001002000029000000000121013f00000d500110019800000000010000190000000101006039353430930000040f000000110100002900000060211000c90000000f020000290000000001210019000000400110008a0000000201100367000000000101043b001000000001001d00000d500110009c000029400000213d000000400300043d00000d6c01000041000000000013043500000004013000390000000d02000029000000000021043500000000010004140000001002000029000000040420008c00000c4f0000613d00000024040000390000002006000039000a00000003001d0000000a05000029353400990000040f0000000a03000029000000000110004c00000c4f0000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f0000000303300367000000050440027200000ae70000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00000adf0000413d000000000520004c00000af60000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000000f0300002900000000040300190000000003320019000000000223004b00000000020000190000000102004039000d00000003001d00000d6d0330009c000009980000213d0000000102200190000009980000c13d0000000d02000029000000400020043f000000200110008c0000000e02000029000029400000413d0000000001040433000f00000001001d00000d500110009c000029400000213d0000001201000029000b00000001001d00000d79010000410000000d03000029000000000013043500000004013000390000000f0300002900000000003104350000000001000414000c00000001001d00000d540100004100000000001004390000000400200443000000240000044300008005010000390000004402000039353400d00000040f00000d5002100197000000040120008c00000cb80000613d000000240400003900000020060000390000000c010000290000000d030000290000000005030019353400990000040f000000000110004c00000cb80000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f0000000303300367000000050440027200000b410000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00000b390000413d000000000520004c00000b500000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f00000d4e0200004100000d4e0490009c0000000004020019000000000409401900000d4e0510009c0000000001028019000000c0011002100000004002400210000000000112019f00000d76011001c70000800902000039000000100400002900000000050000193534352a0000040f0000000f090000290000000003010019000000600330027000000d4e03300197000000200430008c000000200500003900000000050340190000001f0450018f000000050550027200000b730000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00000b6b0000413d000000000640004c00000b820000613d0000000505500210000000000651034f00000000055900190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c00000bab0000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f0000000303300367000000050440027200000b9a0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00000b920000413d000000000520004c00000ba90000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000000002920019001100000002001d00000d6d0220009c000009980000213d0000001102000029000000400020043f000000200110008c000029400000413d0000000f010000290000000001010433000000000210004c0000000002000019000000010200c039000000000221004b000029400000c13d000000000110004c00000ca00000c13d00000d520100004100000000001004350000000101000039000000040010043f00000024020000390000000001000019353400ec0000040f0000001201000029000c00000001001d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f00000000040500190000000003520019000000000223004b00000000020000190000000102004039000e00000003001d00000d6d0330009c000009980000213d0000000102200190000009980000c13d0000000e02000029000000400020043f000000200110008c000029400000413d000000000204043300000d500120009c000029400000213d000000000120004c0000000c01000029000900000001001d000d00000001001d000010030000c13d00000009010000290000000d0200002900000000011201a00000116f0000c13d0000000b01000029000000000110004c0000129a0000c13d000000120100002900000d520200004100000000002104350000001101000039000000040010043f00000012010000290000002402000039353400ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000000002320019000c00000002001d00000d6d0220009c000009980000213d0000000c02000029000000400020043f000000200110008c0000000e02000029000029400000413d0000000d010000290000000001010433000600000001001d00000d6c010000410000000c0300002900000000001304350000000401300039000000100300002900000000003104350000000001000414000d00000001001d00000d5401000041000000000010043900000004002004430000000b01000029000000240010044300008005010000390000004402000039353400d00000040f00000d5002100197000000040120008c00000e9a0000613d000000240400003900000020060000390000000d010000290000000c030000290000000005030019353400990000040f000000000110004c00000e9a0000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f0000000303300367000000050440027200000c360000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00000c2e0000413d000000000520004c00000c450000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f00000024010000390000000201100367000000000101043b00000d6d0210009c00000c7a0000a13d00000012010000290000000002010019353400ec0000040f0000001201000029000a00000001001d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600420018f00000000050300190000000002340019000000000342004b0000000003000019000000010300403900000d6d0420009c000009980000213d0000000103300190000009980000c13d000000400020043f000000200110008c0000000e02000029000029400000413d0000000001050433000800000001001d00000d5401000041000000000010043900000004002004430000000b01000029000000240010044300008005010000390000004402000039353400d00000040f00000d7702000041000000000020043900000d5001100197000000040010044300008002010000390000002402000039353400d00000040f000000000110004c00000fe30000c13d0000000a010000290000000002010019353400ec0000040f0000000002000031000000040110003935342e340000040f001000000001001d000f00000002001d0000000201000367000e0000000103530000004401100370000000000101043b000d00000001001d00000d500110009c000029400000213d353431ba0000040f0000000e0100035f0000006401100370000000000101043b000e00000001001d00000d6b0100004100000000001004390000800b010000390000000402000039353400d00000040f0000000e02000029000000000112004b00000000010000190000000101008039353431a90000040f0000000f01000029000000000110004c00000fb80000c13d000000120100002900000d520200004100000000002104350000003201000039000000040010043f00000012010000290000002402000039353400ec0000040f00000d8301000041000000110300002900000000001304350000000a0100002900000d50011001970000000402300039000000000012043500000000010004140000001202000029001000000002001d0000000b02000029000000040220008c000010920000613d0000001002000029000000000220004c000010340000c13d000000240400003900000020060000390000000b0200002900000011030000290000000005030019353400620000040f00000000020100190000106a0000013d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000000d030000290000000002320019000c00000002001d00000d6d0220009c000009980000213d0000000c02000029000000400020043f000000200110008c000029400000413d0000000d010000290000000001010433000000000210004c0000000002000019000000010200c039000000000221004b000029400000c13d000000000110004c0000000b01000029000d00000001001d000014090000c13d0000001101000029000000100200002935342f0f0000040f00000d8601000041000000400200043d0000000000120435000000040120003900000011030000290000000000310435000000240120003900000010030000290000000000310435001000000002001d000000440120003900000000000104350000000001000414000f00000001001d00000d540100004100000000001004390000000e010000290000000400100443000000240000044300008005010000390000004402000039353400d00000040f00000d5002100197000000040120008c00000cf60000613d000000640400003900000020060000390000000f0100002900000010030000290000000005030019353400990000040f000000000110004c0000065e0000613d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f00000010030000290000000003320019000000000223004b00000000020000190000000102004039000f00000003001d00000d6d0330009c000009980000213d0000000102200190000009980000c13d0000000f02000029000000400020043f000000200110008c0000000e02000029000029400000413d00000010010000290000000001010433001000000001001d00000d500110009c000029400000213d00000d79010000410000000f0300002900000000001304350000000401300039000000100300002900000000003104350000000001000414000c00000001001d00000d540100004100000000001004390000000400200443000000240000044300008005010000390000004402000039353400d00000040f00000d5002100197000000040120008c000019b40000613d000000240400003900000020060000390000000c010000290000000f030000290000000005030019353400990000040f000000000110004c000019b40000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f0000000303300367000000050440027200000d3d0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00000d350000413d000000000520004c00000d4c0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f000900000005001d0000000001060433000000000110004c000002640000613d00000000010704330000000f0200002900000d500220019700000000002104350000000001060433000000000110004c000002640000613d0000000e0100002900000d500210019700000000010704330000002001100039000f00000002001d00000000002104350000000001060433000000000110004c000002640000613d000800000007001d000000000107043300000040011000390000000d02000029000000000021043500000d6c01000041000000400300043d00000000001304350000000c0100002900000d5002100197000e00000003001d0000000401300039000d00000002001d000000000021043500000000010004140000000f02000029000000040220008c000013170000613d000000240400003900000020060000390000000f020000290000000e030000290000000005030019353400990000040f000000000110004c000013170000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f0000000303300367000000050440027200000d8f0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00000d870000413d000000000520004c00000d9e0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f00000d4e0200004100000d4e0430009c000000000302801900000d4e0410009c0000000001028019000000c0011002100000004002300210000000000112019f00000d74011001c700008009020000390000001003000029000000000405001900000000050000193534352a0000040f00000011030000290000000004010019000000600440027000000d4e09400197000000200490008c000000200500003900000000050940190000001f0450018f000000050550027200000dc10000613d000000000600001900000005076002100000000008730019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00000db90000413d000000000640004c00000dd00000613d0000000505500210000000000651034f00000000055300190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000009001f0003000000010355000000000120004c00000dfa0000c13d000000010400003100000010010000290000000001140019000000000141004b000029400000213d000000400100043d0000001f0240018f00000010030000290000000303300367000000050440027200000de90000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00000de10000413d000000000520004c00000df80000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600420018f0000000002340019000000000342004b0000000003000019000000010300403900000d6d0420009c000009980000213d0000000103300190000009980000c13d000000400020043f000000200110008c000029400000413d0000001101000029000000000201043300000001010000390000001003000029000000000013041b000000400100043d0000004003100039000000000023043500000020021000390000000b0300002900000000003204350000000c02000029000000000021043500000060020000390000000003000019353400e20000040f00000d4e0200004100000d4e0410009c000000000102801900000d4e0490009c00000000020940190000004002200210000000c001100210000000000121019f00000d7b011001c70000800902000039000000110400002900000000050000193534352a0000040f0000000d090000290000000003010019000000600330027000000d4e03300197000000200430008c000000200500003900000000050340190000001f0450018f000000050550027200000e3b0000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00000e330000413d000000000640004c00000e4a0000613d0000000505500210000000000651034f00000000055900190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c00000e730000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f0000000303300367000000050440027200000e620000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00000e5a0000413d000000000520004c00000e710000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f00000012010000290000000102000031000000200320008c000000200300003900000000030240190000001f03300039000000600330018f00000000050900190000000004930019000000000334004b00000000030000190000000103004039001000000004001d00000d6d0440009c000009980000213d0000000103300190000009980000c13d0000001003000029000000400030043f000000200220008c000029400000413d0000000002050433000000000320004c0000000003000019000000010300c039000000000332004b000029400000c13d000000000220004c0000119e0000c13d0000000002010019353400ec0000040f000000120100002900000d520200004100000000002104350000004101000039000000040010043f00000012010000290000002402000039353400ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000000c030000290000000002320019000d00000002001d00000d6d0220009c000009980000213d0000000d02000029000000400020043f000000200110008c000029400000413d0000000c010000290000000001010433000500000001001d00000d7c010000410000000d02000029000000000012043500000004012000390000001002000029000000000021043500000000010004140000001202000029000c00000002001d0000001102000029000000040220008c000014a10000613d0000000c02000029000000000220004c000014440000c13d0000002404000039000000400600003900000011020000290000000d030000290000000005030019353400620000040f00000000020100190000147a0000013d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f000000070300002900000000040300190000000003320019000000000223004b00000000020000190000000102004039000400000003001d00000d6d0330009c000009980000213d0000000102200190000009980000c13d0000000402000029000000400020043f000000200110008c000029400000413d0000000001040433000700000001001d00000d500110009c000029400000213d0000000701000029000000000110004c000015a80000c13d00000002010003670000000e02000029000000000221034f000000000202043b000000000402001900000d500220009c000029400000213d0000000802000029000000000221034f000000000202043b00000d500320009c000029400000213d0000000603000029000000000131034f000000000301043b000000000130004c0000000001000019000000010100c039000000000113004b000029400000c13d0000000001040019001000000001001d35342f380000040f0000000003010019000000000200041100000010010000290000000c04000029353434d40000040f00000000030000310000000e01000029000000110200002935342e8c0000040f0000000d02000029353432d80000040f00000d6c01000041000000400200043d0000000000120435001100000002001d00000004012000390000000902000029000000000021043500000000010004140000000f02000029000000040220008c000019e00000613d000000240400003900000020060000390000000f0200002900000011030000290000000005030019353400990000040f000000000110004c000019e00000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f0000000303300367000000050440027200000f270000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00000f1f0000413d000000000520004c00000f360000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f000000070300002900000000040300190000000003320019000000000223004b00000000020000190000000102004039000400000003001d00000d6d0330009c000009980000213d0000000102200190000009980000c13d0000000402000029000000400020043f000000200110008c000029400000413d0000000001040433000700000001001d00000d500110009c000029400000213d0000000701000029000000000110004c000015db0000c13d00000002010003670000000d02000029000000000221034f000000000202043b000000000502001900000d500220009c0000000e04000029000029400000213d0000000802000029000000000221034f000000000202043b00000d500320009c000029400000213d0000000603000029000000000131034f000000000301043b000000000130004c0000000001000019000000010100c039000000000113004b000029400000c13d0000000001050019000700000001001d35342f380000040f0000000003010019000000000200041100000007010000290000000c04000029353434d40000040f00000000030000310000000d01000029000000110200002935342e8c0000040f0000001002000029353432d80000040f00000d6c01000041000000400200043d0000000000120435001100000002001d00000004012000390000001002000029000000000021043500000d54010000410000000002000414001000000002001d00000000001004390000000e0100002900000004001004430000000901000029000000240010044300008005010000390000004402000039353400d00000040f00000d5002100197000000040120008c00001a060000613d00000024040000390000002006000039000000100100002900000011030000290000000005030019353400990000040f000000000110004c00001a060000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f0000000303300367000000050440027200000fa70000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00000f9f0000413d000000000520004c00000fb60000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f0000001001000029353434480000040f000e00000001001d0000001001000029353434480000040f000c00000001001d00000010010000290000002001100039353434480000040f000b00000001001d00000010010000290000004001100039353434500000040f00000000030100190000000c010000290000000b0200002935342f380000040f000c00000001001d0000001101000029353430a40000040f000000000401043300000000020004110000000e010000290000000c03000029353434d40000040f000000000300003100000010010000290000000f0200002935342e8c0000040f0000000d02000029353432d80000040f00000001010000390000001202000029000000000012041b000000400100043d001000000001001d000000110200002935342e7c0000040f0000001003000029000000000231004900000000010300190000000003000019353400e20000040f000000400200043d00000d8101000041000a00000002001d00000000001204350000000001000414000700000001001d00000d540100004100000000001004390000000e0100002900000004001004430000000b01000029000000240010044300008005010000390000004402000039353400d00000040f00000000030004160000001202000029000900000002001d00000d5005100197000000040150008c000013890000613d000000000130004c0000132c0000c13d0000000404000039000000070100002900000000020500190000000a0300002900000000050300190000000906000029353400620000040f0000000002010019000013620000013d00000d87010000410000000e0300002900000000001304350000000001000414000000040320008c000010bc0000613d000000040400003900000020060000390000000e030000290000000005030019353400990000040f000000000110004c000010bc0000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f00000003033003670000000504400272000010230000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b0000101b0000413d000000000520004c000010320000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f00000d4e02000041000000110400002900000d4e0340009c0000000003020019000000000304401900000d4e0410009c0000000001028019000000c0011002100000004002300210000000000112019f00000d74011001c7000080090200003900000010030000290000000b0400002900000000050000193534352a0000040f00000011090000290000000003010019000000600330027000000d4e03300197000000200430008c000000200500003900000000050340190000001f0450018f0000000505500272000010570000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b0000104f0000413d000000000640004c000010670000613d0000000505500210000000000651034f000000110700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c0000001103000029000010920000c13d000000010400003100000010010000290000000001140019000000000141004b000029400000213d000000400100043d0000001f0240018f000000100300002900000003033003670000000504400272000010810000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000010790000413d000000000520004c000010900000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f000000000232001900000d6d0320009c000009980000213d000000400020043f000000200110008c000029400000413d00000011010000290000000001010433001100000001001d00000000010004160000000d02000029000000000121004b000010ad0000a13d00000000010004160000000d02000029000000000221004b000005940000413d0000000d0200002900000000022100490000000c01000029353434920000040f00000001010000390000001002000029000000000012041b000000400100043d00000040021000390000001103000029000000000032043500000020021000390000000d0300002900000000003204350000000e02000029000000000021043500000060020000390000000003000019353400e20000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000000e03000029000000000232001900000d6d0320009c000009980000213d000000400020043f000000200110008c000029400000413d0000000e010000290000000001010433000c00000001001d000000110100002900000010020000290000000f03000029353430370000040f000d00000001001d000900000002001d00000be70000013d000000400100043d001100000001001d000000100200002935342e7c0000040f0000001103000029000000000231004900000000010300190000000003000019353400e20000040f00000d4e02000041000000090500002900000d4e0450009c0000000004020019000000000405401900000d4e0510009c0000000001028019000000c0011002100000004002400210000000000112019f00000d85011001c700008009020000390000000e0400002900000000050000193534352a0000040f00000009090000290000000003010019000000600330027000000d4e033001970000001105000029000000000453004b00000000050340190000001f0450018f0000000505500272000010fe0000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000010f60000413d000000000640004c0000110e0000613d0000000505500210000000000651034f000000090700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c0000000908000029000011390000c13d000000010400003100000011010000290000000001140019000000000141004b000029400000213d000000400100043d0000001f0240018f000000110300002900000003033003670000000504400272000011280000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000011200000413d000000000520004c000011370000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f00000d6d0180009c000009980000213d0000000901000029000000400010043f0000001101000029000000000110004c0000119b0000c13d00000d6b0100004100000000001004390000800b010000390000000402000039353400d00000040f0000000a02000029000000000112004b00000000010000190000000101008039001100000001001d353431a90000040f353431ba0000040f0000001101000029353431a90000040f0000000f0100002900000007020000290000000d0300002935342f380000040f00000d7a02000041000000400600043d000000000026043500000000020100190000004404600039000000000100041400000012030000290000000c05000029000000000054043500000004046000390000000805000029000000000054043500000d5004200197001100000006001d00000024026000390000000000420435000e00000004001d000000040240008c0000151f0000613d000000000230004c000014c40000c13d000000640400003900000020060000390000000e0200002900000011030000290000000005030019353400620000040f0000000002010019000014f90000013d0000000b010000290000000d020000290000000903000029353430bb0000040f0000000a02000029000000000221004b000012f80000a13d0000000a0100002900000009020000290000000d03000029353430bb0000040f0000000c0200002900000000251200a9000b00000001001d000000000210004c000011840000613d0000000b0100002900000000321500d90000000c01000029000000000212004b000005940000c13d0000000d01000029000000000210004c000013100000613d0000000a010000290000000c0200002900000000322100a9000000000310004c000011910000613d0000000a0100002900000000431200d90000000c01000029000000000313004b000005940000c13d0000000901000029000000000310004c000013100000613d0000000d0100002900000000311500d9000000090300002900000000323200d9000000000321004b00000000020140190000188d0000013d00000011010000290000000002010019353400ec0000040f00000d6c010000410000001002000029000000000012043500000004012000390000000c02000029000000000021043500000000010004140000000f02000029000000040220008c000011d40000613d000000240400003900000020060000390000000f0200002900000010030000290000000005030019353400990000040f000000000110004c000011d40000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f00000003033003670000000504400272000011c30000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000011bb0000413d000000000520004c000011d20000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f0000000102000031000000200120008c000000200100003900000000010240190000001f01100039000000600110018f000000100300002900000000033100190000001201000029000d00000003001d00000d6d0330009c000009980000213d0000000d03000029000000400030043f000000200220008c0000160e0000813d0000000002010019353400ec0000040f000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f00000003033003670000000504400272000011f90000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000011f10000413d000000000520004c000012080000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f00000d4e02000041000000090500002900000d4e0450009c0000000004020019000000000405401900000d4e0510009c0000000001028019000000c0011002100000004002400210000000000112019f00000d85011001c70000800902000039000000070400002900000000050000193534352a0000040f00000009090000290000000003010019000000600330027000000d4e033001970000001105000029000000000453004b00000000050340190000001f0450018f00000005055002720000122c0000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000012240000413d000000000640004c0000123c0000613d0000000505500210000000000651034f000000090700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c000012660000c13d000000010400003100000011010000290000000001140019000000000141004b000029400000213d000000400100043d0000001f0240018f000000110300002900000003033003670000000504400272000012550000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b0000124d0000413d000000000520004c000012640000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f000000090100002900000d6d0110009c000009980000213d0000000901000029000000400010043f0000001101000029000000000110004c000013df0000c13d353431ba0000040f00000d6b0100004100000000001004390000800b010000390000000402000039353400d00000040f0000000a02000029000000000112004b00000000010000190000000101008039353431a90000040f0000000f010000290000000e020000290000000d0300002935342f380000040f00000d7a02000041000000400600043d000000000026043500000000020100190000004404600039000000000100041400000012030000290000000c05000029000000000054043500000004046000390000001005000029000000000054043500000d5004200197001100000006001d00000024026000390000000000420435001000000004001d000000040240008c000018330000613d000000000230004c000017d80000c13d00000064040000390000002006000039000000100200002900000011030000290000000005030019353400620000040f00000000020100190000180d0000013d0000000b030000290000000a0400002900000000214300a900000000323100d9000000000242004b000005940000c13d000000000210004c00000bee0000613d000000800210027000000d880310009c000000000201a01900000d880310009c0000000003000019000000800300203900000040043001bf00000d6d0520009c0000000003042019000000400420027000000d6d0520009c000000000204201900000020043001bf00000d4e0520009c0000000003042019000000200420027000000d4e0520009c000000000204201900000010043001bf0000ffff0520008c0000000003042019000000100420027000000000020420190000000804300039000000ff0520008c00000000030420190000000804200270000000000204201900000004043000390000000f0520008c0000000003042019000000040420027000000000020420190000000204300039000000030520008c000000000304201900000002042002700000000002042019000000010220008c0000000002000019000000010200203900000000022300190000000102200270000000000321022f000000010220020f0000000002320019000000020320008c000013100000413d000000010220027000000000432100d90000000002230019000000020320008c000013100000413d000000010220027000000000432100d90000000002230019000000020320008c000013100000413d000000010220027000000000432100d90000000002230019000000020320008c000013100000413d000000010220027000000000432100d90000000002230019000000020320008c000013100000413d000000010220027000000000432100d90000000002230019000000020320008c000013100000413d000000010220027000000000432100d90000000002230019000000020320008c000013100000413d000000010220027000000000312100d9000000000312004b0000000001024019000003e70210008c00000bee0000a13d000003e80210008a0000188d0000013d0000000b040000290000000c0200002900000000324200a9000000000340004c000013020000613d0000000b0300002900000000433200d90000000c04000029000000000343004b000005940000c13d0000000d03000029000000000330004c000013100000613d0000000c0300002900000000433100a9000000000410004c0000130d0000613d00000000541300d90000000c05000029000000000454004b000005940000c13d0000000904000029000000000440004c000018860000c13d00000d520100004100000000001004350000001201000039000000040010043f00000024020000390000000001000019353400ec0000040f00000012010000290000000102000031000000200320008c000000200300003900000000030240190000001f03300039000000600430018f0000000e030000290000000003340019000000000443004b0000000004000019000000010400403900000d6d0530009c000009980000213d0000000104400190000009980000c13d000000400030043f000000200220008c0000178d0000813d0000000002010019353400ec0000040f00000d4e010000410000000a0400002900000d4e0240009c00000000020100190000000002044019000000070600002900000d4e0460009c0000000001064019000000c0011002100000004002200210000000000112019f00000d82011001c70000800902000039000000000405001900000000050000193534352a0000040f0000000a090000290000000003010019000000600330027000000d4e033001970000000905000029000000000453004b00000000050340190000001f0450018f00000005055002720000134f0000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000013470000413d000000000640004c0000135f0000613d0000000505500210000000000651034f0000000a0700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c000013890000c13d000000010400003100000009010000290000000001140019000000000141004b000029400000213d000000400100043d0000001f0240018f000000090300002900000003033003670000000504400272000013780000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000013700000413d000000000520004c000013870000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f0000000a0100002900000d6d0110009c000009980000213d0000000a01000029000000400010043f0000000901000029000000000110004c000014060000c13d00000002030003670000000f01000029000000000113034f000000000101043b00000d500210009c000029400000213d0000000f020000290000002002200039000a00000002001d000000000223034f000000000202043b00000d500420009c000029400000213d0000000f040000290000004004400039000700000004001d000000000343034f000000000303043b000000000430004c0000000004000019000000010400c039000000000443004b000029400000c13d35342f380000040f00000d6e02000041000000400300043d000900000003001d00000000002304350000000002010019000000000100041400000d5002200197000600000002001d000000040220008c000018fa0000613d00000004040000390000002006000039000000060200002900000009030000290000000005030019353400990000040f000000000110004c000018fa0000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f00000003033003670000000504400272000013ce0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000013c60000413d000000000520004c000013dd0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f00000011010000290000000002010019353400ec0000040f000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f00000003033003670000000504400272000013f50000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000013ed0000413d000000000520004c000014040000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f00000009010000290000000002010019353400ec0000040f00000d89010000410000000c050000290000000000150435000000000100041400000004020000390000000202200367000000000202043b000000240350003900000011040000290000000000430435000000040350003900000000002304350000000f02000029000000040220008c000014b30000613d000000440400003900000020060000390000000f020000290000000c030000290000000005030019353400990000040f000000000110004c000014b30000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f00000003033003670000000504400272000014330000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b0000142b0000413d000000000520004c000014420000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f00000d4e020000410000000d0400002900000d4e0340009c0000000003020019000000000304401900000d4e0410009c0000000001028019000000c0011002100000004002300210000000000112019f00000d74011001c700008009020000390000000c03000029000000110400002900000000050000193534352a0000040f0000000d090000290000000003010019000000600330027000000d4e03300197000000400430008c000000400500003900000000050340190000001f0450018f0000000505500272000014670000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b0000145f0000413d000000000640004c000014770000613d0000000505500210000000000651034f0000000d0700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c000014a10000c13d00000001040000310000000c010000290000000001140019000000000141004b000029400000213d000000400100043d0000001f0240018f0000000c0300002900000003033003670000000504400272000014900000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000014880000413d000000000520004c0000149f0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f0000000101000031000000400210008c000000400200003900000000020140190000001f02200039000000e00220018f0000000d030000290000000002320019001100000002001d00000d6d0220009c000009980000213d0000001102000029000000400020043f000000400110008c000015720000813d0000000c010000290000000002010019353400ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000000c03000029000000000232001900000d6d0320009c000009980000213d000000400020043f000000200110008c000029400000413d0000000c010000290000000001010433000d00000001001d00000cd20000013d00000d4e02000041000000110500002900000d4e0450009c0000000004020019000000000405401900000d4e0510009c0000000001028019000000c0011002100000004002400210000000000112019f00000d7b011001c700008009020000390000000e0400002900000000050000193534352a0000040f00000011090000290000000003010019000000600330027000000d4e03300197000000200430008c000000200500003900000000050340190000001f0450018f0000000505500272000014e60000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000014de0000413d000000000640004c000014f60000613d0000000505500210000000000651034f000000110700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c0000151f0000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f000000030330036700000005044002720000150e0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000015060000413d000000000520004c0000151d0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f00000011030000290000000003320019000000000223004b00000000020000190000000102004039000d00000003001d00000d6d0330009c000009980000213d0000000102200190000009980000c13d0000000d02000029000000400020043f000000200110008c000029400000413d00000011010000290000000001010433000000000210004c0000000002000019000000010200c039000000000221004b000029400000c13d000000000110004c00000c4c0000613d00000d6c010000410000000d02000029000000000012043500000004012000390000001002000029000000000021043500000000010004140000000f02000029000000040220008c000019520000613d000000240400003900000020060000390000000f020000290000000d030000290000000005030019353400990000040f000000000110004c000019520000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f00000003033003670000000504400272000015610000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000015590000413d000000000520004c000015700000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f00000d6c010000410000001102000029000000000012043500000004012000390000001002000029000000000021043500000000010004140000000702000029000000040220008c000016470000613d00000024040000390000002006000039000000070200002900000011030000290000000005030019353400990000040f000000000110004c000016470000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f00000003033003670000000504400272000015970000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b0000158f0000413d000000000520004c000015a60000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f00000d6f010000410000000402000029000000000012043500000000010004140000000502000029000000040220008c0000169d0000613d00000004040000390000002006000039000000050200002900000004030000290000000005030019353400990000040f000000000110004c0000169d0000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f00000003033003670000000504400272000015ca0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000015c20000413d000000000520004c000015d90000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f00000d6f010000410000000402000029000000000012043500000000010004140000000502000029000000040220008c0000170c0000613d00000004040000390000002006000039000000050200002900000004030000290000000005030019353400990000040f000000000110004c0000170c0000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f00000003033003670000000504400272000015fd0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000015f50000413d000000000520004c0000160c0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f00000010010000290000000001010433000b00000001001d00000d6c010000410000000d02000029000000000012043500000004012000390000000c02000029000000000021043500000000010004140000000e02000029000000040220008c0000177b0000613d000000240400003900000020060000390000000e020000290000000d030000290000000005030019353400990000040f000000000110004c0000177b0000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f00000003033003670000000504400272000016360000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b0000162e0000413d000000000520004c000016450000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f00000011030000290000000002320019000d00000002001d00000d6d0220009c000009980000213d0000000d02000029000000400020043f000000200110008c000029400000413d000000110100002900000000020104330000000601000029001100000002001d000000000112004b000005940000413d00000d6c010000410000000d0200002900000000001204350000000401200039000000100200002900000000002104350000000001000414001000000001001d00000d540100004100000000001004390000000e0100002900000004001004430000000b01000029000000240010044300008005010000390000004402000039000c00000002001d353400d00000040f00000d5002100197000000040120008c00001a9e0000613d0000002404000039000000200600003900000010010000290000000d030000290000000005030019353400990000040f000000000110004c00001a9e0000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f000000030330036700000005044002720000168c0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000016840000413d000000000520004c0000169b0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000000403000029000000000232001900000d6d0320009c000009980000213d000000400020043f000000200110008c000029400000413d00000004010000290000000001010433000000000210004c0000000002000019000000010200c039000000000221004b000029400000c13d000000000110004c00000edf0000613d00000002010003670000000602000029000000000221034f000000000202043b000000000320004c0000000003000019000000010300c039000000000332004b000029400000c13d000000000220004c000000020300003900000019030060390000000c0500002900000000423500a900000000433200d9000000000353004b0000000e03000029000005940000c13d000027102420011a0000000c02000029000500000004001d000000000242004b000005940000413d000000000131034f000000000101043b00000d500210009c000029400000213d000000000200041100000010030000290000000504000029353434d40000040f0000000e010000290000000201100367000000000201043b00000d500120009c000029400000213d000000400300043d00000d6c010000410000000000130435000400000003001d0000000401300039000000100300002900000000003104350000000001000414000000040320008c00001f840000613d0000002404000039000000200600003900000004030000290000000005030019353400990000040f000000000110004c00001f840000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f00000003033003670000000504400272000016fb0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000016f30000413d000000000520004c0000170a0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000000403000029000000000232001900000d6d0320009c000009980000213d000000400020043f000000200110008c000029400000413d00000004010000290000000001010433000000000210004c0000000002000019000000010200c039000000000221004b000029400000c13d000000000110004c00000f540000613d00000002010003670000000602000029000000000221034f000000000202043b000000000320004c0000000003000019000000010300c039000000000332004b000029400000c13d000000000220004c000000020300003900000019030060390000000c0500002900000000425300a900000000433200d9000000000353004b0000000d03000029000005940000c13d000027102420011a0000000c02000029000400000004001d000000000242004b000005940000413d000000000131034f000000000101043b00000d500210009c000029400000213d000000000200041100000010030000290000000404000029353434d40000040f0000000d010000290000000201100367000000000201043b00000d500120009c000029400000213d000000400300043d00000d6c010000410000000000130435000500000003001d0000000401300039000000100300002900000000003104350000000001000414000000040320008c00001fce0000613d0000002404000039000000200600003900000005030000290000000005030019353400990000040f000000000110004c00001fce0000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f000000030330036700000005044002720000176a0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000017620000413d000000000520004c000017790000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f0000000102000031000000200120008c000000200100003900000000010240190000001f01100039000000600110018f0000000d0300002900000000033100190000001201000029001000000003001d00000d6d0330009c000009980000213d0000001003000029000000400030043f000000200220008c0000199a0000813d0000000002010019353400ec0000040f0000000b010000290000000001010433000000000110004c0000000801000029000002640000613d0000000e020000290000000002020433000400000002001d00000000010104330000004002100039000000000302043300000020021000390000000002020433000000000101043300000d500110019700000d5002200197000000000330004c0000000003000019000000010300c03935342f380000040f00000d6e02000041000000400300043d000e00000003001d000000000023043500000000020100190000000001000414000500000002001d00000d5002200197000700000002001d000000040220008c000018980000613d0000000404000039000000200600003900000007020000290000000e030000290000000005030019353400990000040f000000000110004c000018980000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f00000003033003670000000504400272000017c70000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000017bf0000413d000000000520004c000017d60000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f00000d4e02000041000000110500002900000d4e0450009c0000000004020019000000000405401900000d4e0510009c0000000001028019000000c0011002100000004002400210000000000112019f00000d7b011001c70000800902000039000000100400002900000000050000193534352a0000040f00000011090000290000000003010019000000600330027000000d4e03300197000000200430008c000000200500003900000000050340190000001f0450018f0000000505500272000017fa0000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000017f20000413d000000000640004c0000180a0000613d0000000505500210000000000651034f000000110700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c000018330000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f00000003033003670000000504400272000018220000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b0000181a0000413d000000000520004c000018310000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f00000011030000290000000003320019000000000223004b00000000020000190000000102004039000d00000003001d00000d6d0330009c000009980000213d0000000102200190000009980000c13d0000000d02000029000000400020043f000000200110008c000029400000413d00000011010000290000000001010433000000000210004c0000000002000019000000010200c039000000000221004b000029400000c13d000000000110004c00000c4c0000613d00000d6c010000410000000d02000029000000000012043500000004012000390000000b02000029000000000021043500000000010004140000000f02000029000000040220008c00001a560000613d000000240400003900000020060000390000000f020000290000000d030000290000000005030019353400990000040f000000000110004c00001a560000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f00000003033003670000000504400272000018750000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b0000186d0000413d000000000520004c000018840000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f0000000d0400002900000000424200d9000000090400002900000000434300d9000000000432004b0000000002038019000a00000001001d000000400100043d0000004003100039000000000023043500000020021000390000000a0300002900000000003204350000000b02000029000000000021043500000060020000390000000003000019353400e20000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000000e030000290000000003320019000000000223004b00000000020000190000000102004039000600000003001d00000d6d0330009c000009980000213d0000000102200190000009980000c13d0000000602000029000000400020043f000000200110008c000029400000413d0000000e010000290000000001010433000e00000001001d00000d500110009c000029400000213d0000000e01000029000000000110004c00001bdc0000c13d0000000b050000290000000001050433000000000110004c0000000801000029000002640000613d0000000001010433000000000101043300000d5001100197000000000200041100000005030000290000000a04000029353434d40000040f0000000b010000290000000c02000029353432d80000040f00000d6c01000041000000400200043d0000000000120435001100000002001d00000004012000390000000d02000029000000000021043500000000010004140000000f02000029000000040220008c00001da20000613d000000240400003900000020060000390000000f0200002900000011030000290000000005030019353400990000040f000000000110004c00001da20000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f00000003033003670000000504400272000018e90000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000018e10000413d000000000520004c000018f80000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600320018f00000009020000290000000002230019000000000332004b0000000003000019000000010300403900000d6d0420009c000009980000213d0000000103300190000009980000c13d000000400020043f000000200110008c000029400000413d00000009010000290000000001010433000900000001001d00000d500110009c000029400000213d0000000001000416000400000001001d0000000901000029000000000110004c00001c800000c13d00000002030003670000000f01000029000000000113034f000000000101043b00000d500210009c0000000e05000029000029400000213d0000000a02000029000000000223034f000000000202043b00000d500420009c000029400000213d0000000704000029000000000343034f000000000303043b000000000430004c0000000004000019000000010400c039000000000443004b000029400000c13d35342f380000040f00000d7d02000041000000400300043d000a00000003001d0000000000230435000900000001001d0000000001000414000700000001001d00000d540100004100000000001004390000000e0100002900000004001004430000000b01000029000000240010044300008005010000390000004402000039353400d00000040f000000090200002900000d50022001970000000a0500002900000004045000390000001203000029000000000024043500000024025000390000000404000029000000000042043500000d5005100197000000040150008c000021f40000613d000000000130004c000021980000c13d00000044040000390000002006000039000000070100002900000000020500190000000a030000290000000005030019353400620000040f0000000002010019000021ce0000013d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000000d030000290000000002320019001100000002001d00000d6d0220009c000009980000213d0000001102000029000000400020043f000000200110008c000029400000413d0000000d010000290000000001010433000c00000001001d00000d6c010000410000001102000029000000000012043500000004012000390000001002000029000000000021043500000000010004140000000702000029000000040220008c00001b420000613d00000024040000390000002006000039000000070200002900000011030000290000000005030019353400990000040f000000000110004c00001b420000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f00000003033003670000000504400272000019890000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000019810000413d000000000520004c000019980000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f0000000d010000290000000001010433000a00000001001d00000d7c010000410000001002000029000000000012043500000004012000390000000c02000029000000000021043500000000010004140000001202000029000d00000002001d0000001102000029000000040220008c00001b300000613d0000000d02000029000000000220004c00001ad40000c13d00000024040000390000004006000039000000110200002900000010030000290000000005030019353400620000040f000000000201001900001b090000013d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000000f030000290000000002320019000e00000002001d00000d6d0220009c000009980000213d0000000e02000029000000400020043f000000200110008c000029400000413d0000000f010000290000000001010433000000000210004c0000000002000019000000010200c039000000000221004b000029400000c13d000000000110004c00001cb40000c13d000000120100002a0000000001000019000000010100c0390000000b030000290000000d04000029000000000234004b00000000020000190000000102002039000000000112019f000000010510018f0000000e0100002900000020021000390000000000520435000000000234004b00000000020300190000000002042019000000000021043500000040020000390000000003000019353400e20000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600320018f00000011020000290000000002230019000000000332004b0000000003000019000000010300403900000d6d0420009c000009980000213d0000000103300190000009980000c13d000000400020043f000000200110008c000029400000413d000000110100002900000000010104330000000a02000029353430b00000040f0000000002010019001100000002001d0000000b01000029000000000112004b00000000010000190000000101008039353432c40000040f00000001010000390000001202000029000000000012041b000000400100043d0000001102000029000000000021043500000020020000390000000003000019353400e20000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600320018f00000011020000290000000002230019000000000332004b0000000003000019000000010300403900000d6d0420009c000009980000213d0000000103300190000009980000c13d000000400020043f000000200110008c000029400000413d000000110100002900000000020104330000000f01000029001100000002001d000000000112004b000005940000413d00000d540100004100000000001004390000000e0100002900000004001004430000000901000029000000240010044300008005010000390000004402000039353400d00000040f00000d7702000041000000000020043900000d5001100197000000040010044300008002010000390000002402000039353400d00000040f0000000e02000029000000000110004c00000c4c0000613d0000000f0100002900000011030000290000000003130049000000400400043d00000d80010000410000000000140435001100000004001d0000000401400039000f00000003001d00000000003104350000000001000414000d00000001001d00000d5401000041000000000010043900000004002004430000000901000029000000240010044300008005010000390000004402000039353400d00000040f0000001202000029001000000002001d00000d5005100197000000040150008c00001f130000613d0000001001000029000000000110004c00001eb50000c13d00000024040000390000000d010000290000000002050019000000110300002900000000050300190000000006000019353400620000040f000000000201001900001eec0000013d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000000d030000290000000002320019001100000002001d00000d6d0220009c000009980000213d0000001102000029000000400020043f000000200110008c000029400000413d0000000d010000290000000001010433000c00000001001d00000d6c010000410000001102000029000000000012043500000004012000390000000b02000029000000000021043500000000010004140000000e02000029000000040220008c00001bb30000613d000000240400003900000020060000390000000e0200002900000011030000290000000005030019353400990000040f000000000110004c00001bb30000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f0000000303300367000000050440027200001a8d0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00001a850000413d000000000520004c00001a9c0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000000d03000029000000000232001900000d6d0320009c000009980000213d000000400020043f000000200110008c000029400000413d0000000d0100002900000000020104330000000501000029001000000002001d000000000112004b000005940000413d0000000601000029000000110200002900000000021200490000000901000029001100000002001d000000000112004b00000000010000190000000101008039353431ce0000040f0000000501000029000000100200002900000000021200490000000a01000029000900000002001d000000000112004b00000000010000190000000101008039353431df0000040f00000001010000390000001202000029000d00000001001d001000000002001d000000000012041b00000d770100004100000000001004390000000f01000029000000040010044300008002010000390000002402000039353400d00000040f000000000110004c00001dc90000c13d00000010010000290000000002010019353400ec0000040f00000d4e0200004100000d4e0310009c0000000001028019000000100400002900000d4e0340009c00000000020440190000004002200210000000c001100210000000000121019f00000d74011001c700008009020000390000000d03000029000000110400002900000000050000193534352a0000040f00000010090000290000000003010019000000600330027000000d4e03300197000000400430008c000000400500003900000000050340190000001f0450018f000000050550027200001af60000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00001aee0000413d000000000640004c00001b060000613d0000000505500210000000000651034f000000100700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c00001b300000c13d00000001040000310000000d010000290000000001140019000000000141004b000029400000213d000000400100043d0000001f0240018f0000000d030000290000000303300367000000050440027200001b1f0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00001b170000413d000000000520004c00001b2e0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f0000000101000031000000400210008c000000400200003900000000020140190000001f02200039000000e00220018f00000010030000290000000002320019001100000002001d00000d6d0220009c000009980000213d0000001102000029000000400020043f000000400110008c00001b6b0000813d0000000d010000290000000002010019353400ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f00000011030000290000000002320019000d00000002001d00000d6d0220009c000009980000213d0000000d02000029000000400020043f000000200110008c000029400000413d00000011010000290000000001010433000a00000001001d00000d7c010000410000000d02000029000000000012043500000004012000390000001002000029000000000021043500000000010004140000001202000029001100000002001d0000000e02000029000000040220008c00001e6d0000613d0000001102000029000000000220004c00001e100000c13d000000240400003900000040060000390000000e020000290000000d030000290000000005030019353400620000040f000000000201001900001e460000013d00000d6c010000410000001102000029000000000012043500000004012000390000000c02000029000000000021043500000000010004140000000f02000029000000040220008c00001ba10000613d000000240400003900000020060000390000000f0200002900000011030000290000000005030019353400990000040f000000000110004c00001ba10000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f0000000303300367000000050440027200001b900000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00001b880000413d000000000520004c00001b9f0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f0000000102000031000000200120008c000000200100003900000000010240190000001f01100039000000600110018f000000110300002900000000033100190000001201000029001000000003001d00000d6d0330009c000009980000213d0000001003000029000000400030043f000000200220008c00001d660000813d0000000002010019353400ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f00000011030000290000000002320019000d00000002001d00000d6d0220009c000009980000213d0000000d02000029000000400020043f000000200110008c000029400000413d00000011010000290000000001010433000a00000001001d00000d7c010000410000000d02000029000000000012043500000004012000390000000b02000029000000000021043500000000010004140000001202000029001100000002001d0000001002000029000000040220008c000020750000613d0000001102000029000000000220004c000020180000c13d0000002404000039000000400600003900000010020000290000000d030000290000000005030019353400620000040f00000000020100190000204e0000013d00000d6f010000410000000602000029000000000012043500000000010004140000000702000029000000040220008c00001c0f0000613d00000004040000390000002006000039000000070200002900000006030000290000000005030019353400990000040f000000000110004c00001c0f0000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f0000000303300367000000050440027200001bfe0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00001bf60000413d000000000520004c00001c0d0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000000603000029000000000232001900000d6d0320009c000009980000213d000000400020043f000000200110008c000029400000413d00000006010000290000000001010433000000000210004c0000000002000019000000010200c039000000000221004b000029400000c13d000000000110004c000018b40000613d0000000b010000290000000001010433000000000110004c0000000802000029000002640000613d00000011010000290000000201100367000000000501043b000000000102043300000040021000390000000002020433000000000220004c0000000203000039000000190300603900000000423500a900000000433200d9000a00000005001d000000000353004b000005940000c13d000027102320011a0000000a02000029000700000003001d000000000232004b000005940000413d000000000101043300000d5001100197000000000200041100000010030000290000000704000029353434d40000040f0000000b010000290000000001010433000000000110004c0000000801000029000002640000613d00000000010104330000000002010433000000400300043d00000d6c010000410000000000130435001100000003001d000000040130003900000010030000290000000000310435000000000100041400000d5002200197000000040320008c000024430000613d0000002404000039000000200600003900000011030000290000000005030019353400990000040f000000000110004c000024430000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f0000000303300367000000050440027200001c6f0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00001c670000413d000000000520004c00001c7e0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f000000400200043d00000d6f01000041000500000002001d000000000012043500000000010004140000000602000029000000040220008c00001cef0000613d00000004040000390000002006000039000000060200002900000005030000290000000005030019353400990000040f000000000110004c00001cef0000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f0000000303300367000000050440027200001ca30000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00001c9b0000413d000000000520004c00001cb20000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f00000d89010000410000000e050000290000000000150435000000000100041400000004020000390000000202200367000000000202043b000000240350003900000011040000290000000000430435000000040350003900000000002304350000001002000029000000040220008c00001d540000613d0000004404000039000000200600003900000010020000290000000e030000290000000005030019353400990000040f000000000110004c00001d540000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f0000000303300367000000050440027200001cde0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00001cd60000413d000000000520004c00001ced0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f00000005030000290000000003320019000000000223004b00000000020000190000000102004039000600000003001d00000d6d0330009c000009980000213d0000000102200190000009980000c13d0000000602000029000000400020043f000000200110008c000029400000413d00000005010000290000000001010433000000000210004c0000000002000019000000010200c039000000000221004b000029400000c13d000000000110004c000019160000613d00000007010000290000000201100367000000000101043b000000000210004c0000000002000019000000010200c039000000000221004b000029400000c13d000000000110004c00000002020000390000001902006039000000040400002900000000312400a900000000322100d9000000000242004b000005940000c13d000027101210011a0000000401000029000500000002001d000000000121004b000005940000413d00000d70010000410000000602000029000000000012043500000000010004140000000902000029000000040220008c000023ff0000613d00000004040000390000002006000039000000090200002900000006030000290000000005030019353400990000040f000000000110004c000023ff0000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f0000000303300367000000050440027200001d430000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00001d3b0000413d000000000520004c00001d520000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000000e03000029000000000232001900000d6d0320009c000009980000213d000000400020043f000000200110008c000029400000413d0000000e010000290000000001010433000b00000001001d000e00000002001d000019cc0000013d000000110100002900000000020104330000000b01000029001100000002001d000000000112004b000005940000413d00000d6c010000410000001002000029000000000012043500000004012000390000000c02000029000000000021043500000000010004140000000e02000029000000040220008c00001dfe0000613d000000240400003900000020060000390000000e0200002900000010030000290000000005030019353400990000040f000000000110004c00001dfe0000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f0000000303300367000000050440027200001d910000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00001d890000413d000000000520004c00001da00000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600320018f00000011020000290000000002230019000000000332004b0000000003000019000000010300403900000d6d0420009c000009980000213d0000000103300190000009980000c13d000000400020043f000000200110008c000029400000413d000000110100002900000000010104330000000402000029353430b00000040f00000024020000390000000202200367000000000202043b001100000001001d000000000221004b00000000010000190000000101008039353432c40000040f00000012010000290000000902000029000000000021041b000000400100043d0000001102000029000000000021043500000020020000390000000003000019353400e20000040f000000400200043d000000440120003900000011030000290000000000310435000000200320003900000d7d010000410000000000130435000000080100002900000d5001100197000000240420003900000000001404350000000c01000029000000000012043500000d7e0120009c000009980000213d0000008001200039000000400010043f00000000010004140000001204000029001000000004001d0000000f04000029000000040440008c00001f2c0000c13d00000010070000290000001f0170018f000000050270027200001ded0000613d0000000004000019000000050540021000000000065700190000000005530019000000000505043300000000005604350000000104400039000000000524004b00001de50000413d000000000410004c0000211b0000613d00000005022002100000000003230019000000100400002900000000022400190000000301100210000000000402043300000000041401cf000000000414022f00000000030304330000010001100089000000000313022f00000000011301cf000000000141019f00000000001204350000211b0000013d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f000000100300002900000000023200190000001203000029000f00000003001d00000d6d0320009c000009980000213d000000400020043f000000200110008c000020bd0000813d0000000f010000290000000002010019353400ec0000040f00000d4e020000410000000d0400002900000d4e0340009c0000000003020019000000000304401900000d4e0410009c0000000001028019000000c0011002100000004002300210000000000112019f00000d74011001c7000080090200003900000011030000290000000e0400002900000000050000193534352a0000040f0000000d090000290000000003010019000000600330027000000d4e03300197000000400430008c000000400500003900000000050340190000001f0450018f000000050550027200001e330000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00001e2b0000413d000000000640004c00001e430000613d0000000505500210000000000651034f0000000d0700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c00001e6d0000c13d000000010400003100000011010000290000000001140019000000000141004b000029400000213d000000400100043d0000001f0240018f00000011030000290000000303300367000000050440027200001e5c0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00001e540000413d000000000520004c00001e6b0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f0000000101000031000000400210008c000000400200003900000000020140190000001f02200039000000e00220018f0000000d030000290000000002320019000e00000002001d00000d6d0220009c000009980000213d0000000e02000029000000400020043f000000400110008c00001e7f0000813d00000011010000290000000002010019353400ec0000040f00000d6c010000410000000e02000029000000000012043500000004012000390000001002000029000000000021043500000000010004140000000f02000029000000040220008c00001f360000613d000000240400003900000020060000390000000f020000290000000e030000290000000005030019353400990000040f000000000110004c00001f360000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f0000000303300367000000050440027200001ea40000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00001e9c0000413d000000000520004c00001eb30000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f00000d4e010000410000000d0300002900000d4e0230009c00000000020100190000000002034019000000110400002900000d4e0340009c00000000010440190000004001100210000000c002200210000000000112019f00000d74011001c700008009020000390000001003000029000000000405001900000000050000193534352a0000040f00000011090000290000000003010019000000600330027000000d4e033001970000001005000029000000000453004b00000000050340190000001f0450018f000000050550027200001ed90000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00001ed10000413d000000000640004c00001ee90000613d0000000505500210000000000651034f000000110700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c00001f130000c13d000000010400003100000010010000290000000001140019000000000141004b000029400000213d000000400100043d0000001f0240018f00000010030000290000000303300367000000050440027200001f020000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00001efa0000413d000000000520004c00001f110000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f000000110100002900000d6d0110009c000009980000213d0000001101000029000000400010043f0000001001000029000000000110004c00001f810000c13d0000000a010000290000000f02000029353434920000040f0000000b010000290000000f02000029000000000112004b00000000010000190000000101008039353432c40000040f0000000101000039000000000010041b000000400100043d0000000f02000029000000000021043500000020020000390000000003000019353400e20000040f00000000040204330000001002000029000000000220004c000020e20000c13d0000000f0200002900000000050000190000000006000019353400620000040f000d00000001001d0000211b0000013d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000000e030000290000000002320019001100000002001d00000d6d0220009c000009980000213d0000001102000029000000400020043f000000200110008c000029400000413d0000000e0100002900000000020104330000000c01000029000e00000002001d000000000112004b000005940000413d00000d6c010000410000001102000029000000000012043500000004012000390000001002000029000000000021043500000000010004140000000702000029000000040220008c000022f70000613d00000024040000390000002006000039000000070200002900000011030000290000000005030019353400990000040f000000000110004c000022f70000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f0000000303300367000000050440027200001f700000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00001f680000413d000000000520004c00001f7f0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f00000010010000290000000002010019353400ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f00000004030000290000000003320019000000000223004b00000000020000190000000102004039001000000003001d00000d6d0330009c000009980000213d0000000102200190000009980000c13d0000001002000029000000400020043f000000200110008c000029400000413d00000004010000290000000001010433000300000001001d00000d70010000410000001002000029000000000012043500000000010004140000000702000029000000040220008c0000226f0000613d00000004040000390000002006000039000000070200002900000010030000290000000005030019353400990000040f000000000110004c0000226f0000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f0000000303300367000000050440027200001fbd0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00001fb50000413d000000000520004c00001fcc0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f00000005030000290000000003320019000000000223004b00000000020000190000000102004039000300000003001d00000d6d0330009c000009980000213d0000000102200190000009980000c13d0000000302000029000000400020043f000000200110008c000029400000413d00000005010000290000000001010433000100000001001d00000d70010000410000000302000029000000000012043500000000010004140000000702000029000000040220008c000022b30000613d00000004040000390000002006000039000000070200002900000003030000290000000005030019353400990000040f000000000110004c000022b30000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f00000003033003670000000504400272000020070000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00001fff0000413d000000000520004c000020160000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f00000d4e020000410000000d0400002900000d4e0340009c0000000003020019000000000304401900000d4e0410009c0000000001028019000000c0011002100000004002300210000000000112019f00000d74011001c700008009020000390000001103000029000000100400002900000000050000193534352a0000040f0000000d090000290000000003010019000000600330027000000d4e03300197000000400430008c000000400500003900000000050340190000001f0450018f00000005055002720000203b0000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000020330000413d000000000640004c0000204b0000613d0000000505500210000000000651034f0000000d0700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c000020750000c13d000000010400003100000011010000290000000001140019000000000141004b000029400000213d000000400100043d0000001f0240018f000000110300002900000003033003670000000504400272000020640000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b0000205c0000413d000000000520004c000020730000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f0000000101000031000000400210008c000000400200003900000000020140190000001f02200039000000e00220018f0000000d030000290000000002320019001000000002001d00000d6d0220009c000009980000213d0000001002000029000000400020043f000000400110008c000020870000813d00000011010000290000000002010019353400ec0000040f00000d6c010000410000001002000029000000000012043500000004012000390000000b02000029000000000021043500000000010004140000000f02000029000000040220008c000021370000613d000000240400003900000020060000390000000f0200002900000010030000290000000005030019353400990000040f000000000110004c000021370000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f00000003033003670000000504400272000020ac0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000020a40000413d000000000520004c000020bb0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f000000100100002900000000010104330000000a02000029353430b00000040f0000000b0200002900000011030000290000000003230049001000000003001d00000084020000390000000202200367000000000202043b000000000223004b00000000020000190000000102008039001100000001001d0000000001020019353431ce0000040f000000a4010000390000000201100367000000000101043b0000001102000029000000000112004b00000000010000190000000101008039353431df0000040f00000001010000390000000f02000029000000000012041b000000400100043d0000002002100039000000110300002900000000003204350000001002000029000000000021043500000040020000390000000003000019353400e20000040f00000d4e0200004100000d4e0530009c0000000003028019000000400330021000000d4e0540009c00000000040280190000006004400210000000000334019f00000d4e0410009c0000000001028019000000c001100210000000000113019f00000d7f011001c7000080090200003900000010030000290000000f0400002900000000050000193534352a0000040f00000010090000290000000003010019000000600330027000000d4e03300197000000000493004b000000000509001900000000050340190000001f0450018f0000000505500272000021070000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000020ff0000413d000000000640004c000021170000613d0000000505500210000000000651034f000000100700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000d00000002001d000100000003001f00030000000103553534345b0000040f0000000d02000029000000000220004c000021340000613d0000000002010433000000000320004c000021820000c13d00000d540100004100000000001004390000000e0100002900000004001004430000000b01000029000000240010044300008005010000390000004402000039353400d00000040f00000d7702000041000000000020043900000d5001100197000000040010044300008002010000390000002402000039353400d00000040f000000000110004c0000224c0000c13d00000010010000290000000002010019353400ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f00000010030000290000000002320019001100000002001d00000d6d0220009c000009980000213d0000001102000029000000400020043f000000200110008c000029400000413d000000100100002900000000020104330000000c01000029001000000002001d000000000112004b000005940000413d00000d6c010000410000001102000029000000000012043500000004012000390000000b02000029000000000021043500000000010004140000000e02000029000000040220008c000023a60000613d000000240400003900000020060000390000000e0200002900000011030000290000000005030019353400990000040f000000000110004c000023a60000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f00000003033003670000000504400272000021710000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000021690000413d000000000520004c000021800000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f00000d4f03000041000000200420008c0000000004000019000000000403401900000d4f02200197000000000520004c000000000300a01900000d4f0220009c00000000020400190000000002036019000000000220004c000029400000c13d00000020011000390000000001010433000000000210004c0000000002000019000000010200c039000000000221004b000029400000c13d000000000110004c000021340000613d000021220000013d00000d4e010000410000000a0400002900000d4e0240009c00000000020100190000000002044019000000070600002900000d4e0460009c0000000001064019000000c0011002100000004002200210000000000112019f00000d76011001c70000800902000039000000000405001900000000050000193534352a0000040f0000000a090000290000000003010019000000600330027000000d4e03300197000000200430008c000000200500003900000000050340190000001f0450018f0000000505500272000021bb0000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000021b30000413d000000000640004c000021cb0000613d0000000505500210000000000651034f0000000a0700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c000021f40000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f00000003033003670000000504400272000021e30000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000021db0000413d000000000520004c000021f20000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600320018f0000000a020000290000000002230019000000000332004b0000000003000019000000010300403900000d6d0420009c000009980000213d0000000103300190000009980000c13d000000400020043f000000200110008c000029400000413d0000000a010000290000000001010433000000000210004c0000000002000019000000010200c039000000000221004b000029400000c13d000000000110004c00000bc20000613d00000000030000310000000f01000029000000110200002935342e8c0000040f0000000d02000029353432d80000040f00000d6c01000041000000400200043d0000000000120435001100000002001d00000004012000390000000d02000029000000000021043500000000010004140000001002000029000000040220008c000023d80000613d00000024040000390000002006000039000000100200002900000011030000290000000005030019353400990000040f000000000110004c000023d80000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f000000030330036700000005044002720000223b0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000022330000413d000000000520004c0000224a0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f000000400200043d00000d80010000410000000000120435001000000002001d0000000401200039000000090200002900000000002104350000000001000414000d00000001001d00000d540100004100000000001004390000000e0100002900000004001004430000000b01000029000000240010044300008005010000390000004402000039353400d00000040f0000001202000029000f00000002001d00000d5005100197000000040150008c0000238f0000613d0000000f01000029000000000110004c000023310000c13d00000024040000390000000d010000290000000002050019000000100300002900000000050300190000000006000019353400620000040f0000000002010019000023680000013d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f00000010030000290000000002320019000400000002001d00000d6d0220009c000009980000213d0000000402000029000000400020043f000000200110008c000029400000413d0000001001000029000000000101043300000d500210009c000029400000213d00000d71020000410000000403000029000000000023043500000004023000390000000000120435000000000100041400000d7202000041000000240400003900000020060000390000000005030019353400990000040f000000000110004c0000245a0000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f00000003033003670000000504400272000022a20000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b0000229a0000413d000000000520004c000022b10000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f00000003030000290000000002320019000200000002001d00000d6d0220009c000009980000213d0000000202000029000000400020043f000000200110008c000029400000413d0000000301000029000000000101043300000d500210009c000029400000213d00000d71020000410000000203000029000000000023043500000004023000390000000000120435000000000100041400000d7202000041000000240400003900000020060000390000000005030019353400990000040f000000000110004c000024a30000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f00000003033003670000000504400272000022e60000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000022de0000413d000000000520004c000022f50000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000001103000029000000000232001900000d6d0320009c000009980000213d000000400020043f000000200110008c000029400000413d000000110100002900000000020104330000000a01000029001100000002001d000000000112004b000005940000413d0000000c010000290000000e02000029000000000212004900000064010000390000000201100367000000000101043b001000000002001d000000000112004b00000000010000190000000101008039353431ce0000040f0000000a010000290000001102000029000000000212004900000084010000390000000201100367000000000101043b000d00000002001d000000000112004b00000000010000190000000101008039353431df0000040f00000001010000390000001202000029000e00000001001d001100000002001d000000000012041b00000d770100004100000000001004390000000f01000029000000040010044300008002010000390000002402000039353400d00000040f000000000110004c000025230000c13d00000011010000290000000002010019353400ec0000040f00000d4e01000041000000100300002900000d4e0230009c000000000201001900000000020340190000000d0400002900000d4e0340009c0000000001044019000000c0011002100000004002200210000000000112019f00000d74011001c700008009020000390000000f03000029000000000405001900000000050000193534352a0000040f00000010090000290000000003010019000000600330027000000d4e033001970000000f05000029000000000453004b00000000050340190000001f0450018f0000000505500272000023550000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b0000234d0000413d000000000640004c000023650000613d0000000505500210000000000651034f000000100700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c0000238f0000c13d00000001040000310000000f010000290000000001140019000000000141004b000029400000213d000000400100043d0000001f0240018f0000000f03000029000000030330036700000005044002720000237e0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000023760000413d000000000520004c0000238d0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f000000100100002900000d6d0110009c000009980000213d0000001001000029000000400010043f0000000f01000029000000000110004c000023a30000c13d00000008010000290000000902000029353434920000040f000000400100043d0000002002100039000000090300002900000000003204350000001102000029000000000021043500000040020000390000000003000019353400e20000040f0000000f010000290000000002010019353400ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000001103000029000000000232001900000d6d0320009c000009980000213d000000400020043f000000200110008c000029400000413d000000110100002900000000010104330000000a02000029353430b00000040f0000000c0200002900000010030000290000000003230049001000000003001d00000084020000390000000202200367000000000202043b000000000223004b00000000020000190000000102008039001100000001001d0000000001020019353431ce0000040f000000a4010000390000000201100367000000000101043b0000001102000029000000000112004b00000000010000190000000101008039353431df0000040f00000001010000390000001202000029000000000012041b000000400100043d0000002002100039000000110300002900000000003204350000001002000029000000000021043500000040020000390000000003000019353400e20000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600320018f00000011020000290000000002230019000000000332004b0000000003000019000000010300403900000d6d0420009c000009980000213d0000000103300190000009980000c13d000000400020043f000000200110008c000029400000413d000000110100002900000000010104330000000802000029353430b00000040f0000000c020000290000000202200367000000000202043b001100000001001d000000000221004b00000000010000190000000101008039353432c40000040f00000001010000390000001202000029000000000012041b000000400100043d0000001102000029000000000021043500000020020000390000000003000019353400e20000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f00000006030000290000000002320019000300000002001d00000d6d0220009c000009980000213d0000000302000029000000400020043f000000200110008c000029400000413d0000000601000029000000000101043300000d500210009c000029400000213d00000d71020000410000000303000029000000000023043500000004023000390000000000120435000000000100041400000d7202000041000000240400003900000020060000390000000005030019353400990000040f000000000110004c000025a00000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f00000003033003670000000504400272000024320000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b0000242a0000413d000000000520004c000024410000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f00000012010000290000000102000031000000200320008c000000200300003900000000030240190000001f03300039000000600330018f00000011040000290000000004430019000000000334004b00000000030000190000000103004039001000000004001d00000d6d0440009c000009980000213d0000000103300190000009980000c13d0000001003000029000000400030043f000000200220008c000024ed0000813d0000000002010019353400ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000000403000029000000000232001900000d6d0320009c000009980000213d000000400020043f000000200110008c000029400000413d00000004010000290000000001010433000400000001001d00000d500110009c000029400000213d0000000401000029000000000110004c0000286d0000c13d000000400200043d00000d7001000041000400000002001d000000000012043500000000010004140000000702000029000000040220008c000026550000613d00000004040000390000002006000039000000070200002900000004030000290000000005030019353400990000040f000000000110004c000026550000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f00000003033003670000000504400272000024920000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b0000248a0000413d000000000520004c000024a10000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f00000002030000290000000002320019000500000002001d00000d6d0220009c000009980000213d0000000502000029000000400020043f000000200110008c000029400000413d00000002010000290000000001010433000300000001001d00000d500110009c000029400000213d0000000301000029000000000110004c0000293b0000c13d00000d70010000410000000502000029000000000012043500000000010004140000000702000029000000040220008c0000267e0000613d00000004040000390000002006000039000000070200002900000005030000290000000005030019353400990000040f000000000110004c0000267e0000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f00000003033003670000000504400272000024dc0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000024d40000413d000000000520004c000024eb0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f00000011010000290000000001010433000300000001001d00000d70010000410000001002000029000000000012043500000000010004140000000e02000029000000040220008c0000255c0000613d000000040400003900000020060000390000000e0200002900000010030000290000000005030019353400990000040f000000000110004c0000255c0000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f00000003033003670000000504400272000025120000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b0000250a0000413d000000000520004c000025210000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f000000400200043d000000440120003900000010030000290000000000310435000000200320003900000d7d01000041000000000013043500000024012000390000000b0400002900000000004104350000000601000029000000000012043500000d7e0120009c000009980000213d0000008001200039000000400010043f00000000010004140000001204000029001100000004001d0000000f04000029000000040440008c000025e90000c13d00000011020000290000001f0120018f0000000502200272000025470000613d00000000040000190000000505400210000000110600002900000000065600190000000005530019000000000505043300000000005604350000000104400039000000000524004b0000253e0000413d000000000410004c0000000e04000029000f00000004001d0000262c0000613d00000005022002100000000003230019000000110400002900000000022400190000000301100210000000000402043300000000041401cf000000000414022f00000000030304330000010001100089000000000313022f00000000011301cf000000000141019f00000000001204350000000e01000029000f00000001001d0000262c0000013d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f00000010030000290000000002320019000600000002001d00000d6d0220009c000009980000213d0000000602000029000000400020043f000000200110008c000029400000413d0000001001000029000000000101043300000d500210009c000029400000213d00000d71020000410000000603000029000000000023043500000004023000390000000000120435000000000100041400000d7202000041000000240400003900000020060000390000000005030019353400990000040f000000000110004c000026ba0000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f000000030330036700000005044002720000258f0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000025870000413d000000000520004c0000259e0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000000303000029000000000232001900000d6d0320009c000009980000213d000000400020043f000000200110008c000029400000413d00000003010000290000000001010433000600000001001d00000d500110009c000029400000213d0000000601000029000000000110004c00002a850000c13d000000400200043d00000d7001000041000600000002001d000000000012043500000000010004140000000902000029000000040220008c000027040000613d00000004040000390000002006000039000000090200002900000006030000290000000005030019353400990000040f000000000110004c000027040000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f00000003033003670000000504400272000025d80000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000025d00000413d000000000520004c000025e70000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f00000000040204330000001102000029000000000220004c000025f30000c13d0000000f0200002900000000050000190000000006000019353400620000040f000f00000001001d0000262c0000013d00000d4e0200004100000d4e0530009c0000000003028019000000400330021000000d4e0540009c00000000040280190000006004400210000000000334019f00000d4e0410009c0000000001028019000000c001100210000000000113019f00000d7f011001c7000080090200003900000011030000290000000f0400002900000000050000193534352a0000040f0000000003010019000000600330027000000d4e033001970000001105000029000000000453004b00000000050340190000001f0450018f0000000505500272000026180000613d0000000006000019000000050760021000000011080000290000000008780019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b0000260f0000413d000000000640004c000026280000613d0000000505500210000000000651034f000000110700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000f00000002001d000100000003001f00030000000103553534345b0000040f0000000f02000029000000000220004c0000263c0000613d0000000002010433000000000320004c0000263f0000c13d00000d770100004100000000001004390000000701000029000000040010044300008002010000390000002402000039353400d00000040f000000000110004c000026a20000c13d00000011010000290000000002010019353400ec0000040f00000d4f03000041000000200420008c0000000004000019000000000403401900000d4f02200197000000000520004c000000000300a01900000d4f0220009c00000000020400190000000002036019000000000220004c000029400000c13d00000020011000390000000001010433000000000210004c0000000002000019000000010200c039000000000221004b000029400000c13d000000000110004c0000263c0000613d000026330000013d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f00000004030000290000000003320019000000000223004b00000000020000190000000102004039001000000003001d00000d6d0330009c000009980000213d0000000102200190000009980000c13d0000001002000029000000400020043f000000200110008c000029400000413d0000000401000029000000000101043300000d500210009c000029400000213d00000d730200004100000010030000290000000000230435000000040230003900000000001204350000000001000414000000120200002a000700000002001d000027a30000c13d00000d72020000410000002404000039000000200600003900000010030000290000000005030019353400620000040f0000000002010019000027d90000013d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f00000005030000290000000002320019000700000002001d00000d6d0220009c000009980000213d0000000702000029000000400020043f000000200110008c000029400000413d0000000501000029000000000101043300000d500210009c000029400000213d00000d730200004100000007030000290000000000230435000000040230003900000000001204350000000001000414000000120200002a000500000002001d000028000000c13d00000d72020000410000002404000039000000200600003900000007030000290000000005030019353400620000040f0000000002010019000028350000013d000000400200043d00000d80010000410000000000120435001100000002001d00000004012000390000000d02000029000000000021043500000000010004140000001202000029000f00000002001d0000000702000029000000040220008c0000278a0000613d0000000f02000029000000000220004c0000272d0000c13d00000024040000390000000702000029000000110300002900000000050300190000000006000019353400620000040f0000000002010019000027630000013d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f00000006030000290000000002320019001100000002001d00000d6d0220009c000009980000213d0000001102000029000000400020043f000000200110008c000029400000413d00000006010000290000000001010433001000000001001d00000d500110009c000029400000213d0000001001000029000000000110004c00002c850000c13d00000d70010000410000001102000029000000000012043500000000010004140000000e02000029000000040220008c000029f30000613d000000040400003900000020060000390000000e0200002900000011030000290000000005030019353400990000040f000000000110004c000029f30000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f00000003033003670000000504400272000026f30000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000026eb0000413d000000000520004c000027020000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f00000006030000290000000003320019000000000223004b00000000020000190000000102004039000900000003001d00000d6d0330009c000009980000213d0000000102200190000009980000c13d0000000902000029000000400020043f000000200110008c000029400000413d0000000601000029000000000101043300000d500210009c000029400000213d00000d730200004100000009030000290000000000230435000000040230003900000000001204350000000001000414000000120200002a000600000002001d00002a170000c13d00000d72020000410000002404000039000000200600003900000009030000290000000005030019353400620000040f000000000201001900002a4d0000013d00000d4e02000041000000110400002900000d4e0340009c0000000003020019000000000304401900000d4e0410009c0000000001028019000000c0011002100000004002300210000000000112019f00000d74011001c700008009020000390000000f03000029000000070400002900000000050000193534352a0000040f0000000003010019000000600330027000000d4e033001970000000f05000029000000000453004b00000000050340190000001f0450018f0000000505500272000027500000613d0000000006000019000000050760021000000011080000290000000008780019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000027470000413d000000000640004c000027600000613d0000000505500210000000000651034f000000110700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c0000278a0000c13d00000001040000310000000f010000290000000001140019000000000141004b000029400000213d000000400100043d0000001f0240018f0000000f0300002900000003033003670000000504400272000027790000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000027710000413d000000000520004c000027880000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f000000110100002900000d6d0110009c000009980000213d0000001101000029000000400010043f0000000f01000029000000000110004c000027a00000c13d0000000b010000290000000d02000029353434920000040f0000000e01000029000000000010041b000000400100043d00000020021000390000000d0300002900000000003204350000001002000029000000000021043500000040020000390000000003000019353400e20000040f0000000f010000290000000002010019353400ec0000040f00000d4e02000041000000100400002900000d4e0340009c0000000003020019000000000304401900000d4e0410009c0000000001028019000000c0011002100000004002300210000000000112019f00000d74011001c7000080090200003900000d7204000041000000070300002900000000050000193534352a0000040f0000000003010019000000600330027000000d4e03300197000000200430008c000000200500003900000000050340190000001f0450018f0000000505500272000027c60000613d0000000006000019000000050760021000000010080000290000000008780019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000027bd0000413d000000000640004c000027d60000613d0000000505500210000000000651034f000000100700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f00030000000103550000000104000031000000000120004c0000285c0000c13d00000007010000290000000001140019000000000141004b000029400000213d000000400100043d0000001f0240018f000000070300002900000003033003670000000504400272000027ef0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000027e70000413d000000000520004c000027fe0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f00000d4e0200004100000d4e0310009c0000000001028019000000070400002900000d4e0340009c00000000020440190000004002200210000000c001100210000000000121019f00000d74011001c7000080090200003900000d7204000041000000050300002900000000050000193534352a0000040f0000000003010019000000600330027000000d4e03300197000000200430008c000000200500003900000000050340190000001f0450018f0000000505500272000028220000613d0000000006000019000000050760021000000007080000290000000008780019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000028190000413d000000000640004c000028320000613d0000000505500210000000000651034f000000070700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f00030000000103550000000104000031000000000120004c000029280000c13d00000005010000290000000001140019000000000141004b000029400000213d000000400100043d0000001f0240018f0000000503000029000000030330036700000005044002720000284b0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000028430000413d000000000520004c0000285a0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f000000200140008c000000200100003900000000010440190000001f01100039000000600110018f0000001002000029000000000121001900000d6d0210009c000009980000213d000000400010043f000000200140008c000029400000413d00000010010000290000000001010433000400000001001d00000d500110009c000029400000213d0000000e010000290000000201100367000000000501043b00000d500150009c000029400000213d000000400600043d00000d7501000041000000000016043500000024026000390000000001000414000000120300002900000003040000290000000000420435001000000006001d000000040260003900000004040000290000000000420435000000040250008c000028e50000613d000000000230004c0000288a0000c13d00000044040000390000002006000039000000000205001900000010030000290000000005030019353400620000040f0000000002010019000028bf0000013d00000d4e02000041000000100600002900000d4e0460009c0000000004020019000000000406401900000d4e0610009c0000000001028019000000c0011002100000004002400210000000000112019f00000d76011001c70000800902000039000000000405001900000000050000193534352a0000040f0000000003010019000000600330027000000d4e03300197000000200430008c000000200500003900000000050340190000001f0450018f0000000505500272000028ac0000613d0000000006000019000000050760021000000010080000290000000008780019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000028a30000413d000000000640004c000028bc0000613d0000000505500210000000000651034f000000100700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c000028e50000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f00000003033003670000000504400272000028d40000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000028cc0000413d000000000520004c000028e30000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600320018f00000010020000290000000002230019000000000332004b0000000003000019000000010300403900000d6d0420009c000009980000213d0000000103300190000009980000c13d000000400020043f000000200110008c000029400000413d00000010010000290000000001010433000000000210004c0000000002000019000000010200c039000000000121004b000029400000c13d0000000e010000290000000201100367000000000101043b000700000001001d00000d500110009c000029400000213d00000d770100004100000000001004390000000401000029000000040010044300008002010000390000002402000039353400d00000040f000000000110004c00000c4c0000613d000000400500043d00000d7801000041000000000015043500000024025000390000000001000414000000120300002900000003040000290000000000420435001000000005001d0000000402500039000000070400002900000000004204350000001202000029000700000002001d0000000402000029000000040220008c00002b9c0000613d000000000230004c00002b400000c13d00000044040000390000000402000029000000100300002900000000050300190000000706000029353400620000040f000000000201001900002b750000013d000000200140008c000000200100003900000000010440190000001f01100039000000600110018f00000007020000290000000001210019000500000001001d00000d6d0110009c000009980000213d0000000501000029000000400010043f000000200140008c000029400000413d00000007010000290000000001010433000300000001001d00000d500110009c000029400000213d0000000d010000290000000201100367000000000501043b00000d500150009c000029430000a13d00000000010000190000000002000019353400ec0000040f00000d75010000410000000506000029000000000016043500000024026000390000000001000414000000120300002900000001040000290000000000420435000000040260003900000003040000290000000000420435000000040250008c000029b50000613d000000000230004c0000295a0000c13d00000044040000390000002006000039000000000205001900000005030000290000000005030019353400620000040f00000000020100190000298f0000013d00000d4e02000041000000050600002900000d4e0460009c0000000004020019000000000406401900000d4e0610009c0000000001028019000000c0011002100000004002400210000000000112019f00000d76011001c70000800902000039000000000405001900000000050000193534352a0000040f0000000003010019000000600330027000000d4e03300197000000200430008c000000200500003900000000050340190000001f0450018f00000005055002720000297c0000613d0000000006000019000000050760021000000005080000290000000008780019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000029730000413d000000000640004c0000298c0000613d0000000505500210000000000651034f000000050700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c000029b50000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f00000003033003670000000504400272000029a40000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b0000299c0000413d000000000520004c000029b30000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000000503000029000000000232001900000d6d0320009c000009980000213d000000400020043f000000200110008c000029400000413d00000005010000290000000001010433000000000210004c0000000002000019000000010200c039000000000121004b000029400000c13d0000000d010000290000000201100367000000000101043b000500000001001d00000d500110009c000029400000213d00000d770100004100000000001004390000000301000029000000040010044300008002010000390000002402000039353400d00000040f000000000110004c00000c4c0000613d000000400500043d00000d7801000041000000000015043500000024025000390000000001000414000000120300002900000001040000290000000000420435000700000005001d0000000402500039000000050400002900000000004204350000001202000029000500000002001d0000000302000029000000040220008c00002c070000613d000000000230004c00002bab0000c13d00000044040000390000000302000029000000070300002900000000050300190000000506000029353400620000040f000000000201001900002be00000013d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f00000011030000290000000002320019001000000002001d00000d6d0220009c000009980000213d0000001002000029000000400020043f000000200110008c000029400000413d0000001101000029000000000101043300000d500210009c000029400000213d00000d730200004100000010030000290000000000230435000000040230003900000000001204350000000001000414000000120200002a001100000002001d00002c160000c13d00000d72020000410000002404000039000000200600003900000010030000290000000005030019353400620000040f000000000201001900002c4b0000013d00000d4e02000041000000090400002900000d4e0340009c0000000003020019000000000304401900000d4e0410009c0000000001028019000000c0011002100000004002300210000000000112019f00000d74011001c7000080090200003900000d7204000041000000060300002900000000050000193534352a0000040f0000000003010019000000600330027000000d4e03300197000000200430008c000000200500003900000000050340190000001f0450018f000000050550027200002a3a0000613d0000000006000019000000050760021000000009080000290000000008780019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00002a310000413d000000000640004c00002a4a0000613d0000000505500210000000000651034f000000090700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f00030000000103550000000104000031000000000120004c00002a740000c13d00000006010000290000000001140019000000000141004b000029400000213d000000400100043d0000001f0240018f00000006030000290000000303300367000000050440027200002a630000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00002a5b0000413d000000000520004c00002a720000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f000000200140008c000000200100003900000000010440190000001f01100039000000600110018f0000000902000029000000000121001900000d6d0210009c000009980000213d000000400010043f000000200140008c000029400000413d00000009010000290000000001010433000600000001001d00000d500110009c000029400000213d0000000f010000290000000201100367000000000501043b00000d500150009c000029400000213d000000400600043d00000d7501000041000000000016043500000024026000390000000001000414000000120300002900000005040000290000000000420435000900000006001d000000040260003900000006040000290000000000420435000000040250008c00002afd0000613d000000000230004c00002aa20000c13d00000044040000390000002006000039000000000205001900000009030000290000000005030019353400620000040f000000000201001900002ad70000013d00000d4e02000041000000090600002900000d4e0460009c0000000004020019000000000406401900000d4e0610009c0000000001028019000000c0011002100000004002400210000000000112019f00000d76011001c70000800902000039000000000405001900000000050000193534352a0000040f0000000003010019000000600330027000000d4e03300197000000200430008c000000200500003900000000050340190000001f0450018f000000050550027200002ac40000613d0000000006000019000000050760021000000009080000290000000008780019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00002abb0000413d000000000640004c00002ad40000613d0000000505500210000000000651034f000000090700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c00002afd0000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f0000000303300367000000050440027200002aec0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00002ae40000413d000000000520004c00002afb0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600320018f00000009020000290000000002230019000000000332004b0000000003000019000000010300403900000d6d0420009c000009980000213d0000000103300190000009980000c13d000000400020043f000000200110008c000029400000413d00000009010000290000000001010433000000000210004c0000000002000019000000010200c039000000000121004b000029400000c13d0000000f010000290000000201100367000000000101043b000300000001001d00000d500110009c000029400000213d00000d770100004100000000001004390000000601000029000000040010044300008002010000390000002402000039353400d00000040f000000000110004c00000c4c0000613d000000400500043d00000d7801000041000000000015043500000024025000390000000001000414000000120300002900000005040000290000000000420435000900000005001d0000000402500039000000030400002900000000004204350000001202000029000300000002001d0000000602000029000000040220008c00002d9b0000613d000000000230004c00002d3f0000c13d00000044040000390000000602000029000000090300002900000000050300190000000306000029353400620000040f000000000201001900002d740000013d00000d4e02000041000000100500002900000d4e0450009c0000000004020019000000000405401900000d4e0510009c0000000001028019000000c0011002100000004002400210000000000112019f00000d76011001c70000800902000039000000040400002900000000050000193534352a0000040f0000000003010019000000600330027000000d4e033001970000000705000029000000000453004b00000000050340190000001f0450018f000000050550027200002b620000613d0000000006000019000000050760021000000010080000290000000008780019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00002b590000413d000000000640004c00002b720000613d0000000505500210000000000651034f000000100700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c00002b9c0000c13d000000010400003100000007010000290000000001140019000000000141004b000029400000213d000000400100043d0000001f0240018f00000007030000290000000303300367000000050440027200002b8b0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00002b830000413d000000000520004c00002b9a0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f000000100100002900000d6d0110009c000009980000213d0000000c0100002900000005020000290000000001210049000c00000001001d0000001001000029000000400010043f0000000701000029000000000110004c00000edf0000613d00000007010000290000000002010019353400ec0000040f00000d4e02000041000000070500002900000d4e0450009c0000000004020019000000000405401900000d4e0510009c0000000001028019000000c0011002100000004002400210000000000112019f00000d76011001c70000800902000039000000030400002900000000050000193534352a0000040f0000000003010019000000600330027000000d4e033001970000000505000029000000000453004b00000000050340190000001f0450018f000000050550027200002bcd0000613d0000000006000019000000050760021000000007080000290000000008780019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00002bc40000413d000000000640004c00002bdd0000613d0000000505500210000000000651034f000000070700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c00002c070000c13d000000010400003100000005010000290000000001140019000000000141004b000029400000213d000000400100043d0000001f0240018f00000005030000290000000303300367000000050440027200002bf60000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00002bee0000413d000000000520004c00002c050000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f000000070100002900000d6d0110009c000009980000213d0000000c0100002900000004020000290000000001210049000c00000001001d0000000701000029000000400010043f0000000501000029000000000110004c00000f540000613d00000005010000290000000002010019353400ec0000040f00000d4e0200004100000d4e0310009c0000000001028019000000100400002900000d4e0340009c00000000020440190000004002200210000000c001100210000000000121019f00000d74011001c7000080090200003900000d7204000041000000110300002900000000050000193534352a0000040f0000000003010019000000600330027000000d4e03300197000000200430008c000000200500003900000000050340190000001f0450018f000000050550027200002c380000613d0000000006000019000000050760021000000010080000290000000008780019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00002c2f0000413d000000000640004c00002c480000613d0000000505500210000000000651034f000000100700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f00030000000103550000000104000031000000000120004c00002c720000c13d00000011010000290000000001140019000000000141004b000029400000213d000000400100043d0000001f0240018f00000011030000290000000303300367000000050440027200002c610000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00002c590000413d000000000520004c00002c700000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f000000200140008c000000200100003900000000010440190000001f01100039000000600110018f00000010020000290000000001210019001100000001001d00000d6d0110009c000009980000213d0000001101000029000000400010043f000000200140008c000029400000413d00000010010000290000000001010433001000000001001d00000d500110009c000029400000213d0000000b010000290000000001010433000000000110004c0000000801000029000002640000613d0000000001010433000000000201043300000d7501000041000000110600002900000000001604350000002404600039000000000100041400000012030000290000000305000029000000000054043500000004046000390000001005000029000000000054043500000d5005200197000000040250008c00002cfe0000613d000000000230004c00002ca40000c13d00000044040000390000002006000039000000000205001900000011030000290000000005030019353400620000040f000000000201001900002cd80000013d00000d4e0200004100000d4e0410009c0000000001028019000000110600002900000d4e0460009c00000000020640190000004002200210000000c001100210000000000121019f00000d76011001c70000800902000039000000000405001900000000050000193534352a0000040f0000000003010019000000600330027000000d4e03300197000000200430008c000000200500003900000000050340190000001f0450018f000000050550027200002cc50000613d0000000006000019000000050760021000000011080000290000000008780019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00002cbc0000413d000000000640004c00002cd50000613d0000000505500210000000000651034f000000110700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c00002cfe0000c13d000000120300002900000001040000310000000001340019000000000141004b000029400000213d000000400100043d0000001f0240018f0000000303300367000000050440027200002ced0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00002ce50000413d000000000520004c00002cfc0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000001103000029000000000232001900000d6d0320009c000009980000213d000000400020043f000000200110008c000029400000413d00000011010000290000000001010433000000000210004c0000000002000019000000010200c039000000000121004b000029400000c13d0000000b010000290000000001010433000000000110004c0000000801000029000002640000613d00000000010104330000000001010433001100000001001d00000d770100004100000000001004390000001001000029000000040010044300008002010000390000002402000039353400d00000040f000000000110004c00000c4c0000613d000000400500043d00000d7801000041000000000015043500000024025000390000000001000414000000120300002900000003040000290000000000420435000000110200002900000d5002200197001100000005001d000000040450003900000000002404350000001002000029000000040220008c00002e050000613d0000001202000029000e00000002001d000000000230004c00002daa0000c13d00000044040000390000001002000029000000110300002900000000050300190000000e06000029353400620000040f000000000201001900002dde0000013d00000d4e02000041000000090500002900000d4e0450009c0000000004020019000000000405401900000d4e0510009c0000000001028019000000c0011002100000004002400210000000000112019f00000d76011001c70000800902000039000000060400002900000000050000193534352a0000040f0000000003010019000000600330027000000d4e033001970000000305000029000000000453004b00000000050340190000001f0450018f000000050550027200002d610000613d0000000006000019000000050760021000000009080000290000000008780019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00002d580000413d000000000640004c00002d710000613d0000000505500210000000000651034f000000090700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c00002d9b0000c13d000000010400003100000003010000290000000001140019000000000141004b000029400000213d000000400100043d0000001f0240018f00000003030000290000000303300367000000050440027200002d8a0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00002d820000413d000000000520004c00002d990000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f000000090100002900000d6d0110009c000009980000213d000000040100002900000005020000290000000001210049000400000001001d0000000901000029000000400010043f0000000301000029000000000110004c000019160000613d00000003010000290000000002010019353400ec0000040f00000d4e0200004100000d4e0410009c0000000001028019000000110500002900000d4e0450009c00000000020540190000004002200210000000c001100210000000000121019f00000d76011001c70000800902000039000000100400002900000000050000193534352a0000040f0000000003010019000000600330027000000d4e033001970000000e05000029000000000453004b00000000050340190000001f0450018f000000050550027200002dcb0000613d0000000006000019000000050760021000000011080000290000000008780019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00002dc20000413d000000000640004c00002ddb0000613d0000000505500210000000000651034f000000110700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c00002e050000c13d00000001040000310000000e010000290000000001140019000000000141004b000029400000213d000000400100043d0000001f0240018f0000000e030000290000000303300367000000050440027200002df40000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00002dec0000413d000000000520004c00002e030000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031353400ec0000040f000000110100002900000d6d0110009c000009980000213d0000000a0100002900000007020000290000000001210049000a00000001001d0000001101000029000000400010043f000018b40000013d000000000101043300000d8c0210009c00002e130000813d000000000001042d00000000010000190000000002000019353400ec0000040f00000004010000390000000201100367000000000101043b00000d8c0210009c00002e1c0000813d000000000001042d00000000010000190000000002000019353400ec0000040f00000024010000390000000201100367000000000101043b00000d8c0210009c00002e250000813d000000000001042d00000000010000190000000002000019353400ec0000040f00000044010000390000000201100367000000000101043b000000000210004c0000000002000019000000010200c039000000000221004b00002e310000c13d000000000001042d00000000010000190000000002000019353400ec0000040f0000001f0310003900000d4f04000041000000000523004b0000000005000019000000000504401900000d4f0620019700000d4f03300197000000000763004b000000000400a019000000000363013f00000d4f0330009c00000000030500190000000003046019000000000330004c00002e4e0000613d0000000203100367000000000303043b00000d6d0430009c00002e4e0000213d00000060543000c900000020011000390000000004410019000000000224004b00002e4e0000213d0000000002030019000000000001042d00000000010000190000000002000019353400ec0000040f00020000000000020000000002010019000000040120008a00000d4f030000410000009f0410008c0000000004000019000000000403201900000d4f01100197000000000510004c000000000300801900000d4f0110009c00000000010400190000000001036019000000000110004c00002e790000613d00000002010003670000002403100370000000000303043b000200000003001d0000000403100370000000000303043b000100000003001d0000004401100370000000000101043b00000d6d0310009c00002e790000213d000000040110003935342e340000040f0000000003010019000000000402001900000002010003670000006402100370000000000502043b00000d500250009c00002e790000213d0000008401100370000000000601043b00000001010000290000000202000029000000000001042d00000000010000190000000002000019353400ec0000040f0000002003000039000000000031043500000000030204330000002004100039000000000034043500000040011000390000000004000019000000000534004b00002e8b0000813d0000002002200039000000000502043300000000005104350000000104400039000000200110003900002e830000013d000000000001042d00000d8d0420009c00002ed50000813d00000005042002100000003f04400039000000200500008a000000000554016f000000400400043d0000000005540019000000000645004b0000000006000019000000010600403900000d6d0750009c00002ed50000213d000000010660019000002ed50000c13d000000400050043f000000000024043500000060522000c90000000002120019000000000532004b00002ed20000213d0000000005040019000000000621004b00002ed00000813d000000000613004900000d4f07000041000000600860008c0000000008000019000000000807401900000d4f06600197000000000960004c000000000700a01900000d4f0660009c00000000060800190000000006076019000000000660004c00002ed20000c13d000000400600043d00000d8e0760009c00002ed50000213d0000006007600039000000400070043f0000000207100367000000000707043b00000d500870009c00002ed20000213d000000000076043500000020071000390000000207700367000000000707043b00000d500870009c00002ed20000213d0000002008600039000000000078043500000040071000390000000207700367000000000707043b000000000870004c0000000008000019000000010800c039000000000887004b00002ed20000c13d0000002005500039000000400860003900000000007804350000000000650435000000600110003900002ea20000013d0000000001040019000000000001042d00000000010000190000000002000019353400ec0000040f00000d520100004100000000001004350000004101000039000000040010043f00000024020000390000000001000019353400ec0000040f000000040110008a00000d4f02000041000000df0310008c0000000003000019000000000302201900000d4f01100197000000000410004c000000000200801900000d4f0110009c00000000010300190000000001026019000000000110004c00002f020000613d00000002070003670000000401700370000000000101043b00000d500210009c00002f020000213d0000002402700370000000000202043b000000000320004c0000000003000019000000010300c039000000000332004b00002f020000c13d000000a403700370000000000603043b00000d500360009c00002f020000213d0000004403700370000000000303043b0000006404700370000000000404043b0000008405700370000000000505043b000000c407700370000000000707043b000000000001042d00000000010000190000000002000019353400ec0000040f000000000110004c00002f080000613d000000000001042d00000d520100004100000000001004350000000101000039000000040010043f00000024020000390000000001000019353400ec0000040f00000d500410019700000d5005200197000000000354004b00002f1c0000613d000000000354004b0000000003020019000000000301401900000d500630019800002f2a0000613d000000000454004b00000000020180190000000001030019000000000001042d000000400100043d000000440210003900000d9103000041000000000032043500000024021000390000001b03000039000000000032043500000d900200004100000000002104350000000402100039000000200300003900000000003204350000006402000039353400ec0000040f000000400100043d000000440210003900000d8f03000041000000000032043500000024021000390000001403000039000000000032043500000d900200004100000000002104350000000402100039000000200300003900000000003204350000006402000039353400ec0000040f0005000000000002000300000003001d000200000002001d000400000001001d35342f0f0000040f00000d8601000041000000400200043d000500000002001d00000000001204350000000001000414000100000001001d00000d5401000041000000000010043900000000010004120000000400100443000000240000044300008005010000390000004402000039353400d00000040f00000005030000290000000302000029000000000220004c0000000002000019000000010200c03900000044043000390000000000240435000000020200002900000d500220019700000024043000390000000000240435000000040200002900000d50022001970000000404300039000000000024043500000d5002100197000000040120008c00002f650000613d0000006404000039000000200600003900000001010000290000000505000029353400990000040f0000000503000029000000000110004c00002f940000613d0000000102000031000000200120008c000000200100003900000000010240190000001f01100039000000600410018f0000000001340019000000000441004b0000000005000019000000010500403900000d6d0410009c00002f800000213d000000010450019000002f800000c13d000000400010043f0000001f0220008c00002f7d0000a13d000000000203043300000d500320009c00002f7d0000213d000000000320004c00002f870000613d0000000001020019000000000001042d00000000010000190000000002000019353400ec0000040f00000d520100004100000000001004350000004101000039000000040010043f00000024020000390000000001000019353400ec0000040f000000440210003900000d9203000041000000000032043500000024021000390000000703000039000000000032043500000d900200004100000000002104350000000402100039000000200300003900000000003204350000006402000039353400ec0000040f0000000302000367000000400100043d00000001040000310000001f0340018f000000050440027200002fa30000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b00002f9b0000413d000000000530004c00002fb20000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f00000000002404350000000102000031353400ec0000040f0005000000000002000300000003001d000200000002001d000400000001001d35342f0f0000040f00000d8601000041000000400200043d000500000002001d00000000001204350000000001000414000100000001001d00000d5401000041000000000010043900000000010004120000000400100443000000240000044300008005010000390000004402000039353400d00000040f00000005030000290000000302000029000000000220004c0000000002000019000000010200c03900000044043000390000000000240435000000020200002900000d500220019700000024043000390000000000240435000000040200002900000d50022001970000000404300039000000000024043500000d5002100197000000040120008c00002fe10000613d0000006404000039000000200600003900000001010000290000000505000029353400990000040f0000000503000029000000000110004c000030000000613d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600420018f0000000002340019000000000442004b0000000005000019000000010500403900000d6d0420009c00002ff90000213d000000010450019000002ff90000c13d000000400020043f0000001f0110008c00002ff60000a13d000000000103043300000d500210009c00002ff60000213d000000000001042d00000000010000190000000002000019353400ec0000040f00000d520100004100000000001004350000004101000039000000040010043f00000024020000390000000001000019353400ec0000040f0000000302000367000000400100043d00000001040000310000001f0340018f00000005044002720000300f0000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b000030070000413d000000000530004c0000301e0000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f00000000002404350000000102000031353400ec0000040f000000000212004900000d4f030000410000005f0420008c0000000004000019000000000403201900000d4f02200197000000000520004c000000000300801900000d4f0220009c00000000020400190000000002036019000000000220004c000030340000613d000000200210003900000000020204330000000004010433000000400110003900000000030104330000000001040019000000000001042d00000000010000190000000002000019353400ec0000040f0004000000000002000300000003001d000200000002001d000400000001001d35342f0f0000040f000100000001001d00000004010000290000000202000029000000030300002935342fb40000040f00000d9302000041000000400500043d00000000002504350000000002010019000000000100041400000d5002200197000000040320008c000030520000613d000000040400003900000060060000390000000003050019000300000005001d0000000305000029353400990000040f0000000305000029000000000110004c000030730000613d0000000101000031000000600210008c00000060010080390000001f02100039000000e00320018f0000000002530019000000000332004b0000000003000019000000010300403900000d6d0420009c0000306c0000213d00000001033001900000306c0000c13d000000400020043f00000000025100190000000001050019353430200000040f00000004030000290000000104000029000000000334013f00000d500330019800000000030200190000000003016019000000000201c0190000000001030019000000000001042d00000d520100004100000000001004350000004101000039000000040010043f00000024020000390000000001000019353400ec0000040f0000000302000367000000400100043d00000001040000310000001f0340018f0000000504400272000030820000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b0000307a0000413d000000000530004c000030910000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f00000000002404350000000102000031353400ec0000040f000000000110004c000030960000613d000000000001042d000000400100043d000000440210003900000d9403000041000000000032043500000024021000390000001403000039000000000032043500000d900200004100000000002104350000000402100039000000200300003900000000003204350000006402000039353400ec0000040f0000000002010433000000000220004c000030a90000613d0000002001100039000000000001042d00000d520100004100000000001004350000003201000039000000040010043f00000024020000390000000001000019353400ec0000040f000000000321004b000030b40000413d0000000001210049000000000001042d00000d520100004100000000001004350000001101000039000000040010043f00000024020000390000000001000019353400ec0000040f000000000410004c000030c70000613d000000000420004c000030d50000613d000000000430004c000030d50000613d00000000541300a900000000511400d9000000000131004b000030e30000c13d00000000212400d9000000000001042d000000400100043d000000440210003900000d9603000041000000000032043500000024021000390000001b03000039000000000032043500000d900200004100000000002104350000000402100039000000200300003900000000003204350000006402000039353400ec0000040f000000400100043d000000440210003900000d9503000041000000000032043500000024021000390000001e03000039000000000032043500000d900200004100000000002104350000000402100039000000200300003900000000003204350000006402000039353400ec0000040f00000d520100004100000000001004350000001101000039000000040010043f00000024020000390000000001000019353400ec0000040f0006000000000002000200000004001d000500000003001d000400000002001d000300000001001d000000400200043d000600000002001d00000d860100004100000000001204350000000001000414000100000001001d00000d5401000041000000000010043900000000010004120000000400100443000000240000044300008005010000390000004402000039353400d00000040f00000006030000290000000502000029000000000220004c0000000002000019000000010200c03900000044043000390000000000240435000000040200002900000d500220019700000024043000390000000000240435000000030200002900000d50022001970000000404300039000000000024043500000d5002100197000000040120008c000031170000613d0000006404000039000000200600003900000001010000290000000605000029353400990000040f0000000603000029000000000110004c000031820000613d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600420018f0000000002340019000000000442004b0000000005000019000000010500403900000d6d0420009c0000317b0000213d00000001045001900000317b0000c13d000000400020043f0000001f0110008c000031780000a13d000000000403043300000d500140009c000031780000213d000000000140004c00000000010000190000000002000019000031770000613d000000030100002900000004020000290000000503000029000600000004001d353430370000040f000000060500002900000d8704000041000000400300043d000000000043043500000000070100190000000001000414000000040450008c000031490000613d0000000404000039000500000002001d000000200600003900000000020500190000000005030019000600000007001d000400000003001d353400990000040f000000040300002900000006070000290000000502000029000000000110004c000031820000613d0000000101000031000000200410008c000000200400003900000000040140190000001f04400039000000600440018f0000000005340019000000000445004b0000000006000019000000010600403900000d6d0450009c0000317b0000213d00000001046001900000317b0000c13d000000400050043f000000200110008c000031780000413d00000000060304330000000203000029000000000130004c000031720000613d000000000403001900000000314700a900000000434100d9000000000373004b0000316b0000c13d000000000360004c000031a20000613d00000000316100d9000000020500002900000000435200a900000000545300d9000000000424004b000031760000613d00000d520100004100000000001004350000001101000039000000040010043f00000024020000390000000001000019353400ec0000040f000000000160004c00000000030000190000000001000019000031a20000613d00000000326300d9000000000001042d00000000010000190000000002000019353400ec0000040f00000d520100004100000000001004350000004101000039000000040010043f00000024020000390000000001000019353400ec0000040f0000000302000367000000400100043d00000001040000310000001f0340018f0000000504400272000031910000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b000031890000413d000000000530004c000031a00000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f00000000002404350000000102000031353400ec0000040f00000d520100004100000000001004350000001201000039000000040010043f00000024020000390000000001000019353400ec0000040f000000000110004c000031ac0000613d000000000001042d000000400100043d000000440210003900000d9703000041000000000032043500000024021000390000000f03000039000000000032043500000d900200004100000000002104350000000402100039000000200300003900000000003204350000006402000039353400ec0000040f000000000100041a000000020110008c000031c00000613d0000000201000039000000000010041b000000000001042d000000400100043d000000440210003900000d9803000041000000000032043500000024021000390000001f03000039000000000032043500000d900200004100000000002104350000000402100039000000200300003900000000003204350000006402000039353400ec0000040f000000000110004c000031d10000613d000000000001042d000000400100043d000000440210003900000d9903000041000000000032043500000024021000390000001d03000039000000000032043500000d900200004100000000002104350000000402100039000000200300003900000000003204350000006402000039353400ec0000040f000000000110004c000031e20000613d000000000001042d000000400100043d000000440210003900000d9a03000041000000000032043500000024021000390000001d03000039000000000032043500000d900200004100000000002104350000000402100039000000200300003900000000003204350000006402000039353400ec0000040f000c000000000002000700000007001d000c00000005001d000b00000003001d000a00000002001d000900000001001d000800000004001d000600000006001d000000000164004b000032930000413d0000000c010000290000000702000029000000000121004b000032930000413d00000d5401000041000000000010043900000000010004120000000400100443000000240000044300008005010000390000004402000039353400d00000040f00000d8602000041000000400900043d00000000002904350000000b02000029000000000220004c0000000006000019000000010600c03900000000020100190000004403900039000000000100041400000000006304350000000a0300002900000d500730019700000024039000390000000000730435000000090300002900000d50083001970000000403900039000000000083043500000d5005200197000000040250008c0000322e0000613d0000006404000039000400000006001d000000200600003900000000020500190000000003090019000500000005001d0000000005090019000300000007001d000200000008001d000100000009001d353400990000040f00000001090000290000000208000029000000030700002900000004060000290000000505000029000000000110004c0000329d0000613d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000000003920019000000000223004b0000000002000019000000010200403900000d6d0430009c000032960000213d0000000102200190000032960000c13d000000400030043f000000200110008c000032930000413d000000000109043300000d500210009c000032930000213d000000000110004c000032670000c13d00000d9b0100004100000000001304350000004402300039000000000100041400000000006204350000002402300039000000000072043500000004023000390000000000820435000000040250008c000032580000613d000000640400003900000020060000390000000002050019000500000003001d0000000505000029353400620000040f0000000503000029000000000110004c0000329d0000613d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f000000000232001900000d6d0420009c000032960000213d000000400020043f000000200110008c000032930000413d000000000103043300000d500110009c000032930000213d00000009010000290000000a020000290000000b03000029353430370000040f0000000003010019000000000402001900000000014301a00000000801000029000032910000613d000b00000003001d0000000002030019000a00000004001d0000000003040019353430bb0000040f00000000030100190000000c01000029000000000213004b000032880000a13d0000000a020000290000000b03000029353430bb0000040f00000000020100190000000801000029000000000112004b000032bd0000213d0000000601000029000000000112004b00000000010000190000000101008039000b00000002001d353431ce0000040f0000000b01000029000032910000013d0000000701000029000000000113004b00000000010000190000000101008039000c00000003001d353431df0000040f0000000c01000029000c00000001001d00000008010000290000000c02000029000000000001042d00000000010000190000000002000019353400ec0000040f00000d520100004100000000001004350000004101000039000000040010043f00000024020000390000000001000019353400ec0000040f0000000302000367000000400100043d00000001040000310000001f0340018f0000000504400272000032ac0000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b000032a40000413d000000000530004c000032bb0000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f00000000002404350000000102000031353400ec0000040f00000d520100004100000000001004350000000101000039000000040010043f00000024020000390000000001000019353400ec0000040f000000000110004c000032c70000613d000000000001042d000000400100043d000000640210003900000d9c030000410000000000320435000000440210003900000d9d03000041000000000032043500000024021000390000002203000039000000000032043500000d900200004100000000002104350000000402100039000000200300003900000000003204350000008402000039353400ec0000040f000a000000000002000100000002001d00000000030100190000002001300039000200000001001d0000000004000019000800000003001d0000000001030433000000000114004b000034160000813d000000050140021000000002020000290000000001210019000900000001001d0000000002010433000000000102043300000d50011001970000002002200039000000000202043300000d5002200197000a00000004001d35342f0f0000040f00000008020000290000000002020433000600000001001d0000000a01000029000000000112004b000034170000a13d000000090100002900000000010104330000004002100039000000000302043300000020021000390000000002020433000000000101043300000d500110019700000d5002200197000000000330004c0000000003000019000000010300c03935342f380000040f00000d9302000041000000400500043d00000000002504350000000002010019000000000100041400000d5002200197000700000002001d000000040220008c000033140000613d0000000404000039000000600600003900000007020000290000000003050019000500000005001d0000000505000029353400990000040f0000000505000029000000000110004c000034280000613d0000000101000031000000600210008c00000060010080390000001f02100039000000e00320018f0000000002530019000000000332004b0000000003000019000000010300403900000d6d0420009c0000341e0000213d00000001033001900000341e0000c13d000000400020043f00000000025100190000000001050019353430200000040f000000080300002900000000030304330000000a04000029000000000343004b000034170000a13d000000090300002900000000030304330000000003030433000000400700043d00000d6c040000410000000000470435000000040470003900000007050000290000000000540435000000060400002900000d500440019700000d5003300197000600000004001d000000000443004b000000000602001900000000060160190000000001000414000000040230008c000033490000613d0000002404000039000500000006001d0000002006000039000000000203001900000000030700190000000005070019000400000007001d353400990000040f00000004070000290000000506000029000000000110004c000034280000613d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000000003720019000000000223004b0000000002000019000000010200403900000d6d0430009c0000341e0000213d00000001022001900000341e0000c13d000000400030043f000000200110008c000034250000413d0000000002070433000000000162004b00000008010000290000000a040000290000340f0000413d0000000001010433000000000141004b000034170000a13d00000009010000290000000001010433000000000101043300000d8904000041000000000043043500000d50051001970000002404300039000000000100041400000000005404350000000002620049000000040430003900000000002404350000000702000029000000040220008c0000337a0000613d000000440400003900000020060000390000000702000029000700000003001d0000000705000029353400990000040f0000000703000029000000000110004c000034280000613d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f000000000232001900000d6d0420009c0000341e0000213d000000400020043f000000200110008c000034250000413d000000080100002900000000020104330000000a04000029000000000142004b000034170000a13d000000000103043300000009030000290000000003030433000000000303043300000d50033001970000000605000029000000000353004b00000000030000190000000003016019000600000003001d0000000001006019000700000001001d000000010120008a000000000114004b0000000101000029000033b00000813d0000000101400039000000000212004b000034170000a13d0000000501100210000000020200002900000000012100190000000003010433000000000103043300000d50011001970000002002300039000000000202043300000d500220019700000040033000390000000003030433000000000330004c0000000003000019000000010300c03935342f380000040f0000000a0400002900000008020000290000000002020433000500000001001d000000000142004b000034170000a13d000000090100002900000000010104330000004002100039000000000302043300000020021000390000000002020433000000000101043300000d500110019700000d5002200197000000000330004c0000000003000019000000010300c03935342f380000040f000000400300043d00000d500210019700000d9e0130009c0000341e0000213d0000002001300039000400000001001d000000400010043f000300000003001d000000000003043500000d77010000410000000000100439000900000002001d000000040020044300008002010000390000002402000039353400d00000040f000000000110004c000034250000613d0000000a010000290000000107100039000000400300043d000000640130003900000080020000390000000000210435000000050100002900000d50011001970000004402300039000000000012043500000024013000390000000602000029000000000021043500000d9f0100004100000000001304350000000401300039000000070200002900000000002104350000000301000029000000000601043300000084013000390000000000610435000000a40130003900000000020000190000000408000029000000000462004b000033f30000813d00000000042100190000000005280019000000000505043300000000005404350000002002200039000033eb0000013d0000000001610019000000000001043500000000010004140000000902000029000000040420008c000034060000613d0000001f04600039000000200500008a000000000454016f000000a40440003900000000050300190000000006000019000900000007001d000700000003001d353400620000040f00000007030000290000000907000029000000000110004c000034280000613d00000d6d0130009c0000341e0000213d000000400030043f000000010100008a0000000a02000029000000000112004b00000000040700190000000803000029000032df0000c13d00000d520100004100000000001004350000001101000039000000040010043f00000024020000390000000001000019353400ec0000040f000000000001042d00000d520100004100000000001004350000003201000039000000040010043f00000024020000390000000001000019353400ec0000040f00000d520100004100000000001004350000004101000039000000040010043f00000024020000390000000001000019353400ec0000040f00000000010000190000000002000019353400ec0000040f0000000302000367000000400100043d00000001040000310000001f0340018f0000000504400272000034370000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b0000342f0000413d000000000530004c000034460000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f00000000002404350000000102000031353400ec0000040f0000000201100367000000000101043b00000d8c0210009c0000344d0000813d000000000001042d00000000010000190000000002000019353400ec0000040f0000000201100367000000000101043b000000000210004c0000000002000019000000010200c039000000000221004b000034580000c13d000000000001042d00000000010000190000000002000019353400ec0000040f000000600100003900000001020000320000348a0000613d0000003f01200039000000200300008a000000000331016f000000400100043d0000000003310019000000000413004b0000000004000019000000010400403900000d6d0530009c0000348b0000213d00000001044001900000348b0000c13d000000400030043f00000000002104350000002002100039000000030300036700000001050000310000001f0450018f00000005055002720000347b0000613d000000000600001900000005076002100000000008720019000000000773034f000000000707043b00000000007804350000000106600039000000000756004b000034730000413d000000000640004c0000348a0000613d0000000505500210000000000353034f00000000025200190000000304400210000000000502043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f0000000000320435000000000001042d00000d520100004100000000001004350000004101000039000000040010043f00000024020000390000000001000019353400ec0000040f000100000000000200000000030200190000000004010019000000400100043d00000da00210009c000034bc0000813d0000002002100039000000400020043f000000000001043500000001050000390000000001000414000000040240008c000034b60000613d000000000230004c000034af0000613d00000d4e0200004100000d4e0510009c0000000001028019000000c00110021000000d7f011001c7000080090200003900000000050000193534352a0000040f0000000003010019000000600330027000010d4e0030019d0003000000010355000000010520018f000034b60000013d00000000020400190000000003000019000000000400001900000000050000190000000006000019353400620000040f0000000005010019000100000005001d3534345b0000040f0000000101000029000000000110004c000034c30000613d000000000001042d00000d520100004100000000001004350000004101000039000000040010043f00000024020000390000000001000019353400ec0000040f000000400100043d000000640210003900000da1030000410000000000320435000000440210003900000da203000041000000000032043500000024021000390000002303000039000000000032043500000d900200004100000000002104350000000402100039000000200300003900000000003204350000008402000039353400ec0000040f0004000000000002000200000004001d000300000003001d000400000002001d00000d77020000410000000000200439000100000001001d000000040010044300008002010000390000002402000039353400d00000040f000000000110004c000035200000613d000000400500043d000000640150003900000002020000290000000000210435000000030100002900000d500110019700000044035000390000000000130435000000200350003900000d7a010000410000000000130435000000040100002900000d5001100197000000240450003900000000001404350000006401000039000000000015043500000da30150009c000035230000813d000000a001500039000000400010043f00000000010004140000000102000029000000040420008c0000000004000019000035020000613d000000000405043300000000050000190000000006000019353400620000040f000000000110004c00000000040000190000000104006039000400000004001d3534345b0000040f00000004020000290000000102200190000035200000c13d0000000002010433000000000320004c0000351f0000613d00000d4f03000041000000200420008c0000000004000019000000000403401900000d4f02200197000000000520004c000000000300a01900000d4f0220009c00000000020400190000000002036019000000000220004c000035200000c13d00000020011000390000000001010433000000000210004c0000000002000019000000010200c039000000000221004b000035200000c13d000000000110004c000035200000613d000000000001042d00000000010000190000000002000019353400ec0000040f00000d520100004100000000001004350000004101000039000000040010043f00000024020000390000000001000019353400ec0000040f0000352d002104210000000102000039000000000001042d00000000020000190000352c0000013d00003532002104230000000102000039000000000001042d0000000002000019000035310000013d0000353400000432000035350001042e0000353600010430000000000000000000000000000000000000000000000000000000000000000000000000ffffffff8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffff00000002000000000000000000000000000000000000000000000000000000004e487b71000000000000000000000000000000000000000000000000000000000200000200000000000000000000000000000000000000000000000000000000310ab089e4439a4c15d089f94afb7896ff553aecb10793d0ab882de59d99a32e000000000000000000000000000000000000000000000000000000000dede6c40000000000000000000000000000000000000000000000000000000013dcfc590000000000000000000000000000000000000000000000000000000018a13086000000000000000000000000000000000000000000000000000000003fc8cef3000000000000000000000000000000000000000000000000000000004386e63c00000000000000000000000000000000000000000000000000000000448725b4000000000000000000000000000000000000000000000000000000004c1ee03e00000000000000000000000000000000000000000000000000000000544caa56000000000000000000000000000000000000000000000000000000005a47ddc3000000000000000000000000000000000000000000000000000000005e1e6325000000000000000000000000000000000000000000000000000000005e60dab50000000000000000000000000000000000000000000000000000000067ffb66a000000000000000000000000000000000000000000000000000000007301e3c8000000000000000000000000000000000000000000000000000000009881fcb40000000000000000000000000000000000000000000000000000000098a0fb3c00000000000000000000000000000000000000000000000000000000a32b1fcd00000000000000000000000000000000000000000000000000000000b7e0d4c000000000000000000000000000000000000000000000000000000000c45a015500000000000000000000000000000000000000000000000000000000cfc381ea00000000000000000000000000000000000000000000000000000000d7b0e0a500000000000000000000000000000000000000000000000000000000e5e31b1300000000000000000000000000000000000000000000000000000000f41766d8796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d9553913270a0823100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff45a1de790000000000000000000000000000000000000000000000000000000091f36d65000000000000000000000000000000000000000000000000000000006c4f5398000000000000000000000000000000000000000000000000000000002fcd8f2700000000000000000000000000000000000000000000000000000000000000000000000000000000e490695fafe699e85ff4b23bc9986cfe454b65f46bd1a72c000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000024000000000000000000000000095ea7b30000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000440000000000000000000000001806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b83b66503cf00000000000000000000000000000000000000000000000000000000e5e31b130000000000000000000000000000000000000000000000000000000023b872dd00000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000006400000000000000000000000089afcb4400000000000000000000000000000000000000000000000000000000a9059cbb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff7f02000000000000000000000000000000000000000000000000000000000000002e1a7d4d00000000000000000000000000000000000000000000000000000000d0e30db00000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000040000000000000000000000006a62784200000000000000000000000000000000000000000000000000000000d505accf0000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000e40000000000000000000000006801cc300000000000000000000000000000000000000000000000000000000018160ddd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fffffffffffffffffffffffffffffffff140a35a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffbf000000000000000000000000000000000000000000000000ffffffffffffffa000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000ffffffffffffff9f526f757465723a205a45524f5f4144445245535300000000000000000000000008c379a000000000000000000000000000000000000000000000000000000000526f757465723a204944454e544943414c5f414444524553534553000000000070616972206e61000000000000000000000000000000000000000000000000000902f1ac00000000000000000000000000000000000000000000000000000000526f757465723a20494e56414c49445f50415448000000000000000000000000526f757465723a20494e53554646494349454e545f4c49515549444954590000526f757465723a20494e53554646494349454e545f414d4f554e540000000000526f757465723a204558504952454400000000000000000000000000000000005265656e7472616e637947756172643a207265656e7472616e742063616c6c00526f757465723a20494e53554646494349454e545f415f414d4f554e54000000526f757465723a20494e53554646494349454e545f425f414d4f554e5400000082dfdce4000000000000000000000000000000000000000000000000000000004e54000000000000000000000000000000000000000000000000000000000000526f757465723a20494e53554646494349454e545f4f55545055545f414d4f55000000000000000000000000000000000000000000000000ffffffffffffffdf022c0d9f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffe04c454400000000000000000000000000000000000000000000000000000000005472616e7366657248656c7065723a204554485f5452414e534645525f464149000000000000000000000000000000000000000000000000ffffffffffffff600000000000000000000000000000000000000000000000000000000000000000
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0x000000000000000000000000e140eac2bb748c8f456719a457f26636617bb0e90000000000000000000000005aea5775959fbc2557cc8789bc1bf90a239d9a91
-----Decoded View---------------
Arg [0] : _factory (address): 0xE140EaC2bB748c8F456719a457F26636617Bb0E9
Arg [1] : _weth (address): 0x5AEa5775959fBC2557Cc8789bC1bf90A239D9a91
-----Encoded View---------------
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ZKSYNC | 100.00% | $0.999757 | 0.2475 | $0.2474 |
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.