Contract 0x661090cB830757B2D0Cd53C49Bf0d17a28992e5d

Contract Overview

Balance:
0 Ether
Txn Hash
Method
Block
From
To
Value
0xbcdbecac621de49b0e32cd67211cc076c7c0fc4dbf2bb2ff5f8a5ff4fa003618Enact Motion113314722022-09-06 5:57:1924 days 17 hrs ago0xf940cf55013e77fd70d47802878ea3aaf272475c IN  0x661090cb830757b2d0cd53c49bf0d17a28992e5d0 Ether0.00024044 1.5
0x7cc1eebdaf00937fba0b29826f5a669ef5044c698c26e549fa45d7b28b288482Grant Role101721522022-02-15 12:20:48227 days 10 hrs ago0x2a61d3ba5030ef471c74f612962c7367eca3a62d IN  0x661090cb830757b2d0cd53c49bf0d17a28992e5d0 Ether0.0000511 1.00000003
0xd16723cfe8d3f5ce66c86a05c3e53c34d924cfe32ed2b8a18182e07b4d57e1bfObject To Motion101432712022-02-10 11:56:05232 days 11 hrs ago0xb2f057256477098d216d570d6fb60beeb9481051 IN  0x661090cb830757b2d0cd53c49bf0d17a28992e5d0 Ether0.00025592 1.91037437
0xdaab6a4b62f7e3d81c70b186ced17ea75e124f61e74457df2fa5b4a2bb5aff42Object To Motion101430992022-02-10 11:13:03232 days 11 hrs ago0xb2f057256477098d216d570d6fb60beeb9481051 IN  0x661090cb830757b2d0cd53c49bf0d17a28992e5d0 Ether0.00018425 1.87704228
0xd888f50da7b762c1f0bf684993e3be20ba107bb57858bb6795f6931656118481Object To Motion101390392022-02-09 12:01:17233 days 11 hrs ago0x4ec7b04fccd45482da61984b5415798d02223f88 IN  0x661090cb830757b2d0cd53c49bf0d17a28992e5d0 Ether0.0002714 2.82231674
0xcb5b5dbde377656328dd3b02b418f7e5766239b1f5fc14b39e9224075cded136Object To Motion101390362022-02-09 12:00:32233 days 11 hrs ago0xc2868f82d2c01471c48fc8247564bb4f246d7b54 IN  0x661090cb830757b2d0cd53c49bf0d17a28992e5d0 Ether0.0002994 3.05000504
0x50ec40bc2db7f0f1762ac478cc34f5510fc6aa7d65f57717f97fd2eac5e65f8eObject To Motion101390032022-02-09 11:52:17233 days 11 hrs ago0x62a3d8a878beef2ba024bbc26c5be9d2ee4dde7e IN  0x661090cb830757b2d0cd53c49bf0d17a28992e5d0 Ether0.00034176 2.63941853
0x52a724b5164d67d5c799379467acc9cb981948314f00045f6feb8efd64246755Object To Motion101389992022-02-09 11:51:17233 days 11 hrs ago0xb2f057256477098d216d570d6fb60beeb9481051 IN  0x661090cb830757b2d0cd53c49bf0d17a28992e5d0 Ether0.00026105 2.65940712
0xcea7535511e24cba1bc5bb8f834e42c79bf799eabcdfb36e286d990b01bb98dcEnact Motion101281082022-02-07 14:26:42235 days 8 hrs ago0x3419ebccff29b3870f6544d1f6cfa458c9dbd72d IN  0x661090cb830757b2d0cd53c49bf0d17a28992e5d0 Ether0.00016528 1.50000004
0xd91917c81a0de7718e7456145df76992221619b5c20c143d279fa01dc49c9e06Enact Motion100925882022-02-01 10:22:09241 days 12 hrs ago0xe22faf247335241682726cd601f38576b1b1dc72 IN  0x661090cb830757b2d0cd53c49bf0d17a28992e5d0 Ether0.00020291 1.50000001
0x75c287dcd49f930294809434bedd6ecafe6640cbfe47462541c478e181f1ce5eEnact Motion100925842022-02-01 10:21:09241 days 12 hrs ago0xe22faf247335241682726cd601f38576b1b1dc72 IN  0x661090cb830757b2d0cd53c49bf0d17a28992e5d0 Ether0.00020631 1.50000001
0x2901573e7174288921feea750fbb557b58df770a463e6d192b75d4cf5ee0f661Enact Motion99780612022-01-12 10:36:12261 days 12 hrs ago0x62a3d8a878beef2ba024bbc26c5be9d2ee4dde7e IN  0x661090cb830757b2d0cd53c49bf0d17a28992e5d0 Ether0.00015806 1.50000001
0x58427caa600b5c0d2457ce7b8b224254abbe2641b26e0a7fa9fe47a8ffffefd7Object To Motion99727212022-01-11 12:20:25262 days 10 hrs ago0x62a3d8a878beef2ba024bbc26c5be9d2ee4dde7e IN  0x661090cb830757b2d0cd53c49bf0d17a28992e5d0 Ether0.00014631 1.50000001
0x5cd314b69e0db6dd14529a9ee85a87364a20bee43353f06223677751279e02ffObject To Motion99719552022-01-11 9:08:50262 days 14 hrs ago0x62a3d8a878beef2ba024bbc26c5be9d2ee4dde7e IN  0x661090cb830757b2d0cd53c49bf0d17a28992e5d0 Ether0.00014631 1.50000002
0x14f3e937034d8706077f8f5efdc1c49e1a9b805a21bf8129d0f8372372c02bf3Object To Motion99719332022-01-11 9:03:19262 days 14 hrs ago0x62a3d8a878beef2ba024bbc26c5be9d2ee4dde7e IN  0x661090cb830757b2d0cd53c49bf0d17a28992e5d0 Ether0.00003625 1.50000002
0x9c97ee1483040edb91a85184af1a4547061ac5017f6270cf6386102cb09db7e1Object To Motion99719322022-01-11 9:03:04262 days 14 hrs ago0x62a3d8a878beef2ba024bbc26c5be9d2ee4dde7e IN  0x661090cb830757b2d0cd53c49bf0d17a28992e5d0 Ether0.00014631 1.50000002
0x245177a4157faa87efc94ca879257113853ea0c82b1a1773e177298a9b041f8bObject To Motion99719312022-01-11 9:02:49262 days 14 hrs ago0x62a3d8a878beef2ba024bbc26c5be9d2ee4dde7e IN  0x661090cb830757b2d0cd53c49bf0d17a28992e5d0 Ether0.00015623 1.50000002
0x46675efdb24fe6137b38f9f59d7bf067b278c86906b55969ea7940b7a67e7a80Object To Motion99719312022-01-11 9:02:49262 days 14 hrs ago0x62a3d8a878beef2ba024bbc26c5be9d2ee4dde7e IN  0x661090cb830757b2d0cd53c49bf0d17a28992e5d0 Ether0.00003625 1.50000002
0x59a737d749fc6ca4b8422c1fdf9f34996d7b51c768d5ca8646216148788ffabcObject To Motion99719302022-01-11 9:02:34262 days 14 hrs ago0x62a3d8a878beef2ba024bbc26c5be9d2ee4dde7e IN  0x661090cb830757b2d0cd53c49bf0d17a28992e5d0 Ether0.00030458 2.35225001
0x1eb05e1a8f3ba4323d7676e8afe5b86c04883b017456bcbef0493ba6ff2d0761Object To Motion99719302022-01-11 9:02:34262 days 14 hrs ago0x62a3d8a878beef2ba024bbc26c5be9d2ee4dde7e IN  0x661090cb830757b2d0cd53c49bf0d17a28992e5d0 Ether0.00022943 2.35225001
0x391f94959ad7ec6fb7ce1a25fd985c52b1d17e7cbd57fac374ca6aaffd23aa7eObject To Motion99719292022-01-11 9:02:19262 days 14 hrs ago0x62a3d8a878beef2ba024bbc26c5be9d2ee4dde7e IN  0x661090cb830757b2d0cd53c49bf0d17a28992e5d0 Ether0.00032461 2.42500001
0x977fe824b3578ea2e5a99be5d09e202f23ccb6c6e8646ac04815899156ce9b57Object To Motion99719282022-01-11 9:02:04262 days 14 hrs ago0x62a3d8a878beef2ba024bbc26c5be9d2ee4dde7e IN  0x661090cb830757b2d0cd53c49bf0d17a28992e5d0 Ether0.00005861 2.42500001
0x1982f451950e99556a4e185a84deb52253dddbd90a9de0978220cb62fd68f49fObject To Motion99719282022-01-11 9:02:04262 days 14 hrs ago0x62a3d8a878beef2ba024bbc26c5be9d2ee4dde7e IN  0x661090cb830757b2d0cd53c49bf0d17a28992e5d0 Ether0.000314 2.42500001
0x0dfd862e46ed114a5bcfdaeef453a15d5e301b6f1ec3126e08b1973d3c28b4f0Object To Motion99719272022-01-11 9:01:49262 days 14 hrs ago0x62a3d8a878beef2ba024bbc26c5be9d2ee4dde7e IN  0x661090cb830757b2d0cd53c49bf0d17a28992e5d0 Ether0.000314 2.42500001
0x23ab24d10afb381d5b073643e7d61041d6ca10130b04bb7d259799c7d0486245Object To Motion99719262022-01-11 9:01:34262 days 14 hrs ago0x62a3d8a878beef2ba024bbc26c5be9d2ee4dde7e IN  0x661090cb830757b2d0cd53c49bf0d17a28992e5d0 Ether0.00032461 2.42500001
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xbcdbecac621de49b0e32cd67211cc076c7c0fc4dbf2bb2ff5f8a5ff4fa003618113314722022-09-06 5:57:1924 days 17 hrs ago 0x661090cb830757b2d0cd53c49bf0d17a28992e5d 0x2667c7e8731d7314e7c492700ad440f7c37241840 Ether
0xbcdbecac621de49b0e32cd67211cc076c7c0fc4dbf2bb2ff5f8a5ff4fa003618113314722022-09-06 5:57:1924 days 17 hrs ago 0x661090cb830757b2d0cd53c49bf0d17a28992e5d 0xbb0f594143208ecd04dc7aae48955902a716f9f70 Ether
0xd16723cfe8d3f5ce66c86a05c3e53c34d924cfe32ed2b8a18182e07b4d57e1bf101432712022-02-10 11:56:05232 days 11 hrs ago 0x661090cb830757b2d0cd53c49bf0d17a28992e5d 0x06c6ab60f0ad054236d7d4faf98a5d33e852e7170 Ether
0xd16723cfe8d3f5ce66c86a05c3e53c34d924cfe32ed2b8a18182e07b4d57e1bf101432712022-02-10 11:56:05232 days 11 hrs ago 0x661090cb830757b2d0cd53c49bf0d17a28992e5d 0x06c6ab60f0ad054236d7d4faf98a5d33e852e7170 Ether
0xdaab6a4b62f7e3d81c70b186ced17ea75e124f61e74457df2fa5b4a2bb5aff42101430992022-02-10 11:13:03232 days 11 hrs ago 0x661090cb830757b2d0cd53c49bf0d17a28992e5d 0x06c6ab60f0ad054236d7d4faf98a5d33e852e7170 Ether
0xdaab6a4b62f7e3d81c70b186ced17ea75e124f61e74457df2fa5b4a2bb5aff42101430992022-02-10 11:13:03232 days 11 hrs ago 0x661090cb830757b2d0cd53c49bf0d17a28992e5d 0x06c6ab60f0ad054236d7d4faf98a5d33e852e7170 Ether
0xe5d81b0d8fa98b41d42f77cc3bb8aaf89c9e0e37aee1c91da47c3680bcab3849101430922022-02-10 11:11:18232 days 11 hrs ago 0x661090cb830757b2d0cd53c49bf0d17a28992e5d 0xbb0f594143208ecd04dc7aae48955902a716f9f70 Ether
0xe5d81b0d8fa98b41d42f77cc3bb8aaf89c9e0e37aee1c91da47c3680bcab3849101430922022-02-10 11:11:18232 days 11 hrs ago 0xb9b953bb58411d7932d76a2493e309c88f9f2e13 0x661090cb830757b2d0cd53c49bf0d17a28992e5d0 Ether
0xd888f50da7b762c1f0bf684993e3be20ba107bb57858bb6795f6931656118481101390392022-02-09 12:01:17233 days 11 hrs ago 0x661090cb830757b2d0cd53c49bf0d17a28992e5d 0x06c6ab60f0ad054236d7d4faf98a5d33e852e7170 Ether
0xd888f50da7b762c1f0bf684993e3be20ba107bb57858bb6795f6931656118481101390392022-02-09 12:01:17233 days 11 hrs ago 0x661090cb830757b2d0cd53c49bf0d17a28992e5d 0x06c6ab60f0ad054236d7d4faf98a5d33e852e7170 Ether
0xcb5b5dbde377656328dd3b02b418f7e5766239b1f5fc14b39e9224075cded136101390362022-02-09 12:00:32233 days 11 hrs ago 0x661090cb830757b2d0cd53c49bf0d17a28992e5d 0x06c6ab60f0ad054236d7d4faf98a5d33e852e7170 Ether
0xcb5b5dbde377656328dd3b02b418f7e5766239b1f5fc14b39e9224075cded136101390362022-02-09 12:00:32233 days 11 hrs ago 0x661090cb830757b2d0cd53c49bf0d17a28992e5d 0x06c6ab60f0ad054236d7d4faf98a5d33e852e7170 Ether
0x50ec40bc2db7f0f1762ac478cc34f5510fc6aa7d65f57717f97fd2eac5e65f8e101390032022-02-09 11:52:17233 days 11 hrs ago 0x661090cb830757b2d0cd53c49bf0d17a28992e5d 0x06c6ab60f0ad054236d7d4faf98a5d33e852e7170 Ether
0x50ec40bc2db7f0f1762ac478cc34f5510fc6aa7d65f57717f97fd2eac5e65f8e101390032022-02-09 11:52:17233 days 11 hrs ago 0x661090cb830757b2d0cd53c49bf0d17a28992e5d 0x06c6ab60f0ad054236d7d4faf98a5d33e852e7170 Ether
0x52a724b5164d67d5c799379467acc9cb981948314f00045f6feb8efd64246755101389992022-02-09 11:51:17233 days 11 hrs ago 0x661090cb830757b2d0cd53c49bf0d17a28992e5d 0x06c6ab60f0ad054236d7d4faf98a5d33e852e7170 Ether
0x52a724b5164d67d5c799379467acc9cb981948314f00045f6feb8efd64246755101389992022-02-09 11:51:17233 days 11 hrs ago 0x661090cb830757b2d0cd53c49bf0d17a28992e5d 0x06c6ab60f0ad054236d7d4faf98a5d33e852e7170 Ether
0xab64e1af79a69536825b15c9f205a0d6a74c9a0f3970eaba6e3aae446f7c7d1b101389282022-02-09 11:33:31233 days 11 hrs ago 0x661090cb830757b2d0cd53c49bf0d17a28992e5d 0x3129c041b372ee93a5a8756dc4ec6f154d85bc9a0 Ether
0xab64e1af79a69536825b15c9f205a0d6a74c9a0f3970eaba6e3aae446f7c7d1b101389282022-02-09 11:33:31233 days 11 hrs ago 0xb9b953bb58411d7932d76a2493e309c88f9f2e13 0x661090cb830757b2d0cd53c49bf0d17a28992e5d0 Ether
0x0206a532802f791b2e7f86e71f170891cf22fc00ab6610ea064a705ee6d6cfe9101389252022-02-09 11:32:46233 days 11 hrs ago 0x661090cb830757b2d0cd53c49bf0d17a28992e5d 0xda53ff207966b3946facac52dd22b130d507d2760 Ether
0x0206a532802f791b2e7f86e71f170891cf22fc00ab6610ea064a705ee6d6cfe9101389252022-02-09 11:32:46233 days 11 hrs ago 0xb9b953bb58411d7932d76a2493e309c88f9f2e13 0x661090cb830757b2d0cd53c49bf0d17a28992e5d0 Ether
0xf15bbb92cc08b18d213ab9797f4f4c0c132b4980b93d4a428fe3349e62051995101339242022-02-08 14:41:32234 days 8 hrs ago 0x661090cb830757b2d0cd53c49bf0d17a28992e5d 0x2667c7e8731d7314e7c492700ad440f7c37241840 Ether
0xf15bbb92cc08b18d213ab9797f4f4c0c132b4980b93d4a428fe3349e62051995101339242022-02-08 14:41:32234 days 8 hrs ago 0x661090cb830757b2d0cd53c49bf0d17a28992e5d 0xda53ff207966b3946facac52dd22b130d507d2760 Ether
0xf15bbb92cc08b18d213ab9797f4f4c0c132b4980b93d4a428fe3349e62051995101339242022-02-08 14:41:32234 days 8 hrs ago 0xb9b953bb58411d7932d76a2493e309c88f9f2e13 0x661090cb830757b2d0cd53c49bf0d17a28992e5d0 Ether
0x8e97697e8ac0344a49ca567c4f1668811d69a5c14f04b6232368adc307b69adc101339132022-02-08 14:38:47234 days 8 hrs ago 0x661090cb830757b2d0cd53c49bf0d17a28992e5d 0x2667c7e8731d7314e7c492700ad440f7c37241840 Ether
0x8e97697e8ac0344a49ca567c4f1668811d69a5c14f04b6232368adc307b69adc101339132022-02-08 14:38:47234 days 8 hrs ago 0x661090cb830757b2d0cd53c49bf0d17a28992e5d 0xda53ff207966b3946facac52dd22b130d507d2760 Ether
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
EasyTrack

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-11-19
*/

