Overview
POL Balance
0 POL
POL Value
$0.00More Info
Private Name Tags
ContractCreator
Loading...
Loading
Contract Name:
UZX
Compiler Version
v0.8.21+commit.d9974bed
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2023-10-10 */ // SPDX-License-Identifier: UNLICENSED // File: @openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SafeCast.sol) // This file was procedurally generated from scripts/generate/templates/SafeCast.js. pragma solidity ^0.8.0; /** * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow * checks. * * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can * easily result in undesired exploitation or bugs, since developers usually * assume that overflows raise errors. `SafeCast` restores this intuition by * reverting the transaction when such an operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. * * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing * all math on `uint256` and `int256` and then downcasting. */ library SafeCastUpgradeable { /** * @dev Returns the downcasted uint248 from uint256, reverting on * overflow (when the input is greater than largest uint248). * * Counterpart to Solidity's `uint248` operator. * * Requirements: * * - input must fit into 248 bits * * _Available since v4.7._ */ function toUint248(uint256 value) internal pure returns (uint248) { require(value <= type(uint248).max, "SafeCast: value doesn't fit in 248 bits"); return uint248(value); } /** * @dev Returns the downcasted uint240 from uint256, reverting on * overflow (when the input is greater than largest uint240). * * Counterpart to Solidity's `uint240` operator. * * Requirements: * * - input must fit into 240 bits * * _Available since v4.7._ */ function toUint240(uint256 value) internal pure returns (uint240) { require(value <= type(uint240).max, "SafeCast: value doesn't fit in 240 bits"); return uint240(value); } /** * @dev Returns the downcasted uint232 from uint256, reverting on * overflow (when the input is greater than largest uint232). * * Counterpart to Solidity's `uint232` operator. * * Requirements: * * - input must fit into 232 bits * * _Available since v4.7._ */ function toUint232(uint256 value) internal pure returns (uint232) { require(value <= type(uint232).max, "SafeCast: value doesn't fit in 232 bits"); return uint232(value); } /** * @dev Returns the downcasted uint224 from uint256, reverting on * overflow (when the input is greater than largest uint224). * * Counterpart to Solidity's `uint224` operator. * * Requirements: * * - input must fit into 224 bits * * _Available since v4.2._ */ function toUint224(uint256 value) internal pure returns (uint224) { require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); return uint224(value); } /** * @dev Returns the downcasted uint216 from uint256, reverting on * overflow (when the input is greater than largest uint216). * * Counterpart to Solidity's `uint216` operator. * * Requirements: * * - input must fit into 216 bits * * _Available since v4.7._ */ function toUint216(uint256 value) internal pure returns (uint216) { require(value <= type(uint216).max, "SafeCast: value doesn't fit in 216 bits"); return uint216(value); } /** * @dev Returns the downcasted uint208 from uint256, reverting on * overflow (when the input is greater than largest uint208). * * Counterpart to Solidity's `uint208` operator. * * Requirements: * * - input must fit into 208 bits * * _Available since v4.7._ */ function toUint208(uint256 value) internal pure returns (uint208) { require(value <= type(uint208).max, "SafeCast: value doesn't fit in 208 bits"); return uint208(value); } /** * @dev Returns the downcasted uint200 from uint256, reverting on * overflow (when the input is greater than largest uint200). * * Counterpart to Solidity's `uint200` operator. * * Requirements: * * - input must fit into 200 bits * * _Available since v4.7._ */ function toUint200(uint256 value) internal pure returns (uint200) { require(value <= type(uint200).max, "SafeCast: value doesn't fit in 200 bits"); return uint200(value); } /** * @dev Returns the downcasted uint192 from uint256, reverting on * overflow (when the input is greater than largest uint192). * * Counterpart to Solidity's `uint192` operator. * * Requirements: * * - input must fit into 192 bits * * _Available since v4.7._ */ function toUint192(uint256 value) internal pure returns (uint192) { require(value <= type(uint192).max, "SafeCast: value doesn't fit in 192 bits"); return uint192(value); } /** * @dev Returns the downcasted uint184 from uint256, reverting on * overflow (when the input is greater than largest uint184). * * Counterpart to Solidity's `uint184` operator. * * Requirements: * * - input must fit into 184 bits * * _Available since v4.7._ */ function toUint184(uint256 value) internal pure returns (uint184) { require(value <= type(uint184).max, "SafeCast: value doesn't fit in 184 bits"); return uint184(value); } /** * @dev Returns the downcasted uint176 from uint256, reverting on * overflow (when the input is greater than largest uint176). * * Counterpart to Solidity's `uint176` operator. * * Requirements: * * - input must fit into 176 bits * * _Available since v4.7._ */ function toUint176(uint256 value) internal pure returns (uint176) { require(value <= type(uint176).max, "SafeCast: value doesn't fit in 176 bits"); return uint176(value); } /** * @dev Returns the downcasted uint168 from uint256, reverting on * overflow (when the input is greater than largest uint168). * * Counterpart to Solidity's `uint168` operator. * * Requirements: * * - input must fit into 168 bits * * _Available since v4.7._ */ function toUint168(uint256 value) internal pure returns (uint168) { require(value <= type(uint168).max, "SafeCast: value doesn't fit in 168 bits"); return uint168(value); } /** * @dev Returns the downcasted uint160 from uint256, reverting on * overflow (when the input is greater than largest uint160). * * Counterpart to Solidity's `uint160` operator. * * Requirements: * * - input must fit into 160 bits * * _Available since v4.7._ */ function toUint160(uint256 value) internal pure returns (uint160) { require(value <= type(uint160).max, "SafeCast: value doesn't fit in 160 bits"); return uint160(value); } /** * @dev Returns the downcasted uint152 from uint256, reverting on * overflow (when the input is greater than largest uint152). * * Counterpart to Solidity's `uint152` operator. * * Requirements: * * - input must fit into 152 bits * * _Available since v4.7._ */ function toUint152(uint256 value) internal pure returns (uint152) { require(value <= type(uint152).max, "SafeCast: value doesn't fit in 152 bits"); return uint152(value); } /** * @dev Returns the downcasted uint144 from uint256, reverting on * overflow (when the input is greater than largest uint144). * * Counterpart to Solidity's `uint144` operator. * * Requirements: * * - input must fit into 144 bits * * _Available since v4.7._ */ function toUint144(uint256 value) internal pure returns (uint144) { require(value <= type(uint144).max, "SafeCast: value doesn't fit in 144 bits"); return uint144(value); } /** * @dev Returns the downcasted uint136 from uint256, reverting on * overflow (when the input is greater than largest uint136). * * Counterpart to Solidity's `uint136` operator. * * Requirements: * * - input must fit into 136 bits * * _Available since v4.7._ */ function toUint136(uint256 value) internal pure returns (uint136) { require(value <= type(uint136).max, "SafeCast: value doesn't fit in 136 bits"); return uint136(value); } /** * @dev Returns the downcasted uint128 from uint256, reverting on * overflow (when the input is greater than largest uint128). * * Counterpart to Solidity's `uint128` operator. * * Requirements: * * - input must fit into 128 bits * * _Available since v2.5._ */ function toUint128(uint256 value) internal pure returns (uint128) { require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); return uint128(value); } /** * @dev Returns the downcasted uint120 from uint256, reverting on * overflow (when the input is greater than largest uint120). * * Counterpart to Solidity's `uint120` operator. * * Requirements: * * - input must fit into 120 bits * * _Available since v4.7._ */ function toUint120(uint256 value) internal pure returns (uint120) { require(value <= type(uint120).max, "SafeCast: value doesn't fit in 120 bits"); return uint120(value); } /** * @dev Returns the downcasted uint112 from uint256, reverting on * overflow (when the input is greater than largest uint112). * * Counterpart to Solidity's `uint112` operator. * * Requirements: * * - input must fit into 112 bits * * _Available since v4.7._ */ function toUint112(uint256 value) internal pure returns (uint112) { require(value <= type(uint112).max, "SafeCast: value doesn't fit in 112 bits"); return uint112(value); } /** * @dev Returns the downcasted uint104 from uint256, reverting on * overflow (when the input is greater than largest uint104). * * Counterpart to Solidity's `uint104` operator. * * Requirements: * * - input must fit into 104 bits * * _Available since v4.7._ */ function toUint104(uint256 value) internal pure returns (uint104) { require(value <= type(uint104).max, "SafeCast: value doesn't fit in 104 bits"); return uint104(value); } /** * @dev Returns the downcasted uint96 from uint256, reverting on * overflow (when the input is greater than largest uint96). * * Counterpart to Solidity's `uint96` operator. * * Requirements: * * - input must fit into 96 bits * * _Available since v4.2._ */ function toUint96(uint256 value) internal pure returns (uint96) { require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); return uint96(value); } /** * @dev Returns the downcasted uint88 from uint256, reverting on * overflow (when the input is greater than largest uint88). * * Counterpart to Solidity's `uint88` operator. * * Requirements: * * - input must fit into 88 bits * * _Available since v4.7._ */ function toUint88(uint256 value) internal pure returns (uint88) { require(value <= type(uint88).max, "SafeCast: value doesn't fit in 88 bits"); return uint88(value); } /** * @dev Returns the downcasted uint80 from uint256, reverting on * overflow (when the input is greater than largest uint80). * * Counterpart to Solidity's `uint80` operator. * * Requirements: * * - input must fit into 80 bits * * _Available since v4.7._ */ function toUint80(uint256 value) internal pure returns (uint80) { require(value <= type(uint80).max, "SafeCast: value doesn't fit in 80 bits"); return uint80(value); } /** * @dev Returns the downcasted uint72 from uint256, reverting on * overflow (when the input is greater than largest uint72). * * Counterpart to Solidity's `uint72` operator. * * Requirements: * * - input must fit into 72 bits * * _Available since v4.7._ */ function toUint72(uint256 value) internal pure returns (uint72) { require(value <= type(uint72).max, "SafeCast: value doesn't fit in 72 bits"); return uint72(value); } /** * @dev Returns the downcasted uint64 from uint256, reverting on * overflow (when the input is greater than largest uint64). * * Counterpart to Solidity's `uint64` operator. * * Requirements: * * - input must fit into 64 bits * * _Available since v2.5._ */ function toUint64(uint256 value) internal pure returns (uint64) { require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); return uint64(value); } /** * @dev Returns the downcasted uint56 from uint256, reverting on * overflow (when the input is greater than largest uint56). * * Counterpart to Solidity's `uint56` operator. * * Requirements: * * - input must fit into 56 bits * * _Available since v4.7._ */ function toUint56(uint256 value) internal pure returns (uint56) { require(value <= type(uint56).max, "SafeCast: value doesn't fit in 56 bits"); return uint56(value); } /** * @dev Returns the downcasted uint48 from uint256, reverting on * overflow (when the input is greater than largest uint48). * * Counterpart to Solidity's `uint48` operator. * * Requirements: * * - input must fit into 48 bits * * _Available since v4.7._ */ function toUint48(uint256 value) internal pure returns (uint48) { require(value <= type(uint48).max, "SafeCast: value doesn't fit in 48 bits"); return uint48(value); } /** * @dev Returns the downcasted uint40 from uint256, reverting on * overflow (when the input is greater than largest uint40). * * Counterpart to Solidity's `uint40` operator. * * Requirements: * * - input must fit into 40 bits * * _Available since v4.7._ */ function toUint40(uint256 value) internal pure returns (uint40) { require(value <= type(uint40).max, "SafeCast: value doesn't fit in 40 bits"); return uint40(value); } /** * @dev Returns the downcasted uint32 from uint256, reverting on * overflow (when the input is greater than largest uint32). * * Counterpart to Solidity's `uint32` operator. * * Requirements: * * - input must fit into 32 bits * * _Available since v2.5._ */ function toUint32(uint256 value) internal pure returns (uint32) { require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); return uint32(value); } /** * @dev Returns the downcasted uint24 from uint256, reverting on * overflow (when the input is greater than largest uint24). * * Counterpart to Solidity's `uint24` operator. * * Requirements: * * - input must fit into 24 bits * * _Available since v4.7._ */ function toUint24(uint256 value) internal pure returns (uint24) { require(value <= type(uint24).max, "SafeCast: value doesn't fit in 24 bits"); return uint24(value); } /** * @dev Returns the downcasted uint16 from uint256, reverting on * overflow (when the input is greater than largest uint16). * * Counterpart to Solidity's `uint16` operator. * * Requirements: * * - input must fit into 16 bits * * _Available since v2.5._ */ function toUint16(uint256 value) internal pure returns (uint16) { require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); return uint16(value); } /** * @dev Returns the downcasted uint8 from uint256, reverting on * overflow (when the input is greater than largest uint8). * * Counterpart to Solidity's `uint8` operator. * * Requirements: * * - input must fit into 8 bits * * _Available since v2.5._ */ function toUint8(uint256 value) internal pure returns (uint8) { require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); return uint8(value); } /** * @dev Converts a signed int256 into an unsigned uint256. * * Requirements: * * - input must be greater than or equal to 0. * * _Available since v3.0._ */ function toUint256(int256 value) internal pure returns (uint256) { require(value >= 0, "SafeCast: value must be positive"); return uint256(value); } /** * @dev Returns the downcasted int248 from int256, reverting on * overflow (when the input is less than smallest int248 or * greater than largest int248). * * Counterpart to Solidity's `int248` operator. * * Requirements: * * - input must fit into 248 bits * * _Available since v4.7._ */ function toInt248(int256 value) internal pure returns (int248 downcasted) { downcasted = int248(value); require(downcasted == value, "SafeCast: value doesn't fit in 248 bits"); } /** * @dev Returns the downcasted int240 from int256, reverting on * overflow (when the input is less than smallest int240 or * greater than largest int240). * * Counterpart to Solidity's `int240` operator. * * Requirements: * * - input must fit into 240 bits * * _Available since v4.7._ */ function toInt240(int256 value) internal pure returns (int240 downcasted) { downcasted = int240(value); require(downcasted == value, "SafeCast: value doesn't fit in 240 bits"); } /** * @dev Returns the downcasted int232 from int256, reverting on * overflow (when the input is less than smallest int232 or * greater than largest int232). * * Counterpart to Solidity's `int232` operator. * * Requirements: * * - input must fit into 232 bits * * _Available since v4.7._ */ function toInt232(int256 value) internal pure returns (int232 downcasted) { downcasted = int232(value); require(downcasted == value, "SafeCast: value doesn't fit in 232 bits"); } /** * @dev Returns the downcasted int224 from int256, reverting on * overflow (when the input is less than smallest int224 or * greater than largest int224). * * Counterpart to Solidity's `int224` operator. * * Requirements: * * - input must fit into 224 bits * * _Available since v4.7._ */ function toInt224(int256 value) internal pure returns (int224 downcasted) { downcasted = int224(value); require(downcasted == value, "SafeCast: value doesn't fit in 224 bits"); } /** * @dev Returns the downcasted int216 from int256, reverting on * overflow (when the input is less than smallest int216 or * greater than largest int216). * * Counterpart to Solidity's `int216` operator. * * Requirements: * * - input must fit into 216 bits * * _Available since v4.7._ */ function toInt216(int256 value) internal pure returns (int216 downcasted) { downcasted = int216(value); require(downcasted == value, "SafeCast: value doesn't fit in 216 bits"); } /** * @dev Returns the downcasted int208 from int256, reverting on * overflow (when the input is less than smallest int208 or * greater than largest int208). * * Counterpart to Solidity's `int208` operator. * * Requirements: * * - input must fit into 208 bits * * _Available since v4.7._ */ function toInt208(int256 value) internal pure returns (int208 downcasted) { downcasted = int208(value); require(downcasted == value, "SafeCast: value doesn't fit in 208 bits"); } /** * @dev Returns the downcasted int200 from int256, reverting on * overflow (when the input is less than smallest int200 or * greater than largest int200). * * Counterpart to Solidity's `int200` operator. * * Requirements: * * - input must fit into 200 bits * * _Available since v4.7._ */ function toInt200(int256 value) internal pure returns (int200 downcasted) { downcasted = int200(value); require(downcasted == value, "SafeCast: value doesn't fit in 200 bits"); } /** * @dev Returns the downcasted int192 from int256, reverting on * overflow (when the input is less than smallest int192 or * greater than largest int192). * * Counterpart to Solidity's `int192` operator. * * Requirements: * * - input must fit into 192 bits * * _Available since v4.7._ */ function toInt192(int256 value) internal pure returns (int192 downcasted) { downcasted = int192(value); require(downcasted == value, "SafeCast: value doesn't fit in 192 bits"); } /** * @dev Returns the downcasted int184 from int256, reverting on * overflow (when the input is less than smallest int184 or * greater than largest int184). * * Counterpart to Solidity's `int184` operator. * * Requirements: * * - input must fit into 184 bits * * _Available since v4.7._ */ function toInt184(int256 value) internal pure returns (int184 downcasted) { downcasted = int184(value); require(downcasted == value, "SafeCast: value doesn't fit in 184 bits"); } /** * @dev Returns the downcasted int176 from int256, reverting on * overflow (when the input is less than smallest int176 or * greater than largest int176). * * Counterpart to Solidity's `int176` operator. * * Requirements: * * - input must fit into 176 bits * * _Available since v4.7._ */ function toInt176(int256 value) internal pure returns (int176 downcasted) { downcasted = int176(value); require(downcasted == value, "SafeCast: value doesn't fit in 176 bits"); } /** * @dev Returns the downcasted int168 from int256, reverting on * overflow (when the input is less than smallest int168 or * greater than largest int168). * * Counterpart to Solidity's `int168` operator. * * Requirements: * * - input must fit into 168 bits * * _Available since v4.7._ */ function toInt168(int256 value) internal pure returns (int168 downcasted) { downcasted = int168(value); require(downcasted == value, "SafeCast: value doesn't fit in 168 bits"); } /** * @dev Returns the downcasted int160 from int256, reverting on * overflow (when the input is less than smallest int160 or * greater than largest int160). * * Counterpart to Solidity's `int160` operator. * * Requirements: * * - input must fit into 160 bits * * _Available since v4.7._ */ function toInt160(int256 value) internal pure returns (int160 downcasted) { downcasted = int160(value); require(downcasted == value, "SafeCast: value doesn't fit in 160 bits"); } /** * @dev Returns the downcasted int152 from int256, reverting on * overflow (when the input is less than smallest int152 or * greater than largest int152). * * Counterpart to Solidity's `int152` operator. * * Requirements: * * - input must fit into 152 bits * * _Available since v4.7._ */ function toInt152(int256 value) internal pure returns (int152 downcasted) { downcasted = int152(value); require(downcasted == value, "SafeCast: value doesn't fit in 152 bits"); } /** * @dev Returns the downcasted int144 from int256, reverting on * overflow (when the input is less than smallest int144 or * greater than largest int144). * * Counterpart to Solidity's `int144` operator. * * Requirements: * * - input must fit into 144 bits * * _Available since v4.7._ */ function toInt144(int256 value) internal pure returns (int144 downcasted) { downcasted = int144(value); require(downcasted == value, "SafeCast: value doesn't fit in 144 bits"); } /** * @dev Returns the downcasted int136 from int256, reverting on * overflow (when the input is less than smallest int136 or * greater than largest int136). * * Counterpart to Solidity's `int136` operator. * * Requirements: * * - input must fit into 136 bits * * _Available since v4.7._ */ function toInt136(int256 value) internal pure returns (int136 downcasted) { downcasted = int136(value); require(downcasted == value, "SafeCast: value doesn't fit in 136 bits"); } /** * @dev Returns the downcasted int128 from int256, reverting on * overflow (when the input is less than smallest int128 or * greater than largest int128). * * Counterpart to Solidity's `int128` operator. * * Requirements: * * - input must fit into 128 bits * * _Available since v3.1._ */ function toInt128(int256 value) internal pure returns (int128 downcasted) { downcasted = int128(value); require(downcasted == value, "SafeCast: value doesn't fit in 128 bits"); } /** * @dev Returns the downcasted int120 from int256, reverting on * overflow (when the input is less than smallest int120 or * greater than largest int120). * * Counterpart to Solidity's `int120` operator. * * Requirements: * * - input must fit into 120 bits * * _Available since v4.7._ */ function toInt120(int256 value) internal pure returns (int120 downcasted) { downcasted = int120(value); require(downcasted == value, "SafeCast: value doesn't fit in 120 bits"); } /** * @dev Returns the downcasted int112 from int256, reverting on * overflow (when the input is less than smallest int112 or * greater than largest int112). * * Counterpart to Solidity's `int112` operator. * * Requirements: * * - input must fit into 112 bits * * _Available since v4.7._ */ function toInt112(int256 value) internal pure returns (int112 downcasted) { downcasted = int112(value); require(downcasted == value, "SafeCast: value doesn't fit in 112 bits"); } /** * @dev Returns the downcasted int104 from int256, reverting on * overflow (when the input is less than smallest int104 or * greater than largest int104). * * Counterpart to Solidity's `int104` operator. * * Requirements: * * - input must fit into 104 bits * * _Available since v4.7._ */ function toInt104(int256 value) internal pure returns (int104 downcasted) { downcasted = int104(value); require(downcasted == value, "SafeCast: value doesn't fit in 104 bits"); } /** * @dev Returns the downcasted int96 from int256, reverting on * overflow (when the input is less than smallest int96 or * greater than largest int96). * * Counterpart to Solidity's `int96` operator. * * Requirements: * * - input must fit into 96 bits * * _Available since v4.7._ */ function toInt96(int256 value) internal pure returns (int96 downcasted) { downcasted = int96(value); require(downcasted == value, "SafeCast: value doesn't fit in 96 bits"); } /** * @dev Returns the downcasted int88 from int256, reverting on * overflow (when the input is less than smallest int88 or * greater than largest int88). * * Counterpart to Solidity's `int88` operator. * * Requirements: * * - input must fit into 88 bits * * _Available since v4.7._ */ function toInt88(int256 value) internal pure returns (int88 downcasted) { downcasted = int88(value); require(downcasted == value, "SafeCast: value doesn't fit in 88 bits"); } /** * @dev Returns the downcasted int80 from int256, reverting on * overflow (when the input is less than smallest int80 or * greater than largest int80). * * Counterpart to Solidity's `int80` operator. * * Requirements: * * - input must fit into 80 bits * * _Available since v4.7._ */ function toInt80(int256 value) internal pure returns (int80 downcasted) { downcasted = int80(value); require(downcasted == value, "SafeCast: value doesn't fit in 80 bits"); } /** * @dev Returns the downcasted int72 from int256, reverting on * overflow (when the input is less than smallest int72 or * greater than largest int72). * * Counterpart to Solidity's `int72` operator. * * Requirements: * * - input must fit into 72 bits * * _Available since v4.7._ */ function toInt72(int256 value) internal pure returns (int72 downcasted) { downcasted = int72(value); require(downcasted == value, "SafeCast: value doesn't fit in 72 bits"); } /** * @dev Returns the downcasted int64 from int256, reverting on * overflow (when the input is less than smallest int64 or * greater than largest int64). * * Counterpart to Solidity's `int64` operator. * * Requirements: * * - input must fit into 64 bits * * _Available since v3.1._ */ function toInt64(int256 value) internal pure returns (int64 downcasted) { downcasted = int64(value); require(downcasted == value, "SafeCast: value doesn't fit in 64 bits"); } /** * @dev Returns the downcasted int56 from int256, reverting on * overflow (when the input is less than smallest int56 or * greater than largest int56). * * Counterpart to Solidity's `int56` operator. * * Requirements: * * - input must fit into 56 bits * * _Available since v4.7._ */ function toInt56(int256 value) internal pure returns (int56 downcasted) { downcasted = int56(value); require(downcasted == value, "SafeCast: value doesn't fit in 56 bits"); } /** * @dev Returns the downcasted int48 from int256, reverting on * overflow (when the input is less than smallest int48 or * greater than largest int48). * * Counterpart to Solidity's `int48` operator. * * Requirements: * * - input must fit into 48 bits * * _Available since v4.7._ */ function toInt48(int256 value) internal pure returns (int48 downcasted) { downcasted = int48(value); require(downcasted == value, "SafeCast: value doesn't fit in 48 bits"); } /** * @dev Returns the downcasted int40 from int256, reverting on * overflow (when the input is less than smallest int40 or * greater than largest int40). * * Counterpart to Solidity's `int40` operator. * * Requirements: * * - input must fit into 40 bits * * _Available since v4.7._ */ function toInt40(int256 value) internal pure returns (int40 downcasted) { downcasted = int40(value); require(downcasted == value, "SafeCast: value doesn't fit in 40 bits"); } /** * @dev Returns the downcasted int32 from int256, reverting on * overflow (when the input is less than smallest int32 or * greater than largest int32). * * Counterpart to Solidity's `int32` operator. * * Requirements: * * - input must fit into 32 bits * * _Available since v3.1._ */ function toInt32(int256 value) internal pure returns (int32 downcasted) { downcasted = int32(value); require(downcasted == value, "SafeCast: value doesn't fit in 32 bits"); } /** * @dev Returns the downcasted int24 from int256, reverting on * overflow (when the input is less than smallest int24 or * greater than largest int24). * * Counterpart to Solidity's `int24` operator. * * Requirements: * * - input must fit into 24 bits * * _Available since v4.7._ */ function toInt24(int256 value) internal pure returns (int24 downcasted) { downcasted = int24(value); require(downcasted == value, "SafeCast: value doesn't fit in 24 bits"); } /** * @dev Returns the downcasted int16 from int256, reverting on * overflow (when the input is less than smallest int16 or * greater than largest int16). * * Counterpart to Solidity's `int16` operator. * * Requirements: * * - input must fit into 16 bits * * _Available since v3.1._ */ function toInt16(int256 value) internal pure returns (int16 downcasted) { downcasted = int16(value); require(downcasted == value, "SafeCast: value doesn't fit in 16 bits"); } /** * @dev Returns the downcasted int8 from int256, reverting on * overflow (when the input is less than smallest int8 or * greater than largest int8). * * Counterpart to Solidity's `int8` operator. * * Requirements: * * - input must fit into 8 bits * * _Available since v3.1._ */ function toInt8(int256 value) internal pure returns (int8 downcasted) { downcasted = int8(value); require(downcasted == value, "SafeCast: value doesn't fit in 8 bits"); } /** * @dev Converts an unsigned uint256 into a signed int256. * * Requirements: * * - input must be less than or equal to maxInt256. * * _Available since v3.0._ */ function toInt256(uint256 value) internal pure returns (int256) { // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); return int256(value); } } // File: @openzeppelin/contracts-upgradeable/interfaces/IERC6372Upgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC6372.sol) pragma solidity ^0.8.0; interface IERC6372Upgradeable { /** * @dev Clock used for flagging checkpoints. Can be overridden to implement timestamp based checkpoints (and voting). */ function clock() external view returns (uint48); /** * @dev Description of the clock */ // solhint-disable-next-line func-name-mixedcase function CLOCK_MODE() external view returns (string memory); } // File: @openzeppelin/contracts-upgradeable/governance/utils/IVotesUpgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (governance/utils/IVotes.sol) pragma solidity ^0.8.0; /** * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts. * * _Available since v4.5._ */ interface IVotesUpgradeable { /** * @dev Emitted when an account changes their delegate. */ event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate); /** * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes. */ event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance); /** * @dev Returns the current amount of votes that `account` has. */ function getVotes(address account) external view returns (uint256); /** * @dev Returns the amount of votes that `account` had at a specific moment in the past. If the `clock()` is * configured to use block numbers, this will return the value at the end of the corresponding block. */ function getPastVotes(address account, uint256 timepoint) external view returns (uint256); /** * @dev Returns the total supply of votes available at a specific moment in the past. If the `clock()` is * configured to use block numbers, this will return the value at the end of the corresponding block. * * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes. * Votes that have not been delegated are still part of total supply, even though they would not participate in a * vote. */ function getPastTotalSupply(uint256 timepoint) external view returns (uint256); /** * @dev Returns the delegate that `account` has chosen. */ function delegates(address account) external view returns (address); /** * @dev Delegates votes from the sender to `delegatee`. */ function delegate(address delegatee) external; /** * @dev Delegates votes from signer to `delegatee`. */ function delegateBySig(address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) external; } // File: @openzeppelin/contracts-upgradeable/interfaces/IERC5805Upgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC5805.sol) pragma solidity ^0.8.0; interface IERC5805Upgradeable is IERC6372Upgradeable, IVotesUpgradeable {} // File: @openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library CountersUpgradeable { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts-upgradeable/interfaces/IERC5267Upgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC5267.sol) pragma solidity ^0.8.0; interface IERC5267Upgradeable { /** * @dev MAY be emitted to signal that the domain could have changed. */ event EIP712DomainChanged(); /** * @dev returns the fields and values that describe the domain separator used by this contract for EIP-712 * signature. */ function eip712Domain() external view returns ( bytes1 fields, string memory name, string memory version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] memory extensions ); } // File: @openzeppelin/contracts-upgradeable/utils/math/SignedMathUpgradeable.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.0; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMathUpgradeable { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } } // File: @openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library MathUpgradeable { 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); } } } // File: @openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library StringsUpgradeable { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = MathUpgradeable.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toString(int256 value) internal pure returns (string memory) { return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMathUpgradeable.abs(value)))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, MathUpgradeable.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return keccak256(bytes(a)) == keccak256(bytes(b)); } } // File: @openzeppelin/contracts-upgradeable/utils/cryptography/ECDSAUpgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSAUpgradeable { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV // Deprecated in v4.8 } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32 message) { // 32 is the length in bytes of hash, // enforced by the type signature above /// @solidity memory-safe-assembly assembly { mstore(0x00, "\x19Ethereum Signed Message:\n32") mstore(0x1c, hash) message := keccak256(0x00, 0x3c) } } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", StringsUpgradeable.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 data) { /// @solidity memory-safe-assembly assembly { let ptr := mload(0x40) mstore(ptr, "\x19\x01") mstore(add(ptr, 0x02), domainSeparator) mstore(add(ptr, 0x22), structHash) data := keccak256(ptr, 0x42) } } /** * @dev Returns an Ethereum Signed Data with intended validator, created from a * `validator` and `data` according to the version 0 of EIP-191. * * See {recover}. */ function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x00", validator, data)); } } // File: @openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20Upgradeable { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); } // File: @openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20MetadataUpgradeable is IERC20Upgradeable { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File: @openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20PermitUpgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol) pragma solidity ^0.8.0; /** * @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 IERC20PermitUpgradeable { /** * @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); } // File: @openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @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); } } } // File: @openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol // OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ```solidity * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. * * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a * constructor. * * Emits an {Initialized} event. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * A reinitializer may be used after the original initialization step. This is essential to configure modules that * are added through upgrades and that require initialization. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. * * WARNING: setting the version to 255 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized != type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } /** * @dev Returns the highest version that has been initialized. See {reinitializer}. */ function _getInitializedVersion() internal view returns (uint8) { return _initialized; } /** * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. */ function _isInitializing() internal view returns (bool) { return _initializing; } } // File: @openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/EIP712.sol) pragma solidity ^0.8.8; /** * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. * * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible, * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding * they need in their contracts using a combination of `abi.encode` and `keccak256`. * * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA * ({_hashTypedDataV4}). * * The implementation of the domain separator was designed to be as efficient as possible while still properly updating * the chain id to protect against replay attacks on an eventual fork of the chain. * * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. * * NOTE: In the upgradeable version of this contract, the cached values will correspond to the address, and the domain * separator of the implementation contract. This will cause the `_domainSeparatorV4` function to always rebuild the * separator from the immutable values, which is cheaper than accessing a cached version in cold storage. * * _Available since v3.4._ * * @custom:storage-size 52 */ abstract contract EIP712Upgradeable is Initializable, IERC5267Upgradeable { bytes32 private constant _TYPE_HASH = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"); /// @custom:oz-renamed-from _HASHED_NAME bytes32 private _hashedName; /// @custom:oz-renamed-from _HASHED_VERSION bytes32 private _hashedVersion; string private _name; string private _version; /** * @dev Initializes the domain separator and parameter caches. * * The meaning of `name` and `version` is specified in * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: * * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. * - `version`: the current major version of the signing domain. * * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart * contract upgrade]. */ function __EIP712_init(string memory name, string memory version) internal onlyInitializing { __EIP712_init_unchained(name, version); } function __EIP712_init_unchained(string memory name, string memory version) internal onlyInitializing { _name = name; _version = version; // Reset prior values in storage if upgrading _hashedName = 0; _hashedVersion = 0; } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { return _buildDomainSeparator(); } function _buildDomainSeparator() private view returns (bytes32) { return keccak256(abi.encode(_TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash(), block.chainid, address(this))); } /** * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this * function returns the hash of the fully encoded EIP712 message for this domain. * * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: * * ```solidity * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( * keccak256("Mail(address to,string contents)"), * mailTo, * keccak256(bytes(mailContents)) * ))); * address signer = ECDSA.recover(digest, signature); * ``` */ function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { return ECDSAUpgradeable.toTypedDataHash(_domainSeparatorV4(), structHash); } /** * @dev See {EIP-5267}. * * _Available since v4.9._ */ function eip712Domain() public view virtual override returns ( bytes1 fields, string memory name, string memory version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] memory extensions ) { // If the hashed name and version in storage are non-zero, the contract hasn't been properly initialized // and the EIP712 domain is not reliable, as it will be missing name and version. require(_hashedName == 0 && _hashedVersion == 0, "EIP712: Uninitialized"); return ( hex"0f", // 01111 _EIP712Name(), _EIP712Version(), block.chainid, address(this), bytes32(0), new uint256[](0) ); } /** * @dev The name parameter for the EIP712 domain. * * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs * are a concern. */ function _EIP712Name() internal virtual view returns (string memory) { return _name; } /** * @dev The version parameter for the EIP712 domain. * * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs * are a concern. */ function _EIP712Version() internal virtual view returns (string memory) { return _version; } /** * @dev The hash of the name parameter for the EIP712 domain. * * NOTE: In previous versions this function was virtual. In this version you should override `_EIP712Name` instead. */ function _EIP712NameHash() internal view returns (bytes32) { string memory name = _EIP712Name(); if (bytes(name).length > 0) { return keccak256(bytes(name)); } else { // If the name is empty, the contract may have been upgraded without initializing the new storage. // We return the name hash in storage if non-zero, otherwise we assume the name is empty by design. bytes32 hashedName = _hashedName; if (hashedName != 0) { return hashedName; } else { return keccak256(""); } } } /** * @dev The hash of the version parameter for the EIP712 domain. * * NOTE: In previous versions this function was virtual. In this version you should override `_EIP712Version` instead. */ function _EIP712VersionHash() internal view returns (bytes32) { string memory version = _EIP712Version(); if (bytes(version).length > 0) { return keccak256(bytes(version)); } else { // If the version is empty, the contract may have been upgraded without initializing the new storage. // We return the version hash in storage if non-zero, otherwise we assume the version is empty by design. bytes32 hashedVersion = _hashedVersion; if (hashedVersion != 0) { return hashedVersion; } else { return keccak256(""); } } } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[48] private __gap; } // File: @openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File: @openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * The default value of {decimals} is 18. To change this, you should override * this function so it returns a different value. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable, IERC20MetadataUpgradeable { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * All two of these values are immutable: they can only be set once during * construction. */ function __ERC20_init(string memory name_, string memory symbol_) internal onlyInitializing { __ERC20_init_unchained(name_, symbol_); } function __ERC20_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the default value returned by this function, unless * it's overridden. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer(address from, address to, uint256 amount) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _balances[to] += amount; } emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _balances[account] += amount; } emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; // Overflow not possible: amount <= accountBalance <= totalSupply. _totalSupply -= amount; } emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance(address owner, address spender, uint256 amount) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {} /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[45] private __gap; } // File: @openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20PermitUpgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/ERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Implementation 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. * * _Available since v3.4._ * * @custom:storage-size 51 */ abstract contract ERC20PermitUpgradeable is Initializable, ERC20Upgradeable, IERC20PermitUpgradeable, EIP712Upgradeable { using CountersUpgradeable for CountersUpgradeable.Counter; mapping(address => CountersUpgradeable.Counter) private _nonces; // solhint-disable-next-line var-name-mixedcase bytes32 private constant _PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); /** * @dev In previous versions `_PERMIT_TYPEHASH` was declared as `immutable`. * However, to ensure consistency with the upgradeable transpiler, we will continue * to reserve a slot. * @custom:oz-renamed-from _PERMIT_TYPEHASH */ // solhint-disable-next-line var-name-mixedcase bytes32 private _PERMIT_TYPEHASH_DEPRECATED_SLOT; /** * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `"1"`. * * It's a good idea to use the same `name` that is defined as the ERC20 token name. */ function __ERC20Permit_init(string memory name) internal onlyInitializing { __EIP712_init_unchained(name, "1"); } function __ERC20Permit_init_unchained(string memory) internal onlyInitializing {} /** * @dev See {IERC20Permit-permit}. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public virtual override { require(block.timestamp <= deadline, "ERC20Permit: expired deadline"); bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline)); bytes32 hash = _hashTypedDataV4(structHash); address signer = ECDSAUpgradeable.recover(hash, v, r, s); require(signer == owner, "ERC20Permit: invalid signature"); _approve(owner, spender, value); } /** * @dev See {IERC20Permit-nonces}. */ function nonces(address owner) public view virtual override returns (uint256) { return _nonces[owner].current(); } /** * @dev See {IERC20Permit-DOMAIN_SEPARATOR}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view override returns (bytes32) { return _domainSeparatorV4(); } /** * @dev "Consume a nonce": return the current value and increment. * * _Available since v4.1._ */ function _useNonce(address owner) internal virtual returns (uint256 current) { CountersUpgradeable.Counter storage nonce = _nonces[owner]; current = nonce.current(); nonce.increment(); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } // File: @openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20VotesUpgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/ERC20Votes.sol) pragma solidity ^0.8.0; /** * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's, * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1. * * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module. * * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting * power can be queried through the public accessors {getVotes} and {getPastVotes}. * * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked. * * _Available since v4.2._ */ abstract contract ERC20VotesUpgradeable is Initializable, ERC20PermitUpgradeable, IERC5805Upgradeable { function __ERC20Votes_init() internal onlyInitializing { } function __ERC20Votes_init_unchained() internal onlyInitializing { } struct Checkpoint { uint32 fromBlock; uint224 votes; } bytes32 private constant _DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)"); mapping(address => address) private _delegates; mapping(address => Checkpoint[]) private _checkpoints; Checkpoint[] private _totalSupplyCheckpoints; /** * @dev Clock used for flagging checkpoints. Can be overridden to implement timestamp based checkpoints (and voting). */ function clock() public view virtual override returns (uint48) { return SafeCastUpgradeable.toUint48(block.number); } /** * @dev Description of the clock */ // solhint-disable-next-line func-name-mixedcase function CLOCK_MODE() public view virtual override returns (string memory) { // Check that the clock was not modified require(clock() == block.number, "ERC20Votes: broken clock mode"); return "mode=blocknumber&from=default"; } /** * @dev Get the `pos`-th checkpoint for `account`. */ function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) { return _checkpoints[account][pos]; } /** * @dev Get number of checkpoints for `account`. */ function numCheckpoints(address account) public view virtual returns (uint32) { return SafeCastUpgradeable.toUint32(_checkpoints[account].length); } /** * @dev Get the address `account` is currently delegating to. */ function delegates(address account) public view virtual override returns (address) { return _delegates[account]; } /** * @dev Gets the current votes balance for `account` */ function getVotes(address account) public view virtual override returns (uint256) { uint256 pos = _checkpoints[account].length; unchecked { return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes; } } /** * @dev Retrieve the number of votes for `account` at the end of `timepoint`. * * Requirements: * * - `timepoint` must be in the past */ function getPastVotes(address account, uint256 timepoint) public view virtual override returns (uint256) { require(timepoint < clock(), "ERC20Votes: future lookup"); return _checkpointsLookup(_checkpoints[account], timepoint); } /** * @dev Retrieve the `totalSupply` at the end of `timepoint`. Note, this value is the sum of all balances. * It is NOT the sum of all the delegated votes! * * Requirements: * * - `timepoint` must be in the past */ function getPastTotalSupply(uint256 timepoint) public view virtual override returns (uint256) { require(timepoint < clock(), "ERC20Votes: future lookup"); return _checkpointsLookup(_totalSupplyCheckpoints, timepoint); } /** * @dev Lookup a value in a list of (sorted) checkpoints. */ function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 timepoint) private view returns (uint256) { // We run a binary search to look for the last (most recent) checkpoint taken before (or at) `timepoint`. // // Initially we check if the block is recent to narrow the search range. // During the loop, the index of the wanted checkpoint remains in the range [low-1, high). // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant. // - If the middle checkpoint is after `timepoint`, we look in [low, mid) // - If the middle checkpoint is before or equal to `timepoint`, we look in [mid+1, high) // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not // out of bounds (in which case we're looking too far in the past and the result is 0). // Note that if the latest checkpoint available is exactly for `timepoint`, we end up with an index that is // past the end of the array, so we technically don't find a checkpoint after `timepoint`, but it works out // the same. uint256 length = ckpts.length; uint256 low = 0; uint256 high = length; if (length > 5) { uint256 mid = length - MathUpgradeable.sqrt(length); if (_unsafeAccess(ckpts, mid).fromBlock > timepoint) { high = mid; } else { low = mid + 1; } } while (low < high) { uint256 mid = MathUpgradeable.average(low, high); if (_unsafeAccess(ckpts, mid).fromBlock > timepoint) { high = mid; } else { low = mid + 1; } } unchecked { return high == 0 ? 0 : _unsafeAccess(ckpts, high - 1).votes; } } /** * @dev Delegate votes from the sender to `delegatee`. */ function delegate(address delegatee) public virtual override { _delegate(_msgSender(), delegatee); } /** * @dev Delegates votes from signer to `delegatee` */ function delegateBySig( address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s ) public virtual override { require(block.timestamp <= expiry, "ERC20Votes: signature expired"); address signer = ECDSAUpgradeable.recover( _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))), v, r, s ); require(nonce == _useNonce(signer), "ERC20Votes: invalid nonce"); _delegate(signer, delegatee); } /** * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1). */ function _maxSupply() internal view virtual returns (uint224) { return type(uint224).max; } /** * @dev Snapshots the totalSupply after it has been increased. */ function _mint(address account, uint256 amount) internal virtual override { super._mint(account, amount); require(totalSupply() <= _maxSupply(), "ERC20Votes: total supply risks overflowing votes"); _writeCheckpoint(_totalSupplyCheckpoints, _add, amount); } /** * @dev Snapshots the totalSupply after it has been decreased. */ function _burn(address account, uint256 amount) internal virtual override { super._burn(account, amount); _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount); } /** * @dev Move voting power when tokens are transferred. * * Emits a {IVotes-DelegateVotesChanged} event. */ function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual override { super._afterTokenTransfer(from, to, amount); _moveVotingPower(delegates(from), delegates(to), amount); } /** * @dev Change delegation for `delegator` to `delegatee`. * * Emits events {IVotes-DelegateChanged} and {IVotes-DelegateVotesChanged}. */ function _delegate(address delegator, address delegatee) internal virtual { address currentDelegate = delegates(delegator); uint256 delegatorBalance = balanceOf(delegator); _delegates[delegator] = delegatee; emit DelegateChanged(delegator, currentDelegate, delegatee); _moveVotingPower(currentDelegate, delegatee, delegatorBalance); } function _moveVotingPower(address src, address dst, uint256 amount) private { if (src != dst && amount > 0) { if (src != address(0)) { (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount); emit DelegateVotesChanged(src, oldWeight, newWeight); } if (dst != address(0)) { (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount); emit DelegateVotesChanged(dst, oldWeight, newWeight); } } } function _writeCheckpoint( Checkpoint[] storage ckpts, function(uint256, uint256) view returns (uint256) op, uint256 delta ) private returns (uint256 oldWeight, uint256 newWeight) { uint256 pos = ckpts.length; unchecked { Checkpoint memory oldCkpt = pos == 0 ? Checkpoint(0, 0) : _unsafeAccess(ckpts, pos - 1); oldWeight = oldCkpt.votes; newWeight = op(oldWeight, delta); if (pos > 0 && oldCkpt.fromBlock == clock()) { _unsafeAccess(ckpts, pos - 1).votes = SafeCastUpgradeable.toUint224(newWeight); } else { ckpts.push(Checkpoint({fromBlock: SafeCastUpgradeable.toUint32(clock()), votes: SafeCastUpgradeable.toUint224(newWeight)})); } } } function _add(uint256 a, uint256 b) private pure returns (uint256) { return a + b; } function _subtract(uint256 a, uint256 b) private pure returns (uint256) { return a - b; } /** * @dev Access an element of the array without performing bounds check. The position is assumed to be within bounds. */ function _unsafeAccess(Checkpoint[] storage ckpts, uint256 pos) private pure returns (Checkpoint storage result) { assembly { mstore(0, ckpts.slot) result.slot := add(keccak256(0, 0x20), pos) } } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[47] private __gap; } // File: @openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File: uzx.sol pragma solidity ^0.8.20; contract UZX is Initializable,OwnableUpgradeable, ERC20VotesUpgradeable{ event BecomeSuperUser(address user); event CancelSuperUser(address user); address public constant LockAddress = address(0x0000000000000000000000000000008888888888); address public constant LockMiningAddress = address(0x0000000000000000000000000000088888888888); mapping(address => uint256) lockedBalance; mapping(address => mapping(uint => uint)) lockedValueMap; mapping(address => uint[]) lockedTimeMap; mapping(address => uint) public userIdentity; uint8 constant private TYPE_GENESIS = 1; uint8 constant private TYPE_SUPER = 2; address public operator; address public UZXDao; address public miningRewards; mapping(address => uint) becomeSuperAmount; mapping(address => uint[]) public genesisUnlockTimeMap; mapping(address => uint[]) public superUnlockTimeMap; mapping(address => address) superSelfChangeMap; uint[] public superUserTime; uint public superUserQuota; IERC20 usdt; constructor(){ _disableInitializers(); } function initialize(address[] memory _genesisUsers,address _operator,address _dao,address _miningRewards) public initializer { require(_genesisUsers.length == 7, "Error genesis users"); OwnableUpgradeable.__Ownable_init(); ERC20Upgradeable.__ERC20_init("UZXCoin","UZX"); ERC20PermitUpgradeable. __ERC20Permit_init("UZXCoin"); ERC20VotesUpgradeable.__ERC20Votes_init(); _init(_genesisUsers,_operator,_dao,_miningRewards); } function _init(address[] memory _genesisUsers,address _operator,address _daoFunding,address _miningRewards) internal virtual { usdt = IERC20(address(0xc2132D05D31c914a87C6611C10748AEb04B58e8F)); miningRewards = _miningRewards; superUserTime = new uint[](20); superUserQuota = 20; uint256[] memory unlockTime = new uint256[](15); for (uint i = 15; i > 0; i--) { unlockTime[i-1] = getNextDayZero() + ( (15 - i) * 30 * 1 days + 730 days); } uint genesisAmount = 20000000 * 10**18; for (uint i = 0; i < _genesisUsers.length; i++) { _mint(_genesisUsers[i], genesisAmount); lockedBalance[_genesisUsers[i]] += genesisAmount; genesisUnlockTimeMap[_genesisUsers[i]] = unlockTime; userIdentity[_genesisUsers[i]] = TYPE_GENESIS; } _mint(_operator, 30000000 * 10**18); operator = _operator; _mint(_daoFunding, 20000000 * 10**18); lockedBalance[LockAddress] += 210000000 * 10**18; _mint(LockAddress, 210000000 * 10**18); lockedBalance[LockMiningAddress] += 100000000 * 10**18; _mint(LockMiningAddress, 100000000 * 10**18); for (uint i = 20 ; i > 0 ; i--){ superUserTime[i-1] = getNextDayZero() + ( (10 - (i%2==0?i:i+1)/2) * 90 * 1 days); } } function addSuperUser(address[] memory _user,uint[] memory _amount) onlyOwner public returns (bool){ require(_user.length == _amount.length,"Error super user data"); require(superUserQuota > 0,"No super user quota"); for (uint i = 0 ; i < _user.length ; i ++){ becomeSuperAmount[_user[i]] = _amount[i]; } return true; } function becomeSuperUser() public returns (bool){ address sender = _msgSender(); require(becomeSuperAmount[sender] > 0 ,"Ineligible address"); require(superUserQuota > 0 ,"No super user quota"); require(superUserTime[superUserQuota - 1] < block.timestamp ,"It is not time to become super user"); if(becomeSuperAmount[sender] > 1){ usdt.transferFrom(sender, address(this), becomeSuperAmount[sender]); } delete becomeSuperAmount[sender]; uint256[] memory unlockTime = new uint256[](11); for (uint i = 11; i > 0; i--) { unlockTime[i-1] = getNextDayZero() + ( (11 - i) * 30 * 1 days + 365 days); } superUnlockTimeMap[sender] = unlockTime; userIdentity[sender] = TYPE_SUPER; superUserQuota -= 1; lockedBalance[LockAddress] -= 10500000 * 10**18; lockedBalance[sender] += 10500000 * 10**18; _transfer(LockAddress, sender, 10500000 * 10**18); emit BecomeSuperUser(sender); return true; } function superUnlockCoin() isSuper(_msgSender()) public returns(bool){ address sender = _msgSender(); require(lockedBalance[sender] > 5000000 * 10**18,"No more coins to unlock"); require(superUnlockTimeMap[sender][superUnlockTimeMap[sender].length - 1] < block.timestamp ,"It is not time to unlock the coins yet"); lockedBalance[sender] -= (superUnlockTimeMap[sender].length == 1 ? 250000 * 10**18 : 525000 * 10**18); superUnlockTimeMap[sender].pop(); return true; } function changeSuper(address _newSuper,address _oldSuper) isUZXDao isSuper(_oldSuper) public returns(bool){ require(balanceOf(_newSuper) > 5000000 * 10*18,"Not enough balance"); lockedBalance[_newSuper] += 5000000 * 10*18; lockedBalance[_oldSuper] -= 5000000 * 10*18; userIdentity[_newSuper] = TYPE_SUPER; delete userIdentity[_oldSuper]; emit BecomeSuperUser(_newSuper); emit CancelSuperUser(_oldSuper); return true; } function authorizeSuperChangeAddress(address superUser,address newAddress) isSuper(superUser) onlyOwner public returns(bool){ superSelfChangeMap[superUser] = newAddress; return true; } function superChangeAddress(address newAddress) isSuper(_msgSender()) public returns(bool){ address sender = _msgSender(); require(superSelfChangeMap[sender] == newAddress,"Error address"); delete superSelfChangeMap[sender]; delete userIdentity[sender]; userIdentity[newAddress] = TYPE_SUPER; superUnlockTimeMap[newAddress] = superUnlockTimeMap[sender]; delete superUnlockTimeMap[sender]; transferAll(sender, newAddress); emit BecomeSuperUser(newAddress); emit CancelSuperUser(sender); return true; } function transferAll(address senderAddress, address receiveAddress) internal { uint256 lockBalance = lockedBalance[senderAddress]; lockedBalance[senderAddress] = 0; lockedBalance[receiveAddress] += lockBalance; _transfer(senderAddress, receiveAddress, balanceOf(senderAddress)); } function genesisUnlockCoin() isGenesis public returns(bool){ address sender = _msgSender(); require(lockedBalance[sender] >= 6000000 * 10**18,"No more coins to unlock"); require(genesisUnlockTimeMap[sender][genesisUnlockTimeMap[sender].length - 1] < block.timestamp ,"It is not time to unlock the coins yet"); genesisUnlockTimeMap[sender].pop(); lockedBalance[sender] -= 1000000 * 10**18; return true; } function genesisChangeAddress(address newAddress) isGenesis public returns(bool){ address sender = _msgSender(); delete userIdentity[sender]; userIdentity[newAddress] = TYPE_GENESIS; genesisUnlockTimeMap[newAddress] = genesisUnlockTimeMap[sender]; delete genesisUnlockTimeMap[sender]; transferAll(sender, newAddress); return true; } function miningRequest(uint amount) public returns (bool){ require(_msgSender() == miningRewards,"Only mining rewards address"); require(balanceOf(LockMiningAddress) >= amount, "Not enough balance"); lockedBalance[LockMiningAddress] -= amount; _transfer(LockMiningAddress, miningRewards, amount); return true; } function getNextDayZero() internal view returns (uint256){ return block.timestamp - (block.timestamp % 1 days) + (1 days); } function setUZXDao(address _address) onlyOwner public{ require(UZXDao == address(0),"UZXDao already set"); UZXDao = _address; } function extractUSDT(address _address,uint256 _amount) onlyOwner public returns (bool){ usdt.transfer(_address, _amount); return true; } function batchTransfer(address[] memory recipients, uint256[] memory amounts) isOperator external returns (bool){ require(recipients.length == amounts.length, "Arrays must have the same length"); for (uint256 i = 0; i < recipients.length; i++) { _transfer(operator, recipients[i], amounts[i]); } return true; } function transferLocked(address to, uint totalAmount, uint lockAmount,uint256 lockDays) isOperator public{ address tokenOwner = _msgSender(); require(totalAmount >= lockAmount,"LockAmount error"); _transfer(tokenOwner,to,totalAmount); if(lockAmount > 0){ uint unlockTime = getNextDayZero() + (lockDays * 1 days); lockedBalance[to] = lockedBalance[to] + lockAmount; mapping(uint=>uint) storage lockedValue = lockedValueMap[to]; if(lockedValue[unlockTime]==0){ lockedTimeMap[to].push(unlockTime); } lockedValue[unlockTime] = lockedValue[unlockTime] + lockAmount; } } function getLockedInfo() view public returns(uint[] memory,uint[] memory,uint){ uint[] memory lockedTime = lockedTimeMap[msg.sender]; uint[] memory lockedValue = new uint[](lockedTime.length); for(uint i = 0 ; i < lockedTime.length ; i++){ lockedValue[i] = lockedValueMap[msg.sender][lockedTime[i]]; } return (lockedTime,lockedValue,block.timestamp); } function unlockCoin() public returns(bool){ address sender = _msgSender(); require(lockedTimeMap[sender].length > 0,"no locked coin"); uint minTime = 0; uint[] memory lockedTimeList = lockedTimeMap[sender]; for(uint i = 0 ; i < lockedTimeList.length ; i++){ if(minTime == 0 || lockedTimeList[i] < minTime) minTime = lockedTimeList[i]; } require(minTime !=0 && minTime < block.timestamp,"it is not time to unlock coins"); uint[] memory lockedTime = lockedTimeMap[sender]; uint timeIndex = 0; for(uint i = 0 ; i < lockedTime.length ; i++){ if(lockedTime[i] < block.timestamp){ lockedBalance[sender] = lockedBalance[sender] - lockedValueMap[sender][lockedTime[i]]; delete lockedValueMap[sender][lockedTime[i]]; }else{ lockedTimeMap[sender][timeIndex] = lockedTime[i]; timeIndex++; } } for(uint i = timeIndex ; i < lockedTime.length ; i++){ lockedTimeMap[sender].pop(); } return true; } function lockedBalanceOf(address account) public view returns (uint256) { return lockedBalance[account]; } function burn(address account, uint amount) onlyOwner public{ _burn(account,amount); } function clock() public view override returns (uint48) { return uint48(block.timestamp); } function CLOCK_MODE() public pure override returns (string memory) { return "mode=timestamp"; } function _beforeTokenTransfer(address from,address to,uint256 amount) internal override virtual { if(lockedBalance[from] > 0){ require(balanceOf(from) - lockedBalance[from] >= amount,"Locked coin can not transfer"); } super._beforeTokenTransfer(from, to, amount); } function _afterTokenTransfer(address from,address to,uint256 amount) internal override virtual { super._afterTokenTransfer(from, to, amount); } modifier isUZXDao(){ require(UZXDao == _msgSender() ,"Only UZXDao"); _; } modifier isOperator(){ require(operator == _msgSender() ,"Only Operator"); _; } modifier isGenesis() { require(userIdentity[_msgSender()] == TYPE_GENESIS, "Only Genesis"); _; } modifier isSuper(address _address) { require(userIdentity[_address] == TYPE_SUPER, "Only Super"); _; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"}],"name":"BecomeSuperUser","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"}],"name":"CancelSuperUser","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[],"name":"EIP712DomainChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CLOCK_MODE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LockAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LockMiningAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UZXDao","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_user","type":"address[]"},{"internalType":"uint256[]","name":"_amount","type":"uint256[]"}],"name":"addSuperUser","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"superUser","type":"address"},{"internalType":"address","name":"newAddress","type":"address"}],"name":"authorizeSuperChangeAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"batchTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"becomeSuperUser","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newSuper","type":"address"},{"internalType":"address","name":"_oldSuper","type":"address"}],"name":"changeSuper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint32","name":"pos","type":"uint32"}],"name":"checkpoints","outputs":[{"components":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint224","name":"votes","type":"uint224"}],"internalType":"struct ERC20VotesUpgradeable.Checkpoint","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"clock","outputs":[{"internalType":"uint48","name":"","type":"uint48"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eip712Domain","outputs":[{"internalType":"bytes1","name":"fields","type":"bytes1"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"version","type":"string"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"verifyingContract","type":"address"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"uint256[]","name":"extensions","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"extractUSDT","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"genesisChangeAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"genesisUnlockCoin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"genesisUnlockTimeMap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLockedInfo","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"timepoint","type":"uint256"}],"name":"getPastTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"timepoint","type":"uint256"}],"name":"getPastVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_genesisUsers","type":"address[]"},{"internalType":"address","name":"_operator","type":"address"},{"internalType":"address","name":"_dao","type":"address"},{"internalType":"address","name":"_miningRewards","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"lockedBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"miningRequest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"miningRewards","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setUZXDao","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"superChangeAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"superUnlockCoin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"superUnlockTimeMap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"superUserQuota","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"superUserTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"totalAmount","type":"uint256"},{"internalType":"uint256","name":"lockAmount","type":"uint256"},{"internalType":"uint256","name":"lockDays","type":"uint256"}],"name":"transferLocked","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlockCoin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userIdentity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506200001c62000022565b620000e3565b600054610100900460ff16156200008f5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff90811614620000e1576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b614b1d80620000f36000396000f3fe608060405234801561001057600080fd5b50600436106103785760003560e01c806384b0196e116101d3578063c3cda52011610104578063dc80a9eb116100a2578063f259f69a1161007c578063f259f69a146107e0578063f2fde38b146107f7578063f50f6b8f1461080a578063f82900b11461081457600080fd5b8063dc80a9eb1461077d578063dd62ed3e14610790578063f1127ed8146107a357600080fd5b8063d35b6c98116100de578063d35b6c9814610742578063d46005b11461074a578063d505accf1461075d578063dc5e7cff1461077057600080fd5b8063c3cda52014610709578063c6413c781461071c578063cc18b7f11461072f57600080fd5b80639ab24eb011610171578063a9059cbb1161014b578063a9059cbb146106c8578063ad571aff146106db578063b8393543146106ee578063c173dab71461070157600080fd5b80639ab24eb01461068f5780639dc29fac146106a2578063a457c2d7146106b557600080fd5b80638e539e8c116101ad5780638e539e8c1461064b57806391ddadf41461065e57806395d89b4114610674578063972d4c391461067c57600080fd5b806384b0196e1461060c57806388d695b2146106275780638da5cb5b1461063a57600080fd5b8063570ca735116102ad5780636232d9b71161024b57806370a082311161022557806370a08231146105bc57806370d8d374146105e5578063715018a6146105f15780637ecebe00146105f957600080fd5b80636232d9b71461056e5780636c23b90a146105815780636fcfff451461059457600080fd5b80635c19a95c116102875780635c19a95c1461052b5780635f16f78d146105405780635f8341c514610553578063614b485a1461055b57600080fd5b8063570ca735146104c1578063587cde1e146104d5578063593557361461050157600080fd5b80632520f2191161031a57806339509351116102f4578063395093511461045e5780633a46b1a81461047157806340c449f7146104845780634bf5d7e91461049757600080fd5b80632520f21914610434578063313ce567146104475780633644e5151461045657600080fd5b80630a0782d5116103565780630a0782d5146103c257806318160ddd146103ee57806321839e321461040057806323b872dd1461042157600080fd5b806301de3d011461037d57806306fdde031461039a578063095ea7b3146103af575b600080fd5b610385610828565b60405190151581526020015b60405180910390f35b6103a26109ce565b60405161039191906142a0565b6103856103bd3660046142ca565b610a60565b610135546103d6906001600160a01b031681565b6040516001600160a01b039091168152602001610391565b6067545b604051908152602001610391565b6103f261040e3660046142f4565b6101336020526000908152604090205481565b61038561042f36600461430f565b610a7a565b6103f261044236600461434b565b610a9e565b60405160128152602001610391565b6103f2610ac0565b61038561046c3660046142ca565b610acf565b6103f261047f3660046142ca565b610af1565b610385610492366004614364565b610b6f565b60408051808201909152600e81526d06d6f64653d74696d657374616d760941b60208201526103a2565b610134546103d6906001600160a01b031681565b6103d66104e33660046142f4565b6001600160a01b03908116600090815260fe60205260409020541690565b6103f261050f3660046142f4565b6001600160a01b03166000908152610130602052604090205490565b61053e6105393660046142f4565b610d63565b005b61038561054e3660046142f4565b610d70565b610385610e3f565b6103f26105693660046142ca565b611003565b61038561057c3660046142ca565b611035565b61038561058f366004614364565b6110c1565b6105a76105a23660046142f4565b611138565b60405163ffffffff9091168152602001610391565b6103f26105ca3660046142f4565b6001600160a01b031660009081526065602052604090205490565b6103d664888888888881565b61053e61115a565b6103f26106073660046142f4565b61116e565b61061461118c565b60405161039197969594939291906143d2565b61038561063536600461451f565b61122a565b6033546001600160a01b03166103d6565b6103f261065936600461434b565b611334565b60405165ffffffffffff42168152602001610391565b6103a2611395565b61053e61068a3660046145da565b6113a4565b6103f261069d3660046142f4565b611526565b61053e6106b03660046142ca565b6115a8565b6103856106c33660046142ca565b6115be565b6103856106d63660046142ca565b611639565b6103f26106e93660046142ca565b611647565b61053e6106fc3660046142f4565b611664565b6103856116de565b61053e610717366004614624565b611ac8565b61038561072a36600461434b565b611bfe565b61038561073d3660046142f4565b611d49565b610385611ee9565b61053e61075836600461467c565b6122b2565b61053e61076b3660046146eb565b61248d565b6103d66508888888888881565b61038561078b36600461451f565b6125f1565b6103f261079e366004614364565b612709565b6107b66107b1366004614755565b612734565b60408051825163ffffffff1681526020928301516001600160e01b03169281019290925201610391565b6107e86127b8565b60405161039193929190614795565b61053e6108053660046142f4565b6128ed565b6103f261013c5481565b610136546103d6906001600160a01b031681565b336000908152610133602052604081205460011461087c5760405162461bcd60e51b815260206004820152600c60248201526b4f6e6c792047656e6573697360a01b60448201526064015b60405180910390fd5b33600081815261013060205260409020546a04f68ca6d8cd91c600000011156108e15760405162461bcd60e51b81526020600482015260176024820152764e6f206d6f726520636f696e7320746f20756e6c6f636b60481b6044820152606401610873565b6001600160a01b038116600090815261013860205260409020805442919061090b906001906147e1565b8154811061091b5761091b6147f4565b9060005260206000200154106109435760405162461bcd60e51b81526004016108739061480a565b6001600160a01b03811660009081526101386020526040902080548061096b5761096b614850565b6001900381819060005260206000200160009055905569d3c21bcecceda10000006101306000836001600160a01b03166001600160a01b0316815260200190815260200160002060008282546109c191906147e1565b9091555060019250505090565b6060606880546109dd90614866565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0990614866565b8015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b5050505050905090565b600033610a6e818585612963565b60019150505b92915050565b600033610a88858285612a87565b610a93858585612b01565b506001949350505050565b61013b8181548110610aaf57600080fd5b600091825260209091200154905081565b6000610aca612cbd565b905090565b600033610a6e818585610ae28383612709565b610aec919061489a565b612963565b60004265ffffffffffff168210610b465760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610873565b6001600160a01b038316600090815260ff60205260409020610b689083612cc7565b9392505050565b610135546000906001600160a01b03163314610bbb5760405162461bcd60e51b815260206004820152600b60248201526a4f6e6c7920555a5844616f60a81b6044820152606401610873565b6001600160a01b038216600090815261013360205260409020548290600214610bf65760405162461bcd60e51b8152600401610873906148ad565b6335a4e900610c1a856001600160a01b031660009081526065602052604090205490565b11610c5c5760405162461bcd60e51b81526020600482015260126024820152714e6f7420656e6f7567682062616c616e636560701b6044820152606401610873565b6001600160a01b03841660009081526101306020526040812080546335a4e9009290610c8990849061489a565b90915550506001600160a01b03831660009081526101306020526040812080546335a4e9009290610cbb9084906147e1565b90915550506001600160a01b038481166000818152610133602090815260408083206002905593871682528382209190915591519081527f260a88fa07e8ea4260d30faac411b1c748c1ce1e10b53d1834e3558fd9db1cdb910160405180910390a16040516001600160a01b03841681527f59c6cc77543b0366e9ac5aacb1ca32a6b7ac8879330886f7010279da1dc5d2f69060200160405180910390a15060019392505050565b610d6d3382612db0565b50565b3360009081526101336020526040812054600114610dbf5760405162461bcd60e51b815260206004820152600c60248201526b4f6e6c792047656e6573697360a01b6044820152606401610873565b336000818152610133602090815260408083208390556001600160a01b038616808452818420600190558484526101389092528083209183529091208154610e0792906141a0565b506001600160a01b038116600090815261013860205260408120610e2a916141ec565b610e348184612e2a565b60019150505b919050565b3360008181526101336020526040812054909190600214610e725760405162461bcd60e51b8152600401610873906148ad565b33600081815261013060205260409020546a0422ca8b0a00a42500000010610ed65760405162461bcd60e51b81526020600482015260176024820152764e6f206d6f726520636f696e7320746f20756e6c6f636b60481b6044820152606401610873565b6001600160a01b0381166000908152610139602052604090208054429190610f00906001906147e1565b81548110610f1057610f106147f4565b906000526020600020015410610f385760405162461bcd60e51b81526004016108739061480a565b6001600160a01b03811660009081526101396020526040902054600114610f6957696f2c4e995ec98e200000610f75565b6934f086f3b33b684000005b69ffffffffffffffffffff166101306000836001600160a01b03166001600160a01b031681526020019081526020016000206000828254610fb691906147e1565b90915550506001600160a01b038116600090815261013960205260409020805480610fe357610fe3614850565b6001900381819060005260206000200160009055905560019250505b5090565b610139602052816000526040600020818154811061102057600080fd5b90600052602060002001600091509150505481565b600061103f612e96565b61013d5460405163a9059cbb60e01b81526001600160a01b038581166004830152602482018590529091169063a9059cbb906044016020604051808303816000875af1158015611093573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b791906148d1565b5060019392505050565b6001600160a01b0382166000908152610133602052604081205483906002146110fc5760405162461bcd60e51b8152600401610873906148ad565b611104612e96565b50506001600160a01b03918216600090815261013a6020526040902080546001600160a01b03191691909216179055600190565b6001600160a01b038116600090815260ff6020526040812054610a7490612ef0565b611162612e96565b61116c6000612f55565b565b6001600160a01b038116600090815260cb6020526040812054610a74565b6000606080600080600060606097546000801b1480156111ac5750609854155b6111f05760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606401610873565b6111f8612fa7565b611200612fb6565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b610134546000906001600160a01b031633146112785760405162461bcd60e51b815260206004820152600d60248201526c27b7363c9027b832b930ba37b960991b6044820152606401610873565b81518351146112c95760405162461bcd60e51b815260206004820181905260248201527f417272617973206d7573742068617665207468652073616d65206c656e6774686044820152606401610873565b60005b83518110156110b757610134548451611322916001600160a01b0316908690849081106112fb576112fb6147f4565b6020026020010151858481518110611315576113156147f4565b6020026020010151612b01565b8061132c816148f3565b9150506112cc565b60004265ffffffffffff1682106113895760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610873565b610a7461010083612cc7565b6060606980546109dd90614866565b610134546001600160a01b031633146113ef5760405162461bcd60e51b815260206004820152600d60248201526c27b7363c9027b832b930ba37b960991b6044820152606401610873565b33828410156114335760405162461bcd60e51b815260206004820152601060248201526f2637b1b5a0b6b7bab73a1032b93937b960811b6044820152606401610873565b61143e818686612b01565b821561151f576000611453836201518061490c565b61145b612fc5565b611465919061489a565b6001600160a01b0387166000908152610130602052604090205490915061148d90859061489a565b6001600160a01b038716600090815261013060209081526040808320939093556101318152828220848352908190529181205490036114f3576001600160a01b038716600090815261013260209081526040822080546001810182559083529120018290555b60008281526020829052604090205461150d90869061489a565b60009283526020919091526040909120555b5050505050565b6001600160a01b038116600090815260ff60205260408120548015611595576001600160a01b038316600090815260ff6020526040902080546000198301908110611573576115736147f4565b60009182526020909120015464010000000090046001600160e01b0316611598565b60005b6001600160e01b03169392505050565b6115b0612e96565b6115ba8282612feb565b5050565b600033816115cc8286612709565b90508381101561162c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610873565b610a938286868403612963565b600033610a6e818585612b01565b610138602052816000526040600020818154811061102057600080fd5b61166c612e96565b610135546001600160a01b0316156116bb5760405162461bcd60e51b815260206004820152601260248201527115569611185bc8185b1c9958591e481cd95d60721b6044820152606401610873565b61013580546001600160a01b0319166001600160a01b0392909216919091179055565b33600081815261013760205260408120549091906117335760405162461bcd60e51b8152602060048201526012602482015271496e656c696769626c65206164647265737360701b6044820152606401610873565b600061013c541161177c5760405162461bcd60e51b81526020600482015260136024820152724e6f20737570657220757365722071756f746160681b6044820152606401610873565b4261013b600161013c5461179091906147e1565b815481106117a0576117a06147f4565b9060005260206000200154106118045760405162461bcd60e51b815260206004820152602360248201527f4974206973206e6f742074696d6520746f206265636f6d65207375706572207560448201526239b2b960e91b6064820152608401610873565b6001600160a01b03811660009081526101376020526040902054600110156118b75761013d546001600160a01b0382811660008181526101376020526040908190205490516323b872dd60e01b8152600481019290925230602483015260448201529116906323b872dd906064016020604051808303816000875af1158015611891573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118b591906148d1565b505b6001600160a01b0381166000908152610137602090815260408083208390558051600b808252610180820190925291820161016080368337019050509050600b5b801561197a5761190981600b6147e1565b61191490601e61490c565b611921906201518061490c565b61192f906301e1338061489a565b611937612fc5565b611941919061489a565b8261194d6001846147e1565b8151811061195d5761195d6147f4565b60209081029190910101528061197281614923565b9150506118f8565b506001600160a01b03821660009081526101396020908152604090912082516119a59284019061420a565b506001600160a01b0382166000908152610133602052604081206002905561013c8054600192906119d79084906147e1565b909155505064888888888860009081526101306020527f783040282484dfc8d1cb5f777c8a8d379cb3545bb226d8c0ae323bfca96f47d780546a08af7623fb67bf1a8000009290611a299084906147e1565b90915550506001600160a01b03821660009081526101306020526040812080546a08af7623fb67bf1a8000009290611a6290849061489a565b90915550611a839050648888888888836a08af7623fb67bf1a800000612b01565b6040516001600160a01b03831681527f260a88fa07e8ea4260d30faac411b1c748c1ce1e10b53d1834e3558fd9db1cdb9060200160405180910390a160019250505090565b83421115611b185760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610873565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b038816918101919091526060810186905260808101859052600090611b9290611b8a9060a00160405160208183030381529060405280519060200120613004565b858585613031565b9050611b9d81613059565b8614611beb5760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610873565b611bf58188612db0565b50505050505050565b610136546000906001600160a01b0316336001600160a01b031614611c655760405162461bcd60e51b815260206004820152601b60248201527f4f6e6c79206d696e696e672072657761726473206164647265737300000000006044820152606401610873565b6508888888888860005260656020527f8f5af3c1063236be11ae3a69c821e061f76dbe0f4b5c1d82d51f10c76c9f9d1654821115611cda5760405162461bcd60e51b81526020600482015260126024820152714e6f7420656e6f7567682062616c616e636560701b6044820152606401610873565b6508888888888860009081526101306020527f4eafcfbd02771f66df42d1f3cd4568775dbfdb0c59dcebc984e3f32af8aacf238054849290611d1d9084906147e1565b909155505061013654611d419065088888888888906001600160a01b031684612b01565b506001919050565b3360008181526101336020526040812054909190600214611d7c5760405162461bcd60e51b8152600401610873906148ad565b33600081815261013a60205260409020546001600160a01b03858116911614611dd75760405162461bcd60e51b815260206004820152600d60248201526c4572726f72206164647265737360981b6044820152606401610873565b6001600160a01b03808216600081815261013a6020908152604080832080546001600160a01b03191690556101338252808320839055938816808352848320600290559282526101399052828120918152919091208154611e3892906141a0565b506001600160a01b038116600090815261013960205260408120611e5b916141ec565b611e658185612e2a565b6040516001600160a01b03851681527f260a88fa07e8ea4260d30faac411b1c748c1ce1e10b53d1834e3558fd9db1cdb9060200160405180910390a16040516001600160a01b03821681527f59c6cc77543b0366e9ac5aacb1ca32a6b7ac8879330886f7010279da1dc5d2f69060200160405180910390a160019250505b50919050565b3360008181526101326020526040812054909190611f3a5760405162461bcd60e51b815260206004820152600e60248201526d3737903637b1b5b2b21031b7b4b760911b6044820152606401610873565b6001600160a01b03811660009081526101326020908152604080832080548251818502810185019093528083528493830182828015611f9857602002820191906000526020600020905b815481526020019060010190808311611f84575b5050505050905060005b815181101561200457821580611fd0575082828281518110611fc657611fc66147f4565b6020026020010151105b15611ff257818181518110611fe757611fe76147f4565b602002602001015192505b80611ffc816148f3565b915050611fa2565b50811580159061201357504282105b61205f5760405162461bcd60e51b815260206004820152601e60248201527f6974206973206e6f742074696d6520746f20756e6c6f636b20636f696e7300006044820152606401610873565b6001600160a01b038316600090815261013260209081526040808320805482518185028101850190935280835291929091908301828280156120c057602002820191906000526020600020905b8154815260200190600101908083116120ac575b505050505090506000805b825181101561224857428382815181106120e7576120e76147f4565b602002602001015110156121cb576001600160a01b0386166000908152610131602052604081208451909190859084908110612125576121256147f4565b60200260200101518152602001908152602001600020546101306000886001600160a01b03166001600160a01b031681526020019081526020016000205461216d91906147e1565b6001600160a01b03871660009081526101306020908152604080832093909355610131905290812084519091908590849081106121ac576121ac6147f4565b6020026020010151815260200190815260200160002060009055612236565b8281815181106121dd576121dd6147f4565b60200260200101516101326000886001600160a01b03166001600160a01b03168152602001908152602001600020838154811061221c5761221c6147f4565b60009182526020909120015581612232816148f3565b9250505b80612240816148f3565b9150506120cb565b50805b82518110156122a5576001600160a01b03861660009081526101326020526040902080548061227c5761227c614850565b60019003818190600052602060002001600090559055808061229d906148f3565b91505061224b565b5060019550505050505090565b600054610100900460ff16158080156122d25750600054600160ff909116105b806122ec5750303b1580156122ec575060005460ff166001145b61234f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610873565b6000805460ff191660011790558015612372576000805461ff0019166101001790555b84516007146123b95760405162461bcd60e51b81526020600482015260136024820152724572726f722067656e6573697320757365727360681b6044820152606401610873565b6123c161307f565b612405604051806040016040528060078152602001662aad2c21b7b4b760c91b815250604051806040016040528060038152602001620aab4b60eb1b8152506130ae565b61242d604051806040016040528060078152602001662aad2c21b7b4b760c91b8152506130df565b612435613129565b61244185858585613150565b801561151f576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b834211156124dd5760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610873565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861250c8c613059565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e001604051602081830303815290604052805190602001209050600061256782613004565b9050600061257782878787613031565b9050896001600160a01b0316816001600160a01b0316146125da5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610873565b6125e58a8a8a612963565b50505050505050505050565b60006125fb612e96565b81518351146126445760405162461bcd60e51b81526020600482015260156024820152744572726f722073757065722075736572206461746160581b6044820152606401610873565b600061013c541161268d5760405162461bcd60e51b81526020600482015260136024820152724e6f20737570657220757365722071756f746160681b6044820152606401610873565b60005b83518110156110b7578281815181106126ab576126ab6147f4565b602002602001015161013760008684815181106126ca576126ca6147f4565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020819055508080612701906148f3565b915050612690565b6001600160a01b03918216600090815260666020908152604080832093909416825291909152205490565b60408051808201909152600080825260208201526001600160a01b038316600090815260ff60205260409020805463ffffffff8416908110612778576127786147f4565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b3360009081526101326020908152604080832080548251818502810185019093528083526060948594909384939092909183018282801561281857602002820191906000526020600020905b815481526020019060010190808311612804575b505050505090506000815167ffffffffffffffff81111561283b5761283b614442565b604051908082528060200260200182016040528015612864578160200160208202803683370190505b50905060005b82518110156128e05733600090815261013160205260408120845190919085908490811061289a5761289a6147f4565b60200260200101518152602001908152602001600020548282815181106128c3576128c36147f4565b6020908102919091010152806128d8816148f3565b91505061286a565b5090949093504292509050565b6128f5612e96565b6001600160a01b03811661295a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610873565b610d6d81612f55565b6001600160a01b0383166129c55760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610873565b6001600160a01b038216612a265760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610873565b6001600160a01b0383811660008181526066602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000612a938484612709565b90506000198114612afb5781811015612aee5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610873565b612afb8484848403612963565b50505050565b6001600160a01b038316612b655760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610873565b6001600160a01b038216612bc75760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610873565b612bd283838361357e565b6001600160a01b03831660009081526065602052604090205481811015612c4a5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610873565b6001600160a01b0380851660008181526065602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612caa9086815260200190565b60405180910390a3612afb84848461361c565b6000610aca613627565b815460009081816005811115612d21576000612ce28461369b565b612cec90856147e1565b600088815260209020909150869082015463ffffffff161115612d1157809150612d1f565b612d1c81600161489a565b92505b505b80821015612d6e576000612d358383613783565b600088815260209020909150869082015463ffffffff161115612d5a57809150612d68565b612d6581600161489a565b92505b50612d21565b8015612d9a576000868152602090208101600019015464010000000090046001600160e01b0316612d9d565b60005b6001600160e01b03169695505050505050565b6001600160a01b03828116600081815260fe6020818152604080842080546065845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4612afb82848361379e565b6001600160a01b0380831660009081526101306020526040808220805490839055928416825281208054839290612e6290849061489a565b90915550612e9190508383612e8c826001600160a01b031660009081526065602052604090205490565b612b01565b505050565b6033546001600160a01b0316331461116c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610873565b600063ffffffff821115610fff5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608401610873565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6060609980546109dd90614866565b6060609a80546109dd90614866565b6000612fd46201518042614950565b612fde90426147e1565b610aca906201518061489a565b612ff582826138db565b612afb610100613a2283613a2e565b6000610a74613011612cbd565b8360405161190160f01b8152600281019290925260228201526042902090565b600080600061304287878787613b98565b9150915061304f81613c5c565b5095945050505050565b6001600160a01b038116600090815260cb60205260409020805460018101825590611ee3565b600054610100900460ff166130a65760405162461bcd60e51b815260040161087390614964565b61116c613da6565b600054610100900460ff166130d55760405162461bcd60e51b815260040161087390614964565b6115ba8282613dd6565b600054610100900460ff166131065760405162461bcd60e51b815260040161087390614964565b610d6d81604051806040016040528060018152602001603160f81b815250613e16565b600054610100900460ff1661116c5760405162461bcd60e51b815260040161087390614964565b61013d805473c2132d05d31c914a87c6611c10748aeb04b58e8f6001600160a01b03199182161790915561013680549091166001600160a01b0383161790556040805160148082526102a08201909252906020820161028080368337505081516131c29261013b92506020019061420a565b50601461013c5560408051600f8082526102008201909252600091602082016101e080368337019050509050600f5b80156132735761320281600f6147e1565b61320d90601e61490c565b61321a906201518061490c565b613228906303c2670061489a565b613230612fc5565b61323a919061489a565b826132466001846147e1565b81518110613256576132566147f4565b60209081029190910101528061326b81614923565b9150506131f1565b506a108b2a2c2802909400000060005b86518110156133b4576132af8782815181106132a1576132a16147f4565b602002602001015183613e65565b8161013060008984815181106132c7576132c76147f4565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060008282546132fe919061489a565b9250508190555082610138600089848151811061331d5761331d6147f4565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020908051906020019061335892919061420a565b50600160ff166101336000898481518110613375576133756147f4565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000208190555080806133ac906148f3565b915050613283565b506133ca856a18d0bf423c03d8de000000613e65565b61013480546001600160a01b0319166001600160a01b0387161790556133fb846a108b2a2c28029094000000613e65565b64888888888860009081526101306020527f783040282484dfc8d1cb5f777c8a8d379cb3545bb226d8c0ae323bfca96f47d780546aadb53acfa41aee12000000929061344890849061489a565b9091555061346890506488888888886aadb53acfa41aee12000000613e65565b6508888888888860009081526101306020527f4eafcfbd02771f66df42d1f3cd4568775dbfdb0c59dcebc984e3f32af8aacf2380546a52b7d2dcc80cd2e400000092906134b690849061489a565b909155506134d79050650888888888886a52b7d2dcc80cd2e4000000613e65565b60145b8015611bf55760026134ec8183614950565b15613501576134fc82600161489a565b613503565b815b61350d91906149af565b61351890600a6147e1565b61352390605a61490c565b613530906201518061490c565b613538612fc5565b613542919061489a565b61013b6135506001846147e1565b81548110613560576135606147f4565b6000918252602090912001558061357681614923565b9150506134da565b6001600160a01b0383166000908152610130602052604090205415612e91576001600160a01b0383166000908152610130602090815260408083205460659092529091205482916135ce916147e1565b1015612e915760405162461bcd60e51b815260206004820152601c60248201527f4c6f636b656420636f696e2063616e206e6f74207472616e73666572000000006044820152606401610873565b612e91838383613ef0565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f613652613f22565b61365a613f7b565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b6000816000036136ad57506000919050565b600060016136ba84613fac565b901c6001901b905060018184816136d3576136d361493a565b048201901c905060018184816136eb576136eb61493a565b048201901c905060018184816137035761370361493a565b048201901c9050600181848161371b5761371b61493a565b048201901c905060018184816137335761373361493a565b048201901c9050600181848161374b5761374b61493a565b048201901c905060018184816137635761376361493a565b048201901c9050610b688182858161377d5761377d61493a565b04614040565b600061379260028484186149af565b610b689084841661489a565b816001600160a01b0316836001600160a01b0316141580156137c05750600081115b15612e91576001600160a01b0383161561384e576001600160a01b038316600090815260ff6020526040812081906137fb90613a2285613a2e565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051613843929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615612e91576001600160a01b038216600090815260ff6020526040812081906138849061405685613a2e565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516138cc929190918252602082015260400190565b60405180910390a25050505050565b6001600160a01b03821661393b5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610873565b6139478260008361357e565b6001600160a01b038216600090815260656020526040902054818110156139bb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610873565b6001600160a01b03831660008181526065602090815260408083208686039055606780548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3612e918360008461361c565b6000610b6882846147e1565b82546000908190818115613a7b5760008781526020902082016000190160408051808201909152905463ffffffff8116825264010000000090046001600160e01b03166020820152613a90565b60408051808201909152600080825260208201525b905080602001516001600160e01b03169350613ab084868863ffffffff16565b9250600082118015613ad05750805163ffffffff1665ffffffffffff4216145b15613b1557613ade83614062565b60008881526020902083016000190180546001600160e01b03929092166401000000000263ffffffff909216919091179055613b8e565b866040518060400160405280613b38613b2b4290565b65ffffffffffff16612ef0565b63ffffffff168152602001613b4c86614062565b6001600160e01b0390811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115613bcf5750600090506003613c53565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613c23573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116613c4c57600060019250925050613c53565b9150600090505b94509492505050565b6000816004811115613c7057613c706149c3565b03613c785750565b6001816004811115613c8c57613c8c6149c3565b03613cd95760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610873565b6002816004811115613ced57613ced6149c3565b03613d3a5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610873565b6003816004811115613d4e57613d4e6149c3565b03610d6d5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610873565b600054610100900460ff16613dcd5760405162461bcd60e51b815260040161087390614964565b61116c33612f55565b600054610100900460ff16613dfd5760405162461bcd60e51b815260040161087390614964565b6068613e098382614a27565b506069612e918282614a27565b600054610100900460ff16613e3d5760405162461bcd60e51b815260040161087390614964565b6099613e498382614a27565b50609a613e568282614a27565b50506000609781905560985550565b613e6f82826140cb565b6067546001600160e01b031015613ee15760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b6064820152608401610873565b612afb61010061405683613a2e565b6001600160a01b03838116600090815260fe6020526040808220548584168352912054612e919291821691168361379e565b600080613f2d612fa7565b805190915015613f44578051602090910120919050565b6097548015613f535792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b600080613f86612fb6565b805190915015613f9d578051602090910120919050565b6098548015613f535792915050565b600080608083901c15613fc157608092831c92015b604083901c15613fd357604092831c92015b602083901c15613fe557602092831c92015b601083901c15613ff757601092831c92015b600883901c1561400957600892831c92015b600483901c1561401b57600492831c92015b600283901c1561402d57600292831c92015b600183901c15610a745760010192915050565b600081831061404f5781610b68565b5090919050565b6000610b68828461489a565b60006001600160e01b03821115610fff5760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b6064820152608401610873565b6001600160a01b0382166141215760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610873565b61412d6000838361357e565b806067600082825461413f919061489a565b90915550506001600160a01b0382166000818152606560209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36115ba6000838361361c565b8280548282559060005260206000209081019282156141e05760005260206000209182015b828111156141e05782548255916001019190600101906141c5565b50610fff929150614245565b5080546000825590600052602060002090810190610d6d9190614245565b8280548282559060005260206000209081019282156141e0579160200282015b828111156141e057825182559160200191906001019061422a565b5b80821115610fff5760008155600101614246565b6000815180845260005b8181101561428057602081850181015186830182015201614264565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000610b68602083018461425a565b80356001600160a01b0381168114610e3a57600080fd5b600080604083850312156142dd57600080fd5b6142e6836142b3565b946020939093013593505050565b60006020828403121561430657600080fd5b610b68826142b3565b60008060006060848603121561432457600080fd5b61432d846142b3565b925061433b602085016142b3565b9150604084013590509250925092565b60006020828403121561435d57600080fd5b5035919050565b6000806040838503121561437757600080fd5b614380836142b3565b915061438e602084016142b3565b90509250929050565b600081518084526020808501945080840160005b838110156143c7578151875295820195908201906001016143ab565b509495945050505050565b60ff60f81b8816815260e0602082015260006143f160e083018961425a565b8281036040840152614403818961425a565b606084018890526001600160a01b038716608085015260a0840186905283810360c085015290506144348185614397565b9a9950505050505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561448157614481614442565b604052919050565b600067ffffffffffffffff8211156144a3576144a3614442565b5060051b60200190565b600082601f8301126144be57600080fd5b813560206144d36144ce83614489565b614458565b82815260059290921b840181019181810190868411156144f257600080fd5b8286015b8481101561451457614507816142b3565b83529183019183016144f6565b509695505050505050565b6000806040838503121561453257600080fd5b823567ffffffffffffffff8082111561454a57600080fd5b614556868387016144ad565b935060209150818501358181111561456d57600080fd5b85019050601f8101861361458057600080fd5b803561458e6144ce82614489565b81815260059190911b820183019083810190888311156145ad57600080fd5b928401925b828410156145cb578335825292840192908401906145b2565b80955050505050509250929050565b600080600080608085870312156145f057600080fd5b6145f9856142b3565b966020860135965060408601359560600135945092505050565b803560ff81168114610e3a57600080fd5b60008060008060008060c0878903121561463d57600080fd5b614646876142b3565b9550602087013594506040870135935061466260608801614613565b92506080870135915060a087013590509295509295509295565b6000806000806080858703121561469257600080fd5b843567ffffffffffffffff8111156146a957600080fd5b6146b5878288016144ad565b9450506146c4602086016142b3565b92506146d2604086016142b3565b91506146e0606086016142b3565b905092959194509250565b600080600080600080600060e0888a03121561470657600080fd5b61470f886142b3565b965061471d602089016142b3565b9550604088013594506060880135935061473960808901614613565b925060a0880135915060c0880135905092959891949750929550565b6000806040838503121561476857600080fd5b614771836142b3565b9150602083013563ffffffff8116811461478a57600080fd5b809150509250929050565b6060815260006147a86060830186614397565b82810360208401526147ba8186614397565b915050826040830152949350505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610a7457610a746147cb565b634e487b7160e01b600052603260045260246000fd5b60208082526026908201527f4974206973206e6f742074696d6520746f20756e6c6f636b2074686520636f696040820152651b9cc81e595d60d21b606082015260800190565b634e487b7160e01b600052603160045260246000fd5b600181811c9082168061487a57607f821691505b602082108103611ee357634e487b7160e01b600052602260045260246000fd5b80820180821115610a7457610a746147cb565b6020808252600a908201526927b7363c9029bab832b960b11b604082015260600190565b6000602082840312156148e357600080fd5b81518015158114610b6857600080fd5b600060018201614905576149056147cb565b5060010190565b8082028115828204841417610a7457610a746147cb565b600081614932576149326147cb565b506000190190565b634e487b7160e01b600052601260045260246000fd5b60008261495f5761495f61493a565b500690565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6000826149be576149be61493a565b500490565b634e487b7160e01b600052602160045260246000fd5b601f821115612e9157600081815260208120601f850160051c81016020861015614a005750805b601f850160051c820191505b81811015614a1f57828155600101614a0c565b505050505050565b815167ffffffffffffffff811115614a4157614a41614442565b614a5581614a4f8454614866565b846149d9565b602080601f831160018114614a8a5760008415614a725750858301515b600019600386901b1c1916600185901b178555614a1f565b600085815260208120601f198616915b82811015614ab957888601518255948401946001909101908401614a9a565b5085821015614ad75787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fea2646970667358221220786116b778e4dde4faacd9dfff2568db90b9da81471f12b663b3a2089b96230564736f6c63430008150033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103785760003560e01c806384b0196e116101d3578063c3cda52011610104578063dc80a9eb116100a2578063f259f69a1161007c578063f259f69a146107e0578063f2fde38b146107f7578063f50f6b8f1461080a578063f82900b11461081457600080fd5b8063dc80a9eb1461077d578063dd62ed3e14610790578063f1127ed8146107a357600080fd5b8063d35b6c98116100de578063d35b6c9814610742578063d46005b11461074a578063d505accf1461075d578063dc5e7cff1461077057600080fd5b8063c3cda52014610709578063c6413c781461071c578063cc18b7f11461072f57600080fd5b80639ab24eb011610171578063a9059cbb1161014b578063a9059cbb146106c8578063ad571aff146106db578063b8393543146106ee578063c173dab71461070157600080fd5b80639ab24eb01461068f5780639dc29fac146106a2578063a457c2d7146106b557600080fd5b80638e539e8c116101ad5780638e539e8c1461064b57806391ddadf41461065e57806395d89b4114610674578063972d4c391461067c57600080fd5b806384b0196e1461060c57806388d695b2146106275780638da5cb5b1461063a57600080fd5b8063570ca735116102ad5780636232d9b71161024b57806370a082311161022557806370a08231146105bc57806370d8d374146105e5578063715018a6146105f15780637ecebe00146105f957600080fd5b80636232d9b71461056e5780636c23b90a146105815780636fcfff451461059457600080fd5b80635c19a95c116102875780635c19a95c1461052b5780635f16f78d146105405780635f8341c514610553578063614b485a1461055b57600080fd5b8063570ca735146104c1578063587cde1e146104d5578063593557361461050157600080fd5b80632520f2191161031a57806339509351116102f4578063395093511461045e5780633a46b1a81461047157806340c449f7146104845780634bf5d7e91461049757600080fd5b80632520f21914610434578063313ce567146104475780633644e5151461045657600080fd5b80630a0782d5116103565780630a0782d5146103c257806318160ddd146103ee57806321839e321461040057806323b872dd1461042157600080fd5b806301de3d011461037d57806306fdde031461039a578063095ea7b3146103af575b600080fd5b610385610828565b60405190151581526020015b60405180910390f35b6103a26109ce565b60405161039191906142a0565b6103856103bd3660046142ca565b610a60565b610135546103d6906001600160a01b031681565b6040516001600160a01b039091168152602001610391565b6067545b604051908152602001610391565b6103f261040e3660046142f4565b6101336020526000908152604090205481565b61038561042f36600461430f565b610a7a565b6103f261044236600461434b565b610a9e565b60405160128152602001610391565b6103f2610ac0565b61038561046c3660046142ca565b610acf565b6103f261047f3660046142ca565b610af1565b610385610492366004614364565b610b6f565b60408051808201909152600e81526d06d6f64653d74696d657374616d760941b60208201526103a2565b610134546103d6906001600160a01b031681565b6103d66104e33660046142f4565b6001600160a01b03908116600090815260fe60205260409020541690565b6103f261050f3660046142f4565b6001600160a01b03166000908152610130602052604090205490565b61053e6105393660046142f4565b610d63565b005b61038561054e3660046142f4565b610d70565b610385610e3f565b6103f26105693660046142ca565b611003565b61038561057c3660046142ca565b611035565b61038561058f366004614364565b6110c1565b6105a76105a23660046142f4565b611138565b60405163ffffffff9091168152602001610391565b6103f26105ca3660046142f4565b6001600160a01b031660009081526065602052604090205490565b6103d664888888888881565b61053e61115a565b6103f26106073660046142f4565b61116e565b61061461118c565b60405161039197969594939291906143d2565b61038561063536600461451f565b61122a565b6033546001600160a01b03166103d6565b6103f261065936600461434b565b611334565b60405165ffffffffffff42168152602001610391565b6103a2611395565b61053e61068a3660046145da565b6113a4565b6103f261069d3660046142f4565b611526565b61053e6106b03660046142ca565b6115a8565b6103856106c33660046142ca565b6115be565b6103856106d63660046142ca565b611639565b6103f26106e93660046142ca565b611647565b61053e6106fc3660046142f4565b611664565b6103856116de565b61053e610717366004614624565b611ac8565b61038561072a36600461434b565b611bfe565b61038561073d3660046142f4565b611d49565b610385611ee9565b61053e61075836600461467c565b6122b2565b61053e61076b3660046146eb565b61248d565b6103d66508888888888881565b61038561078b36600461451f565b6125f1565b6103f261079e366004614364565b612709565b6107b66107b1366004614755565b612734565b60408051825163ffffffff1681526020928301516001600160e01b03169281019290925201610391565b6107e86127b8565b60405161039193929190614795565b61053e6108053660046142f4565b6128ed565b6103f261013c5481565b610136546103d6906001600160a01b031681565b336000908152610133602052604081205460011461087c5760405162461bcd60e51b815260206004820152600c60248201526b4f6e6c792047656e6573697360a01b60448201526064015b60405180910390fd5b33600081815261013060205260409020546a04f68ca6d8cd91c600000011156108e15760405162461bcd60e51b81526020600482015260176024820152764e6f206d6f726520636f696e7320746f20756e6c6f636b60481b6044820152606401610873565b6001600160a01b038116600090815261013860205260409020805442919061090b906001906147e1565b8154811061091b5761091b6147f4565b9060005260206000200154106109435760405162461bcd60e51b81526004016108739061480a565b6001600160a01b03811660009081526101386020526040902080548061096b5761096b614850565b6001900381819060005260206000200160009055905569d3c21bcecceda10000006101306000836001600160a01b03166001600160a01b0316815260200190815260200160002060008282546109c191906147e1565b9091555060019250505090565b6060606880546109dd90614866565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0990614866565b8015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b5050505050905090565b600033610a6e818585612963565b60019150505b92915050565b600033610a88858285612a87565b610a93858585612b01565b506001949350505050565b61013b8181548110610aaf57600080fd5b600091825260209091200154905081565b6000610aca612cbd565b905090565b600033610a6e818585610ae28383612709565b610aec919061489a565b612963565b60004265ffffffffffff168210610b465760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610873565b6001600160a01b038316600090815260ff60205260409020610b689083612cc7565b9392505050565b610135546000906001600160a01b03163314610bbb5760405162461bcd60e51b815260206004820152600b60248201526a4f6e6c7920555a5844616f60a81b6044820152606401610873565b6001600160a01b038216600090815261013360205260409020548290600214610bf65760405162461bcd60e51b8152600401610873906148ad565b6335a4e900610c1a856001600160a01b031660009081526065602052604090205490565b11610c5c5760405162461bcd60e51b81526020600482015260126024820152714e6f7420656e6f7567682062616c616e636560701b6044820152606401610873565b6001600160a01b03841660009081526101306020526040812080546335a4e9009290610c8990849061489a565b90915550506001600160a01b03831660009081526101306020526040812080546335a4e9009290610cbb9084906147e1565b90915550506001600160a01b038481166000818152610133602090815260408083206002905593871682528382209190915591519081527f260a88fa07e8ea4260d30faac411b1c748c1ce1e10b53d1834e3558fd9db1cdb910160405180910390a16040516001600160a01b03841681527f59c6cc77543b0366e9ac5aacb1ca32a6b7ac8879330886f7010279da1dc5d2f69060200160405180910390a15060019392505050565b610d6d3382612db0565b50565b3360009081526101336020526040812054600114610dbf5760405162461bcd60e51b815260206004820152600c60248201526b4f6e6c792047656e6573697360a01b6044820152606401610873565b336000818152610133602090815260408083208390556001600160a01b038616808452818420600190558484526101389092528083209183529091208154610e0792906141a0565b506001600160a01b038116600090815261013860205260408120610e2a916141ec565b610e348184612e2a565b60019150505b919050565b3360008181526101336020526040812054909190600214610e725760405162461bcd60e51b8152600401610873906148ad565b33600081815261013060205260409020546a0422ca8b0a00a42500000010610ed65760405162461bcd60e51b81526020600482015260176024820152764e6f206d6f726520636f696e7320746f20756e6c6f636b60481b6044820152606401610873565b6001600160a01b0381166000908152610139602052604090208054429190610f00906001906147e1565b81548110610f1057610f106147f4565b906000526020600020015410610f385760405162461bcd60e51b81526004016108739061480a565b6001600160a01b03811660009081526101396020526040902054600114610f6957696f2c4e995ec98e200000610f75565b6934f086f3b33b684000005b69ffffffffffffffffffff166101306000836001600160a01b03166001600160a01b031681526020019081526020016000206000828254610fb691906147e1565b90915550506001600160a01b038116600090815261013960205260409020805480610fe357610fe3614850565b6001900381819060005260206000200160009055905560019250505b5090565b610139602052816000526040600020818154811061102057600080fd5b90600052602060002001600091509150505481565b600061103f612e96565b61013d5460405163a9059cbb60e01b81526001600160a01b038581166004830152602482018590529091169063a9059cbb906044016020604051808303816000875af1158015611093573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b791906148d1565b5060019392505050565b6001600160a01b0382166000908152610133602052604081205483906002146110fc5760405162461bcd60e51b8152600401610873906148ad565b611104612e96565b50506001600160a01b03918216600090815261013a6020526040902080546001600160a01b03191691909216179055600190565b6001600160a01b038116600090815260ff6020526040812054610a7490612ef0565b611162612e96565b61116c6000612f55565b565b6001600160a01b038116600090815260cb6020526040812054610a74565b6000606080600080600060606097546000801b1480156111ac5750609854155b6111f05760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606401610873565b6111f8612fa7565b611200612fb6565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b610134546000906001600160a01b031633146112785760405162461bcd60e51b815260206004820152600d60248201526c27b7363c9027b832b930ba37b960991b6044820152606401610873565b81518351146112c95760405162461bcd60e51b815260206004820181905260248201527f417272617973206d7573742068617665207468652073616d65206c656e6774686044820152606401610873565b60005b83518110156110b757610134548451611322916001600160a01b0316908690849081106112fb576112fb6147f4565b6020026020010151858481518110611315576113156147f4565b6020026020010151612b01565b8061132c816148f3565b9150506112cc565b60004265ffffffffffff1682106113895760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610873565b610a7461010083612cc7565b6060606980546109dd90614866565b610134546001600160a01b031633146113ef5760405162461bcd60e51b815260206004820152600d60248201526c27b7363c9027b832b930ba37b960991b6044820152606401610873565b33828410156114335760405162461bcd60e51b815260206004820152601060248201526f2637b1b5a0b6b7bab73a1032b93937b960811b6044820152606401610873565b61143e818686612b01565b821561151f576000611453836201518061490c565b61145b612fc5565b611465919061489a565b6001600160a01b0387166000908152610130602052604090205490915061148d90859061489a565b6001600160a01b038716600090815261013060209081526040808320939093556101318152828220848352908190529181205490036114f3576001600160a01b038716600090815261013260209081526040822080546001810182559083529120018290555b60008281526020829052604090205461150d90869061489a565b60009283526020919091526040909120555b5050505050565b6001600160a01b038116600090815260ff60205260408120548015611595576001600160a01b038316600090815260ff6020526040902080546000198301908110611573576115736147f4565b60009182526020909120015464010000000090046001600160e01b0316611598565b60005b6001600160e01b03169392505050565b6115b0612e96565b6115ba8282612feb565b5050565b600033816115cc8286612709565b90508381101561162c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610873565b610a938286868403612963565b600033610a6e818585612b01565b610138602052816000526040600020818154811061102057600080fd5b61166c612e96565b610135546001600160a01b0316156116bb5760405162461bcd60e51b815260206004820152601260248201527115569611185bc8185b1c9958591e481cd95d60721b6044820152606401610873565b61013580546001600160a01b0319166001600160a01b0392909216919091179055565b33600081815261013760205260408120549091906117335760405162461bcd60e51b8152602060048201526012602482015271496e656c696769626c65206164647265737360701b6044820152606401610873565b600061013c541161177c5760405162461bcd60e51b81526020600482015260136024820152724e6f20737570657220757365722071756f746160681b6044820152606401610873565b4261013b600161013c5461179091906147e1565b815481106117a0576117a06147f4565b9060005260206000200154106118045760405162461bcd60e51b815260206004820152602360248201527f4974206973206e6f742074696d6520746f206265636f6d65207375706572207560448201526239b2b960e91b6064820152608401610873565b6001600160a01b03811660009081526101376020526040902054600110156118b75761013d546001600160a01b0382811660008181526101376020526040908190205490516323b872dd60e01b8152600481019290925230602483015260448201529116906323b872dd906064016020604051808303816000875af1158015611891573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118b591906148d1565b505b6001600160a01b0381166000908152610137602090815260408083208390558051600b808252610180820190925291820161016080368337019050509050600b5b801561197a5761190981600b6147e1565b61191490601e61490c565b611921906201518061490c565b61192f906301e1338061489a565b611937612fc5565b611941919061489a565b8261194d6001846147e1565b8151811061195d5761195d6147f4565b60209081029190910101528061197281614923565b9150506118f8565b506001600160a01b03821660009081526101396020908152604090912082516119a59284019061420a565b506001600160a01b0382166000908152610133602052604081206002905561013c8054600192906119d79084906147e1565b909155505064888888888860009081526101306020527f783040282484dfc8d1cb5f777c8a8d379cb3545bb226d8c0ae323bfca96f47d780546a08af7623fb67bf1a8000009290611a299084906147e1565b90915550506001600160a01b03821660009081526101306020526040812080546a08af7623fb67bf1a8000009290611a6290849061489a565b90915550611a839050648888888888836a08af7623fb67bf1a800000612b01565b6040516001600160a01b03831681527f260a88fa07e8ea4260d30faac411b1c748c1ce1e10b53d1834e3558fd9db1cdb9060200160405180910390a160019250505090565b83421115611b185760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610873565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b038816918101919091526060810186905260808101859052600090611b9290611b8a9060a00160405160208183030381529060405280519060200120613004565b858585613031565b9050611b9d81613059565b8614611beb5760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610873565b611bf58188612db0565b50505050505050565b610136546000906001600160a01b0316336001600160a01b031614611c655760405162461bcd60e51b815260206004820152601b60248201527f4f6e6c79206d696e696e672072657761726473206164647265737300000000006044820152606401610873565b6508888888888860005260656020527f8f5af3c1063236be11ae3a69c821e061f76dbe0f4b5c1d82d51f10c76c9f9d1654821115611cda5760405162461bcd60e51b81526020600482015260126024820152714e6f7420656e6f7567682062616c616e636560701b6044820152606401610873565b6508888888888860009081526101306020527f4eafcfbd02771f66df42d1f3cd4568775dbfdb0c59dcebc984e3f32af8aacf238054849290611d1d9084906147e1565b909155505061013654611d419065088888888888906001600160a01b031684612b01565b506001919050565b3360008181526101336020526040812054909190600214611d7c5760405162461bcd60e51b8152600401610873906148ad565b33600081815261013a60205260409020546001600160a01b03858116911614611dd75760405162461bcd60e51b815260206004820152600d60248201526c4572726f72206164647265737360981b6044820152606401610873565b6001600160a01b03808216600081815261013a6020908152604080832080546001600160a01b03191690556101338252808320839055938816808352848320600290559282526101399052828120918152919091208154611e3892906141a0565b506001600160a01b038116600090815261013960205260408120611e5b916141ec565b611e658185612e2a565b6040516001600160a01b03851681527f260a88fa07e8ea4260d30faac411b1c748c1ce1e10b53d1834e3558fd9db1cdb9060200160405180910390a16040516001600160a01b03821681527f59c6cc77543b0366e9ac5aacb1ca32a6b7ac8879330886f7010279da1dc5d2f69060200160405180910390a160019250505b50919050565b3360008181526101326020526040812054909190611f3a5760405162461bcd60e51b815260206004820152600e60248201526d3737903637b1b5b2b21031b7b4b760911b6044820152606401610873565b6001600160a01b03811660009081526101326020908152604080832080548251818502810185019093528083528493830182828015611f9857602002820191906000526020600020905b815481526020019060010190808311611f84575b5050505050905060005b815181101561200457821580611fd0575082828281518110611fc657611fc66147f4565b6020026020010151105b15611ff257818181518110611fe757611fe76147f4565b602002602001015192505b80611ffc816148f3565b915050611fa2565b50811580159061201357504282105b61205f5760405162461bcd60e51b815260206004820152601e60248201527f6974206973206e6f742074696d6520746f20756e6c6f636b20636f696e7300006044820152606401610873565b6001600160a01b038316600090815261013260209081526040808320805482518185028101850190935280835291929091908301828280156120c057602002820191906000526020600020905b8154815260200190600101908083116120ac575b505050505090506000805b825181101561224857428382815181106120e7576120e76147f4565b602002602001015110156121cb576001600160a01b0386166000908152610131602052604081208451909190859084908110612125576121256147f4565b60200260200101518152602001908152602001600020546101306000886001600160a01b03166001600160a01b031681526020019081526020016000205461216d91906147e1565b6001600160a01b03871660009081526101306020908152604080832093909355610131905290812084519091908590849081106121ac576121ac6147f4565b6020026020010151815260200190815260200160002060009055612236565b8281815181106121dd576121dd6147f4565b60200260200101516101326000886001600160a01b03166001600160a01b03168152602001908152602001600020838154811061221c5761221c6147f4565b60009182526020909120015581612232816148f3565b9250505b80612240816148f3565b9150506120cb565b50805b82518110156122a5576001600160a01b03861660009081526101326020526040902080548061227c5761227c614850565b60019003818190600052602060002001600090559055808061229d906148f3565b91505061224b565b5060019550505050505090565b600054610100900460ff16158080156122d25750600054600160ff909116105b806122ec5750303b1580156122ec575060005460ff166001145b61234f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610873565b6000805460ff191660011790558015612372576000805461ff0019166101001790555b84516007146123b95760405162461bcd60e51b81526020600482015260136024820152724572726f722067656e6573697320757365727360681b6044820152606401610873565b6123c161307f565b612405604051806040016040528060078152602001662aad2c21b7b4b760c91b815250604051806040016040528060038152602001620aab4b60eb1b8152506130ae565b61242d604051806040016040528060078152602001662aad2c21b7b4b760c91b8152506130df565b612435613129565b61244185858585613150565b801561151f576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b834211156124dd5760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610873565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861250c8c613059565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e001604051602081830303815290604052805190602001209050600061256782613004565b9050600061257782878787613031565b9050896001600160a01b0316816001600160a01b0316146125da5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610873565b6125e58a8a8a612963565b50505050505050505050565b60006125fb612e96565b81518351146126445760405162461bcd60e51b81526020600482015260156024820152744572726f722073757065722075736572206461746160581b6044820152606401610873565b600061013c541161268d5760405162461bcd60e51b81526020600482015260136024820152724e6f20737570657220757365722071756f746160681b6044820152606401610873565b60005b83518110156110b7578281815181106126ab576126ab6147f4565b602002602001015161013760008684815181106126ca576126ca6147f4565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020819055508080612701906148f3565b915050612690565b6001600160a01b03918216600090815260666020908152604080832093909416825291909152205490565b60408051808201909152600080825260208201526001600160a01b038316600090815260ff60205260409020805463ffffffff8416908110612778576127786147f4565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b3360009081526101326020908152604080832080548251818502810185019093528083526060948594909384939092909183018282801561281857602002820191906000526020600020905b815481526020019060010190808311612804575b505050505090506000815167ffffffffffffffff81111561283b5761283b614442565b604051908082528060200260200182016040528015612864578160200160208202803683370190505b50905060005b82518110156128e05733600090815261013160205260408120845190919085908490811061289a5761289a6147f4565b60200260200101518152602001908152602001600020548282815181106128c3576128c36147f4565b6020908102919091010152806128d8816148f3565b91505061286a565b5090949093504292509050565b6128f5612e96565b6001600160a01b03811661295a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610873565b610d6d81612f55565b6001600160a01b0383166129c55760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610873565b6001600160a01b038216612a265760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610873565b6001600160a01b0383811660008181526066602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000612a938484612709565b90506000198114612afb5781811015612aee5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610873565b612afb8484848403612963565b50505050565b6001600160a01b038316612b655760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610873565b6001600160a01b038216612bc75760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610873565b612bd283838361357e565b6001600160a01b03831660009081526065602052604090205481811015612c4a5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610873565b6001600160a01b0380851660008181526065602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612caa9086815260200190565b60405180910390a3612afb84848461361c565b6000610aca613627565b815460009081816005811115612d21576000612ce28461369b565b612cec90856147e1565b600088815260209020909150869082015463ffffffff161115612d1157809150612d1f565b612d1c81600161489a565b92505b505b80821015612d6e576000612d358383613783565b600088815260209020909150869082015463ffffffff161115612d5a57809150612d68565b612d6581600161489a565b92505b50612d21565b8015612d9a576000868152602090208101600019015464010000000090046001600160e01b0316612d9d565b60005b6001600160e01b03169695505050505050565b6001600160a01b03828116600081815260fe6020818152604080842080546065845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4612afb82848361379e565b6001600160a01b0380831660009081526101306020526040808220805490839055928416825281208054839290612e6290849061489a565b90915550612e9190508383612e8c826001600160a01b031660009081526065602052604090205490565b612b01565b505050565b6033546001600160a01b0316331461116c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610873565b600063ffffffff821115610fff5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608401610873565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6060609980546109dd90614866565b6060609a80546109dd90614866565b6000612fd46201518042614950565b612fde90426147e1565b610aca906201518061489a565b612ff582826138db565b612afb610100613a2283613a2e565b6000610a74613011612cbd565b8360405161190160f01b8152600281019290925260228201526042902090565b600080600061304287878787613b98565b9150915061304f81613c5c565b5095945050505050565b6001600160a01b038116600090815260cb60205260409020805460018101825590611ee3565b600054610100900460ff166130a65760405162461bcd60e51b815260040161087390614964565b61116c613da6565b600054610100900460ff166130d55760405162461bcd60e51b815260040161087390614964565b6115ba8282613dd6565b600054610100900460ff166131065760405162461bcd60e51b815260040161087390614964565b610d6d81604051806040016040528060018152602001603160f81b815250613e16565b600054610100900460ff1661116c5760405162461bcd60e51b815260040161087390614964565b61013d805473c2132d05d31c914a87c6611c10748aeb04b58e8f6001600160a01b03199182161790915561013680549091166001600160a01b0383161790556040805160148082526102a08201909252906020820161028080368337505081516131c29261013b92506020019061420a565b50601461013c5560408051600f8082526102008201909252600091602082016101e080368337019050509050600f5b80156132735761320281600f6147e1565b61320d90601e61490c565b61321a906201518061490c565b613228906303c2670061489a565b613230612fc5565b61323a919061489a565b826132466001846147e1565b81518110613256576132566147f4565b60209081029190910101528061326b81614923565b9150506131f1565b506a108b2a2c2802909400000060005b86518110156133b4576132af8782815181106132a1576132a16147f4565b602002602001015183613e65565b8161013060008984815181106132c7576132c76147f4565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060008282546132fe919061489a565b9250508190555082610138600089848151811061331d5761331d6147f4565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020908051906020019061335892919061420a565b50600160ff166101336000898481518110613375576133756147f4565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000208190555080806133ac906148f3565b915050613283565b506133ca856a18d0bf423c03d8de000000613e65565b61013480546001600160a01b0319166001600160a01b0387161790556133fb846a108b2a2c28029094000000613e65565b64888888888860009081526101306020527f783040282484dfc8d1cb5f777c8a8d379cb3545bb226d8c0ae323bfca96f47d780546aadb53acfa41aee12000000929061344890849061489a565b9091555061346890506488888888886aadb53acfa41aee12000000613e65565b6508888888888860009081526101306020527f4eafcfbd02771f66df42d1f3cd4568775dbfdb0c59dcebc984e3f32af8aacf2380546a52b7d2dcc80cd2e400000092906134b690849061489a565b909155506134d79050650888888888886a52b7d2dcc80cd2e4000000613e65565b60145b8015611bf55760026134ec8183614950565b15613501576134fc82600161489a565b613503565b815b61350d91906149af565b61351890600a6147e1565b61352390605a61490c565b613530906201518061490c565b613538612fc5565b613542919061489a565b61013b6135506001846147e1565b81548110613560576135606147f4565b6000918252602090912001558061357681614923565b9150506134da565b6001600160a01b0383166000908152610130602052604090205415612e91576001600160a01b0383166000908152610130602090815260408083205460659092529091205482916135ce916147e1565b1015612e915760405162461bcd60e51b815260206004820152601c60248201527f4c6f636b656420636f696e2063616e206e6f74207472616e73666572000000006044820152606401610873565b612e91838383613ef0565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f613652613f22565b61365a613f7b565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b6000816000036136ad57506000919050565b600060016136ba84613fac565b901c6001901b905060018184816136d3576136d361493a565b048201901c905060018184816136eb576136eb61493a565b048201901c905060018184816137035761370361493a565b048201901c9050600181848161371b5761371b61493a565b048201901c905060018184816137335761373361493a565b048201901c9050600181848161374b5761374b61493a565b048201901c905060018184816137635761376361493a565b048201901c9050610b688182858161377d5761377d61493a565b04614040565b600061379260028484186149af565b610b689084841661489a565b816001600160a01b0316836001600160a01b0316141580156137c05750600081115b15612e91576001600160a01b0383161561384e576001600160a01b038316600090815260ff6020526040812081906137fb90613a2285613a2e565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051613843929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615612e91576001600160a01b038216600090815260ff6020526040812081906138849061405685613a2e565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516138cc929190918252602082015260400190565b60405180910390a25050505050565b6001600160a01b03821661393b5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610873565b6139478260008361357e565b6001600160a01b038216600090815260656020526040902054818110156139bb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610873565b6001600160a01b03831660008181526065602090815260408083208686039055606780548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3612e918360008461361c565b6000610b6882846147e1565b82546000908190818115613a7b5760008781526020902082016000190160408051808201909152905463ffffffff8116825264010000000090046001600160e01b03166020820152613a90565b60408051808201909152600080825260208201525b905080602001516001600160e01b03169350613ab084868863ffffffff16565b9250600082118015613ad05750805163ffffffff1665ffffffffffff4216145b15613b1557613ade83614062565b60008881526020902083016000190180546001600160e01b03929092166401000000000263ffffffff909216919091179055613b8e565b866040518060400160405280613b38613b2b4290565b65ffffffffffff16612ef0565b63ffffffff168152602001613b4c86614062565b6001600160e01b0390811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115613bcf5750600090506003613c53565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613c23573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116613c4c57600060019250925050613c53565b9150600090505b94509492505050565b6000816004811115613c7057613c706149c3565b03613c785750565b6001816004811115613c8c57613c8c6149c3565b03613cd95760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610873565b6002816004811115613ced57613ced6149c3565b03613d3a5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610873565b6003816004811115613d4e57613d4e6149c3565b03610d6d5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610873565b600054610100900460ff16613dcd5760405162461bcd60e51b815260040161087390614964565b61116c33612f55565b600054610100900460ff16613dfd5760405162461bcd60e51b815260040161087390614964565b6068613e098382614a27565b506069612e918282614a27565b600054610100900460ff16613e3d5760405162461bcd60e51b815260040161087390614964565b6099613e498382614a27565b50609a613e568282614a27565b50506000609781905560985550565b613e6f82826140cb565b6067546001600160e01b031015613ee15760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b6064820152608401610873565b612afb61010061405683613a2e565b6001600160a01b03838116600090815260fe6020526040808220548584168352912054612e919291821691168361379e565b600080613f2d612fa7565b805190915015613f44578051602090910120919050565b6097548015613f535792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b600080613f86612fb6565b805190915015613f9d578051602090910120919050565b6098548015613f535792915050565b600080608083901c15613fc157608092831c92015b604083901c15613fd357604092831c92015b602083901c15613fe557602092831c92015b601083901c15613ff757601092831c92015b600883901c1561400957600892831c92015b600483901c1561401b57600492831c92015b600283901c1561402d57600292831c92015b600183901c15610a745760010192915050565b600081831061404f5781610b68565b5090919050565b6000610b68828461489a565b60006001600160e01b03821115610fff5760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b6064820152608401610873565b6001600160a01b0382166141215760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610873565b61412d6000838361357e565b806067600082825461413f919061489a565b90915550506001600160a01b0382166000818152606560209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36115ba6000838361361c565b8280548282559060005260206000209081019282156141e05760005260206000209182015b828111156141e05782548255916001019190600101906141c5565b50610fff929150614245565b5080546000825590600052602060002090810190610d6d9190614245565b8280548282559060005260206000209081019282156141e0579160200282015b828111156141e057825182559160200191906001019061422a565b5b80821115610fff5760008155600101614246565b6000815180845260005b8181101561428057602081850181015186830182015201614264565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000610b68602083018461425a565b80356001600160a01b0381168114610e3a57600080fd5b600080604083850312156142dd57600080fd5b6142e6836142b3565b946020939093013593505050565b60006020828403121561430657600080fd5b610b68826142b3565b60008060006060848603121561432457600080fd5b61432d846142b3565b925061433b602085016142b3565b9150604084013590509250925092565b60006020828403121561435d57600080fd5b5035919050565b6000806040838503121561437757600080fd5b614380836142b3565b915061438e602084016142b3565b90509250929050565b600081518084526020808501945080840160005b838110156143c7578151875295820195908201906001016143ab565b509495945050505050565b60ff60f81b8816815260e0602082015260006143f160e083018961425a565b8281036040840152614403818961425a565b606084018890526001600160a01b038716608085015260a0840186905283810360c085015290506144348185614397565b9a9950505050505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561448157614481614442565b604052919050565b600067ffffffffffffffff8211156144a3576144a3614442565b5060051b60200190565b600082601f8301126144be57600080fd5b813560206144d36144ce83614489565b614458565b82815260059290921b840181019181810190868411156144f257600080fd5b8286015b8481101561451457614507816142b3565b83529183019183016144f6565b509695505050505050565b6000806040838503121561453257600080fd5b823567ffffffffffffffff8082111561454a57600080fd5b614556868387016144ad565b935060209150818501358181111561456d57600080fd5b85019050601f8101861361458057600080fd5b803561458e6144ce82614489565b81815260059190911b820183019083810190888311156145ad57600080fd5b928401925b828410156145cb578335825292840192908401906145b2565b80955050505050509250929050565b600080600080608085870312156145f057600080fd5b6145f9856142b3565b966020860135965060408601359560600135945092505050565b803560ff81168114610e3a57600080fd5b60008060008060008060c0878903121561463d57600080fd5b614646876142b3565b9550602087013594506040870135935061466260608801614613565b92506080870135915060a087013590509295509295509295565b6000806000806080858703121561469257600080fd5b843567ffffffffffffffff8111156146a957600080fd5b6146b5878288016144ad565b9450506146c4602086016142b3565b92506146d2604086016142b3565b91506146e0606086016142b3565b905092959194509250565b600080600080600080600060e0888a03121561470657600080fd5b61470f886142b3565b965061471d602089016142b3565b9550604088013594506060880135935061473960808901614613565b925060a0880135915060c0880135905092959891949750929550565b6000806040838503121561476857600080fd5b614771836142b3565b9150602083013563ffffffff8116811461478a57600080fd5b809150509250929050565b6060815260006147a86060830186614397565b82810360208401526147ba8186614397565b915050826040830152949350505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610a7457610a746147cb565b634e487b7160e01b600052603260045260246000fd5b60208082526026908201527f4974206973206e6f742074696d6520746f20756e6c6f636b2074686520636f696040820152651b9cc81e595d60d21b606082015260800190565b634e487b7160e01b600052603160045260246000fd5b600181811c9082168061487a57607f821691505b602082108103611ee357634e487b7160e01b600052602260045260246000fd5b80820180821115610a7457610a746147cb565b6020808252600a908201526927b7363c9029bab832b960b11b604082015260600190565b6000602082840312156148e357600080fd5b81518015158114610b6857600080fd5b600060018201614905576149056147cb565b5060010190565b8082028115828204841417610a7457610a746147cb565b600081614932576149326147cb565b506000190190565b634e487b7160e01b600052601260045260246000fd5b60008261495f5761495f61493a565b500690565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6000826149be576149be61493a565b500490565b634e487b7160e01b600052602160045260246000fd5b601f821115612e9157600081815260208120601f850160051c81016020861015614a005750805b601f850160051c820191505b81811015614a1f57828155600101614a0c565b505050505050565b815167ffffffffffffffff811115614a4157614a41614442565b614a5581614a4f8454614866565b846149d9565b602080601f831160018114614a8a5760008415614a725750858301515b600019600386901b1c1916600185901b178555614a1f565b600085815260208120601f198616915b82811015614ab957888601518255948401946001909101908401614a9a565b5085821015614ad75787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fea2646970667358221220786116b778e4dde4faacd9dfff2568db90b9da81471f12b663b3a2089b96230564736f6c63430008150033
Deployed Bytecode Sourcemap
136154:12498:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;142834:470;;;:::i;:::-;;;179:14:1;;172:22;154:41;;142:2;127:18;142834:470:0;;;;;;;;103283:100;;;:::i;:::-;;;;;;;:::i;105643:201::-;;;;;;:::i;:::-;;:::i;136845:21::-;;;;;-1:-1:-1;;;;;136845:21:0;;;;;;-1:-1:-1;;;;;1460:32:1;;;1442:51;;1430:2;1415:18;136845:21:0;1296:203:1;104412:108:0;104500:12;;104412:108;;;1650:25:1;;;1638:2;1623:18;104412:108:0;1504:177:1;136674:44:0;;;;;;:::i;:::-;;;;;;;;;;;;;;106424:261;;;;;;:::i;:::-;;:::i;137130:27::-;;;;;;:::i;:::-;;:::i;104254:93::-;;;104337:2;2537:36:1;;2525:2;2510:18;104254:93:0;2395:184:1;117705:115:0;;;:::i;107094:238::-;;;;;;:::i;:::-;;:::i;122131:251::-;;;;;;:::i;:::-;;:::i;141164:495::-;;;;;;:::i;:::-;;:::i;147578:109::-;147656:23;;;;;;;;;;;;-1:-1:-1;;;147656:23:0;;;;147578:109;;136815:23;;;;;-1:-1:-1;;;;;136815:23:0;;;121482:128;;;;;;:::i;:::-;-1:-1:-1;;;;;121583:19:0;;;121556:7;121583:19;;;:10;:19;;;;;;;;121482:128;147230:120;;;;;;:::i;:::-;-1:-1:-1;;;;;147320:22:0;147293:7;147320:22;;;:13;:22;;;;;;;147230:120;125027:114;;;;;;:::i;:::-;;:::i;:::-;;143312:403;;;;;;:::i;:::-;;:::i;140628:528::-;;;:::i;137018:52::-;;;;;;:::i;:::-;;:::i;144396:159::-;;;;;;:::i;:::-;;:::i;141667:207::-;;;;;;:::i;:::-;;:::i;121227:162::-;;;;;;:::i;:::-;;:::i;:::-;;;3205:10:1;3193:23;;;3175:42;;3163:2;3148:18;121227:162:0;3031:192:1;104583:127:0;;;;;;:::i;:::-;-1:-1:-1;;;;;104684:18:0;104657:7;104684:18;;;:9;:18;;;;;;;104583:127;136318:89;;136364:42;136318:89;;132100:103;;;:::i;117447:128::-;;;;;;:::i;:::-;;:::i;95819:889::-;;;:::i;:::-;;;;;;;;;;;;;:::i;144563:364::-;;;;;;:::i;:::-;;:::i;131459:87::-;131532:6;;-1:-1:-1;;;;;131532:6:0;131459:87;;122654:242;;;;;;:::i;:::-;;:::i;147466:104::-;;;7183:14:1;147546:15:0;7171:27:1;7153:46;;7141:2;7126:18;147466:104:0;7009:196:1;103502:104:0;;;:::i;144935:710::-;;;;;;:::i;:::-;;:::i;121694:248::-;;;;;;:::i;:::-;;:::i;147358:100::-;;;;;;:::i;:::-;;:::i;107835:436::-;;;;;;:::i;:::-;;:::i;104916:193::-;;;;;;:::i;:::-;;:::i;136957:54::-;;;;;;:::i;:::-;;:::i;144238:150::-;;;;;;:::i;:::-;;:::i;139548:1072::-;;;:::i;125223:602::-;;;;;;:::i;:::-;;:::i;143723:361::-;;;;;;:::i;:::-;;:::i;141882:607::-;;;;;;:::i;:::-;;:::i;146076:1146::-;;;:::i;137279:481::-;;;;;;:::i;:::-;;:::i;116725:656::-;;;;;;:::i;:::-;;:::i;136414:95::-;;136466:42;136414:95;;139158:382;;;;;;:::i;:::-;;:::i;105172:151::-;;;;;;:::i;:::-;;:::i;120997:150::-;;;;;;:::i;:::-;;:::i;:::-;;;;10069:13:1;;10084:10;10065:30;10047:49;;10156:4;10144:17;;;10138:24;-1:-1:-1;;;;;10134:50:1;10112:20;;;10105:80;;;;10020:18;120997:150:0;9845:346:1;145653:415:0;;;:::i;:::-;;;;;;;;;:::i;132358:201::-;;;;;;:::i;:::-;;:::i;137164:26::-;;;;;;136873:28;;;;;-1:-1:-1;;;;;136873:28:0;;;142834:470;100416:10;142888:4;148435:26;;;:12;:26;;;;;;136763:1;148435:42;148427:67;;;;-1:-1:-1;;;148427:67:0;;10939:2:1;148427:67:0;;;10921:21:1;10978:2;10958:18;;;10951:30;-1:-1:-1;;;10997:18:1;;;10990:42;11049:18;;148427:67:0;;;;;;;;;100416:10;142904:14:::1;142952:21:::0;;;:13:::1;:21;::::0;;;;;142977:16:::1;-1:-1:-1::0;142952:41:0::1;142944:76;;;::::0;-1:-1:-1;;;142944:76:0;;11280:2:1;142944:76:0::1;::::0;::::1;11262:21:1::0;11319:2;11299:18;;;11292:30;-1:-1:-1;;;11338:18:1;;;11331:53;11401:18;;142944:76:0::1;11078:347:1::0;142944:76:0::1;-1:-1:-1::0;;;;;143039:28:0;::::1;;::::0;;;:20:::1;:28;::::0;;;;143068:35;;143111:15:::1;::::0;143039:28;143068:39:::1;::::0;143106:1:::1;::::0;143068:39:::1;:::i;:::-;143039:69;;;;;;;;:::i;:::-;;;;;;;;;:87;143031:138;;;;-1:-1:-1::0;;;143031:138:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;143180:28:0;::::1;;::::0;;;:20:::1;:28;::::0;;;;:34;;;::::1;;;;:::i;:::-;;;;;;;;;;;;;;;;;;143250:16;143225:13;:21;143239:6;-1:-1:-1::0;;;;;143225:21:0::1;-1:-1:-1::0;;;;;143225:21:0::1;;;;;;;;;;;;;:41;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;143292:4:0::1;::::0;-1:-1:-1;;;142834:470:0;:::o;103283:100::-;103337:13;103370:5;103363:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;103283:100;:::o;105643:201::-;105726:4;100416:10;105782:32;100416:10;105798:7;105807:6;105782:8;:32::i;:::-;105832:4;105825:11;;;105643:201;;;;;:::o;106424:261::-;106521:4;100416:10;106579:38;106595:4;100416:10;106610:6;106579:15;:38::i;:::-;106628:27;106638:4;106644:2;106648:6;106628:9;:27::i;:::-;-1:-1:-1;106673:4:0;;106424:261;-1:-1:-1;;;;106424:261:0:o;137130:27::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;137130:27:0;:::o;117705:115::-;117765:7;117792:20;:18;:20::i;:::-;117785:27;;117705:115;:::o;107094:238::-;107182:4;100416:10;107238:64;100416:10;107254:7;107291:10;107263:25;100416:10;107254:7;107263:9;:25::i;:::-;:38;;;;:::i;:::-;107238:8;:64::i;122131:251::-;122227:7;147546:15;122255:19;;:9;:19;122247:57;;;;-1:-1:-1;;;122247:57:0;;13083:2:1;122247:57:0;;;13065:21:1;13122:2;13102:18;;;13095:30;-1:-1:-1;;;13141:18:1;;;13134:55;13206:18;;122247:57:0;12881:349:1;122247:57:0;-1:-1:-1;;;;;122341:21:0;;;;;;:12;:21;;;;;122322:52;;122364:9;122322:18;:52::i;:::-;122315:59;122131:251;-1:-1:-1;;;122131:251:0:o;141164:495::-;148219:6;;141265:4;;-1:-1:-1;;;;;148219:6:0;100416:10;148219:22;148211:46;;;;-1:-1:-1;;;148211:46:0;;13437:2:1;148211:46:0;;;13419:21:1;13476:2;13456:18;;;13449:30;-1:-1:-1;;;13495:18:1;;;13488:41;13546:18;;148211:46:0;13235:335:1;148211:46:0;-1:-1:-1;;;;;148576:22:0;::::1;;::::0;;;:12:::1;:22;::::0;;;;;141239:9;;136807:1:::1;148576:36;148568:59;;;;-1:-1:-1::0;;;148568:59:0::1;;;;;;;:::i;:::-;141312:15:::2;141289:20;141299:9;-1:-1:-1::0;;;;;104684:18:0;104657:7;104684:18;;;:9;:18;;;;;;;104583:127;141289:20:::2;:38;141281:68;;;::::0;-1:-1:-1;;;141281:68:0;;14116:2:1;141281:68:0::2;::::0;::::2;14098:21:1::0;14155:2;14135:18;;;14128:30;-1:-1:-1;;;14174:18:1;;;14167:48;14232:18;;141281:68:0::2;13914:342:1::0;141281:68:0::2;-1:-1:-1::0;;;;;141360:24:0;::::2;;::::0;;;:13:::2;:24;::::0;;;;:43;;141388:15:::2;::::0;141360:24;:43:::2;::::0;141388:15;;141360:43:::2;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;141414:24:0;::::2;;::::0;;;:13:::2;:24;::::0;;;;:43;;141442:15:::2;::::0;141414:24;:43:::2;::::0;141442:15;;141414:43:::2;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;141468:23:0;;::::2;;::::0;;;:12:::2;:23;::::0;;;;;;;136807:1:::2;141468:36:::0;;141522:23;;::::2;::::0;;;;;141515:30;;;;141561:26;;1442:51:1;;;141561:26:0::2;::::0;1415:18:1;141561:26:0::2;;;;;;;141603;::::0;-1:-1:-1;;;;;1460:32:1;;1442:51;;141603:26:0::2;::::0;1430:2:1;1415:18;141603:26:0::2;;;;;;;-1:-1:-1::0;141647:4:0::2;::::0;141164:495;-1:-1:-1;;;141164:495:0:o;125027:114::-;125099:34;100416:10;125123:9;125099;:34::i;:::-;125027:114;:::o;143312:403::-;100416:10;143387:4;148435:26;;;:12;:26;;;;;;136763:1;148435:42;148427:67;;;;-1:-1:-1;;;148427:67:0;;10939:2:1;148427:67:0;;;10921:21:1;10978:2;10958:18;;;10951:30;-1:-1:-1;;;10997:18:1;;;10990:42;11049:18;;148427:67:0;10737:336:1;148427:67:0;100416:10;143403:14:::1;143450:20:::0;;;:12:::1;:20;::::0;;;;;;;143443:27;;;-1:-1:-1;;;;;143481:24:0;::::1;::::0;;;;;;136763:1:::1;143481:39:::0;;143566:28;;;:20:::1;:28:::0;;;;;;143531:32;;;;;;:63;;::::1;::::0;143566:28;143531:63:::1;:::i;:::-;-1:-1:-1::0;;;;;;143612:28:0;::::1;;::::0;;;:20:::1;:28;::::0;;;;143605:35:::1;::::0;::::1;:::i;:::-;143654:31;143666:6;143674:10;143654:11;:31::i;:::-;143703:4;143696:11;;;148505:1;143312:403:::0;;;:::o;140628:528::-;100416:10;140692:4;148576:22;;;:12;:22;;;;;;140692:4;;100416:10;136807:1;148576:36;148568:59;;;;-1:-1:-1;;;148568:59:0;;;;;;;:::i;:::-;100416:10;140708:14:::1;140756:21:::0;;;:13:::1;:21;::::0;;;;;140780:16:::1;-1:-1:-1::0;140748:75:0::1;;;::::0;-1:-1:-1;;;140748:75:0;;11280:2:1;140748:75:0::1;::::0;::::1;11262:21:1::0;11319:2;11299:18;;;11292:30;-1:-1:-1;;;11338:18:1;;;11331:53;11401:18;;140748:75:0::1;11078:347:1::0;140748:75:0::1;-1:-1:-1::0;;;;;140842:26:0;::::1;;::::0;;;:18:::1;:26;::::0;;;;140869:33;;140910:15:::1;::::0;140842:26;140869:37:::1;::::0;140905:1:::1;::::0;140869:37:::1;:::i;:::-;140842:65;;;;;;;;:::i;:::-;;;;;;;;;:83;140834:134;;;;-1:-1:-1::0;;;140834:134:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;141005:26:0;::::1;;::::0;;;:18:::1;:26;::::0;;;;:33;141042:1:::1;141005:38;:74;;141064:15;141005:74;;;141046:15;141005:74;140979:101;;:13;:21;140993:6;-1:-1:-1::0;;;;;140979:21:0::1;-1:-1:-1::0;;;;;140979:21:0::1;;;;;;;;;;;;;:101;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;141094:26:0;::::1;;::::0;;;:18:::1;:26;::::0;;;;:32;;;::::1;;;;:::i;:::-;;;;;;;;;;;;;;;;;;141144:4;141137:11;;;148638:1;140628:528:::0;;:::o;137018:52::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;144396:159::-;144477:4;131345:13;:11;:13::i;:::-;144493:4:::1;::::0;:32:::1;::::0;-1:-1:-1;;;144493:32:0;;-1:-1:-1;;;;;14453:32:1;;;144493::0::1;::::0;::::1;14435:51:1::0;14502:18;;;14495:34;;;144493:4:0;;::::1;::::0;:13:::1;::::0;14408:18:1;;144493:32:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;144543:4:0::1;::::0;144396:159;-1:-1:-1;;;144396:159:0:o;141667:207::-;-1:-1:-1;;;;;148576:22:0;;141786:4;148576:22;;;:12;:22;;;;;;141750:9;;136807:1;148576:36;148568:59;;;;-1:-1:-1;;;148568:59:0;;;;;;;:::i;:::-;131345:13:::1;:11;:13::i;:::-;-1:-1:-1::0;;;;;;;141802:29:0;;::::2;;::::0;;;:18:::2;:29;::::0;;;;:42;;-1:-1:-1;;;;;;141802:42:0::2;::::0;;;::::2;;::::0;;-1:-1:-1;;141667:207:0:o;121227:162::-;-1:-1:-1;;;;;121352:21:0;;121297:6;121352:21;;;:12;:21;;;;;:28;121323:58;;:28;:58::i;132100:103::-;131345:13;:11;:13::i;:::-;132165:30:::1;132192:1;132165:18;:30::i;:::-;132100:103::o:0;117447:128::-;-1:-1:-1;;;;;117543:14:0;;117516:7;117543:14;;;:7;:14;;;;;40554;117543:24;40462:114;95819:889;95940:13;95968:18;96001:21;96037:15;96067:25;96107:12;96134:27;96402:11;;96417:1;96402:16;;;:39;;;;-1:-1:-1;96422:14:0;;:19;96402:39;96394:73;;;;-1:-1:-1;;;96394:73:0;;15024:2:1;96394:73:0;;;15006:21:1;15063:2;15043:18;;;15036:30;-1:-1:-1;;;15082:18:1;;;15075:51;15143:18;;96394:73:0;14822:345:1;96394:73:0;96533:13;:11;:13::i;:::-;96561:16;:14;:16::i;:::-;96673;;;96656:1;96673:16;;;;;;;;;-1:-1:-1;;;96480:220:0;;;-1:-1:-1;96480:220:0;;-1:-1:-1;96592:13:0;;-1:-1:-1;96628:4:0;;-1:-1:-1;96656:1:0;-1:-1:-1;96673:16:0;-1:-1:-1;96480:220:0;-1:-1:-1;95819:889:0:o;144563:364::-;148325:8;;144670:4;;-1:-1:-1;;;;;148325:8:0;100416:10;148325:24;148317:50;;;;-1:-1:-1;;;148317:50:0;;15374:2:1;148317:50:0;;;15356:21:1;15413:2;15393:18;;;15386:30;-1:-1:-1;;;15432:18:1;;;15425:43;15485:18;;148317:50:0;15172:337:1;148317:50:0;144715:7:::1;:14;144694:10;:17;:35;144686:80;;;::::0;-1:-1:-1;;;144686:80:0;;15716:2:1;144686:80:0::1;::::0;::::1;15698:21:1::0;;;15735:18;;;15728:30;15794:34;15774:18;;;15767:62;15846:18;;144686:80:0::1;15514:356:1::0;144686:80:0::1;144782:9;144777:121;144801:10;:17;144797:1;:21;144777:121;;;144850:8;::::0;144860:13;;144840:46:::1;::::0;-1:-1:-1;;;;;144850:8:0::1;::::0;144860:10;;144871:1;;144860:13;::::1;;;;;:::i;:::-;;;;;;;144875:7;144883:1;144875:10;;;;;;;;:::i;:::-;;;;;;;144840:9;:46::i;:::-;144820:3:::0;::::1;::::0;::::1;:::i;:::-;;;;144777:121;;122654:242:::0;122739:7;147546:15;122767:19;;:9;:19;122759:57;;;;-1:-1:-1;;;122759:57:0;;13083:2:1;122759:57:0;;;13065:21:1;13122:2;13102:18;;;13095:30;-1:-1:-1;;;13141:18:1;;;13134:55;13206:18;;122759:57:0;12881:349:1;122759:57:0;122834:54;122853:23;122878:9;122834:18;:54::i;103502:104::-;103558:13;103591:7;103584:14;;;;;:::i;144935:710::-;148325:8;;-1:-1:-1;;;;;148325:8:0;100416:10;148325:24;148317:50;;;;-1:-1:-1;;;148317:50:0;;15374:2:1;148317:50:0;;;15356:21:1;15413:2;15393:18;;;15386:30;-1:-1:-1;;;15432:18:1;;;15425:43;15485:18;;148317:50:0;15172:337:1;148317:50:0;100416:10;145103:25;;::::1;;145095:53;;;::::0;-1:-1:-1;;;145095:53:0;;16217:2:1;145095:53:0::1;::::0;::::1;16199:21:1::0;16256:2;16236:18;;;16229:30;-1:-1:-1;;;16275:18:1;;;16268:46;16331:18;;145095:53:0::1;16015:340:1::0;145095:53:0::1;145159:36;145169:10;145180:2;145183:11;145159:9;:36::i;:::-;145209:14:::0;;145206:432:::1;;145239:15;145277:17;:8:::0;145288:6:::1;145277:17;:::i;:::-;145257:16;:14;:16::i;:::-;:38;;;;:::i;:::-;-1:-1:-1::0;;;;;145331:17:0;::::1;;::::0;;;:13:::1;:17;::::0;;;;;145239:56;;-1:-1:-1;145331:30:0::1;::::0;145351:10;;145331:30:::1;:::i;:::-;-1:-1:-1::0;;;;;145311:17:0;::::1;;::::0;;;:13:::1;:17;::::0;;;;;;;:50;;;;145418:14:::1;:18:::0;;;;;145454:23;;;;;;;;;;;:26;;145451:99:::1;;-1:-1:-1::0;;;;;145500:17:0;::::1;;::::0;;;:13:::1;:17;::::0;;;;;;:34;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;;145451:99:::1;145590:23;::::0;;;::::1;::::0;;;;;;;:36:::1;::::0;145616:10;;145590:36:::1;:::i;:::-;145564:23;::::0;;;::::1;::::0;;;;;;;;:62;145206:432:::1;145040:605;144935:710:::0;;;;:::o;121694:248::-;-1:-1:-1;;;;;121801:21:0;;121767:7;121801:21;;;:12;:21;;;;;:28;121872:8;;:51;;-1:-1:-1;;;;;121887:21:0;;;;;;:12;:21;;;;;:30;;-1:-1:-1;;121909:7:0;;;121887:30;;;;;;:::i;:::-;;;;;;;;;;:36;;;;-1:-1:-1;;;;;121887:36:0;121872:51;;;121883:1;121872:51;-1:-1:-1;;;;;121865:58:0;;121694:248;-1:-1:-1;;;121694:248:0:o;147358:100::-;131345:13;:11;:13::i;:::-;147429:21:::1;147435:7;147443:6;147429:5;:21::i;:::-;147358:100:::0;;:::o;107835:436::-;107928:4;100416:10;107928:4;108011:25;100416:10;108028:7;108011:9;:25::i;:::-;107984:52;;108075:15;108055:16;:35;;108047:85;;;;-1:-1:-1;;;108047:85:0;;16735:2:1;108047:85:0;;;16717:21:1;16774:2;16754:18;;;16747:30;16813:34;16793:18;;;16786:62;-1:-1:-1;;;16864:18:1;;;16857:35;16909:19;;108047:85:0;16533:401:1;108047:85:0;108168:60;108177:5;108184:7;108212:15;108193:16;:34;108168:8;:60::i;104916:193::-;104995:4;100416:10;105051:28;100416:10;105068:2;105072:6;105051:9;:28::i;136957:54::-;;;;;;;;;;;;;;;;;;;;144238:150;131345:13;:11;:13::i;:::-;144310:6:::1;::::0;-1:-1:-1;;;;;144310:6:0::1;:20:::0;144302:50:::1;;;::::0;-1:-1:-1;;;144302:50:0;;17141:2:1;144302:50:0::1;::::0;::::1;17123:21:1::0;17180:2;17160:18;;;17153:30;-1:-1:-1;;;17199:18:1;;;17192:48;17257:18;;144302:50:0::1;16939:342:1::0;144302:50:0::1;144363:6;:17:::0;;-1:-1:-1;;;;;;144363:17:0::1;-1:-1:-1::0;;;;;144363:17:0;;;::::1;::::0;;;::::1;::::0;;144238:150::o;139548:1072::-;100416:10;139591:4;139655:25;;;:17;:25;;;;;;139591:4;;100416:10;139647:60;;;;-1:-1:-1;;;139647:60:0;;17488:2:1;139647:60:0;;;17470:21:1;17527:2;17507:18;;;17500:30;-1:-1:-1;;;17546:18:1;;;17539:48;17604:18;;139647:60:0;17286:342:1;139647:60:0;139743:1;139726:14;;:18;139718:50;;;;-1:-1:-1;;;139718:50:0;;17835:2:1;139718:50:0;;;17817:21:1;17874:2;17854:18;;;17847:30;-1:-1:-1;;;17893:18:1;;;17886:49;17952:18;;139718:50:0;17633:343:1;139718:50:0;139823:15;139787:13;139818:1;139801:14;;:18;;;;:::i;:::-;139787:33;;;;;;;;:::i;:::-;;;;;;;;;:51;139779:99;;;;-1:-1:-1;;;139779:99:0;;18183:2:1;139779:99:0;;;18165:21:1;18222:2;18202:18;;;18195:30;18261:34;18241:18;;;18234:62;-1:-1:-1;;;18312:18:1;;;18305:33;18355:19;;139779:99:0;17981:399:1;139779:99:0;-1:-1:-1;;;;;139892:25:0;;;;;;:17;:25;;;;;;139920:1;-1:-1:-1;139889:127:0;;;139937:4;;-1:-1:-1;;;;;139978:25:0;;;139937:4;139978:25;;;:17;:25;;;;;;;;139937:67;;-1:-1:-1;;;139937:67:0;;;;;18625:34:1;;;;139971:4:0;18675:18:1;;;18668:43;18727:18;;;18720:34;139937:4:0;;;:17;;18560:18:1;;139937:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;139889:127;-1:-1:-1;;;;;140033:25:0;;;;;;:17;:25;;;;;;;;140026:32;;;140099:17;;140113:2;140099:17;;;;;;;;;;;;;;;;;;;-1:-1:-1;;140069:47:0;-1:-1:-1;140141:2:0;140127:130;140145:5;;140127:130;;140212:6;140217:1;140212:2;:6;:::i;:::-;140211:13;;140222:2;140211:13;:::i;:::-;:22;;140227:6;140211:22;:::i;:::-;:33;;140236:8;140211:33;:::i;:::-;140190:16;:14;:16::i;:::-;:55;;;;:::i;:::-;140172:10;140183:3;140185:1;140183;:3;:::i;:::-;140172:15;;;;;;;;:::i;:::-;;;;;;;;;;:73;140152:3;;;;:::i;:::-;;;;140127:130;;;-1:-1:-1;;;;;;140267:26:0;;;;;;:18;:26;;;;;;;;:39;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;140317:20:0;;;;;;:12;:20;;;;;136807:1;140317:33;;140361:14;:19;;140379:1;;140317:20;140361:19;;140379:1;;140361:19;:::i;:::-;;;;-1:-1:-1;;136364:42:0;140391:26;;;;:13;:26;;;:47;;140421:17;;140391:26;:47;;140421:17;;140391:47;:::i;:::-;;;;-1:-1:-1;;;;;;;140449:21:0;;;;;;:13;:21;;;;;:42;;140474:17;;140449:21;:42;;140474:17;;140449:42;:::i;:::-;;;;-1:-1:-1;140502:49:0;;-1:-1:-1;136364:42:0;140525:6;140533:17;140502:9;:49::i;:::-;140567:23;;-1:-1:-1;;;;;1460:32:1;;1442:51;;140567:23:0;;1430:2:1;1415:18;140567:23:0;;;;;;;140608:4;140601:11;;;;139548:1072;:::o;125223:602::-;125450:6;125431:15;:25;;125423:67;;;;-1:-1:-1;;;125423:67:0;;19108:2:1;125423:67:0;;;19090:21:1;19147:2;19127:18;;;19120:30;19186:31;19166:18;;;19159:59;19235:18;;125423:67:0;18906:353:1;125423:67:0;125584:58;;;120021:71;125584:58;;;19495:25:1;-1:-1:-1;;;;;19556:32:1;;19536:18;;;19529:60;;;;19605:18;;;19598:34;;;19648:18;;;19641:34;;;125501:14:0;;125518:185;;125557:87;;19467:19:1;;125584:58:0;;;;;;;;;;;;125574:69;;;;;;125557:16;:87::i;:::-;125659:1;125675;125691;125518:24;:185::i;:::-;125501:202;;125731:17;125741:6;125731:9;:17::i;:::-;125722:5;:26;125714:64;;;;-1:-1:-1;;;125714:64:0;;19888:2:1;125714:64:0;;;19870:21:1;19927:2;19907:18;;;19900:30;19966:27;19946:18;;;19939:55;20011:18;;125714:64:0;19686:349:1;125714:64:0;125789:28;125799:6;125807:9;125789;:28::i;:::-;125412:413;125223:602;;;;;;:::o;143723:361::-;143815:13;;143775:4;;-1:-1:-1;;;;;143815:13:0;100416:10;-1:-1:-1;;;;;143799:29:0;;143791:68;;;;-1:-1:-1;;;143791:68:0;;20242:2:1;143791:68:0;;;20224:21:1;20281:2;20261:18;;;20254:30;20320:29;20300:18;;;20293:57;20367:18;;143791:68:0;20040:351:1;143791:68:0;136466:42;104657:7;104684:18;:9;:18;;;;143910:6;-1:-1:-1;143878:38:0;143870:69;;;;-1:-1:-1;;;143870:69:0;;14116:2:1;143870:69:0;;;14098:21:1;14155:2;14135:18;;;14128:30;-1:-1:-1;;;14174:18:1;;;14167:48;14232:18;;143870:69:0;13914:342:1;143870:69:0;136466:42;143950:32;;;;:13;:32;;;:42;;143986:6;;143950:32;:42;;143986:6;;143950:42;:::i;:::-;;;;-1:-1:-1;;144032:13:0;;144003:51;;136466:42;;-1:-1:-1;;;;;144032:13:0;144047:6;144003:9;:51::i;:::-;-1:-1:-1;144072:4:0;;143723:361;-1:-1:-1;143723:361:0:o;141882:607::-;100416:10;141967:4;148576:22;;;:12;:22;;;;;;141967:4;;100416:10;136807:1;148576:36;148568:59;;;;-1:-1:-1;;;148568:59:0;;;;;;;:::i;:::-;100416:10;141983:14:::1;142031:26:::0;;;:18:::1;:26;::::0;;;;;-1:-1:-1;;;;;142031:40:0;;::::1;:26:::0;::::1;:40;142023:65;;;::::0;-1:-1:-1;;;142023:65:0;;20598:2:1;142023:65:0::1;::::0;::::1;20580:21:1::0;20637:2;20617:18;;;20610:30;-1:-1:-1;;;20656:18:1;;;20649:43;20709:18;;142023:65:0::1;20396:337:1::0;142023:65:0::1;-1:-1:-1::0;;;;;142106:26:0;;::::1;;::::0;;;:18:::1;:26;::::0;;;;;;;142099:33;;-1:-1:-1;;;;;;142099:33:0::1;::::0;;142150:12:::1;:20:::0;;;;;142143:27;;;142181:24;;::::1;::::0;;;;;;136807:1:::1;142181:37:::0;;142262:26;;;:18:::1;:26:::0;;;;;142229:30;;;;;;;:59;;::::1;::::0;142262:26;142229:59:::1;:::i;:::-;-1:-1:-1::0;;;;;;142306:26:0;::::1;;::::0;;;:18:::1;:26;::::0;;;;142299:33:::1;::::0;::::1;:::i;:::-;142346:31;142358:6;142366:10;142346:11;:31::i;:::-;142393:27;::::0;-1:-1:-1;;;;;1460:32:1;;1442:51;;142393:27:0::1;::::0;1430:2:1;1415:18;142393:27:0::1;;;;;;;142436:23;::::0;-1:-1:-1;;;;;1460:32:1;;1442:51;;142436:23:0::1;::::0;1430:2:1;1415:18;142436:23:0::1;;;;;;;142477:4;142470:11;;;148638:1;141882:607:::0;;;;:::o;146076:1146::-;100416:10;146113:4;146177:21;;;:13;:21;;;;;:28;146113:4;;100416:10;146169:58;;;;-1:-1:-1;;;146169:58:0;;20940:2:1;146169:58:0;;;20922:21:1;20979:2;20959:18;;;20952:30;-1:-1:-1;;;20998:18:1;;;20991:44;21052:18;;146169:58:0;20738:338:1;146169:58:0;-1:-1:-1;;;;;146296:21:0;;146238:12;146296:21;;;:13;:21;;;;;;;;146265:52;;;;;;;;;;;;;;;;;146238:12;;146265:52;;146296:21;146265:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;146332:6;146328:151;146349:14;:21;146345:1;:25;146328:151;;;146395:12;;;:43;;;146431:7;146411:14;146426:1;146411:17;;;;;;;;:::i;:::-;;;;;;;:27;146395:43;146392:75;;;146450:14;146465:1;146450:17;;;;;;;;:::i;:::-;;;;;;;146440:27;;146392:75;146373:3;;;;:::i;:::-;;;;146328:151;;;-1:-1:-1;146497:11:0;;;;;:40;;;146522:15;146512:7;:25;146497:40;146489:82;;;;-1:-1:-1;;;146489:82:0;;21283:2:1;146489:82:0;;;21265:21:1;21322:2;21302:18;;;21295:30;21361:32;21341:18;;;21334:60;21411:18;;146489:82:0;21081:354:1;146489:82:0;-1:-1:-1;;;;;146609:21:0;;146582:24;146609:21;;;:13;:21;;;;;;;;146582:48;;;;;;;;;;;;;;;;;;;146609:21;;146582:48;;;146609:21;146582:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;146641:14;146674:6;146670:406;146691:10;:17;146687:1;:21;146670:406;;;146749:15;146733:10;146744:1;146733:13;;;;;;;;:::i;:::-;;;;;;;:31;146730:335;;;-1:-1:-1;;;;;146832:22:0;;;;;;:14;:22;;;;;146855:13;;146832:22;;;146855:10;;146866:1;;146855:13;;;;;;:::i;:::-;;;;;;;146832:37;;;;;;;;;;;;146808:13;:21;146822:6;-1:-1:-1;;;;;146808:21:0;-1:-1:-1;;;;;146808:21:0;;;;;;;;;;;;;:61;;;;:::i;:::-;-1:-1:-1;;;;;146784:21:0;;;;;;:13;:21;;;;;;;;:85;;;;146895:14;:22;;;;;146918:13;;146895:22;;146784:21;146918:10;;146929:1;;146918:13;;;;;;:::i;:::-;;;;;;;146895:37;;;;;;;;;;;146888:44;;;146730:335;;;147006:10;147017:1;147006:13;;;;;;;;:::i;:::-;;;;;;;146971;:21;146985:6;-1:-1:-1;;;;;146971:21:0;-1:-1:-1;;;;;146971:21:0;;;;;;;;;;;;146993:9;146971:32;;;;;;;;:::i;:::-;;;;;;;;;;:48;147038:11;;;;:::i;:::-;;;;146730:335;146711:3;;;;:::i;:::-;;;;146670:406;;;-1:-1:-1;147099:9:0;147086:107;147115:10;:17;147111:1;:21;147086:107;;;-1:-1:-1;;;;;147154:21:0;;;;;;:13;:21;;;;;:27;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;147135:3;;;;;:::i;:::-;;;;147086:107;;;;147210:4;147203:11;;;;;;;146076:1146;:::o;137279:481::-;87838:19;87861:13;;;;;;87860:14;;87908:34;;;;-1:-1:-1;87926:12:0;;87941:1;87926:12;;;;:16;87908:34;87907:108;;;-1:-1:-1;87987:4:0;76610:19;:23;;;87948:66;;-1:-1:-1;87997:12:0;;;;;:17;87948:66;87885:204;;;;-1:-1:-1;;;87885:204:0;;21642:2:1;87885:204:0;;;21624:21:1;21681:2;21661:18;;;21654:30;21720:34;21700:18;;;21693:62;-1:-1:-1;;;21771:18:1;;;21764:44;21825:19;;87885:204:0;21440:410:1;87885:204:0;88100:12;:16;;-1:-1:-1;;88100:16:0;88115:1;88100:16;;;88127:67;;;;88162:13;:20;;-1:-1:-1;;88162:20:0;;;;;88127:67;137423:13:::1;:20;137447:1;137423:25;137415:57;;;::::0;-1:-1:-1;;;137415:57:0;;22057:2:1;137415:57:0::1;::::0;::::1;22039:21:1::0;22096:2;22076:18;;;22069:30;-1:-1:-1;;;22115:18:1;;;22108:49;22174:18;;137415:57:0::1;21855:343:1::0;137415:57:0::1;137483:35;:33;:35::i;:::-;137529:46;;;;;;;;;;;;;;-1:-1:-1::0;;;137529:46:0::1;;::::0;::::1;;;;;;;;;;;;;-1:-1:-1::0;;;137529:46:0::1;;::::0;:29:::1;:46::i;:::-;137586:53;;;;;;;;;;;;;;-1:-1:-1::0;;;137586:53:0::1;;::::0;:42:::1;:53::i;:::-;137650:41;:39;:41::i;:::-;137702:50;137708:13;137722:9;137732:4;137737:14;137702:5;:50::i;:::-;88220:14:::0;88216:102;;;88267:5;88251:21;;-1:-1:-1;;88251:21:0;;;88292:14;;-1:-1:-1;2537:36:1;;88292:14:0;;2525:2:1;2510:18;88292:14:0;;;;;;;87827:498;137279:481;;;;:::o;116725:656::-;116969:8;116950:15;:27;;116942:69;;;;-1:-1:-1;;;116942:69:0;;22604:2:1;116942:69:0;;;22586:21:1;22643:2;22623:18;;;22616:30;22682:31;22662:18;;;22655:59;22731:18;;116942:69:0;22402:353:1;116942:69:0;117024:18;115736:95;117084:5;117091:7;117100:5;117107:16;117117:5;117107:9;:16::i;:::-;117055:79;;;;;;23047:25:1;;;;-1:-1:-1;;;;;23146:15:1;;;23126:18;;;23119:43;23198:15;;;;23178:18;;;23171:43;23230:18;;;23223:34;23273:19;;;23266:35;23317:19;;;23310:35;;;23019:19;;117055:79:0;;;;;;;;;;;;117045:90;;;;;;117024:111;;117148:12;117163:28;117180:10;117163:16;:28::i;:::-;117148:43;;117204:14;117221:39;117246:4;117252:1;117255;117258;117221:24;:39::i;:::-;117204:56;;117289:5;-1:-1:-1;;;;;117279:15:0;:6;-1:-1:-1;;;;;117279:15:0;;117271:58;;;;-1:-1:-1;;;117271:58:0;;23558:2:1;117271:58:0;;;23540:21:1;23597:2;23577:18;;;23570:30;23636:32;23616:18;;;23609:60;23686:18;;117271:58:0;23356:354:1;117271:58:0;117342:31;117351:5;117358:7;117367:5;117342:8;:31::i;:::-;116931:450;;;116725:656;;;;;;;:::o;139158:382::-;139252:4;131345:13;:11;:13::i;:::-;139292:7:::1;:14;139276:5;:12;:30;139268:63;;;::::0;-1:-1:-1;;;139268:63:0;;23917:2:1;139268:63:0::1;::::0;::::1;23899:21:1::0;23956:2;23936:18;;;23929:30;-1:-1:-1;;;23975:18:1;;;23968:51;24036:18;;139268:63:0::1;23715:345:1::0;139268:63:0::1;139367:1;139350:14;;:18;139342:49;;;::::0;-1:-1:-1;;;139342:49:0;;17835:2:1;139342:49:0::1;::::0;::::1;17817:21:1::0;17874:2;17854:18;;;17847:30;-1:-1:-1;;;17893:18:1;;;17886:49;17952:18;;139342:49:0::1;17633:343:1::0;139342:49:0::1;139407:6;139402:109;139424:5;:12;139420:1;:16;139402:109;;;139489:7;139497:1;139489:10;;;;;;;;:::i;:::-;;;;;;;139459:17;:27;139477:5;139483:1;139477:8;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;139459:27:0::1;-1:-1:-1::0;;;;;139459:27:0::1;;;;;;;;;;;;:40;;;;139439:4;;;;;:::i;:::-;;;;139402:109;;105172:151:::0;-1:-1:-1;;;;;105288:18:0;;;105261:7;105288:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;105172:151::o;120997:150::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;121113:21:0;;;;;;:12;:21;;;;;:26;;;;;;;;;;;;:::i;:::-;;;;;;;;;;121106:33;;;;;;;;;121113:26;;121106:33;;;;;;;;;-1:-1:-1;;;;;121106:33:0;;;;;;;;;120997:150;-1:-1:-1;;;120997:150:0:o;145653:415::-;145783:10;145726:4;145769:25;;;:13;:25;;;;;;;;145742:52;;;;;;;;;;;;;;;;;145698:13;;;;145726:4;;;;145742:52;;145769:25;;145742:52;;145769:25;145742:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;145805:25;145844:10;:17;145833:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;145833:29:0;;145805:57;;145877:6;145873:130;145894:10;:17;145890:1;:21;145873:130;;;145965:10;145950:26;;;;:14;:26;;;;;145977:13;;145950:26;;;145977:10;;145988:1;;145977:13;;;;;;:::i;:::-;;;;;;;145950:41;;;;;;;;;;;;145933:11;145945:1;145933:14;;;;;;;;:::i;:::-;;;;;;;;;;:58;145914:3;;;;:::i;:::-;;;;145873:130;;;-1:-1:-1;146021:10:0;;146032:11;;-1:-1:-1;146044:15:0;;-1:-1:-1;145653:415:0;-1:-1:-1;145653:415:0:o;132358:201::-;131345:13;:11;:13::i;:::-;-1:-1:-1;;;;;132447:22:0;::::1;132439:73;;;::::0;-1:-1:-1;;;132439:73:0;;24267:2:1;132439:73:0::1;::::0;::::1;24249:21:1::0;24306:2;24286:18;;;24279:30;24345:34;24325:18;;;24318:62;-1:-1:-1;;;24396:18:1;;;24389:36;24442:19;;132439:73:0::1;24065:402:1::0;132439:73:0::1;132523:28;132542:8;132523:18;:28::i;111828:346::-:0;-1:-1:-1;;;;;111930:19:0;;111922:68;;;;-1:-1:-1;;;111922:68:0;;24674:2:1;111922:68:0;;;24656:21:1;24713:2;24693:18;;;24686:30;24752:34;24732:18;;;24725:62;-1:-1:-1;;;24803:18:1;;;24796:34;24847:19;;111922:68:0;24472:400:1;111922:68:0;-1:-1:-1;;;;;112009:21:0;;112001:68;;;;-1:-1:-1;;;112001:68:0;;25079:2:1;112001:68:0;;;25061:21:1;25118:2;25098:18;;;25091:30;25157:34;25137:18;;;25130:62;-1:-1:-1;;;25208:18:1;;;25201:32;25250:19;;112001:68:0;24877:398:1;112001:68:0;-1:-1:-1;;;;;112082:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;112134:32;;1650:25:1;;;112134:32:0;;1623:18:1;112134:32:0;;;;;;;111828:346;;;:::o;112465:419::-;112566:24;112593:25;112603:5;112610:7;112593:9;:25::i;:::-;112566:52;;-1:-1:-1;;112633:16:0;:37;112629:248;;112715:6;112695:16;:26;;112687:68;;;;-1:-1:-1;;;112687:68:0;;25482:2:1;112687:68:0;;;25464:21:1;25521:2;25501:18;;;25494:30;25560:31;25540:18;;;25533:59;25609:18;;112687:68:0;25280:353:1;112687:68:0;112799:51;112808:5;112815:7;112843:6;112824:16;:25;112799:8;:51::i;:::-;112555:329;112465:419;;;:::o;108741:806::-;-1:-1:-1;;;;;108838:18:0;;108830:68;;;;-1:-1:-1;;;108830:68:0;;25840:2:1;108830:68:0;;;25822:21:1;25879:2;25859:18;;;25852:30;25918:34;25898:18;;;25891:62;-1:-1:-1;;;25969:18:1;;;25962:35;26014:19;;108830:68:0;25638:401:1;108830:68:0;-1:-1:-1;;;;;108917:16:0;;108909:64;;;;-1:-1:-1;;;108909:64:0;;26246:2:1;108909:64:0;;;26228:21:1;26285:2;26265:18;;;26258:30;26324:34;26304:18;;;26297:62;-1:-1:-1;;;26375:18:1;;;26368:33;26418:19;;108909:64:0;26044:399:1;108909:64:0;108986:38;109007:4;109013:2;109017:6;108986:20;:38::i;:::-;-1:-1:-1;;;;;109059:15:0;;109037:19;109059:15;;;:9;:15;;;;;;109093:21;;;;109085:72;;;;-1:-1:-1;;;109085:72:0;;26650:2:1;109085:72:0;;;26632:21:1;26689:2;26669:18;;;26662:30;26728:34;26708:18;;;26701:62;-1:-1:-1;;;26779:18:1;;;26772:36;26825:19;;109085:72:0;26448:402:1;109085:72:0;-1:-1:-1;;;;;109193:15:0;;;;;;;:9;:15;;;;;;109211:20;;;109193:38;;109411:13;;;;;;;;;;:23;;;;;;109463:26;;;;;;109225:6;1650:25:1;;1638:2;1623:18;;1504:177;109463:26:0;;;;;;;;109502:37;109522:4;109528:2;109532:6;109502:19;:37::i;94591:111::-;94644:7;94671:23;:21;:23::i;122985:1956::-;124209:12;;123082:7;;;124209:12;124307:1;124298:10;;124294:260;;;124325:11;124348:28;124369:6;124348:20;:28::i;:::-;124339:37;;:6;:37;:::i;:::-;129546:25;129608:21;;;129675:4;129662:18;;124325:51;;-1:-1:-1;124433:9:0;;129658:28;;124395:35;;;:47;124391:152;;;124470:3;124463:10;;124391:152;;;124520:7;:3;124526:1;124520:7;:::i;:::-;124514:13;;124391:152;124310:244;124294:260;124579:4;124573:3;:10;124566:260;;;124600:11;124614:34;124638:3;124643:4;124614:23;:34::i;:::-;129546:25;129608:21;;;129675:4;129662:18;;124600:48;;-1:-1:-1;124705:9:0;;129658:28;;124667:35;;;:47;124663:152;;;124742:3;124735:10;;124663:152;;;124792:7;:3;124798:1;124792:7;:::i;:::-;124786:13;;124663:152;124585:241;124566:260;;;124870:9;;:52;;129546:25;129608:21;;;129675:4;129662:18;;129658:28;;-1:-1:-1;;129658:28:0;124886:36;;;;-1:-1:-1;;;;;124886:36:0;124870:52;;;124882:1;124870:52;-1:-1:-1;;;;;124863:59:0;;122985:1956;-1:-1:-1;;;;;;122985:1956:0:o;127262:388::-;-1:-1:-1;;;;;121583:19:0;;;127347:23;121583:19;;;:10;:19;;;;;;;;;;104684:9;:18;;;;;;127462:21;;;;:33;;;-1:-1:-1;;;;;;127462:33:0;;;;;;;127513:54;;121583:19;;;;;104684:18;;127462:33;;121583:19;;;127513:54;;127347:23;127513:54;127580:62;127597:15;127614:9;127625:16;127580;:62::i;142497:329::-;-1:-1:-1;;;;;142607:28:0;;;142585:19;142607:28;;;:13;:28;;;;;;;;142646:32;;;;142689:29;;;;;;;:44;;142607:28;;142585:19;142689:44;;142607:28;;142689:44;:::i;:::-;;;;-1:-1:-1;142744:66:0;;-1:-1:-1;142754:13:0;142769:14;142785:24;142754:13;-1:-1:-1;;;;;104684:18:0;104657:7;104684:18;;;:9;:18;;;;;;;104583:127;142785:24;142744:9;:66::i;:::-;142574:252;142497:329;;:::o;131624:132::-;131532:6;;-1:-1:-1;;;;;131532:6:0;100416:10;131688:23;131680:68;;;;-1:-1:-1;;;131680:68:0;;27057:2:1;131680:68:0;;;27039:21:1;;;27076:18;;;27069:30;27135:34;27115:18;;;27108:62;27187:18;;131680:68:0;26855:356:1;15860:190:0;15916:6;15952:16;15943:25;;;15935:76;;;;-1:-1:-1;;;15935:76:0;;27418:2:1;15935:76:0;;;27400:21:1;27457:2;27437:18;;;27430:30;27496:34;27476:18;;;27469:62;-1:-1:-1;;;27547:18:1;;;27540:36;27593:19;;15935:76:0;27216:402:1;132719:191:0;132812:6;;;-1:-1:-1;;;;;132829:17:0;;;-1:-1:-1;;;;;;132829:17:0;;;;;;;132862:40;;132812:6;;;132829:17;132812:6;;132862:40;;132793:16;;132862:40;132782:128;132719:191;:::o;96940:100::-;96994:13;97027:5;97020:12;;;;;:::i;97275:106::-;97332:13;97365:8;97358:15;;;;;:::i;144092:138::-;144141:7;144186:24;144204:6;144186:15;:24;:::i;:::-;144167:44;;:15;:44;:::i;:::-;:55;;144215:6;144167:55;:::i;126515:194::-;126600:28;126612:7;126621:6;126600:11;:28::i;:::-;126641:60;126658:23;126683:9;126694:6;126641:16;:60::i;95546:178::-;95623:7;95650:66;95683:20;:18;:20::i;:::-;95705:10;68131:4;68125:11;-1:-1:-1;;;68150:23:0;;68203:4;68194:14;;68187:39;;;;68256:4;68247:14;;68240:34;68311:4;68296:20;;;67928:406;66133:236;66218:7;66239:17;66258:18;66280:25;66291:4;66297:1;66300;66303;66280:10;:25::i;:::-;66238:67;;;;66316:18;66328:5;66316:11;:18::i;:::-;-1:-1:-1;66352:9:0;66133:236;-1:-1:-1;;;;;66133:236:0:o;117958:218::-;-1:-1:-1;;;;;118090:14:0;;118018:15;118090:14;;;:7;:14;;;;;40554;;40691:1;40673:19;;;;40554:14;118151:17;40584:127;131002:97;89981:13;;;;;;;89973:69;;;;-1:-1:-1;;;89973:69:0;;;;;;;:::i;:::-;131065:26:::1;:24;:26::i;102894:149::-:0;89981:13;;;;;;;89973:69;;;;-1:-1:-1;;;89973:69:0;;;;;;;:::i;:::-;102997:38:::1;103020:5;103027:7;102997:22;:38::i;116443:127::-:0;89981:13;;;;;;;89973:69;;;;-1:-1:-1;;;89973:69:0;;;;;;;:::i;:::-;116528:34:::1;116552:4;116528:34;;;;;;;;;;;;;-1:-1:-1::0;;;116528:34:0::1;;::::0;:23:::1;:34::i;119729:63::-:0;89981:13;;;;;;;89973:69;;;;-1:-1:-1;;;89973:69:0;;;;;;;:::i;137768:1382::-;137904:4;:66;;137926:42;-1:-1:-1;;;;;;137904:66:0;;;;;;;137981:13;:30;;;;;-1:-1:-1;;;;;137981:30:0;;;;;138038:14;;;138049:2;138038:14;;;;;;;;;;;;;;;;;;-1:-1:-1;;138022:30:0;;;;:13;;-1:-1:-1;138022:30:0;;;;:::i;:::-;-1:-1:-1;138080:2:0;138063:14;:19;138123:17;;;138137:2;138123:17;;;;;;;;;138093:27;;138123:17;;;;;;;;;;-1:-1:-1;;138093:47:0;-1:-1:-1;138165:2:0;138151:130;138169:5;;138151:130;;138236:6;138241:1;138236:2;:6;:::i;:::-;138235:13;;138246:2;138235:13;:::i;:::-;:22;;138251:6;138235:22;:::i;:::-;:33;;138260:8;138235:33;:::i;:::-;138214:16;:14;:16::i;:::-;:55;;;;:::i;:::-;138196:10;138207:3;138209:1;138207;:3;:::i;:::-;138196:15;;;;;;;;:::i;:::-;;;;;;;;;;:73;138176:3;;;;:::i;:::-;;;;138151:130;;;-1:-1:-1;138312:17:0;138291:18;138340:302;138361:13;:20;138357:1;:24;138340:302;;;138403:38;138409:13;138423:1;138409:16;;;;;;;;:::i;:::-;;;;;;;138427:13;138403:5;:38::i;:::-;138491:13;138456;:31;138470:13;138484:1;138470:16;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;138456:31:0;-1:-1:-1;;;;;138456:31:0;;;;;;;;;;;;;:48;;;;;;;:::i;:::-;;;;;;;;138560:10;138519:20;:38;138540:13;138554:1;138540:16;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;138519:38:0;-1:-1:-1;;;;;138519:38:0;;;;;;;;;;;;:51;;;;;;;;;;;;:::i;:::-;;136763:1;138585:45;;:12;:30;138598:13;138612:1;138598:16;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;138585:30:0;-1:-1:-1;;;;;138585:30:0;;;;;;;;;;;;:45;;;;138383:3;;;;;:::i;:::-;;;;138340:302;;;;138652:35;138658:9;138669:17;138652:5;:35::i;:::-;138698:8;:20;;-1:-1:-1;;;;;;138698:20:0;-1:-1:-1;;;;;138698:20:0;;;;;138729:37;138735:11;138748:17;138729:5;:37::i;:::-;136364:42;138777:26;;;;:13;:26;;;:48;;138807:18;;138777:26;:48;;138807:18;;138777:48;:::i;:::-;;;;-1:-1:-1;138836:38:0;;-1:-1:-1;136364:42:0;138855:18;138836:5;:38::i;:::-;136466:42;138885:32;;;;:13;:32;;;:54;;138921:18;;138885:32;:54;;138921:18;;138885:54;:::i;:::-;;;;-1:-1:-1;138950:44:0;;-1:-1:-1;136466:42:0;138975:18;138950:5;:44::i;:::-;139019:2;139005:138;139024:5;;139005:138;;139114:1;139100:3;139114:1;139100;:3;:::i;:::-;:6;:12;;139109:3;:1;139111;139109:3;:::i;:::-;139100:12;;;139107:1;139100:12;139099:16;;;;:::i;:::-;139094:21;;:2;:21;:::i;:::-;139093:28;;139119:2;139093:28;:::i;:::-;:37;;139124:6;139093:37;:::i;:::-;139072:16;:14;:16::i;:::-;:59;;;;:::i;:::-;139051:13;139065:3;139067:1;139065;:3;:::i;:::-;139051:18;;;;;;;;:::i;:::-;;;;;;;;;;:80;139032:3;;;;:::i;:::-;;;;139005:138;;147695:313;-1:-1:-1;;;;;147805:19:0;;147827:1;147805:19;;;:13;:19;;;;;;:23;147802:141;;-1:-1:-1;;;;;147870:19:0;;;;;;:13;:19;;;;;;;;;104684:9;:18;;;;;;;147893:6;;147852:37;;;:::i;:::-;:47;;147844:87;;;;-1:-1:-1;;;147844:87:0;;28611:2:1;147844:87:0;;;28593:21:1;28650:2;28630:18;;;28623:30;28689;28669:18;;;28662:58;28737:18;;147844:87:0;28409:352:1;148016:157:0;148122:43;148148:4;148154:2;148158:6;148122:25;:43::i;94710:194::-;94765:7;93162:95;94825:17;:15;:17::i;:::-;94844:20;:18;:20::i;:::-;94802:93;;;;;;29025:25:1;;;;29066:18;;29059:34;;;;29109:18;;;29102:34;94866:13:0;29152:18:1;;;29145:34;94889:4:0;29195:19:1;;;29188:61;28997:19;;94802:93:0;;;;;;;;;;;;94792:104;;;;;;94785:111;;94710:194;:::o;49999:1673::-;50047:7;50071:1;50076;50071:6;50067:47;;-1:-1:-1;50101:1:0;;49999:1673;-1:-1:-1;49999:1673:0:o;50067:47::-;50805:14;50839:1;50828:7;50833:1;50828:4;:7::i;:::-;:12;;50822:1;:19;;50805:36;;51307:1;51296:6;51292:1;:10;;;;;:::i;:::-;;51283:6;:19;51282:26;;51273:35;;51357:1;51346:6;51342:1;:10;;;;;:::i;:::-;;51333:6;:19;51332:26;;51323:35;;51407:1;51396:6;51392:1;:10;;;;;:::i;:::-;;51383:6;:19;51382:26;;51373:35;;51457:1;51446:6;51442:1;:10;;;;;:::i;:::-;;51433:6;:19;51432:26;;51423:35;;51507:1;51496:6;51492:1;:10;;;;;:::i;:::-;;51483:6;:19;51482:26;;51473:35;;51557:1;51546:6;51542:1;:10;;;;;:::i;:::-;;51533:6;:19;51532:26;;51523:35;;51607:1;51596:6;51592:1;:10;;;;;:::i;:::-;;51583:6;:19;51582:26;;51573:35;;51630:23;51634:6;51646;51642:1;:10;;;;;:::i;:::-;;51630:3;:23::i;44156:156::-;44218:7;44293:11;44303:1;44294:5;;;44293:11;:::i;:::-;44283:21;;44284:5;;;44283:21;:::i;127658:609::-;127756:3;-1:-1:-1;;;;;127749:10:0;:3;-1:-1:-1;;;;;127749:10:0;;;:24;;;;;127772:1;127763:6;:10;127749:24;127745:515;;;-1:-1:-1;;;;;127794:17:0;;;127790:224;;-1:-1:-1;;;;;127890:17:0;;127833;127890;;;:12;:17;;;;;127833;;127873:54;;127909:9;127920:6;127873:16;:54::i;:::-;127832:95;;;;127972:3;-1:-1:-1;;;;;127951:47:0;;127977:9;127988;127951:47;;;;;;29434:25:1;;;29490:2;29475:18;;29468:34;29422:2;29407:18;;29260:248;127951:47:0;;;;;;;;127813:201;;127790:224;-1:-1:-1;;;;;128034:17:0;;;128030:219;;-1:-1:-1;;;;;128130:17:0;;128073;128130;;;:12;:17;;;;;128073;;128113:49;;128149:4;128155:6;128113:16;:49::i;:::-;128072:90;;;;128207:3;-1:-1:-1;;;;;128186:47:0;;128212:9;128223;128186:47;;;;;;29434:25:1;;;29490:2;29475:18;;29468:34;29422:2;29407:18;;29260:248;128186:47:0;;;;;;;;128053:196;;127658:609;;;:::o;110715:675::-;-1:-1:-1;;;;;110799:21:0;;110791:67;;;;-1:-1:-1;;;110791:67:0;;29715:2:1;110791:67:0;;;29697:21:1;29754:2;29734:18;;;29727:30;29793:34;29773:18;;;29766:62;-1:-1:-1;;;29844:18:1;;;29837:31;29885:19;;110791:67:0;29513:397:1;110791:67:0;110871:49;110892:7;110909:1;110913:6;110871:20;:49::i;:::-;-1:-1:-1;;;;;110958:18:0;;110933:22;110958:18;;;:9;:18;;;;;;110995:24;;;;110987:71;;;;-1:-1:-1;;;110987:71:0;;30117:2:1;110987:71:0;;;30099:21:1;30156:2;30136:18;;;30129:30;30195:34;30175:18;;;30168:62;-1:-1:-1;;;30246:18:1;;;30239:32;30288:19;;110987:71:0;29915:398:1;110987:71:0;-1:-1:-1;;;;;111094:18:0;;;;;;:9;:18;;;;;;;;111115:23;;;111094:44;;111233:12;:22;;;;;;;111284:37;1650:25:1;;;111094:18:0;;;111284:37;;1623:18:1;111284:37:0;;;;;;;111334:48;111354:7;111371:1;111375:6;111334:19;:48::i;129209:103::-;129272:7;129299:5;129303:1;129299;:5;:::i;128275:820::-;128512:12;;128449:17;;;;;128590:8;;:59;;129546:25;129608:21;;;129675:4;129662:18;;129658:28;;-1:-1:-1;;129658:28:0;128590:59;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;128590:59:0;;;;;;;;128601:16;;;;;;;;;-1:-1:-1;128601:16:0;;;;;;;128590:59;128562:87;;128678:7;:13;;;-1:-1:-1;;;;;128666:25:0;;;128718:20;128721:9;128732:5;128718:2;:20;;:::i;:::-;128706:32;;128765:1;128759:3;:7;:39;;;;-1:-1:-1;128770:17:0;;:28;;;147546:15;128770:28;;128759:39;128755:322;;;128857:40;128887:9;128857:29;:40::i;:::-;129546:25;129608:21;;;129675:4;129662:18;;129658:28;;-1:-1:-1;;129658:28:0;128819:78;;-1:-1:-1;;;;;128819:78:0;;;;;;;;;;;;;;;;128755:322;;;128938:5;128949:111;;;;;;;;128972:37;129001:7;147546:15;;147466:104;129001:7;128972:37;;:28;:37::i;:::-;128949:111;;;;;;129018:40;129048:9;129018:29;:40::i;:::-;-1:-1:-1;;;;;128949:111:0;;;;;;128938:123;;;;;;;-1:-1:-1;128938:123:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;128755:322;128537:551;128487:608;128275:820;;;;;;:::o;64517:1477::-;64605:7;;65539:66;65526:79;;65522:163;;;-1:-1:-1;65638:1:0;;-1:-1:-1;65642:30:0;65622:51;;65522:163;65799:24;;;65782:14;65799:24;;;;;;;;;30545:25:1;;;30618:4;30606:17;;30586:18;;;30579:45;;;;30640:18;;;30633:34;;;30683:18;;;30676:34;;;65799:24:0;;30517:19:1;;65799:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;65799:24:0;;-1:-1:-1;;65799:24:0;;;-1:-1:-1;;;;;;;65838:20:0;;65834:103;;65891:1;65895:29;65875:50;;;;;;;65834:103;65957:6;-1:-1:-1;65965:20:0;;-1:-1:-1;64517:1477:0;;;;;;;;:::o;59977:521::-;60055:20;60046:5;:29;;;;;;;;:::i;:::-;;60042:449;;59977:521;:::o;60042:449::-;60153:29;60144:5;:38;;;;;;;;:::i;:::-;;60140:351;;60199:34;;-1:-1:-1;;;60199:34:0;;31055:2:1;60199:34:0;;;31037:21:1;31094:2;31074:18;;;31067:30;31133:26;31113:18;;;31106:54;31177:18;;60199:34:0;30853:348:1;60140:351:0;60264:35;60255:5;:44;;;;;;;;:::i;:::-;;60251:240;;60316:41;;-1:-1:-1;;;60316:41:0;;31408:2:1;60316:41:0;;;31390:21:1;31447:2;31427:18;;;31420:30;31486:33;31466:18;;;31459:61;31537:18;;60316:41:0;31206:355:1;60251:240:0;60388:30;60379:5;:39;;;;;;;;:::i;:::-;;60375:116;;60435:44;;-1:-1:-1;;;60435:44:0;;31768:2:1;60435:44:0;;;31750:21:1;31807:2;31787:18;;;31780:30;31846:34;31826:18;;;31819:62;-1:-1:-1;;;31897:18:1;;;31890:32;31939:19;;60435:44:0;31566:398:1;131107:113:0;89981:13;;;;;;;89973:69;;;;-1:-1:-1;;;89973:69:0;;;;;;;:::i;:::-;131180:32:::1;100416:10:::0;131180:18:::1;:32::i;103051:162::-:0;89981:13;;;;;;;89973:69;;;;-1:-1:-1;;;89973:69:0;;;;;;;:::i;:::-;103164:5:::1;:13;103172:5:::0;103164;:13:::1;:::i;:::-;-1:-1:-1::0;103188:7:0::1;:17;103198:7:::0;103188;:17:::1;:::i;94226:274::-:0;89981:13;;;;;;;89973:69;;;;-1:-1:-1;;;89973:69:0;;;;;;;:::i;:::-;94339:5:::1;:12;94347:4:::0;94339:5;:12:::1;:::i;:::-;-1:-1:-1::0;94362:8:0::1;:18;94373:7:::0;94362:8;:18:::1;:::i;:::-;-1:-1:-1::0;;94462:1:0::1;94448:11;:15:::0;;;94474:14:::1;:18:::0;-1:-1:-1;94226:274:0:o;126131:290::-;126216:28;126228:7;126237:6;126216:11;:28::i;:::-;104500:12;;-1:-1:-1;;;;;;126263:29:0;126255:90;;;;-1:-1:-1;;;126255:90:0;;34375:2:1;126255:90:0;;;34357:21:1;34414:2;34394:18;;;34387:30;34453:34;34433:18;;;34426:62;-1:-1:-1;;;34504:18:1;;;34497:46;34560:19;;126255:90:0;34173:412:1;126255:90:0;126358:55;126375:23;126400:4;126406:6;126358:16;:55::i;126856:228::-;-1:-1:-1;;;;;121583:19:0;;;121556:7;121583:19;;;:10;:19;;;;;;;;;;;;;;;127020:56;;121583:19;;;;;127069:6;127020:16;:56::i;97603:644::-;97653:7;97673:18;97694:13;:11;:13::i;:::-;97722:18;;97673:34;;-1:-1:-1;97722:22:0;97718:522;;97768:22;;;;;;;;97603:644;-1:-1:-1;97603:644:0:o;97718:522::-;98069:11;;98099:15;;98095:134;;98142:10;97603:644;-1:-1:-1;;97603:644:0:o;98095:134::-;98200:13;98193:20;;;;97603:644;:::o;98475:680::-;98528:7;98548:21;98572:16;:14;:16::i;:::-;98603:21;;98548:40;;-1:-1:-1;98603:25:0;98599:549;;98652:25;;;;;;;;98475:680;-1:-1:-1;98475:680:0:o;98599:549::-;98968:14;;99001:18;;98997:140;;99047:13;98475:680;-1:-1:-1;;98475:680:0:o;52149:1019::-;52201:7;;52288:3;52279:12;;;:16;52275:102;;52326:3;52316:13;;;;52348;52275:102;52404:2;52395:11;;;:15;52391:99;;52441:2;52431:12;;;;52462;52391:99;52517:2;52508:11;;;:15;52504:99;;52554:2;52544:12;;;;52575;52504:99;52630:2;52621:11;;;:15;52617:99;;52667:2;52657:12;;;;52688;52617:99;52743:1;52734:10;;;:14;52730:96;;52779:1;52769:11;;;;52799;52730:96;52853:1;52844:10;;;:14;52840:96;;52889:1;52879:11;;;;52909;52840:96;52963:1;52954:10;;;:14;52950:96;;52999:1;52989:11;;;;53019;52950:96;53073:1;53064:10;;;:14;53060:66;;53109:1;53099:11;53154:6;52149:1019;-1:-1:-1;;52149:1019:0:o;43931:106::-;43989:7;44020:1;44016;:5;:13;;44028:1;44016:13;;;-1:-1:-1;44024:1:0;;43931:106;-1:-1:-1;43931:106:0:o;129103:98::-;129161:7;129188:5;129192:1;129188;:5;:::i;3024:195::-;3081:7;-1:-1:-1;;;;;3109:26:0;;;3101:78;;;;-1:-1:-1;;;3101:78:0;;34792:2:1;3101:78:0;;;34774:21:1;34831:2;34811:18;;;34804:30;34870:34;34850:18;;;34843:62;-1:-1:-1;;;34921:18:1;;;34914:37;34968:19;;3101:78:0;34590:403:1;109834:548:0;-1:-1:-1;;;;;109918:21:0;;109910:65;;;;-1:-1:-1;;;109910:65:0;;35200:2:1;109910:65:0;;;35182:21:1;35239:2;35219:18;;;35212:30;35278:33;35258:18;;;35251:61;35329:18;;109910:65:0;34998:355:1;109910:65:0;109988:49;110017:1;110021:7;110030:6;109988:20;:49::i;:::-;110066:6;110050:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;110221:18:0;;;;;;:9;:18;;;;;;;;:28;;;;;;110276:37;1650:25:1;;;110276:37:0;;1623:18:1;110276:37:0;;;;;;;110326:48;110354:1;110358:7;110367:6;110326:19;:48::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;206:423:1;248:3;286:5;280:12;313:6;308:3;301:19;338:1;348:162;362:6;359:1;356:13;348:162;;;424:4;480:13;;;476:22;;470:29;452:11;;;448:20;;441:59;377:12;348:162;;;352:3;555:1;548:4;539:6;534:3;530:16;526:27;519:38;618:4;611:2;607:7;602:2;594:6;590:15;586:29;581:3;577:39;573:50;566:57;;;206:423;;;;:::o;634:220::-;783:2;772:9;765:21;746:4;803:45;844:2;833:9;829:18;821:6;803:45;:::i;859:173::-;927:20;;-1:-1:-1;;;;;976:31:1;;966:42;;956:70;;1022:1;1019;1012:12;1037:254;1105:6;1113;1166:2;1154:9;1145:7;1141:23;1137:32;1134:52;;;1182:1;1179;1172:12;1134:52;1205:29;1224:9;1205:29;:::i;:::-;1195:39;1281:2;1266:18;;;;1253:32;;-1:-1:-1;;;1037:254:1:o;1686:186::-;1745:6;1798:2;1786:9;1777:7;1773:23;1769:32;1766:52;;;1814:1;1811;1804:12;1766:52;1837:29;1856:9;1837:29;:::i;1877:328::-;1954:6;1962;1970;2023:2;2011:9;2002:7;1998:23;1994:32;1991:52;;;2039:1;2036;2029:12;1991:52;2062:29;2081:9;2062:29;:::i;:::-;2052:39;;2110:38;2144:2;2133:9;2129:18;2110:38;:::i;:::-;2100:48;;2195:2;2184:9;2180:18;2167:32;2157:42;;1877:328;;;;;:::o;2210:180::-;2269:6;2322:2;2310:9;2301:7;2297:23;2293:32;2290:52;;;2338:1;2335;2328:12;2290:52;-1:-1:-1;2361:23:1;;2210:180;-1:-1:-1;2210:180:1:o;2766:260::-;2834:6;2842;2895:2;2883:9;2874:7;2870:23;2866:32;2863:52;;;2911:1;2908;2901:12;2863:52;2934:29;2953:9;2934:29;:::i;:::-;2924:39;;2982:38;3016:2;3005:9;3001:18;2982:38;:::i;:::-;2972:48;;2766:260;;;;;:::o;3228:435::-;3281:3;3319:5;3313:12;3346:6;3341:3;3334:19;3372:4;3401:2;3396:3;3392:12;3385:19;;3438:2;3431:5;3427:14;3459:1;3469:169;3483:6;3480:1;3477:13;3469:169;;;3544:13;;3532:26;;3578:12;;;;3613:15;;;;3505:1;3498:9;3469:169;;;-1:-1:-1;3654:3:1;;3228:435;-1:-1:-1;;;;;3228:435:1:o;3668:920::-;4074:3;4069;4065:13;4057:6;4053:26;4042:9;4035:45;4116:3;4111:2;4100:9;4096:18;4089:31;4016:4;4143:46;4184:3;4173:9;4169:19;4161:6;4143:46;:::i;:::-;4237:9;4229:6;4225:22;4220:2;4209:9;4205:18;4198:50;4271:33;4297:6;4289;4271:33;:::i;:::-;4335:2;4320:18;;4313:34;;;-1:-1:-1;;;;;4384:32:1;;4378:3;4363:19;;4356:61;4404:3;4433:19;;4426:35;;;4498:22;;;4492:3;4477:19;;4470:51;4257:47;-1:-1:-1;4538:44:1;4257:47;4567:6;4538:44;:::i;:::-;4530:52;3668:920;-1:-1:-1;;;;;;;;;;3668:920:1:o;4593:127::-;4654:10;4649:3;4645:20;4642:1;4635:31;4685:4;4682:1;4675:15;4709:4;4706:1;4699:15;4725:275;4796:2;4790:9;4861:2;4842:13;;-1:-1:-1;;4838:27:1;4826:40;;4896:18;4881:34;;4917:22;;;4878:62;4875:88;;;4943:18;;:::i;:::-;4979:2;4972:22;4725:275;;-1:-1:-1;4725:275:1:o;5005:183::-;5065:4;5098:18;5090:6;5087:30;5084:56;;;5120:18;;:::i;:::-;-1:-1:-1;5165:1:1;5161:14;5177:4;5157:25;;5005:183::o;5193:668::-;5247:5;5300:3;5293:4;5285:6;5281:17;5277:27;5267:55;;5318:1;5315;5308:12;5267:55;5354:6;5341:20;5380:4;5404:60;5420:43;5460:2;5420:43;:::i;:::-;5404:60;:::i;:::-;5498:15;;;5584:1;5580:10;;;;5568:23;;5564:32;;;5529:12;;;;5608:15;;;5605:35;;;5636:1;5633;5626:12;5605:35;5672:2;5664:6;5660:15;5684:148;5700:6;5695:3;5692:15;5684:148;;;5766:23;5785:3;5766:23;:::i;:::-;5754:36;;5810:12;;;;5717;;5684:148;;;-1:-1:-1;5850:5:1;5193:668;-1:-1:-1;;;;;;5193:668:1:o;5866:1138::-;5984:6;5992;6045:2;6033:9;6024:7;6020:23;6016:32;6013:52;;;6061:1;6058;6051:12;6013:52;6101:9;6088:23;6130:18;6171:2;6163:6;6160:14;6157:34;;;6187:1;6184;6177:12;6157:34;6210:61;6263:7;6254:6;6243:9;6239:22;6210:61;:::i;:::-;6200:71;;6290:2;6280:12;;6345:2;6334:9;6330:18;6317:32;6374:2;6364:8;6361:16;6358:36;;;6390:1;6387;6380:12;6358:36;6413:24;;;-1:-1:-1;6468:4:1;6460:13;;6456:27;-1:-1:-1;6446:55:1;;6497:1;6494;6487:12;6446:55;6533:2;6520:16;6556:60;6572:43;6612:2;6572:43;:::i;6556:60::-;6650:15;;;6732:1;6728:10;;;;6720:19;;6716:28;;;6681:12;;;;6756:19;;;6753:39;;;6788:1;6785;6778:12;6753:39;6812:11;;;;6832:142;6848:6;6843:3;6840:15;6832:142;;;6914:17;;6902:30;;6865:12;;;;6952;;;;6832:142;;;6993:5;6983:15;;;;;;;5866:1138;;;;;:::o;7210:391::-;7296:6;7304;7312;7320;7373:3;7361:9;7352:7;7348:23;7344:33;7341:53;;;7390:1;7387;7380:12;7341:53;7413:29;7432:9;7413:29;:::i;:::-;7403:39;7489:2;7474:18;;7461:32;;-1:-1:-1;7540:2:1;7525:18;;7512:32;;7591:2;7576:18;7563:32;;-1:-1:-1;7210:391:1;-1:-1:-1;;;7210:391:1:o;7606:156::-;7672:20;;7732:4;7721:16;;7711:27;;7701:55;;7752:1;7749;7742:12;7767:531;7869:6;7877;7885;7893;7901;7909;7962:3;7950:9;7941:7;7937:23;7933:33;7930:53;;;7979:1;7976;7969:12;7930:53;8002:29;8021:9;8002:29;:::i;:::-;7992:39;;8078:2;8067:9;8063:18;8050:32;8040:42;;8129:2;8118:9;8114:18;8101:32;8091:42;;8152:36;8184:2;8173:9;8169:18;8152:36;:::i;:::-;8142:46;;8235:3;8224:9;8220:19;8207:33;8197:43;;8287:3;8276:9;8272:19;8259:33;8249:43;;7767:531;;;;;;;;:::o;8303:571::-;8414:6;8422;8430;8438;8491:3;8479:9;8470:7;8466:23;8462:33;8459:53;;;8508:1;8505;8498:12;8459:53;8548:9;8535:23;8581:18;8573:6;8570:30;8567:50;;;8613:1;8610;8603:12;8567:50;8636:61;8689:7;8680:6;8669:9;8665:22;8636:61;:::i;:::-;8626:71;;;8716:38;8750:2;8739:9;8735:18;8716:38;:::i;:::-;8706:48;;8773:38;8807:2;8796:9;8792:18;8773:38;:::i;:::-;8763:48;;8830:38;8864:2;8853:9;8849:18;8830:38;:::i;:::-;8820:48;;8303:571;;;;;;;:::o;8879:606::-;8990:6;8998;9006;9014;9022;9030;9038;9091:3;9079:9;9070:7;9066:23;9062:33;9059:53;;;9108:1;9105;9098:12;9059:53;9131:29;9150:9;9131:29;:::i;:::-;9121:39;;9179:38;9213:2;9202:9;9198:18;9179:38;:::i;:::-;9169:48;;9264:2;9253:9;9249:18;9236:32;9226:42;;9315:2;9304:9;9300:18;9287:32;9277:42;;9338:37;9370:3;9359:9;9355:19;9338:37;:::i;:::-;9328:47;;9422:3;9411:9;9407:19;9394:33;9384:43;;9474:3;9463:9;9459:19;9446:33;9436:43;;8879:606;;;;;;;;;;:::o;9490:350::-;9557:6;9565;9618:2;9606:9;9597:7;9593:23;9589:32;9586:52;;;9634:1;9631;9624:12;9586:52;9657:29;9676:9;9657:29;:::i;:::-;9647:39;;9736:2;9725:9;9721:18;9708:32;9780:10;9773:5;9769:22;9762:5;9759:33;9749:61;;9806:1;9803;9796:12;9749:61;9829:5;9819:15;;;9490:350;;;;;:::o;10196:536::-;10481:2;10470:9;10463:21;10444:4;10507:56;10559:2;10548:9;10544:18;10536:6;10507:56;:::i;:::-;10611:9;10603:6;10599:22;10594:2;10583:9;10579:18;10572:50;10639:44;10676:6;10668;10639:44;:::i;:::-;10631:52;;;10719:6;10714:2;10703:9;10699:18;10692:34;10196:536;;;;;;:::o;11430:127::-;11491:10;11486:3;11482:20;11479:1;11472:31;11522:4;11519:1;11512:15;11546:4;11543:1;11536:15;11562:128;11629:9;;;11650:11;;;11647:37;;;11664:18;;:::i;11695:127::-;11756:10;11751:3;11747:20;11744:1;11737:31;11787:4;11784:1;11777:15;11811:4;11808:1;11801:15;11827:402;12029:2;12011:21;;;12068:2;12048:18;;;12041:30;12107:34;12102:2;12087:18;;12080:62;-1:-1:-1;;;12173:2:1;12158:18;;12151:36;12219:3;12204:19;;11827:402::o;12234:127::-;12295:10;12290:3;12286:20;12283:1;12276:31;12326:4;12323:1;12316:15;12350:4;12347:1;12340:15;12366:380;12445:1;12441:12;;;;12488;;;12509:61;;12563:4;12555:6;12551:17;12541:27;;12509:61;12616:2;12608:6;12605:14;12585:18;12582:38;12579:161;;12662:10;12657:3;12653:20;12650:1;12643:31;12697:4;12694:1;12687:15;12725:4;12722:1;12715:15;12751:125;12816:9;;;12837:10;;;12834:36;;;12850:18;;:::i;13575:334::-;13777:2;13759:21;;;13816:2;13796:18;;;13789:30;-1:-1:-1;;;13850:2:1;13835:18;;13828:40;13900:2;13885:18;;13575:334::o;14540:277::-;14607:6;14660:2;14648:9;14639:7;14635:23;14631:32;14628:52;;;14676:1;14673;14666:12;14628:52;14708:9;14702:16;14761:5;14754:13;14747:21;14740:5;14737:32;14727:60;;14783:1;14780;14773:12;15875:135;15914:3;15935:17;;;15932:43;;15955:18;;:::i;:::-;-1:-1:-1;16002:1:1;15991:13;;15875:135::o;16360:168::-;16433:9;;;16464;;16481:15;;;16475:22;;16461:37;16451:71;;16502:18;;:::i;18765:136::-;18804:3;18832:5;18822:39;;18841:18;;:::i;:::-;-1:-1:-1;;;18877:18:1;;18765:136::o;27623:127::-;27684:10;27679:3;27675:20;27672:1;27665:31;27715:4;27712:1;27705:15;27739:4;27736:1;27729:15;27755:112;27787:1;27813;27803:35;;27818:18;;:::i;:::-;-1:-1:-1;27852:9:1;;27755:112::o;27872:407::-;28074:2;28056:21;;;28113:2;28093:18;;;28086:30;28152:34;28147:2;28132:18;;28125:62;-1:-1:-1;;;28218:2:1;28203:18;;28196:41;28269:3;28254:19;;27872:407::o;28284:120::-;28324:1;28350;28340:35;;28355:18;;:::i;:::-;-1:-1:-1;28389:9:1;;28284:120::o;30721:127::-;30782:10;30777:3;30773:20;30770:1;30763:31;30813:4;30810:1;30803:15;30837:4;30834:1;30827:15;32095:545;32197:2;32192:3;32189:11;32186:448;;;32233:1;32258:5;32254:2;32247:17;32303:4;32299:2;32289:19;32373:2;32361:10;32357:19;32354:1;32350:27;32344:4;32340:38;32409:4;32397:10;32394:20;32391:47;;;-1:-1:-1;32432:4:1;32391:47;32487:2;32482:3;32478:12;32475:1;32471:20;32465:4;32461:31;32451:41;;32542:82;32560:2;32553:5;32550:13;32542:82;;;32605:17;;;32586:1;32575:13;32542:82;;;32546:3;;;32095:545;;;:::o;32816:1352::-;32942:3;32936:10;32969:18;32961:6;32958:30;32955:56;;;32991:18;;:::i;:::-;33020:97;33110:6;33070:38;33102:4;33096:11;33070:38;:::i;:::-;33064:4;33020:97;:::i;:::-;33172:4;;33236:2;33225:14;;33253:1;33248:663;;;;33955:1;33972:6;33969:89;;;-1:-1:-1;34024:19:1;;;34018:26;33969:89;-1:-1:-1;;32773:1:1;32769:11;;;32765:24;32761:29;32751:40;32797:1;32793:11;;;32748:57;34071:81;;33218:944;;33248:663;32042:1;32035:14;;;32079:4;32066:18;;-1:-1:-1;;33284:20:1;;;33402:236;33416:7;33413:1;33410:14;33402:236;;;33505:19;;;33499:26;33484:42;;33597:27;;;;33565:1;33553:14;;;;33432:19;;33402:236;;;33406:3;33666:6;33657:7;33654:19;33651:201;;;33727:19;;;33721:26;-1:-1:-1;;33810:1:1;33806:14;;;33822:3;33802:24;33798:37;33794:42;33779:58;33764:74;;33651:201;-1:-1:-1;;;;;33898:1:1;33882:14;;;33878:22;33865:36;;-1:-1:-1;32816:1352:1:o
Swarm Source
ipfs://786116b778e4dde4faacd9dfff2568db90b9da81471f12b663b3a2089b962305
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.