// SPDX-License-Identifier: MIT AND GPL-3.0
// File: OpenZeppelin/[email protected]/contracts/access/IAccessControl.sol


pragma solidity ^0.8.0;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}

// File: OpenZeppelin/[email protected]/contracts/utils/Context.sol


pragma solidity ^0.8.0;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: OpenZeppelin/[email protected]/contracts/utils/Strings.sol


pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @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] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

// File: OpenZeppelin/[email protected]/contracts/utils/introspection/IERC165.sol


pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: OpenZeppelin/[email protected]/contracts/utils/introspection/ERC165.sol


pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: OpenZeppelin/[email protected]/contracts/access/AccessControl.sol


pragma solidity ^0.8.0;





/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role, _msgSender());
        _;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(uint160(account), 20),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    function _grantRole(bytes32 role, address account) private {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    function _revokeRole(bytes32 role, address account) private {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

// File: contracts/MotionSettings.sol

// SPDX-FileCopyrightText: 2021 Lido <[email protected]>

pragma solidity ^0.8.4;


/// @author psirex
/// @notice Provides methods to update motion duration, objections threshold, and limit of active motions of Easy Track
contract MotionSettings is AccessControl {
    // -------------
    // EVENTS
    // -------------
    event MotionDurationChanged(uint256 _motionDuration);
    event MotionsCountLimitChanged(uint256 _newMotionsCountLimit);
    event ObjectionsThresholdChanged(uint256 _newThreshold);

    // -------------
    // ERRORS
    // -------------

    string private constant ERROR_VALUE_TOO_SMALL = "VALUE_TOO_SMALL";
    string private constant ERROR_VALUE_TOO_LARGE = "VALUE_TOO_LARGE";

    // ------------
    // CONSTANTS
    // ------------
    /// @notice Upper bound for motionsCountLimit variable.
    uint256 public constant MAX_MOTIONS_LIMIT = 24;

    /// @notice Upper bound for objectionsThreshold variable.
    /// @dev Stored in basis points (1% = 100)
    uint256 public constant MAX_OBJECTIONS_THRESHOLD = 500;

    /// @notice Lower bound for motionDuration variable
    uint256 public constant MIN_MOTION_DURATION = 15 minutes;

    /// ------------------
    /// STORAGE VARIABLES
    /// ------------------

    /// @notice Percent from total supply of governance tokens required to reject motion.
    /// @dev Value stored in basis points: 1% == 100.
    uint256 public objectionsThreshold;

    /// @notice Max count of active motions
    uint256 public motionsCountLimit;

    /// @notice Minimal time required to pass before enacting of motion
    uint256 public motionDuration;

    // ------------
    // CONSTRUCTOR
    // ------------
    constructor(
        address _admin,
        uint256 _motionDuration,
        uint256 _motionsCountLimit,
        uint256 _objectionsThreshold
    ) {
        _setupRole(DEFAULT_ADMIN_ROLE, _admin);
        _setMotionDuration(_motionDuration);
        _setMotionsCountLimit(_motionsCountLimit);
        _setObjectionsThreshold(_objectionsThreshold);
    }

    // ------------------
    // EXTERNAL METHODS
    // ------------------

    /// @notice Sets the minimal time required to pass before enacting of motion
    function setMotionDuration(uint256 _motionDuration) external onlyRole(DEFAULT_ADMIN_ROLE) {
        _setMotionDuration(_motionDuration);
    }

    /// @notice Sets percent from total supply of governance tokens required to reject motion
    function setObjectionsThreshold(uint256 _objectionsThreshold)
        external
        onlyRole(DEFAULT_ADMIN_ROLE)
    {
        _setObjectionsThreshold(_objectionsThreshold);
    }

    /// @notice Sets max count of active motions.
    function setMotionsCountLimit(uint256 _motionsCountLimit)
        external
        onlyRole(DEFAULT_ADMIN_ROLE)
    {
        _setMotionsCountLimit(_motionsCountLimit);
    }

    function _setMotionDuration(uint256 _motionDuration) internal {
        require(_motionDuration >= MIN_MOTION_DURATION, ERROR_VALUE_TOO_SMALL);
        motionDuration = _motionDuration;
        emit MotionDurationChanged(_motionDuration);
    }

    function _setObjectionsThreshold(uint256 _objectionsThreshold) internal {
        require(_objectionsThreshold <= MAX_OBJECTIONS_THRESHOLD, ERROR_VALUE_TOO_LARGE);
        objectionsThreshold = _objectionsThreshold;
        emit ObjectionsThresholdChanged(_objectionsThreshold);
    }

    function _setMotionsCountLimit(uint256 _motionsCountLimit) internal {
        require(_motionsCountLimit <= MAX_MOTIONS_LIMIT, ERROR_VALUE_TOO_LARGE);
        motionsCountLimit = _motionsCountLimit;
        emit MotionsCountLimitChanged(_motionsCountLimit);
    }
}

// File: contracts/interfaces/IEVMScriptFactory.sol

// SPDX-FileCopyrightText: 2021 Lido <[email protected]>

pragma solidity ^0.8.4;

/// @author psirex
/// @notice Interface which every EVMScript factory used in EasyTrack contract has to implement
interface IEVMScriptFactory {
    function createEVMScript(address _creator, bytes memory _evmScriptCallData)
        external
        returns (bytes memory);
}

// File: contracts/libraries/BytesUtils.sol

// SPDX-FileCopyrightText: 2021 Lido <[email protected]>

pragma solidity ^0.8.4;

/// @author psirex
/// @notice Contains methods to extract primitive types from bytes
library BytesUtils {
    function bytes24At(bytes memory data, uint256 location) internal pure returns (bytes24 result) {
        uint256 word = uint256At(data, location);
        assembly {
            result := word
        }
    }

    function addressAt(bytes memory data, uint256 location) internal pure returns (address result) {
        uint256 word = uint256At(data, location);
        assembly {
            result := shr(
                96,
                and(word, 0xffffffffffffffffffffffffffffffffffffffff000000000000000000000000)
            )
        }
    }

    function uint32At(bytes memory _data, uint256 _location) internal pure returns (uint32 result) {
        uint256 word = uint256At(_data, _location);

        assembly {
            result := shr(
                224,
                and(word, 0xffffffff00000000000000000000000000000000000000000000000000000000)
            )
        }
    }

    function uint256At(bytes memory data, uint256 location) internal pure returns (uint256 result) {
        assembly {
            result := mload(add(data, add(0x20, location)))
        }
    }
}

// File: contracts/libraries/EVMScriptPermissions.sol

// SPDX-FileCopyrightText: 2021 Lido <[email protected]>

pragma solidity ^0.8.4;


/// @author psirex
/// @notice Provides methods to convinient work with permissions bytes
/// @dev Permissions - is a list of tuples (address, bytes4) encoded into a bytes representation.
/// Each tuple (address, bytes4) describes a method allowed to be called by EVMScript
library EVMScriptPermissions {
    using BytesUtils for bytes;

    // -------------
    // CONSTANTS
    // -------------

    /// Bytes size of SPEC_ID in EVMScript
    uint256 private constant SPEC_ID_SIZE = 4;

    /// Size of the address type in bytes
    uint256 private constant ADDRESS_SIZE = 20;

    /// Bytes size of calldata length in EVMScript
    uint256 private constant CALLDATA_LENGTH_SIZE = 4;

    /// Bytes size of method selector
    uint256 private constant METHOD_SELECTOR_SIZE = 4;

    /// Bytes size of one item in permissions
    uint256 private constant PERMISSION_SIZE = ADDRESS_SIZE + METHOD_SELECTOR_SIZE;

    // ------------------
    // INTERNAL METHODS
    // ------------------

    /// @notice Validates that passed EVMScript calls only methods allowed in permissions.
    /// @dev Returns false if provided permissions are invalid (has a wrong length or empty)
    function canExecuteEVMScript(bytes memory _permissions, bytes memory _evmScript)
        internal
        pure
        returns (bool)
    {
        uint256 location = SPEC_ID_SIZE; // first 4 bytes reserved for SPEC_ID
        if (!isValidPermissions(_permissions) || _evmScript.length <= location) {
            return false;
        }

        while (location < _evmScript.length) {
            (bytes24 methodToCall, uint32 callDataLength) = _getNextMethodId(_evmScript, location);
            if (!_hasPermission(_permissions, methodToCall)) {
                return false;
            }
            location += ADDRESS_SIZE + CALLDATA_LENGTH_SIZE + callDataLength;
        }
        return true;
    }

    /// @notice Validates that bytes with permissions not empty and has correct length
    function isValidPermissions(bytes memory _permissions) internal pure returns (bool) {
        return _permissions.length > 0 && _permissions.length % PERMISSION_SIZE == 0;
    }

    // Retrieves bytes24 which describes tuple (address, bytes4)
    // from EVMScript starting from _location position
    function _getNextMethodId(bytes memory _evmScript, uint256 _location)
        private
        pure
        returns (bytes24, uint32)
    {
        address recipient = _evmScript.addressAt(_location);
        uint32 callDataLength = _evmScript.uint32At(_location + ADDRESS_SIZE);
        uint32 functionSelector =
            _evmScript.uint32At(_location + ADDRESS_SIZE + CALLDATA_LENGTH_SIZE);
        return (bytes24(uint192(functionSelector)) | bytes20(recipient), callDataLength);
    }

    // Validates that passed _methodToCall contained in permissions
    function _hasPermission(bytes memory _permissions, bytes24 _methodToCall)
        private
        pure
        returns (bool)
    {
        uint256 location = 0;
        while (location < _permissions.length) {
            bytes24 permission = _permissions.bytes24At(location);
            if (permission == _methodToCall) {
                return true;
            }
            location += PERMISSION_SIZE;
        }
        return false;
    }
}

// File: contracts/EVMScriptFactoriesRegistry.sol

// SPDX-FileCopyrightText: 2021 Lido <[email protected]>

pragma solidity ^0.8.4;




/// @author psirex
/// @notice Provides methods to add/remove EVMScript factories
/// and contains an internal method for the convenient creation of EVMScripts
contract EVMScriptFactoriesRegistry is AccessControl {
    using EVMScriptPermissions for bytes;

    // -------------
    // EVENTS
    // -------------

    event EVMScriptFactoryAdded(address indexed _evmScriptFactory, bytes _permissions);
    event EVMScriptFactoryRemoved(address indexed _evmScriptFactory);

    // ------------
    // STORAGE VARIABLES
    // ------------

    /// @notice List of allowed EVMScript factories
    address[] public evmScriptFactories;

    // Position of the EVMScript factory in the `evmScriptFactories` array,
    // plus 1 because index 0 means a value is not in the set.
    mapping(address => uint256) internal evmScriptFactoryIndices;

    /// @notice Permissions of current list of allowed EVMScript factories.
    mapping(address => bytes) public evmScriptFactoryPermissions;

    // ------------
    // CONSTRUCTOR
    // ------------
    constructor(address _admin) {
        _setupRole(DEFAULT_ADMIN_ROLE, _admin);
    }

    // ------------------
    // EXTERNAL METHODS
    // ------------------

    /// @notice Adds new EVMScript Factory to the list of allowed EVMScript factories with given permissions.
    /// Be careful about factories and their permissions added via this method. Only reviewed and tested
    /// factories must be added via this method.
    function addEVMScriptFactory(address _evmScriptFactory, bytes memory _permissions)
        external
        onlyRole(DEFAULT_ADMIN_ROLE)
    {
        require(_permissions.isValidPermissions(), "INVALID_PERMISSIONS");
        require(!_isEVMScriptFactory(_evmScriptFactory), "EVM_SCRIPT_FACTORY_ALREADY_ADDED");
        evmScriptFactories.push(_evmScriptFactory);
        evmScriptFactoryIndices[_evmScriptFactory] = evmScriptFactories.length;
        evmScriptFactoryPermissions[_evmScriptFactory] = _permissions;
        emit EVMScriptFactoryAdded(_evmScriptFactory, _permissions);
    }

    /// @notice Removes EVMScript factory from the list of allowed EVMScript factories
    /// @dev To delete a EVMScript factory from the rewardPrograms array in O(1),
    /// we swap the element to delete with the last one in the array, and then remove
    /// the last element (sometimes called as 'swap and pop').
    function removeEVMScriptFactory(address _evmScriptFactory)
        external
        onlyRole(DEFAULT_ADMIN_ROLE)
    {
        uint256 index = _getEVMScriptFactoryIndex(_evmScriptFactory);
        uint256 lastIndex = evmScriptFactories.length - 1;

        if (index != lastIndex) {
            address lastEVMScriptFactory = evmScriptFactories[lastIndex];
            evmScriptFactories[index] = lastEVMScriptFactory;
            evmScriptFactoryIndices[lastEVMScriptFactory] = index + 1;
        }

        evmScriptFactories.pop();
        delete evmScriptFactoryIndices[_evmScriptFactory];
        delete evmScriptFactoryPermissions[_evmScriptFactory];
        emit EVMScriptFactoryRemoved(_evmScriptFactory);
    }

    /// @notice Returns current list of EVMScript factories
    function getEVMScriptFactories() external view returns (address[] memory) {
        return evmScriptFactories;
    }

    /// @notice Returns if passed address are listed as EVMScript factory in the registry
    function isEVMScriptFactory(address _maybeEVMScriptFactory) external view returns (bool) {
        return _isEVMScriptFactory(_maybeEVMScriptFactory);
    }

    // ------------------
    // INTERNAL METHODS
    // ------------------

    /// @notice Creates EVMScript using given EVMScript factory
    /// @dev Checks permissions of resulting EVMScript and reverts with error
    /// if script tries to call methods not listed in permissions
    function _createEVMScript(
        address _evmScriptFactory,
        address _creator,
        bytes memory _evmScriptCallData
    ) internal returns (bytes memory _evmScript) {
        require(_isEVMScriptFactory(_evmScriptFactory), "EVM_SCRIPT_FACTORY_NOT_FOUND");
        _evmScript = IEVMScriptFactory(_evmScriptFactory).createEVMScript(
            _creator,
            _evmScriptCallData
        );
        bytes memory permissions = evmScriptFactoryPermissions[_evmScriptFactory];
        require(permissions.canExecuteEVMScript(_evmScript), "HAS_NO_PERMISSIONS");
    }

    // ------------------
    // PRIVATE METHODS
    // ------------------

    function _getEVMScriptFactoryIndex(address _evmScriptFactory)
        private
        view
        returns (uint256 _index)
    {
        _index = evmScriptFactoryIndices[_evmScriptFactory];
        require(_index > 0, "EVM_SCRIPT_FACTORY_NOT_FOUND");
        _index -= 1;
    }

    function _isEVMScriptFactory(address _maybeEVMScriptFactory) private view returns (bool) {
        return evmScriptFactoryIndices[_maybeEVMScriptFactory] > 0;
    }
}

// File: contracts/interfaces/IEVMScriptExecutor.sol

// SPDX-FileCopyrightText: 2021 Lido <[email protected]>

pragma solidity ^0.8.4;

/// @notice Interface of EVMScript executor used by EasyTrack
interface IEVMScriptExecutor {
    function executeEVMScript(bytes memory _evmScript) external returns (bytes memory);
}

// File: OpenZeppelin/[email protected]/contracts/security/Pausable.sol


pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

// File: contracts/EasyTrack.sol

// SPDX-FileCopyrightText: 2021 Lido <[email protected]>

pragma solidity ^0.8.4;






interface IMiniMeToken {
    function balanceOfAt(address _owner, uint256 _blockNumber) external pure returns (uint256);

    function totalSupplyAt(uint256 _blockNumber) external view returns (uint256);
}

/// @author psirex
/// @notice Contains main logic of Easy Track
contract EasyTrack is Pausable, AccessControl, MotionSettings, EVMScriptFactoriesRegistry {
    struct Motion {
        uint256 id;
        address evmScriptFactory;
        address creator;
        uint256 duration;
        uint256 startDate;
        uint256 snapshotBlock;
        uint256 objectionsThreshold;
        uint256 objectionsAmount;
        bytes32 evmScriptHash;
    }

    // -------------
    // EVENTS
    // -------------
    event MotionCreated(
        uint256 indexed _motionId,
        address _creator,
        address indexed _evmScriptFactory,
        bytes _evmScriptCallData,
        bytes _evmScript
    );
    event MotionObjected(
        uint256 indexed _motionId,
        address indexed _objector,
        uint256 _weight,
        uint256 _newObjectionsAmount,
        uint256 _newObjectionsAmountPct
    );
    event MotionRejected(uint256 indexed _motionId);
    event MotionCanceled(uint256 indexed _motionId);
    event MotionEnacted(uint256 indexed _motionId);
    event EVMScriptExecutorChanged(address indexed _evmScriptExecutor);

    // -------------
    // ERRORS
    // -------------
    string private constant ERROR_ALREADY_OBJECTED = "ALREADY_OBJECTED";
    string private constant ERROR_NOT_ENOUGH_BALANCE = "NOT_ENOUGH_BALANCE";
    string private constant ERROR_NOT_CREATOR = "NOT_CREATOR";
    string private constant ERROR_MOTION_NOT_PASSED = "MOTION_NOT_PASSED";
    string private constant ERROR_UNEXPECTED_EVM_SCRIPT = "UNEXPECTED_EVM_SCRIPT";
    string private constant ERROR_MOTION_NOT_FOUND = "MOTION_NOT_FOUND";
    string private constant ERROR_MOTIONS_LIMIT_REACHED = "MOTIONS_LIMIT_REACHED";

    // -------------
    // ROLES
    // -------------
    bytes32 public constant PAUSE_ROLE = keccak256("PAUSE_ROLE");
    bytes32 public constant UNPAUSE_ROLE = keccak256("UNPAUSE_ROLE");
    bytes32 public constant CANCEL_ROLE = keccak256("CANCEL_ROLE");

    // -------------
    // CONSTANTS
    // -------------

    // Stores 100% in basis points
    uint256 internal constant HUNDRED_PERCENT = 10000;

    // ------------
    // STORAGE VARIABLES
    // ------------

    /// @notice List of active motions
    Motion[] public motions;

    // Id of the lastly created motion
    uint256 internal lastMotionId;

    /// @notice Address of governanceToken which implements IMiniMeToken interface
    IMiniMeToken public governanceToken;

    /// @notice Address of current EVMScriptExecutor
    IEVMScriptExecutor public evmScriptExecutor;

    // Position of the motion in the `motions` array, plus 1
    // because index 0 means a value is not in the set.
    mapping(uint256 => uint256) internal motionIndicesByMotionId;

    /// @notice Stores if motion with given id has been objected from given address.
    mapping(uint256 => mapping(address => bool)) public objections;

    // ------------
    // CONSTRUCTOR
    // ------------
    constructor(
        address _governanceToken,
        address _admin,
        uint256 _motionDuration,
        uint256 _motionsCountLimit,
        uint256 _objectionsThreshold
    )
        EVMScriptFactoriesRegistry(_admin)
        MotionSettings(_admin, _motionDuration, _motionsCountLimit, _objectionsThreshold)
    {
        _setupRole(DEFAULT_ADMIN_ROLE, _admin);
        _setupRole(PAUSE_ROLE, _admin);
        _setupRole(UNPAUSE_ROLE, _admin);
        _setupRole(CANCEL_ROLE, _admin);

        governanceToken = IMiniMeToken(_governanceToken);
    }

    // ------------------
    // EXTERNAL METHODS
    // ------------------

    /// @notice Creates new motion
    /// @param _evmScriptFactory Address of EVMScript factory registered in Easy Track
    /// @param _evmScriptCallData Encoded call data of EVMScript factory
    /// @return _newMotionId Id of created motion
    function createMotion(address _evmScriptFactory, bytes memory _evmScriptCallData)
        external
        whenNotPaused
        returns (uint256 _newMotionId)
    {
        require(motions.length < motionsCountLimit, ERROR_MOTIONS_LIMIT_REACHED);

        Motion storage newMotion = motions.push();
        _newMotionId = ++lastMotionId;

        newMotion.id = _newMotionId;
        newMotion.creator = msg.sender;
        newMotion.startDate = block.timestamp;
        newMotion.snapshotBlock = block.number;
        newMotion.duration = motionDuration;
        newMotion.objectionsThreshold = objectionsThreshold;
        newMotion.evmScriptFactory = _evmScriptFactory;
        motionIndicesByMotionId[_newMotionId] = motions.length;

        bytes memory evmScript =
            _createEVMScript(_evmScriptFactory, msg.sender, _evmScriptCallData);
        newMotion.evmScriptHash = keccak256(evmScript);

        emit MotionCreated(
            _newMotionId,
            msg.sender,
            _evmScriptFactory,
            _evmScriptCallData,
            evmScript
        );
    }

    /// @notice Enacts motion with given id
    /// @param _motionId Id of motion to enact
    /// @param _evmScriptCallData Encoded call data of EVMScript factory. Same as passed on the creation
    /// of motion with the given motion id. Transaction reverts if EVMScript factory call data differs
    function enactMotion(uint256 _motionId, bytes memory _evmScriptCallData)
        external
        whenNotPaused
    {
        Motion storage motion = _getMotion(_motionId);
        require(motion.startDate + motion.duration <= block.timestamp, ERROR_MOTION_NOT_PASSED);

        address creator = motion.creator;
        bytes32 evmScriptHash = motion.evmScriptHash;
        address evmScriptFactory = motion.evmScriptFactory;

        _deleteMotion(_motionId);
        emit MotionEnacted(_motionId);

        bytes memory evmScript = _createEVMScript(evmScriptFactory, creator, _evmScriptCallData);
        require(evmScriptHash == keccak256(evmScript), ERROR_UNEXPECTED_EVM_SCRIPT);

        evmScriptExecutor.executeEVMScript(evmScript);
    }

    /// @notice Submits an objection from `governanceToken` holder.
    /// @param _motionId Id of motion to object
    function objectToMotion(uint256 _motionId) external {
        Motion storage motion = _getMotion(_motionId);
        require(!objections[_motionId][msg.sender], ERROR_ALREADY_OBJECTED);
        objections[_motionId][msg.sender] = true;

        uint256 snapshotBlock = motion.snapshotBlock;
        uint256 objectorBalance = governanceToken.balanceOfAt(msg.sender, snapshotBlock);
        require(objectorBalance > 0, ERROR_NOT_ENOUGH_BALANCE);

        uint256 totalSupply = governanceToken.totalSupplyAt(snapshotBlock);
        uint256 newObjectionsAmount = motion.objectionsAmount + objectorBalance;
        uint256 newObjectionsAmountPct = (HUNDRED_PERCENT * newObjectionsAmount) / totalSupply;

        emit MotionObjected(
            _motionId,
            msg.sender,
            objectorBalance,
            newObjectionsAmount,
            newObjectionsAmountPct
        );

        if (newObjectionsAmountPct < motion.objectionsThreshold) {
            motion.objectionsAmount = newObjectionsAmount;
        } else {
            _deleteMotion(_motionId);
            emit MotionRejected(_motionId);
        }
    }

    /// @notice Cancels motion with given id
    /// @param _motionId Id of motion to cancel
    /// @dev Method reverts if it is called with not existed _motionId
    function cancelMotion(uint256 _motionId) external {
        Motion storage motion = _getMotion(_motionId);
        require(motion.creator == msg.sender, ERROR_NOT_CREATOR);
        _deleteMotion(_motionId);
        emit MotionCanceled(_motionId);
    }

    /// @notice Cancels all motions with given ids
    /// @param _motionIds Ids of motions to cancel
    function cancelMotions(uint256[] memory _motionIds) external onlyRole(CANCEL_ROLE) {
        for (uint256 i = 0; i < _motionIds.length; ++i) {
            if (motionIndicesByMotionId[_motionIds[i]] > 0) {
                _deleteMotion(_motionIds[i]);
                emit MotionCanceled(_motionIds[i]);
            }
        }
    }

    /// @notice Cancels all active motions
    function cancelAllMotions() external onlyRole(CANCEL_ROLE) {
        uint256 motionsCount = motions.length;
        while (motionsCount > 0) {
            motionsCount -= 1;
            uint256 motionId = motions[motionsCount].id;
            _deleteMotion(motionId);
            emit MotionCanceled(motionId);
        }
    }

    /// @notice Sets new EVMScriptExecutor
    /// @param _evmScriptExecutor Address of new EVMScriptExecutor
    function setEVMScriptExecutor(address _evmScriptExecutor)
        external
        onlyRole(DEFAULT_ADMIN_ROLE)
    {
        evmScriptExecutor = IEVMScriptExecutor(_evmScriptExecutor);
        emit EVMScriptExecutorChanged(_evmScriptExecutor);
    }

    /// @notice Pauses Easy Track if it isn't paused.
    /// Paused Easy Track can't create and enact motions
    function pause() external whenNotPaused onlyRole(PAUSE_ROLE) {
        _pause();
    }

    /// @notice Unpauses Easy Track if it is paused
    function unpause() external whenPaused onlyRole(UNPAUSE_ROLE) {
        _unpause();
    }

    /// @notice Returns if an _objector can submit an objection to motion with id equals to _motionId or not
    /// @param _motionId Id of motion to check opportunity to object
    /// @param _objector Address of objector
    function canObjectToMotion(uint256 _motionId, address _objector) external view returns (bool) {
        Motion storage motion = _getMotion(_motionId);
        uint256 balance = governanceToken.balanceOfAt(_objector, motion.snapshotBlock);
        return balance > 0 && !objections[_motionId][_objector];
    }

    /// @notice Returns list of active motions
    function getMotions() external view returns (Motion[] memory) {
        return motions;
    }

    /// @notice Returns motion with the given id
    /// @param _motionId Id of motion to retrieve
    function getMotion(uint256 _motionId) external view returns (Motion memory) {
        return _getMotion(_motionId);
    }

    // -------
    // PRIVATE METHODS
    // -------

    // Removes motion from list of active moitons
    // To delete a motion from the moitons array in O(1), we swap the element to delete with the last one in
    // the array, and then remove the last element (sometimes called as 'swap and pop').
    function _deleteMotion(uint256 _motionId) private {
        uint256 index = motionIndicesByMotionId[_motionId] - 1;
        uint256 lastIndex = motions.length - 1;

        if (index != lastIndex) {
            Motion storage lastMotion = motions[lastIndex];
            motions[index] = lastMotion;
            motionIndicesByMotionId[lastMotion.id] = index + 1;
        }

        motions.pop();
        delete motionIndicesByMotionId[_motionId];
    }

    // Returns motion with given id if it exists
    function _getMotion(uint256 _motionId) private view returns (Motion storage) {
        uint256 _motionIndex = motionIndicesByMotionId[_motionId];
        require(_motionIndex > 0, ERROR_MOTION_NOT_FOUND);
        return motions[_motionIndex - 1];
    }
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_governanceToken","type":"address"},{"internalType":"address","name":"_admin","type":"address"},{"internalType":"uint256","name":"_motionDuration","type":"uint256"},{"internalType":"uint256","name":"_motionsCountLimit","type":"uint256"},{"internalType":"uint256","name":"_objectionsThreshold","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_evmScriptExecutor","type":"address"}],"name":"EVMScriptExecutorChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_evmScriptFactory","type":"address"},{"indexed":false,"internalType":"bytes","name":"_permissions","type":"bytes"}],"name":"EVMScriptFactoryAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_evmScriptFactory","type":"address"}],"name":"EVMScriptFactoryRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_motionId","type":"uint256"}],"name":"MotionCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_motionId","type":"uint256"},{"indexed":false,"internalType":"address","name":"_creator","type":"address"},{"indexed":true,"internalType":"address","name":"_evmScriptFactory","type":"address"},{"indexed":false,"internalType":"bytes","name":"_evmScriptCallData","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"_evmScript","type":"bytes"}],"name":"MotionCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_motionDuration","type":"uint256"}],"name":"MotionDurationChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_motionId","type":"uint256"}],"name":"MotionEnacted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_motionId","type":"uint256"},{"indexed":true,"internalType":"address","name":"_objector","type":"address"},{"indexed":false,"internalType":"uint256","name":"_weight","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newObjectionsAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newObjectionsAmountPct","type":"uint256"}],"name":"MotionObjected","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_motionId","type":"uint256"}],"name":"MotionRejected","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_newMotionsCountLimit","type":"uint256"}],"name":"MotionsCountLimitChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_newThreshold","type":"uint256"}],"name":"ObjectionsThresholdChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"CANCEL_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MOTIONS_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_OBJECTIONS_THRESHOLD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_MOTION_DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNPAUSE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_evmScriptFactory","type":"address"},{"internalType":"bytes","name":"_permissions","type":"bytes"}],"name":"addEVMScriptFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_motionId","type":"uint256"},{"internalType":"address","name":"_objector","type":"address"}],"name":"canObjectToMotion","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cancelAllMotions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_motionId","type":"uint256"}],"name":"cancelMotion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_motionIds","type":"uint256[]"}],"name":"cancelMotions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_evmScriptFactory","type":"address"},{"internalType":"bytes","name":"_evmScriptCallData","type":"bytes"}],"name":"createMotion","outputs":[{"internalType":"uint256","name":"_newMotionId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_motionId","type":"uint256"},{"internalType":"bytes","name":"_evmScriptCallData","type":"bytes"}],"name":"enactMotion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"evmScriptExecutor","outputs":[{"internalType":"contract IEVMScriptExecutor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"evmScriptFactories","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"evmScriptFactoryPermissions","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEVMScriptFactories","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_motionId","type":"uint256"}],"name":"getMotion","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"evmScriptFactory","type":"address"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"startDate","type":"uint256"},{"internalType":"uint256","name":"snapshotBlock","type":"uint256"},{"internalType":"uint256","name":"objectionsThreshold","type":"uint256"},{"internalType":"uint256","name":"objectionsAmount","type":"uint256"},{"internalType":"bytes32","name":"evmScriptHash","type":"bytes32"}],"internalType":"struct EasyTrack.Motion","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMotions","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"evmScriptFactory","type":"address"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"startDate","type":"uint256"},{"internalType":"uint256","name":"snapshotBlock","type":"uint256"},{"internalType":"uint256","name":"objectionsThreshold","type":"uint256"},{"internalType":"uint256","name":"objectionsAmount","type":"uint256"},{"internalType":"bytes32","name":"evmScriptHash","type":"bytes32"}],"internalType":"struct EasyTrack.Motion[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governanceToken","outputs":[{"internalType":"contract IMiniMeToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_maybeEVMScriptFactory","type":"address"}],"name":"isEVMScriptFactory","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"motionDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"motions","outputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"evmScriptFactory","type":"address"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"startDate","type":"uint256"},{"internalType":"uint256","name":"snapshotBlock","type":"uint256"},{"internalType":"uint256","name":"objectionsThreshold","type":"uint256"},{"internalType":"uint256","name":"objectionsAmount","type":"uint256"},{"internalType":"bytes32","name":"evmScriptHash","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"motionsCountLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_motionId","type":"uint256"}],"name":"objectToMotion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"objections","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"objectionsThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_evmScriptFactory","type":"address"}],"name":"removeEVMScriptFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_evmScriptExecutor","type":"address"}],"name":"setEVMScriptExecutor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_motionDuration","type":"uint256"}],"name":"setMotionDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_motionsCountLimit","type":"uint256"}],"name":"setMotionsCountLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_objectionsThreshold","type":"uint256"}],"name":"setObjectionsThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040516200300238038062003002833981016040819052620000349162000393565b6000805460ff191681558490819085908590859062000054908562000147565b6200005f8362000157565b6200006a82620001e9565b62000075816200026b565b506200008992506000915083905062000147565b506200009760008562000147565b620000c37f139c2898040ef16910dc9f44dc697df79363da767d8bc92f2e310312b816e46d8562000147565b620000ef7f265b220c5a8891efdd9e1b1b7fa72f257bd5169f8d87e319cf3dad6ff52b94ae8562000147565b6200011b7f9f959e00d95122f5cbd677010436cf273ef535b86b056afc172852144b9491d78562000147565b5050600a80546001600160a01b0319166001600160a01b039490941693909317909255506200043e9050565b620001538282620002ee565b5050565b60408051808201909152600f81526e159053155157d513d3d7d4d3505313608a1b6020820152610384821015620001ac5760405162461bcd60e51b8152600401620001a39190620003e6565b60405180910390fd5b5060048190556040518181527f03765c4aa18fde3bfe4015073c2b138ce5a02536dd88ceae9739d3e0dbad5d0e906020015b60405180910390a150565b60408051808201909152600f81526e56414c55455f544f4f5f4c4152474560881b60208201526018821115620002345760405162461bcd60e51b8152600401620001a39190620003e6565b5060038190556040518181527f5e368703b7ab35fe9ef4dbc482cd414476841204c7484b8e834d0d3ac4ed867290602001620001de565b60408051808201909152600f81526e56414c55455f544f4f5f4c4152474560881b60208201526101f4821115620002b75760405162461bcd60e51b8152600401620001a39190620003e6565b5060028190556040518181527fd60715ce58337415334d06256811f30ed8db120287970870d8505e5ed9074c6090602001620001de565b60008281526001602090815260408083206001600160a01b038516845290915290205460ff16620001535760008281526001602081815260408084206001600160a01b0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b80516001600160a01b03811681146200038e57600080fd5b919050565b600080600080600060a08688031215620003ac57600080fd5b620003b78662000376565b9450620003c76020870162000376565b6040870151606088015160809098015196999198509695945092505050565b600060208083528351808285015260005b818110156200041557858101830151858201604001528201620003f7565b8181111562000428576000604083870101525b50601f01601f1916929092016040019392505050565b612bb4806200044e6000396000f3fe608060405234801561001057600080fd5b506004361061025e5760003560e01c80639a4ee59c11610146578063de7cb878116100c3578063ef1ae2f611610087578063ef1ae2f61461058c578063ef89ad951461059f578063f0fdd736146105ca578063f96dae0a146105dd578063f9783b48146105f0578063fdc28ab81461061057600080fd5b8063de7cb87814610526578063e16373951461052e578063e6f5ed5d14610536578063ee20ff0814610549578063ee7eae291461055e57600080fd5b8063b2223eb51161010a578063b2223eb5146104d1578063c34205cd146104e4578063c7794870146104f7578063cdb6aefc1461050a578063d547741f1461051357600080fd5b80639a4ee59c14610420578063a217fddf14610433578063a3e730781461043b578063ad15aad21461044e578063b21d36a81461046e57600080fd5b8063389ed267116101df57806364993a73116101a357806364993a73146103d75780637d3ac0fb146103e05780638456cb59146103f357806388407bd4146103fb57806391d1485414610404578063930c2b311461041757600080fd5b8063389ed2671461037757806338c1f8761461039e5780633f4ba83a146103b157806342f04989146103b95780635c975abb146103cc57600080fd5b8063309756fb11610226578063309756fb1461030c5780633128cce01461033357806331a40e6e1461033c578063329696bc1461034f57806336568abe1461036457600080fd5b806301ffc9a71461026357806313c27ca71461028b578063248a9ca3146102c05780632d65a9f0146102e45780632f2ff15d146102f7575b600080fd5b610276610271366004612679565b610623565b60405190151581526020015b60405180910390f35b6102b27f9f959e00d95122f5cbd677010436cf273ef535b86b056afc172852144b9491d781565b604051908152602001610282565b6102b26102ce366004612634565b6000908152600160208190526040909120015490565b6102766102f236600461251e565b61065a565b61030a61030536600461264d565b61067a565b005b6102b27f265b220c5a8891efdd9e1b1b7fa72f257bd5169f8d87e319cf3dad6ff52b94ae81565b6102b260035481565b61030a61034a366004612634565b6106a6565b6103576106bf565b6040516102829190612915565b61030a61037236600461264d565b610780565b6102b27f139c2898040ef16910dc9f44dc697df79363da767d8bc92f2e310312b816e46d81565b61030a6103ac366004612634565b6107ff565b61030a610abb565b61030a6103c7366004612539565b610b3a565b60005460ff16610276565b6102b260045481565b61030a6103ee36600461251e565b610cb1565b61030a610e12565b6102b261038481565b61027661041236600461264d565b610e68565b6102b260025481565b61030a61042e36600461272a565b610e93565b6102b2600081565b61027661044936600461264d565b611069565b61046161045c366004612634565b611142565b6040516102829190612995565b61048161047c366004612634565b611224565b60408051998a526001600160a01b0398891660208b015296909716958801959095526060870193909352608086019190915260a085015260c084015260e083015261010082015261012001610282565b61030a6104df36600461251e565b61128c565b61030a6104f2366004612634565b6112e3565b61030a610505366004612587565b611379565b6102b26101f481565b61030a61052136600461264d565b61145e565b61030a611485565b6102b2601881565b6102b2610544366004612539565b61152a565b6105516116bd565b60405161028291906128c8565b61027661056c36600461264d565b600d60209081526000928352604080842090915290825290205460ff1681565b61030a61059a366004612634565b61171f565b6105b26105ad366004612634565b611734565b6040516001600160a01b039091168152602001610282565b600b546105b2906001600160a01b031681565b600a546105b2906001600160a01b031681565b6106036105fe36600461251e565b61175e565b6040516102829190612958565b61030a61061e366004612634565b6117f8565b60006001600160e01b03198216637965db0b60e01b148061065457506301ffc9a760e01b6001600160e01b03198316145b92915050565b6001600160a01b0381166000908152600660205260408120541515610654565b60008281526001602081905260409091200154610697813361180d565b6106a18383611871565b505050565b60006106b2813361180d565b6106bb826118dc565b5050565b60606008805480602002602001604051908101604052809291908181526020016000905b82821015610777576000848152602090819020604080516101208101825260098602909201805483526001808201546001600160a01b0390811685870152600283015416928401929092526003810154606084015260048101546080840152600581015460a0840152600681015460c0840152600781015460e08401526008015461010083015290835290920191016106e3565b50505050905090565b6001600160a01b03811633146107f55760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b6106bb8282611962565b600061080a826119c9565b6000838152600d60209081526040808320338452825291829020548251808401909352601083526f1053149150511657d3d0929150d5115160821b918301919091529192509060ff16156108715760405162461bcd60e51b81526004016107ec9190612958565b506000828152600d60209081526040808320338085529252808320805460ff191660011790556005840154600a54915163277166bf60e11b815260048101939093526024830181905292916001600160a01b0390911690634ee2cd7e9060440160206040518083038186803b1580156108e957600080fd5b505afa1580156108fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109219190612711565b905060008111604051806040016040528060128152602001714e4f545f454e4f5547485f42414c414e434560701b815250906109705760405162461bcd60e51b81526004016107ec9190612958565b50600a54604051630981b24d60e41b8152600481018490526000916001600160a01b03169063981b24d09060240160206040518083038186803b1580156109b657600080fd5b505afa1580156109ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ee9190612711565b90506000828560070154610a0291906129fd565b9050600082610a1383612710612a29565b610a1d9190612a15565b6040805186815260208101859052908101829052909150339088907fa64d606df8b3e72e8f53ac4185170bbd4348d0ee03c2cfceadeafc2b316c3e6b9060600160405180910390a38560060154811015610a7d5760078601829055610ab2565b610a8687611a54565b60405187907f6a4120e111f0bfb3586b7dc9317f9ae5441ce866d1ad9d221ce6d76431f8442690600090a25b50505050505050565b60005460ff16610b045760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016107ec565b7f265b220c5a8891efdd9e1b1b7fa72f257bd5169f8d87e319cf3dad6ff52b94ae610b2f813361180d565b610b37611bfa565b50565b6000610b46813361180d565b610b4f82611c8d565b610b915760405162461bcd60e51b8152602060048201526013602482015272494e56414c49445f5045524d495353494f4e5360681b60448201526064016107ec565b6001600160a01b03831660009081526006602052604090205415610bf75760405162461bcd60e51b815260206004820181905260248201527f45564d5f5343524950545f464143544f52595f414c52454144595f414444454460448201526064016107ec565b600580546001810182557f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0319166001600160a01b03861690811790915590546000918252600660209081526040808420929092556007815291208351610c6a928501906123dd565b50826001600160a01b03167fa95e7ae5870d8fc3c3f7b7a378c9c4f469e724c240ee45fbab61758fe7eb981783604051610ca49190612958565b60405180910390a2505050565b6000610cbd813361180d565b6000610cc883611cb9565b600554909150600090610cdd90600190612a48565b9050808214610d7957600060058281548110610cfb57610cfb612b52565b600091825260209091200154600580546001600160a01b039092169250829185908110610d2a57610d2a612b52565b600091825260209091200180546001600160a01b0319166001600160a01b0392909216919091179055610d5e8360016129fd565b6001600160a01b039091166000908152600660205260409020555b6005805480610d8a57610d8a612b3c565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b038616825260068152604080832083905560079091528120610dd891612461565b6040516001600160a01b038516907f158e73cc156a7591e8e04fa6cdfc13d89de9e19fdc692bf0502e2a622c08a12a90600090a250505050565b60005460ff1615610e355760405162461bcd60e51b81526004016107ec9061296b565b7f139c2898040ef16910dc9f44dc697df79363da767d8bc92f2e310312b816e46d610e60813361180d565b610b37611d2a565b60009182526001602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60005460ff1615610eb65760405162461bcd60e51b81526004016107ec9061296b565b6000610ec1836119c9565b90504281600301548260040154610ed891906129fd565b1115604051806040016040528060118152602001701353d51253d397d393d517d41054d4d151607a1b81525090610f225760405162461bcd60e51b81526004016107ec9190612958565b506002810154600882015460018301546001600160a01b039283169216610f4886611a54565b60405186907fd4fbbd7bf63590ce72807eb770b83aaf2f3a7958a4b2093fd9ab89b27609694290600090a26000610f80828588611d82565b9050808051906020012083146040518060400160405280601581526020017415539156141150d5115117d1559357d4d0d4925415605a1b81525090610fd85760405162461bcd60e51b81526004016107ec9190612958565b50600b54604051634a27111d60e01b81526001600160a01b0390911690634a27111d90611009908490600401612958565b600060405180830381600087803b15801561102357600080fd5b505af1158015611037573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261105f91908101906126a3565b5050505050505050565b600080611075846119c9565b600a54600582015460405163277166bf60e11b81526001600160a01b0387811660048301526024820192909252929350600092911690634ee2cd7e9060440160206040518083038186803b1580156110cc57600080fd5b505afa1580156110e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111049190612711565b905060008111801561113957506000858152600d602090815260408083206001600160a01b038816845290915290205460ff16155b95945050505050565b6111a66040518061012001604052806000815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600080191681525090565b6111af826119c9565b60408051610120810182528254815260018301546001600160a01b039081166020830152600284015416918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e082015260089091015461010082015292915050565b6008818154811061123457600080fd5b60009182526020909120600990910201805460018201546002830154600384015460048501546005860154600687015460078801546008909801549698506001600160a01b0395861697949095169592949193909289565b6000611298813361180d565b600b80546001600160a01b0319166001600160a01b0384169081179091556040517f5ed6ba59d23ef79b1a31c9f04da9f879ef6cdb89ad0241716ebdc1f02f5f465a90600090a25050565b60006112ee826119c9565b600281015460408051808201909152600b81526a2727aa2fa1a922a0aa27a960a91b60208201529192506001600160a01b031633146113405760405162461bcd60e51b81526004016107ec9190612958565b5061134a82611a54565b60405182907f801fcb98a9fa2e695209772f0a24f3f7ac36f6568659ae2e0cd7763fb73f286290600090a25050565b7f9f959e00d95122f5cbd677010436cf273ef535b86b056afc172852144b9491d76113a4813361180d565b60005b82518110156106a1576000600c60008584815181106113c8576113c8612b52565b6020026020010151815260200190815260200160002054111561144e576114078382815181106113fa576113fa612b52565b6020026020010151611a54565b82818151811061141957611419612b52565b60200260200101517f801fcb98a9fa2e695209772f0a24f3f7ac36f6568659ae2e0cd7763fb73f286260405160405180910390a25b61145781612ae1565b90506113a7565b6000828152600160208190526040909120015461147b813361180d565b6106a18383611962565b7f9f959e00d95122f5cbd677010436cf273ef535b86b056afc172852144b9491d76114b0813361180d565b6008545b80156106bb576114c5600182612a48565b90506000600882815481106114dc576114dc612b52565b90600052602060002090600902016000015490506114f981611a54565b60405181907f801fcb98a9fa2e695209772f0a24f3f7ac36f6568659ae2e0cd7763fb73f286290600090a2506114b4565b6000805460ff161561154e5760405162461bcd60e51b81526004016107ec9061296b565b6003546008546040805180820190915260158152741353d51253d394d7d31253525517d4915050d21151605a1b6020820152911161159f5760405162461bcd60e51b81526004016107ec9190612958565b50600880546001810182556000918252600980549181027ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3019290916115e490612ae1565b918290555080825560028083018054336001600160a01b0319918216811790925542600480870191909155436005870155546003860155915460068501556001840180549092166001600160a01b038816179091556008546000838152600c602052604081209190915591935061165d90869086611d82565b905080805190602001208260080181905550846001600160a01b0316837f2775db1f1f2dd97c60ba2903b3ca235c9cecb3cb47a9cb464f86578b9877f4a43387856040516116ad93929190612888565b60405180910390a3505092915050565b6060600580548060200260200160405190810160405280929190818152602001828054801561171557602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116116f7575b5050505050905090565b600061172b813361180d565b6106bb82611f79565b6005818154811061174457600080fd5b6000918252602090912001546001600160a01b0316905081565b6007602052600090815260409020805461177790612aa6565b80601f01602080910402602001604051908101604052809291908181526020018280546117a390612aa6565b80156117f05780601f106117c5576101008083540402835291602001916117f0565b820191906000526020600020905b8154815290600101906020018083116117d357829003601f168201915b505050505081565b6000611804813361180d565b6106bb82611ff8565b6118178282610e68565b6106bb5761182f816001600160a01b03166014612076565b61183a836020612076565b60405160200161184b9291906127ef565b60408051601f198184030181529082905262461bcd60e51b82526107ec91600401612958565b61187b8282610e68565b6106bb5760008281526001602081815260408084206001600160a01b0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b60408051808201909152600f81526e159053155157d513d3d7d4d3505313608a1b60208201526103848210156119255760405162461bcd60e51b81526004016107ec9190612958565b5060048190556040518181527f03765c4aa18fde3bfe4015073c2b138ce5a02536dd88ceae9739d3e0dbad5d0e906020015b60405180910390a150565b61196c8282610e68565b156106bb5760008281526001602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000818152600c60209081526040808320548151808301909252601082526f1353d51253d397d393d517d193d5539160821b9282019290925281611a205760405162461bcd60e51b81526004016107ec9190612958565b506008611a2e600183612a48565b81548110611a3e57611a3e612b52565b9060005260206000209060090201915050919050565b6000818152600c6020526040812054611a6f90600190612a48565b600854909150600090611a8490600190612a48565b9050808214611b7257600060088281548110611aa257611aa2612b52565b906000526020600020906009020190508060088481548110611ac657611ac6612b52565b60009182526020909120825460099092020190815560018083015481830180546001600160a01b039283166001600160a01b031991821617909155600280860154908501805491909316911617905560038084015490830155600480840154908301556005808401549083015560068084015490830155600780840154908301556008928301549290910191909155611b609084906129fd565b90546000908152600c60205260409020555b6008805480611b8357611b83612b3c565b600082815260208082206009600019909401938402018281556001810180546001600160a01b03199081169091556002820180549091169055600381018390556004810183905560058101839055600681018390556007810183905560080182905591909255938152600c90935250506040812055565b60005460ff16611c435760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016107ec565b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b60008082511180156106545750611ca6600460146129fd565b8251611cb29190612afc565b1592915050565b6001600160a01b03811660009081526006602052604090205480611d1f5760405162461bcd60e51b815260206004820152601c60248201527f45564d5f5343524950545f464143544f52595f4e4f545f464f554e440000000060448201526064016107ec565b610654600182612a48565b60005460ff1615611d4d5760405162461bcd60e51b81526004016107ec9061296b565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611c703390565b6060611da5846001600160a01b0316600090815260066020526040902054151590565b611df15760405162461bcd60e51b815260206004820152601c60248201527f45564d5f5343524950545f464143544f52595f4e4f545f464f554e440000000060448201526064016107ec565b604051633fa8872760e21b81526001600160a01b0385169063fea21c9c90611e1f9086908690600401612864565b600060405180830381600087803b158015611e3957600080fd5b505af1158015611e4d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611e7591908101906126a3565b6001600160a01b038516600090815260076020526040812080549293509091611e9d90612aa6565b80601f0160208091040260200160405190810160405280929190818152602001828054611ec990612aa6565b8015611f165780601f10611eeb57610100808354040283529160200191611f16565b820191906000526020600020905b815481529060010190602001808311611ef957829003601f168201915b50505050509050611f30828261221990919063ffffffff16565b611f715760405162461bcd60e51b81526020600482015260126024820152714841535f4e4f5f5045524d495353494f4e5360701b60448201526064016107ec565b509392505050565b60408051808201909152600f81526e56414c55455f544f4f5f4c4152474560881b60208201526101f4821115611fc25760405162461bcd60e51b81526004016107ec9190612958565b5060028190556040518181527fd60715ce58337415334d06256811f30ed8db120287970870d8505e5ed9074c6090602001611957565b60408051808201909152600f81526e56414c55455f544f4f5f4c4152474560881b602082015260188211156120405760405162461bcd60e51b81526004016107ec9190612958565b5060038190556040518181527f5e368703b7ab35fe9ef4dbc482cd414476841204c7484b8e834d0d3ac4ed867290602001611957565b60606000612085836002612a29565b6120909060026129fd565b67ffffffffffffffff8111156120a8576120a8612b68565b6040519080825280601f01601f1916602001820160405280156120d2576020820181803683370190505b509050600360fc1b816000815181106120ed576120ed612b52565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061211c5761211c612b52565b60200101906001600160f81b031916908160001a9053506000612140846002612a29565b61214b9060016129fd565b90505b60018111156121c3576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061217f5761217f612b52565b1a60f81b82828151811061219557612195612b52565b60200101906001600160f81b031916908160001a90535060049490941c936121bc81612a8f565b905061214e565b5083156122125760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016107ec565b9392505050565b6000600461222684611c8d565b1580612233575080835111155b15612242576000915050610654565b82518110156122a65760008061225885846122b0565b91509150612266868361232b565b6122765760009350505050610654565b63ffffffff8116612289600460146129fd565b61229391906129fd565b61229d90846129fd565b92505050612242565b5060019392505050565b600080806122be858561238f565b905060006122d76122d06014876129fd565b87906123aa565b905060006122fc60046122eb6014896129fd565b6122f591906129fd565b88906123aa565b90508260601b6bffffffffffffffffffffffff19168163ffffffff1660401b1782945094505050509250929050565b6000805b835181101561238557600061234485836123c5565b905067ffffffffffffffff19808216908516141561236757600192505050610654565b612373600460146129fd565b61237d90836129fd565b91505061232f565b5060009392505050565b60008061239f8484016020015190565b60601c949350505050565b6000806123ba8484016020015190565b60e01c949350505050565b6000806123d58484016020015190565b949350505050565b8280546123e990612aa6565b90600052602060002090601f01602090048101928261240b5760008555612451565b82601f1061242457805160ff1916838001178555612451565b82800160010185558215612451579182015b82811115612451578251825591602001919060010190612436565b5061245d929150612497565b5090565b50805461246d90612aa6565b6000825580601f1061247d575050565b601f016020900490600052602060002090810190610b3791905b5b8082111561245d5760008155600101612498565b80356001600160a01b03811681146124c357600080fd5b919050565b600082601f8301126124d957600080fd5b81356124ec6124e7826129d5565b6129a4565b81815284602083860101111561250157600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561253057600080fd5b612212826124ac565b6000806040838503121561254c57600080fd5b612555836124ac565b9150602083013567ffffffffffffffff81111561257157600080fd5b61257d858286016124c8565b9150509250929050565b6000602080838503121561259a57600080fd5b823567ffffffffffffffff808211156125b257600080fd5b818501915085601f8301126125c657600080fd5b8135818111156125d8576125d8612b68565b8060051b91506125e98483016129a4565b8181528481019084860184860187018a101561260457600080fd5b600095505b83861015612627578035835260019590950194918601918601612609565b5098975050505050505050565b60006020828403121561264657600080fd5b5035919050565b6000806040838503121561266057600080fd5b82359150612670602084016124ac565b90509250929050565b60006020828403121561268b57600080fd5b81356001600160e01b03198116811461221257600080fd5b6000602082840312156126b557600080fd5b815167ffffffffffffffff8111156126cc57600080fd5b8201601f810184136126dd57600080fd5b80516126eb6124e7826129d5565b81815285602083850101111561270057600080fd5b611139826020830160208601612a5f565b60006020828403121561272357600080fd5b5051919050565b6000806040838503121561273d57600080fd5b82359150602083013567ffffffffffffffff81111561257157600080fd5b60008151808452612773816020860160208601612a5f565b601f01601f19169290920160200192915050565b80518252602081015160018060a01b0380821660208501528060408401511660408501525050606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301526101008082015181840152505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351612827816017850160208801612a5f565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351612858816028840160208801612a5f565b01602801949350505050565b6001600160a01b03831681526040602082018190526000906123d59083018461275b565b6001600160a01b03841681526060602082018190526000906128ac9083018561275b565b82810360408401526128be818561275b565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156129095783516001600160a01b0316835292840192918401916001016128e4565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561290957612944838551612787565b928401926101209290920191600101612931565b602081526000612212602083018461275b565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b61012081016106548284612787565b604051601f8201601f1916810167ffffffffffffffff811182821017156129cd576129cd612b68565b604052919050565b600067ffffffffffffffff8211156129ef576129ef612b68565b50601f01601f191660200190565b60008219821115612a1057612a10612b10565b500190565b600082612a2457612a24612b26565b500490565b6000816000190483118215151615612a4357612a43612b10565b500290565b600082821015612a5a57612a5a612b10565b500390565b60005b83811015612a7a578181015183820152602001612a62565b83811115612a89576000848401525b50505050565b600081612a9e57612a9e612b10565b506000190190565b600181811c90821680612aba57607f821691505b60208210811415612adb57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612af557612af5612b10565b5060010190565b600082612b0b57612b0b612b26565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea2646970667358221220649fc0d69b89f4d00f7191f7e952405b455a0fdffb5d4b6d795b3381d87b75d264736f6c6343000806003300000000000000000000000006c6ab60f0ad054236d7d4faf98a5d33e852e7170000000000000000000000002a61d3ba5030ef471c74f612962c7367eca3a62d0000000000000000000000000000000000000000000000000000000000000708000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000032

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

00000000000000000000000006c6ab60f0ad054236d7d4faf98a5d33e852e7170000000000000000000000002a61d3ba5030ef471c74f612962c7367eca3a62d0000000000000000000000000000000000000000000000000000000000000708000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000032

-----Decoded View---------------
Arg [0] : _governanceToken (address): 0x06c6Ab60F0Ad054236d7d4Faf98A5D33e852E717
Arg [1] : _admin (address): 0x2a61d3ba5030Ef471C74f612962c7367ECa3a62d
Arg [2] : _motionDuration (uint256): 1800
Arg [3] : _motionsCountLimit (uint256): 12
Arg [4] : _objectionsThreshold (uint256): 50

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 00000000000000000000000006c6ab60f0ad054236d7d4faf98a5d33e852e717
Arg [1] : 0000000000000000000000002a61d3ba5030ef471c74f612962c7367eca3a62d
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000708
Arg [3] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000032


Deployed ByteCode Sourcemap

32409:11411:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10415:204;;;;;;:::i;:::-;;:::i;:::-;;;9146:14:1;;9139:22;9121:41;;9109:2;9094:18;10415:204:0;;;;;;;;34311:62;;34349:24;34311:62;;;;;9319:25:1;;;9307:2;9292:18;34311:62:0;9274:76:1;11826:123:0;;;;;;:::i;:::-;11892:7;11919:12;;;:6;:12;;;;;;;;:22;;;11826:123;27784:158;;;;;;:::i;:::-;;:::i;12211:147::-;;;;;;:::i;:::-;;:::i;:::-;;34240:64;;34279:25;34240:64;;16599:32;;;;;;17349:144;;;;;;:::i;:::-;;:::i;42393:95::-;;;:::i;:::-;;;;;;;:::i;13259:218::-;;;;;;:::i;:::-;;:::i;34173:60::-;;34210:23;34173:60;;38632:1152;;;;;;:::i;:::-;;:::i;41699:91::-;;;:::i;25833:599::-;;;;;;:::i;:::-;;:::i;30815:86::-;30862:4;30886:7;;;30815:86;;16713:29;;;;;;26762:736;;;;;;:::i;:::-;;:::i;41550:88::-;;;:::i;16215:56::-;;16261:10;16215:56;;10711:139;;;;;;:::i;:::-;;:::i;16511:34::-;;;;;;37742:764;;;;;;:::i;:::-;;:::i;9802:49::-;;9847:4;9802:49;;42024:313;;;;;;:::i;:::-;;:::i;42597:123::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;34650:23::-;;;;;;:::i;:::-;;:::i;:::-;;;;13951:25:1;;;-1:-1:-1;;;;;14050:15:1;;;14045:2;14030:18;;14023:43;14102:15;;;;14082:18;;;14075:43;;;;14149:2;14134:18;;14127:34;;;;14192:3;14177:19;;14170:35;;;;14003:3;14221:19;;14214:35;14280:3;14265:19;;14258:35;14324:3;14309:19;;14302:35;14368:3;14353:19;;14346:35;13938:3;13923:19;34650:23:0;13905:482:1;41173:256:0;;;;;;:::i;:::-;;:::i;39959:257::-;;;;;;:::i;:::-;;:::i;40328:339::-;;;;;;:::i;:::-;;:::i;16095:54::-;;16146:3;16095:54;;12603:149;;;;;;:::i;:::-;;:::i;40719:334::-;;;:::i;15929:46::-;;15973:2;15929:46;;36312:1119;;;;;;:::i;:::-;;:::i;27567:118::-;;;:::i;:::-;;;;;;;:::i;35268:62::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;17596:187;;;;;;:::i;:::-;;:::i;24930:35::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;6490:32:1;;;6472:51;;6460:2;6445:18;24930:35:0;6427:102:1;34942:43:0;;;;;-1:-1:-1;;;;;34942:43:0;;;34844:35;;;;;-1:-1:-1;;;;;34844:35:0;;;25261:60;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;17842:179::-;;;;;;:::i;:::-;;:::i;10415:204::-;10500:4;-1:-1:-1;;;;;;10524:47:0;;-1:-1:-1;;;10524:47:0;;:87;;-1:-1:-1;;;;;;;;;;7819:40:0;;;10575:36;10517:94;10415:204;-1:-1:-1;;10415:204:0:o;27784:158::-;-1:-1:-1;;;;;29322:47:0;;27867:4;29322:47;;;:23;:47;;;;;;:51;;27891:43;29215:166;12211:147;11892:7;11919:12;;;:6;:12;;;;;;;;:22;;10293:30;10304:4;3781:10;10293;:30::i;:::-;12325:25:::1;12336:4;12342:7;12325:10;:25::i;:::-;12211:147:::0;;;:::o;17349:144::-;9847:4;10293:30;9847:4;3781:10;10293;:30::i;:::-;17450:35:::1;17469:15;17450:18;:35::i;:::-;17349:144:::0;;:::o;42393:95::-;42438:15;42473:7;42466:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42466:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42393:95;:::o;13259:218::-;-1:-1:-1;;;;;13355:23:0;;3781:10;13355:23;13347:83;;;;-1:-1:-1;;;13347:83:0;;12935:2:1;13347:83:0;;;12917:21:1;12974:2;12954:18;;;12947:30;13013:34;12993:18;;;12986:62;-1:-1:-1;;;13064:18:1;;;13057:45;13119:19;;13347:83:0;;;;;;;;;13443:26;13455:4;13461:7;13443:11;:26::i;38632:1152::-;38695:21;38719;38730:9;38719:10;:21::i;:::-;38760;;;;:10;:21;;;;;;;;38782:10;38760:33;;;;;;;;;38795:22;;;;;;;;;;;-1:-1:-1;;;38795:22:0;;;;;;;38695:45;;-1:-1:-1;38795:22:0;38760:33;;38759:34;38751:67;;;;-1:-1:-1;;;38751:67:0;;;;;;;;:::i;:::-;-1:-1:-1;38829:21:0;;;;:10;:21;;;;;;;;38851:10;38829:33;;;;;;;;:40;;-1:-1:-1;;38829:40:0;38865:4;38829:40;;;38906:20;;;;38963:15;;:54;;-1:-1:-1;;;38963:54:0;;;;;7506:51:1;;;;7573:18;;;7566:34;;;38906:20:0;38829:21;-1:-1:-1;;;;;38963:15:0;;;;:27;;7479:18:1;;38963:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38937:80;;39054:1;39036:15;:19;39057:24;;;;;;;;;;;;;-1:-1:-1;;;39057:24:0;;;39028:54;;;;;-1:-1:-1;;;39028:54:0;;;;;;;;:::i;:::-;-1:-1:-1;39117:15:0;;:44;;-1:-1:-1;;;39117:44:0;;;;;9319:25:1;;;39095:19:0;;-1:-1:-1;;;;;39117:15:0;;:29;;9292:18:1;;39117:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39095:66;;39172:27;39228:15;39202:6;:23;;;:41;;;;:::i;:::-;39172:71;-1:-1:-1;39254:30:0;39329:11;39288:37;39172:71;34526:5;39288:37;:::i;:::-;39287:53;;;;:::i;:::-;39358:175;;;14594:25:1;;;14650:2;14635:18;;14628:34;;;14678:18;;;14671:34;;;39254:86:0;;-1:-1:-1;39411:10:0;;39387:9;;39358:175;;14582:2:1;14567:18;39358:175:0;;;;;;;39575:6;:26;;;39550:22;:51;39546:231;;;39618:23;;;:45;;;39546:231;;;39696:24;39710:9;39696:13;:24::i;:::-;39740:25;;39755:9;;39740:25;;;;;39546:231;38684:1100;;;;;;38632:1152;:::o;41699:91::-;30862:4;30886:7;;;31410:41;;;;-1:-1:-1;;;31410:41:0;;10828:2:1;31410:41:0;;;10810:21:1;10867:2;10847:18;;;10840:30;-1:-1:-1;;;10886:18:1;;;10879:50;10946:18;;31410:41:0;10800:170:1;31410:41:0;34279:25:::1;10293:30;34279:25:::0;3781:10;10293;:30::i;:::-:1;41772:10:::2;:8;:10::i;:::-;31462:1:::1;41699:91::o:0;25833:599::-;9847:4;10293:30;9847:4;3781:10;10293;:30::i;:::-;25996:33:::1;:12;:31;:33::i;:::-;25988:65;;;::::0;-1:-1:-1;;;25988:65:0;;11538:2:1;25988:65:0::1;::::0;::::1;11520:21:1::0;11577:2;11557:18;;;11550:30;-1:-1:-1;;;11596:18:1;;;11589:49;11655:18;;25988:65:0::1;11510:169:1::0;25988:65:0::1;-1:-1:-1::0;;;;;29322:47:0;;29298:4;29322:47;;;:23;:47;;;;;;:51;26064:84:::1;;;::::0;-1:-1:-1;;;26064:84:0;;11177:2:1;26064:84:0::1;::::0;::::1;11159:21:1::0;;;11196:18;;;11189:30;11255:34;11235:18;;;11228:62;11307:18;;26064:84:0::1;11149:182:1::0;26064:84:0::1;26159:18;:42:::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;;;;26159:42:0::1;-1:-1:-1::0;;;;;26159:42:0;::::1;::::0;;::::1;::::0;;;26257:25;;-1:-1:-1;26212:42:0;;;:23:::1;26159:42;26212::::0;;;;;;;:70;;;;26293:27:::1;:46:::0;;;;:61;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;26392:17;-1:-1:-1::0;;;;;26370:54:0::1;;26411:12;26370:54;;;;;;:::i;:::-;;;;;;;;25833:599:::0;;;:::o;26762:736::-;9847:4;10293:30;9847:4;3781:10;10293;:30::i;:::-;26893:13:::1;26909:44;26935:17;26909:25;:44::i;:::-;26984:18;:25:::0;26893:60;;-1:-1:-1;26964:17:0::1;::::0;26984:29:::1;::::0;27012:1:::1;::::0;26984:29:::1;:::i;:::-;26964:49;;27039:9;27030:5;:18;27026:246;;27065:28;27096:18;27115:9;27096:29;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;27140:18:::1;:25:::0;;-1:-1:-1;;;;;27096:29:0;;::::1;::::0;-1:-1:-1;27096:29:0;;27159:5;;27140:25;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:48:::0;;-1:-1:-1;;;;;;27140:48:0::1;-1:-1:-1::0;;;;;27140:48:0;;;::::1;::::0;;;::::1;::::0;;27251:9:::1;:5:::0;-1:-1:-1;27251:9:0::1;:::i;:::-;-1:-1:-1::0;;;;;27203:45:0;;::::1;;::::0;;;:23:::1;:45;::::0;;;;:57;27026:246:::1;27284:18;:24;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;-1:-1:-1;;27284:24:0;;;;;-1:-1:-1;;;;;;27284:24:0::1;::::0;;;;;;;;-1:-1:-1;;;;;27326:42:0;::::1;::::0;;:23:::1;:42:::0;;;;;;27319:49;;;27386:27:::1;:46:::0;;;;;27379:53:::1;::::0;::::1;:::i;:::-;27448:42;::::0;-1:-1:-1;;;;;27448:42:0;::::1;::::0;::::1;::::0;;;::::1;26882:616;;26762:736:::0;;:::o;41550:88::-;30862:4;30886:7;;;31140:9;31132:38;;;;-1:-1:-1;;;31132:38:0;;;;;;;:::i;:::-;34210:23:::1;10293:30;34210:23:::0;3781:10;10293;:30::i;:::-:1;41622:8:::2;:6;:8::i;10711:139::-:0;10789:4;10813:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;10813:29:0;;;;;;;;;;;;;;;10711:139::o;37742:764::-;30862:4;30886:7;;;31140:9;31132:38;;;;-1:-1:-1;;;31132:38:0;;;;;;;:::i;:::-;37872:21:::1;37896;37907:9;37896:10;:21::i;:::-;37872:45;;37974:15;37955:6;:15;;;37936:6;:16;;;:34;;;;:::i;:::-;:53;;37991:23;;;;;;;;;;;;;-1:-1:-1::0;;;37991:23:0::1;;::::0;37928:87:::1;;;;;-1:-1:-1::0;;;37928:87:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;38046:14:0::1;::::0;::::1;::::0;38095:20:::1;::::0;::::1;::::0;38046:14;38153:23;::::1;::::0;-1:-1:-1;;;;;38046:14:0;;::::1;::::0;38153:23:::1;38189:24;38203:9:::0;38189:13:::1;:24::i;:::-;38229;::::0;38243:9;;38229:24:::1;::::0;;;::::1;38266:22;38291:63;38308:16;38326:7;38335:18;38291:16;:63::i;:::-;38266:88;;38400:9;38390:20;;;;;;38373:13;:37;38412:27;;;;;;;;;;;;;-1:-1:-1::0;;;38412:27:0::1;;::::0;38365:75:::1;;;;;-1:-1:-1::0;;;38365:75:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;38453:17:0::1;::::0;:45:::1;::::0;-1:-1:-1;;;38453:45:0;;-1:-1:-1;;;;;38453:17:0;;::::1;::::0;:34:::1;::::0;:45:::1;::::0;38488:9;;38453:45:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;38453:45:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;;37861:645;;;;;37742:764:::0;;:::o;42024:313::-;42112:4;42129:21;42153;42164:9;42153:10;:21::i;:::-;42203:15;;42242:20;;;;42203:60;;-1:-1:-1;;;42203:60:0;;-1:-1:-1;;;;;7524:32:1;;;42203:60:0;;;7506:51:1;7573:18;;;7566:34;;;;42242:20:0;;-1:-1:-1;42185:15:0;;42203;;;:27;;7479:18:1;;42203:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42185:78;;42291:1;42281:7;:11;:48;;;;-1:-1:-1;42297:21:0;;;;:10;:21;;;;;;;;-1:-1:-1;;;;;42297:32:0;;;;;;;;;;;;42296:33;42281:48;42274:55;42024:313;-1:-1:-1;;;;;42024:313:0:o;42597:123::-;42658:13;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42658:13:0;42691:21;42702:9;42691:10;:21::i;:::-;42684:28;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42684:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42597:123;-1:-1:-1;;42597:123:0:o;34650:23::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;34650:23:0;;;;;;;;;;;;;;;;:::o;41173:256::-;9847:4;10293:30;9847:4;3781:10;10293;:30::i;:::-;41303:17:::1;:58:::0;;-1:-1:-1;;;;;;41303:58:0::1;-1:-1:-1::0;;;;;41303:58:0;::::1;::::0;;::::1;::::0;;;41377:44:::1;::::0;::::1;::::0;-1:-1:-1;;41377:44:0::1;41173:256:::0;;:::o;39959:257::-;40020:21;40044;40055:9;40044:10;:21::i;:::-;40084:14;;;;40114:17;;;;;;;;;;;;-1:-1:-1;;;40114:17:0;;;;40020:45;;-1:-1:-1;;;;;;40084:14:0;40102:10;40084:28;40076:56;;;;-1:-1:-1;;;40076:56:0;;;;;;;;:::i;:::-;;40143:24;40157:9;40143:13;:24::i;:::-;40183:25;;40198:9;;40183:25;;;;;40009:207;39959:257;:::o;40328:339::-;34349:24;10293:30;34349:24;3781:10;10293;:30::i;:::-;40427:9:::1;40422:238;40446:10;:17;40442:1;:21;40422:238;;;40530:1;40489:23;:38;40513:10;40524:1;40513:13;;;;;;;;:::i;:::-;;;;;;;40489:38;;;;;;;;;;;;:42;40485:164;;;40552:28;40566:10;40577:1;40566:13;;;;;;;;:::i;:::-;;;;;;;40552;:28::i;:::-;40619:10;40630:1;40619:13;;;;;;;;:::i;:::-;;;;;;;40604:29;;;;;;;;;;40485:164;40465:3;::::0;::::1;:::i;:::-;;;40422:238;;12603:149:::0;11892:7;11919:12;;;:6;:12;;;;;;;;:22;;10293:30;10304:4;3781:10;10293;:30::i;:::-;12718:26:::1;12730:4;12736:7;12718:11;:26::i;40719:334::-:0;34349:24;10293:30;34349:24;3781:10;10293;:30::i;:::-;40812:7:::1;:14:::0;40837:209:::1;40844:16:::0;;40837:209:::1;;40877:17;40893:1;40877:17:::0;::::1;:::i;:::-;;;40909:16;40928:7;40936:12;40928:21;;;;;;;;:::i;:::-;;;;;;;;;;;:24;;;40909:43;;40967:23;40981:8;40967:13;:23::i;:::-;41010:24;::::0;41025:8;;41010:24:::1;::::0;;;::::1;40862:184;40837:209;;36312:1119:::0;36453:20;30886:7;;;;31140:9;31132:38;;;;-1:-1:-1;;;31132:38:0;;;;;;;:::i;:::-;36516:17:::1;::::0;36499:7:::1;:14:::0;36535:27:::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;36535:27:0::1;::::0;::::1;::::0;;-1:-1:-1;36491:72:0::1;;;;-1:-1:-1::0;;;36491:72:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;36603:7:0::1;:14:::0;;::::1;::::0;::::1;::::0;;36576:24:::1;36603:14:::0;;;::::1;36643::::0;;36603;;::::1;::::0;::::1;::::0;;;36643::::1;::::0;::::1;:::i;:::-;::::0;;;;-1:-1:-1;36670:27:0;;;36708:17:::1;::::0;;::::1;:30:::0;;36728:10:::1;-1:-1:-1::0;;;;;;36708:30:0;;::::1;::::0;::::1;::::0;;;36771:15:::1;36749:19;::::0;;::::1;:37:::0;;;;36823:12:::1;36797:23;::::0;::::1;:38:::0;36867:14;36846:18:::1;::::0;::::1;:35:::0;36924:19;;36892:29:::1;::::0;::::1;:51:::0;-1:-1:-1;36954:26:0;::::1;:46:::0;;;;::::1;-1:-1:-1::0;;;;;36954:46:0;::::1;;::::0;;;37051:7:::1;:14:::0;-1:-1:-1;37011:37:0;;;:23:::1;:37;::::0;;;;:54;;;;36643:14;;-1:-1:-1;37116:67:0::1;::::0;36954:46;;37164:18;37116:16:::1;:67::i;:::-;37078:105;;37230:9;37220:20;;;;;;37194:9;:23;;:46;;;;37338:17;-1:-1:-1::0;;;;;37258:165:0::1;37286:12;37258:165;37313:10;37370:18;37403:9;37258:165;;;;;;;;:::i;:::-;;;;;;;;36480:951;;36312:1119:::0;;;;:::o;27567:118::-;27623:16;27659:18;27652:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27652:25:0;;;;;;;;;;;;;;;;;;;;;;;27567:118;:::o;17596:187::-;9847:4;10293:30;9847:4;3781:10;10293;:30::i;:::-;17730:45:::1;17754:20;17730:23;:45::i;24930:35::-:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24930:35:0;;-1:-1:-1;24930:35:0;:::o;25261:60::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;17842:179::-;9847:4;10293:30;9847:4;3781:10;10293;:30::i;:::-;17972:41:::1;17994:18;17972:21;:41::i;11140:497::-:0;11221:22;11229:4;11235:7;11221;:22::i;:::-;11216:414;;11409:41;11437:7;-1:-1:-1;;;;;11409:41:0;11447:2;11409:19;:41::i;:::-;11523:38;11551:4;11558:2;11523:19;:38::i;:::-;11314:270;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;11314:270:0;;;;;;;;;;-1:-1:-1;;;11260:358:0;;;;;;;:::i;14563:229::-;14638:22;14646:4;14652:7;14638;:22::i;:::-;14633:152;;14677:12;;;;14709:4;14677:12;;;;;;;;-1:-1:-1;;;;;14677:29:0;;;;;;;;;;:36;;-1:-1:-1;;14677:36:0;;;;;;;14733:40;;3781:10;;14677:12;;14733:40;;14677:12;14733:40;14563:229;;:::o;18029:248::-;18150:21;;;;;;;;;;;;-1:-1:-1;;;18150:21:0;;;;16261:10;18110:38;;;18102:70;;;;-1:-1:-1;;;18102:70:0;;;;;;;;:::i;:::-;-1:-1:-1;18183:14:0;:32;;;18231:38;;9319:25:1;;;18231:38:0;;9307:2:1;9292:18;18231:38:0;;;;;;;;18029:248;:::o;14800:230::-;14875:22;14883:4;14889:7;14875;:22::i;:::-;14871:152;;;14946:5;14914:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;14914:29:0;;;;;;;;;;:37;;-1:-1:-1;;14914:37:0;;;14971:40;3781:10;;14914:12;;14971:40;;14946:5;14971:40;14800:230;;:::o;43561:256::-;43622:14;43672:34;;;:23;:34;;;;;;;;;43743:22;;;;;;;;;;;-1:-1:-1;;;43743:22:0;;;;;;;43725:16;43717:49;;;;-1:-1:-1;;;43717:49:0;;;;;;;;:::i;:::-;-1:-1:-1;43784:7:0;43792:16;43807:1;43792:12;:16;:::i;:::-;43784:25;;;;;;;;:::i;:::-;;;;;;;;;;;43777:32;;;43561:256;;;:::o;43037:466::-;43098:13;43114:34;;;:23;:34;;;;;;:38;;43151:1;;43114:38;:::i;:::-;43183:7;:14;43098:54;;-1:-1:-1;43163:17:0;;43183:18;;43200:1;;43183:18;:::i;:::-;43163:38;;43227:9;43218:5;:18;43214:204;;43253:25;43281:7;43289:9;43281:18;;;;;;;;:::i;:::-;;;;;;;;;;;43253:46;;43331:10;43314:7;43322:5;43314:14;;;;;;;;:::i;:::-;;;;;;;;;:27;;:14;;;;;:27;;;;;;;;;;;;;-1:-1:-1;;;;;43314:27:0;;;-1:-1:-1;;;;;;43314:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43397:9;;:5;;:9;:::i;:::-;43380:13;;43356:38;;;;:23;:38;;;;;:50;43214:204;43430:7;:13;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;43430:13:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;;43430:13:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43461:34;;;:23;:34;;;-1:-1:-1;;43461:34:0;;;43454:41;43037:466::o;31874:120::-;30862:4;30886:7;;;31410:41;;;;-1:-1:-1;;;31410:41:0;;10828:2:1;31410:41:0;;;10810:21:1;10867:2;10847:18;;;10840:30;-1:-1:-1;;;10886:18:1;;;10879:50;10946:18;;31410:41:0;10800:170:1;31410:41:0;31943:5:::1;31933:15:::0;;-1:-1:-1;;31933:15:0::1;::::0;;31964:22:::1;3781:10:::0;31973:12:::1;31964:22;::::0;-1:-1:-1;;;;;6490:32:1;;;6472:51;;6460:2;6445:18;31964:22:0::1;;;;;;;31874:120::o:0;22822:179::-;22900:4;22946:1;22924:12;:19;:23;:69;;;;-1:-1:-1;21691:35:0;21591:1;21383:2;21691:35;:::i;:::-;22951:12;:19;:37;;;;:::i;:::-;:42;22917:76;22822:179;-1:-1:-1;;22822:179:0:o;28921:286::-;-1:-1:-1;;;;;29073:42:0;;29032:14;29073:42;;;:23;:42;;;;;;29134:10;29126:51;;;;-1:-1:-1;;;29126:51:0;;12578:2:1;29126:51:0;;;12560:21:1;12617:2;12597:18;;;12590:30;12656;12636:18;;;12629:58;12704:18;;29126:51:0;12550:178:1;29126:51:0;29188:11;29198:1;29188:11;;:::i;31615:118::-;30862:4;30886:7;;;31140:9;31132:38;;;;-1:-1:-1;;;31132:38:0;;;;;;;:::i;:::-;31675:7:::1;:14:::0;;-1:-1:-1;;31675:14:0::1;31685:4;31675:14;::::0;;31705:20:::1;31712:12;3781:10:::0;;3701:98;28242:591;28398:23;28442:38;28462:17;-1:-1:-1;;;;;29322:47:0;29298:4;29322:47;;;:23;:47;;;;;;:51;;;29215:166;28442:38;28434:79;;;;-1:-1:-1;;;28434:79:0;;12578:2:1;28434:79:0;;;12560:21:1;12617:2;12597:18;;;12590:30;12656;12636:18;;;12629:58;12704:18;;28434:79:0;12550:178:1;28434:79:0;28537:119;;-1:-1:-1;;;28537:119:0;;-1:-1:-1;;;;;28537:52:0;;;;;:119;;28604:8;;28627:18;;28537:119;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28537:119:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;28694:46:0;;28667:24;28694:46;;;:27;:46;;;;;28667:73;;28524:132;;-1:-1:-1;28667:24:0;;:73;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28759:43;28791:10;28759:11;:31;;:43;;;;:::i;:::-;28751:74;;;;-1:-1:-1;;;28751:74:0;;12231:2:1;28751:74:0;;;12213:21:1;12270:2;12250:18;;;12243:30;-1:-1:-1;;;12289:18:1;;;12282:48;12347:18;;28751:74:0;12203:168:1;28751:74:0;28423:410;28242:591;;;;;:::o;18285:288::-;18426:21;;;;;;;;;;;;-1:-1:-1;;;18426:21:0;;;;16146:3;18376:48;;;18368:80;;;;-1:-1:-1;;;18368:80:0;;;;;;;;:::i;:::-;-1:-1:-1;18459:19:0;:42;;;18517:48;;9319:25:1;;;18517:48:0;;9307:2:1;9292:18;18517:48:0;9274:76:1;18581:267:0;18709:21;;;;;;;;;;;;-1:-1:-1;;;18709:21:0;;;;15973:2;18668:39;;;18660:71;;;;-1:-1:-1;;;18660:71:0;;;;;;;;:::i;:::-;-1:-1:-1;18742:17:0;:38;;;18796:44;;9319:25:1;;;18796:44:0;;9307:2:1;9292:18;18796:44:0;9274:76:1;5553:451:0;5628:13;5654:19;5686:10;5690:6;5686:1;:10;:::i;:::-;:14;;5699:1;5686:14;:::i;:::-;5676:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5676:25:0;;5654:47;;-1:-1:-1;;;5712:6:0;5719:1;5712:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;5712:15:0;;;;;;;;;-1:-1:-1;;;5738:6:0;5745:1;5738:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;5738:15:0;;;;;;;;-1:-1:-1;5769:9:0;5781:10;5785:6;5781:1;:10;:::i;:::-;:14;;5794:1;5781:14;:::i;:::-;5769:26;;5764:135;5801:1;5797;:5;5764:135;;;-1:-1:-1;;;5849:5:0;5857:3;5849:11;5836:25;;;;;;;:::i;:::-;;;;5824:6;5831:1;5824:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;5824:37:0;;;;;;;;-1:-1:-1;5886:1:0;5876:11;;;;;5804:3;;;:::i;:::-;;;5764:135;;;-1:-1:-1;5917:10:0;;5909:55;;;;-1:-1:-1;;;5909:55:0;;10467:2:1;5909:55:0;;;10449:21:1;;;10486:18;;;10479:30;10545:34;10525:18;;;10518:62;10597:18;;5909:55:0;10439:182:1;5909:55:0;5989:6;5553:451;-1:-1:-1;;;5553:451:0:o;22002:724::-;22133:4;21290:1;22240:32;22259:12;22240:18;:32::i;:::-;22239:33;:66;;;;22297:8;22276:10;:17;:29;;22239:66;22235:111;;;22329:5;22322:12;;;;;22235:111;22376:10;:17;22365:8;:28;22358:339;;;22411:20;22433:21;22458:38;22475:10;22487:8;22458:16;:38::i;:::-;22410:86;;;;22516:42;22531:12;22545;22516:14;:42::i;:::-;22511:96;;22586:5;22579:12;;;;;;;22511:96;22633:52;;;:35;21494:1;21383:2;22633:35;:::i;:::-;:52;;;;:::i;:::-;22621:64;;;;:::i;:::-;;;22395:302;;22358:339;;;-1:-1:-1;22714:4:0;;22002:724;-1:-1:-1;;;22002:724:0:o;23131:500::-;23250:7;;;23303:31;:10;23324:9;23303:20;:31::i;:::-;23283:51;-1:-1:-1;23345:21:0;23369:45;23389:24;21383:2;23389:9;:24;:::i;:::-;23369:10;;:19;:45::i;:::-;23345:69;-1:-1:-1;23425:23:0;23464:68;21494:1;23484:24;21383:2;23484:9;:24;:::i;:::-;:47;;;;:::i;:::-;23464:10;;:19;:68::i;:::-;23425:107;;23596:9;23588:18;;23551:55;;;23567:16;23559:25;;23551:34;;:55;23608:14;23543:80;;;;;;;23131:500;;;;;:::o;23708:460::-;23831:4;;23884:254;23902:12;:19;23891:8;:30;23884:254;;;23938:18;23959:32;:12;23982:8;23959:22;:32::i;:::-;23938:53;-1:-1:-1;;;24010:27:0;;;;;;;24006:79;;;24065:4;24058:11;;;;;;24006:79;21691:35;21591:1;21383:2;21691:35;:::i;:::-;24099:27;;;;:::i;:::-;;;23923:215;23884:254;;;-1:-1:-1;24155:5:0;;23708:460;-1:-1:-1;;;23708:460:0:o;19741:344::-;19820:14;19847:12;19862:25;19872:4;19878:8;20596:30;20610:4;20596:30;20590:37;;20450:195;19862:25;19954:2;19932:135;;19741:344;-1:-1:-1;;;;19741:344:0:o;20093:349::-;20173:13;20199:12;20214:27;20224:5;20231:9;20596:30;20610:4;20596:30;20590:37;;20450:195;20214:27;20310:3;20288:136;;20093:349;-1:-1:-1;;;;20093:349:0:o;19520:213::-;19599:14;19626:12;19641:25;19651:4;19657:8;20596:30;20610:4;20596:30;20590:37;;20450:195;19641:25;19626:40;19520:213;-1:-1:-1;;;;19520:213:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;111:2;63:124;;;:::o;192:462::-;234:5;287:3;280:4;272:6;268:17;264:27;254:2;;305:1;302;295:12;254:2;341:6;328:20;372:48;388:31;416:2;388:31;:::i;:::-;372:48;:::i;:::-;445:2;436:7;429:19;491:3;484:4;479:2;471:6;467:15;463:26;460:35;457:2;;;508:1;505;498:12;457:2;573;566:4;558:6;554:17;547:4;538:7;534:18;521:55;621:1;596:16;;;614:4;592:27;585:38;;;;600:7;244:410;-1:-1:-1;;;244:410:1:o;659:186::-;718:6;771:2;759:9;750:7;746:23;742:32;739:2;;;787:1;784;777:12;739:2;810:29;829:9;810:29;:::i;850:394::-;927:6;935;988:2;976:9;967:7;963:23;959:32;956:2;;;1004:1;1001;994:12;956:2;1027:29;1046:9;1027:29;:::i;:::-;1017:39;;1107:2;1096:9;1092:18;1079:32;1134:18;1126:6;1123:30;1120:2;;;1166:1;1163;1156:12;1120:2;1189:49;1230:7;1221:6;1210:9;1206:22;1189:49;:::i;:::-;1179:59;;;946:298;;;;;:::o;1249:957::-;1333:6;1364:2;1407;1395:9;1386:7;1382:23;1378:32;1375:2;;;1423:1;1420;1413:12;1375:2;1463:9;1450:23;1492:18;1533:2;1525:6;1522:14;1519:2;;;1549:1;1546;1539:12;1519:2;1587:6;1576:9;1572:22;1562:32;;1632:7;1625:4;1621:2;1617:13;1613:27;1603:2;;1654:1;1651;1644:12;1603:2;1690;1677:16;1712:2;1708;1705:10;1702:2;;;1718:18;;:::i;:::-;1764:2;1761:1;1757:10;1747:20;;1787:28;1811:2;1807;1803:11;1787:28;:::i;:::-;1849:15;;;1880:12;;;;1912:11;;;1942;;;1938:20;;1935:33;-1:-1:-1;1932:2:1;;;1981:1;1978;1971:12;1932:2;2003:1;1994:10;;2013:163;2027:2;2024:1;2021:9;2013:163;;;2084:17;;2072:30;;2045:1;2038:9;;;;;2122:12;;;;2154;;2013:163;;;-1:-1:-1;2195:5:1;1344:862;-1:-1:-1;;;;;;;;1344:862:1:o;2211:180::-;2270:6;2323:2;2311:9;2302:7;2298:23;2294:32;2291:2;;;2339:1;2336;2329:12;2291:2;-1:-1:-1;2362:23:1;;2281:110;-1:-1:-1;2281:110:1:o;2396:254::-;2464:6;2472;2525:2;2513:9;2504:7;2500:23;2496:32;2493:2;;;2541:1;2538;2531:12;2493:2;2577:9;2564:23;2554:33;;2606:38;2640:2;2629:9;2625:18;2606:38;:::i;:::-;2596:48;;2483:167;;;;;:::o;2655:286::-;2713:6;2766:2;2754:9;2745:7;2741:23;2737:32;2734:2;;;2782:1;2779;2772:12;2734:2;2808:23;;-1:-1:-1;;;;;;2860:32:1;;2850:43;;2840:2;;2907:1;2904;2897:12;2946:634;3025:6;3078:2;3066:9;3057:7;3053:23;3049:32;3046:2;;;3094:1;3091;3084:12;3046:2;3127:9;3121:16;3160:18;3152:6;3149:30;3146:2;;;3192:1;3189;3182:12;3146:2;3215:22;;3268:4;3260:13;;3256:27;-1:-1:-1;3246:2:1;;3297:1;3294;3287:12;3246:2;3326;3320:9;3351:48;3367:31;3395:2;3367:31;:::i;3351:48::-;3422:2;3415:5;3408:17;3462:7;3457:2;3452;3448;3444:11;3440:20;3437:33;3434:2;;;3483:1;3480;3473:12;3434:2;3496:54;3547:2;3542;3535:5;3531:14;3526:2;3522;3518:11;3496:54;:::i;3770:184::-;3840:6;3893:2;3881:9;3872:7;3868:23;3864:32;3861:2;;;3909:1;3906;3899:12;3861:2;-1:-1:-1;3932:16:1;;3851:103;-1:-1:-1;3851:103:1:o;4218:388::-;4295:6;4303;4356:2;4344:9;4335:7;4331:23;4327:32;4324:2;;;4372:1;4369;4362:12;4324:2;4408:9;4395:23;4385:33;;4469:2;4458:9;4454:18;4441:32;4496:18;4488:6;4485:30;4482:2;;;4528:1;4525;4518:12;4611:257;4652:3;4690:5;4684:12;4717:6;4712:3;4705:19;4733:63;4789:6;4782:4;4777:3;4773:14;4766:4;4759:5;4755:16;4733:63;:::i;:::-;4850:2;4829:15;-1:-1:-1;;4825:29:1;4816:39;;;;4857:4;4812:50;;4660:208;-1:-1:-1;;4660:208:1:o;4873:657::-;4951:5;4945:12;4940:3;4933:25;5004:4;4997:5;4993:16;4987:23;5046:1;5042;5037:3;5033:11;5029:19;5098:2;5084:12;5080:21;5073:4;5068:3;5064:14;5057:45;5163:2;5155:4;5148:5;5144:16;5138:23;5134:32;5127:4;5122:3;5118:14;5111:56;;;5216:4;5209:5;5205:16;5199:23;5192:4;5187:3;5183:14;5176:47;5272:4;5265:5;5261:16;5255:23;5248:4;5243:3;5239:14;5232:47;5328:4;5321:5;5317:16;5311:23;5304:4;5299:3;5295:14;5288:47;5384:4;5377:5;5373:16;5367:23;5360:4;5355:3;5351:14;5344:47;5440:4;5433:5;5429:16;5423:23;5416:4;5411:3;5407:14;5400:47;5466:6;5519:2;5512:5;5508:14;5502:21;5497:2;5492:3;5488:12;5481:43;;4923:607;;:::o;5535:786::-;5946:25;5941:3;5934:38;5916:3;6001:6;5995:13;6017:62;6072:6;6067:2;6062:3;6058:12;6051:4;6043:6;6039:17;6017:62;:::i;:::-;-1:-1:-1;;;6138:2:1;6098:16;;;6130:11;;;6123:40;6188:13;;6210:63;6188:13;6259:2;6251:11;;6244:4;6232:17;;6210:63;:::i;:::-;6293:17;6312:2;6289:26;;5924:397;-1:-1:-1;;;;5924:397:1:o;6534:314::-;-1:-1:-1;;;;;6709:32:1;;6691:51;;6778:2;6773;6758:18;;6751:30;;;-1:-1:-1;;6798:44:1;;6823:18;;6815:6;6798:44;:::i;6853:474::-;-1:-1:-1;;;;;7074:32:1;;7056:51;;7143:2;7138;7123:18;;7116:30;;;-1:-1:-1;;7169:44:1;;7194:18;;7186:6;7169:44;:::i;:::-;7261:9;7253:6;7249:22;7244:2;7233:9;7229:18;7222:50;7289:32;7314:6;7306;7289:32;:::i;:::-;7281:40;7046:281;-1:-1:-1;;;;;;7046:281:1:o;7611:658::-;7782:2;7834:21;;;7904:13;;7807:18;;;7926:22;;;7753:4;;7782:2;8005:15;;;;7979:2;7964:18;;;7753:4;8048:195;8062:6;8059:1;8056:13;8048:195;;;8127:13;;-1:-1:-1;;;;;8123:39:1;8111:52;;8218:15;;;;8183:12;;;;8159:1;8077:9;8048:195;;;-1:-1:-1;8260:3:1;;7762:507;-1:-1:-1;;;;;;7762:507:1:o;8274:702::-;8493:2;8545:21;;;8615:13;;8518:18;;;8637:22;;;8464:4;;8493:2;8716:15;;;;8690:2;8675:18;;;8464:4;8759:191;8773:6;8770:1;8767:13;8759:191;;;8822:44;8862:3;8853:6;8847:13;8822:44;:::i;:::-;8925:15;;;;8895:6;8886:16;;;;;8795:1;8788:9;8759:191;;9355:217;9502:2;9491:9;9484:21;9465:4;9522:44;9562:2;9551:9;9547:18;9539:6;9522:44;:::i;11684:340::-;11886:2;11868:21;;;11925:2;11905:18;;;11898:30;-1:-1:-1;;;11959:2:1;11944:18;;11937:46;12015:2;12000:18;;11858:166::o;13149:244::-;13331:3;13316:19;;13344:43;13320:9;13369:6;13344:43;:::i;14716:275::-;14787:2;14781:9;14852:2;14833:13;;-1:-1:-1;;14829:27:1;14817:40;;14887:18;14872:34;;14908:22;;;14869:62;14866:2;;;14934:18;;:::i;:::-;14970:2;14963:22;14761:230;;-1:-1:-1;14761:230:1:o;14996:186::-;15044:4;15077:18;15069:6;15066:30;15063:2;;;15099:18;;:::i;:::-;-1:-1:-1;15165:2:1;15144:15;-1:-1:-1;;15140:29:1;15171:4;15136:40;;15053:129::o;15187:128::-;15227:3;15258:1;15254:6;15251:1;15248:13;15245:2;;;15264:18;;:::i;:::-;-1:-1:-1;15300:9:1;;15235:80::o;15320:120::-;15360:1;15386;15376:2;;15391:18;;:::i;:::-;-1:-1:-1;15425:9:1;;15366:74::o;15445:168::-;15485:7;15551:1;15547;15543:6;15539:14;15536:1;15533:21;15528:1;15521:9;15514:17;15510:45;15507:2;;;15558:18;;:::i;:::-;-1:-1:-1;15598:9:1;;15497:116::o;15618:125::-;15658:4;15686:1;15683;15680:8;15677:2;;;15691:18;;:::i;:::-;-1:-1:-1;15728:9:1;;15667:76::o;15748:258::-;15820:1;15830:113;15844:6;15841:1;15838:13;15830:113;;;15920:11;;;15914:18;15901:11;;;15894:39;15866:2;15859:10;15830:113;;;15961:6;15958:1;15955:13;15952:2;;;15996:1;15987:6;15982:3;15978:16;15971:27;15952:2;;15801:205;;;:::o;16011:136::-;16050:3;16078:5;16068:2;;16087:18;;:::i;:::-;-1:-1:-1;;;16123:18:1;;16058:89::o;16152:380::-;16231:1;16227:12;;;;16274;;;16295:2;;16349:4;16341:6;16337:17;16327:27;;16295:2;16402;16394:6;16391:14;16371:18;16368:38;16365:2;;;16448:10;16443:3;16439:20;16436:1;16429:31;16483:4;16480:1;16473:15;16511:4;16508:1;16501:15;16365:2;;16207:325;;;:::o;16537:135::-;16576:3;-1:-1:-1;;16597:17:1;;16594:2;;;16617:18;;:::i;:::-;-1:-1:-1;16664:1:1;16653:13;;16584:88::o;16677:112::-;16709:1;16735;16725:2;;16740:18;;:::i;:::-;-1:-1:-1;16774:9:1;;16715:74::o;16794:127::-;16855:10;16850:3;16846:20;16843:1;16836:31;16886:4;16883:1;16876:15;16910:4;16907:1;16900:15;16926:127;16987:10;16982:3;16978:20;16975:1;16968:31;17018:4;17015:1;17008:15;17042:4;17039:1;17032:15;17058:127;17119:10;17114:3;17110:20;17107:1;17100:31;17150:4;17147:1;17140:15;17174:4;17171:1;17164:15;17190:127;17251:10;17246:3;17242:20;17239:1;17232:31;17282:4;17279:1;17272:15;17306:4;17303:1;17296:15;17322:127;17383:10;17378:3;17374:20;17371:1;17364:31;17414:4;17411:1;17404:15;17438:4;17435:1;17428:15

Swarm Source

ipfs://649fc0d69b89f4d00f7191f7e952405b455a0fdffb5d4b6d795b3381d87b75d2
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading

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.