Contract 0x9048278cA7e874F9338e4898C436Ab07AA454701

Contract Overview

Balance:
0 Ether
Txn Hash Method
Block
From
To
Value
0xfc8935b926eca8b97f06dd1dddebda634ad99d806a1afee8ec1cc7af085d678aAdd Module244241732021-04-23 22:04:3224 days 22 hrs ago0x69bdb276a17dd90f9d3a545944ccb20e593ae8e3 IN  0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether0.0000730391
0x0ff134150778ffb9f1defa0bc96a191804ef084331b1758cf6658cda53a25ba1Add Module244207442021-04-23 18:10:2025 days 2 hrs ago0x69bdb276a17dd90f9d3a545944ccb20e593ae8e3 IN  0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether0.0003651955
0xf33d898b880f711afd60822d5db9a00d13eb41d0cac24a55aad51deba6babbeeAdd Module243615882021-04-20 23:26:2827 days 20 hrs ago0x69bdb276a17dd90f9d3a545944ccb20e593ae8e3 IN  0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether0.0003651955
0x4b34bbea0a0a95907d3496cc793d331979468dc217ec9ca0ace3e04c9222e089Add Module240234672021-03-23 1:15:5656 days 19 hrs ago0x69bdb276a17dd90f9d3a545944ccb20e593ae8e3 IN  0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether0.0003651955
0x26e0c64d7931d117a556e73552540ec05891585458bba56ceef93a5151269ca2Add Module240232432021-03-23 0:46:0456 days 19 hrs ago0x69bdb276a17dd90f9d3a545944ccb20e593ae8e3 IN  0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether0.0003651955
0xa308cfba53756737f0101b230f2ce5dbf2a14c884d3a74f644f98dabe167f438Add Factory239396412021-03-16 3:41:2063 days 16 hrs ago0x69bdb276a17dd90f9d3a545944ccb20e593ae8e3 IN  0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether0.0007303910
0x31aeb14ec809eb30d1b90a3e78b38d9ef48211fd16073b1be2b28e08d568a61fAdd Module237813152021-03-06 3:53:1673 days 16 hrs ago0x69bdb276a17dd90f9d3a545944ccb20e593ae8e3 IN  0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether0.00525880872
0x4e77bef8d2de46dde0854a2e1cebf7f7de550e3779be24fe79cb2884845a23b8Add Module237104612021-03-01 17:40:2078 days 2 hrs ago0x69bdb276a17dd90f9d3a545944ccb20e593ae8e3 IN  0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether0.00109266088414.959965017
0xe9e6c776ddb53ecfe2d075d15ca8f8878e41f5ac96f92b67773cd59bdeb2c793Add Module237038712021-03-01 7:51:1678 days 12 hrs ago0x69bdb276a17dd90f9d3a545944ccb20e593ae8e3 IN  0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether0.0005843128
0xff4cdad8ffb9d19c7e728dae330e2d915797c561d5333b6e0753343144120a48Add Module237036782021-03-01 7:34:0878 days 12 hrs ago0x69bdb276a17dd90f9d3a545944ccb20e593ae8e3 IN  0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether0.0005842168
0x6724e6da776d11193b096939318d113a22c2119b669a156d1a76fb80132a3996Add Module237035822021-03-01 7:25:3678 days 12 hrs ago0x69bdb276a17dd90f9d3a545944ccb20e593ae8e3 IN  0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether0.0005843128
0xfe4b64cd73342dfcf80f956b424b5bcbabd88404fb420c19ab3b0faede8a520fRemove Module236208452021-02-23 23:32:4883 days 20 hrs ago0x69bdb276a17dd90f9d3a545944ccb20e593ae8e3 IN  0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether0.0029977620
0xb765a1e1c8e3d238e8e7d2f323629579e3e002b2b3ad5778eed31c247adaf684Remove Module236208422021-02-23 23:32:3283 days 20 hrs ago0x69bdb276a17dd90f9d3a545944ccb20e593ae8e3 IN  0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether0.0031378220
0x38649943cfd9cfe37732ea60a8286b5f1ae7ea509ca9997854d01924cb4c8abdAdd Module236207752021-02-23 23:26:3683 days 20 hrs ago0x69bdb276a17dd90f9d3a545944ccb20e593ae8e3 IN  0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether0.00032867554.5
0xdcff6cbd09ebde714a779a511162997a782a88f4deebd3d065a10c79b082b9a0Add Module236207722021-02-23 23:26:2083 days 20 hrs ago0x69bdb276a17dd90f9d3a545944ccb20e593ae8e3 IN  0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether0.00032867554.5
0xbaf860ea51067929caf065182e5218c33c9c06c034dd027546677343b3ac00b6Add Module236207632021-02-23 23:25:3283 days 20 hrs ago0x69bdb276a17dd90f9d3a545944ccb20e593ae8e3 IN  0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether0.00032862154.5
0x7c2c5448b57bd414f528a9754e847597d8c281a6540ab364739ce3b3e6472c83Add Module235089602021-02-17 1:12:5290 days 19 hrs ago0x69bdb276a17dd90f9d3a545944ccb20e593ae8e3 IN  0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether0.00032867554.5
0x4d9587704bab8bf783d767b867a1255e1fb2d4cf77a5dd22c2383a6b561e48c0Add Module235089582021-02-17 1:12:4490 days 19 hrs ago0x69bdb276a17dd90f9d3a545944ccb20e593ae8e3 IN  0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether0.00032867554.5
0xff04d4f0dddbf67121a01d596cd6ec55f919b9c6a164d80dea9b2b98e5ce52cdAdd Module235089492021-02-17 1:11:5690 days 19 hrs ago0x69bdb276a17dd90f9d3a545944ccb20e593ae8e3 IN  0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether0.00032867554.5
0xcd1e5116f8b504037609266cea0fb22bd2a12e996ddf8226ff6e415eaaa4b5b3Initialize233907742021-02-09 17:03:4898 days 3 hrs ago0x873c532db621bd7422da182569cb978ffa5fb6be IN  0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether0.00011568154.5
0x28d483c6c66b4fda54af30152345bf20d8feafbf2e5940b63ee157fa6780f084Add Module233765512021-02-08 19:55:4099 days 26 mins ago0x69bdb276a17dd90f9d3a545944ccb20e593ae8e3 IN  0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether0.00032867554.5
0x993dc52f013854762999dcbd720e73c406b05222e445c5cf9aa65f4529181466Add Module233765482021-02-08 19:55:2499 days 27 mins ago0x69bdb276a17dd90f9d3a545944ccb20e593ae8e3 IN  0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether0.00032867554.5
0x7164d0b66507b8714c7fdafa5dcf3ec031e56a84f9100988f630e4363d98d105Add Module232190472021-01-30 1:02:36108 days 19 hrs ago0x69bdb276a17dd90f9d3a545944ccb20e593ae8e3 IN  0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether0.00032867554.5
0x887c455dad7df36d8aa8bed8f63961bbdb5db7aeb9133d4bfdf7b3c3ba828bf2Add Module232187962021-01-30 0:40:12108 days 19 hrs ago0x69bdb276a17dd90f9d3a545944ccb20e593ae8e3 IN  0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether0.00032867554.5
0xc1cd6f685517a84d00983dfd1aa51b5e0aa3e864fbe0749bf30ada20e3b44deeAdd Module220862652020-11-13 20:34:28185 days 23 hrs ago0x69bdb276a17dd90f9d3a545944ccb20e593ae8e3 IN  0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether0.0014607820
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xeb070b334bc02a2d92e15865d9f96b505a97c8c93bb1ca482e2c38622bb5eb07248756502021-05-16 19:11:002 days 1 hr ago 0x0437c39a59c42e367c00bc3c95999feb799bce1a 0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether
0xeb070b334bc02a2d92e15865d9f96b505a97c8c93bb1ca482e2c38622bb5eb07248756502021-05-16 19:11:002 days 1 hr ago 0x0437c39a59c42e367c00bc3c95999feb799bce1a 0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether
0xeb070b334bc02a2d92e15865d9f96b505a97c8c93bb1ca482e2c38622bb5eb07248756502021-05-16 19:11:002 days 1 hr ago 0x0437c39a59c42e367c00bc3c95999feb799bce1a 0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether
0xeb070b334bc02a2d92e15865d9f96b505a97c8c93bb1ca482e2c38622bb5eb07248756502021-05-16 19:11:002 days 1 hr ago 0x0437c39a59c42e367c00bc3c95999feb799bce1a 0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether
0xeb070b334bc02a2d92e15865d9f96b505a97c8c93bb1ca482e2c38622bb5eb07248756502021-05-16 19:11:002 days 1 hr ago 0x0437c39a59c42e367c00bc3c95999feb799bce1a 0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether
0xeb070b334bc02a2d92e15865d9f96b505a97c8c93bb1ca482e2c38622bb5eb07248756502021-05-16 19:11:002 days 1 hr ago 0x676c7b527c706801e64ad2108aa1f0ddc83807d0 0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether
0xeb070b334bc02a2d92e15865d9f96b505a97c8c93bb1ca482e2c38622bb5eb07248756502021-05-16 19:11:002 days 1 hr ago 0x0437c39a59c42e367c00bc3c95999feb799bce1a 0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether
0xeb070b334bc02a2d92e15865d9f96b505a97c8c93bb1ca482e2c38622bb5eb07248756502021-05-16 19:11:002 days 1 hr ago 0x0437c39a59c42e367c00bc3c95999feb799bce1a 0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether
0xeb070b334bc02a2d92e15865d9f96b505a97c8c93bb1ca482e2c38622bb5eb07248756502021-05-16 19:11:002 days 1 hr ago 0x0437c39a59c42e367c00bc3c95999feb799bce1a 0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether
0xeb070b334bc02a2d92e15865d9f96b505a97c8c93bb1ca482e2c38622bb5eb07248756502021-05-16 19:11:002 days 1 hr ago 0x676c7b527c706801e64ad2108aa1f0ddc83807d0 0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether
0xeb070b334bc02a2d92e15865d9f96b505a97c8c93bb1ca482e2c38622bb5eb07248756502021-05-16 19:11:002 days 1 hr ago 0x676c7b527c706801e64ad2108aa1f0ddc83807d0 0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether
0xff7419d8ee4c205645915dbac25866cc940f433e1ad364bc8c8b4cc2b6fe1bfc247140742021-05-07 14:41:2411 days 5 hrs ago 0xed1fe1994c6c50c19811ea0534e923c91b8c1632 0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether
0xff7419d8ee4c205645915dbac25866cc940f433e1ad364bc8c8b4cc2b6fe1bfc247140742021-05-07 14:41:2411 days 5 hrs ago 0x8a070235a4b9b477655bf4eb65a1db81051b3cc1 0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether
0xff7419d8ee4c205645915dbac25866cc940f433e1ad364bc8c8b4cc2b6fe1bfc247140742021-05-07 14:41:2411 days 5 hrs ago 0x8a070235a4b9b477655bf4eb65a1db81051b3cc1 0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether
0x2bffb200d3f6bd8014f68f270a4348fdeb5d620e4ac8ae4d802abd062f3dd84a247139262021-05-07 14:31:3211 days 5 hrs ago 0xed1fe1994c6c50c19811ea0534e923c91b8c1632 0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether
0x2bffb200d3f6bd8014f68f270a4348fdeb5d620e4ac8ae4d802abd062f3dd84a247139262021-05-07 14:31:3211 days 5 hrs ago 0x8a070235a4b9b477655bf4eb65a1db81051b3cc1 0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether
0x2bffb200d3f6bd8014f68f270a4348fdeb5d620e4ac8ae4d802abd062f3dd84a247139262021-05-07 14:31:3211 days 5 hrs ago 0x8a070235a4b9b477655bf4eb65a1db81051b3cc1 0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether
0x06304085823c58ccf9f4a7642c76aec4780baa939932e0b2507429ad26d1eed8247137482021-05-07 14:19:2811 days 6 hrs ago 0xc93c8cde0edf4963ea1eea156099b285a945210a 0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether
0x06304085823c58ccf9f4a7642c76aec4780baa939932e0b2507429ad26d1eed8247137482021-05-07 14:19:2811 days 6 hrs ago 0xc93c8cde0edf4963ea1eea156099b285a945210a 0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether
0x4f631e67924d9ac780c728f44428a1b5faa9f60abeecad1a3adf00b64b3cf1bb247136142021-05-07 14:10:3211 days 6 hrs ago 0xc93c8cde0edf4963ea1eea156099b285a945210a 0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether
0x4f631e67924d9ac780c728f44428a1b5faa9f60abeecad1a3adf00b64b3cf1bb247136142021-05-07 14:10:3211 days 6 hrs ago 0xc93c8cde0edf4963ea1eea156099b285a945210a 0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether
0x944c5d76cbc126748849a33b5586dfed2f9f287c6305b0b00446671c5a399f6c247135862021-05-07 14:08:3211 days 6 hrs ago 0xc93c8cde0edf4963ea1eea156099b285a945210a 0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether
0x944c5d76cbc126748849a33b5586dfed2f9f287c6305b0b00446671c5a399f6c247135862021-05-07 14:08:3211 days 6 hrs ago 0xc93c8cde0edf4963ea1eea156099b285a945210a 0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether
0x29006bedc04358f2b5ce8242ac02a8b7e9d2bd617e2a8473da3a0fdabd2e7259247135462021-05-07 14:05:5211 days 6 hrs ago 0xc93c8cde0edf4963ea1eea156099b285a945210a 0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether
0x29006bedc04358f2b5ce8242ac02a8b7e9d2bd617e2a8473da3a0fdabd2e7259247135462021-05-07 14:05:5211 days 6 hrs ago 0xc93c8cde0edf4963ea1eea156099b285a945210a 0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether
[ Download CSV Export 
Loading

Contract Source Code Verified (Similar Match)
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0xF2d421944c8BF2F9338166035b1DFFd767c1a8F5

Contract Name:
Controller

Compiler Version
v0.6.10+commit.00c0fcaf

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Apache-2.0 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-09-06
*/

// Dependency file: @openzeppelin/contracts/GSN/Context.sol



// pragma solidity ^0.6.0;

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

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

// Dependency file: contracts/lib/AddressArrayUtils.sol

/*
    Copyright 2020 Set Labs Inc.

    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.


*/

// pragma solidity 0.6.10;

/**
 * @title AddressArrayUtils
 * @author Set Protocol
 *
 * Utility functions to handle Address Arrays
 */
library AddressArrayUtils {

    /**
     * Finds the index of the first occurrence of the given element.
     * @param A The input array to search
     * @param a The value to find
     * @return Returns (index and isIn) for the first occurrence starting from index 0
     */
    function indexOf(address[] memory A, address a) internal pure returns (uint256, bool) {
        uint256 length = A.length;
        for (uint256 i = 0; i < length; i++) {
            if (A[i] == a) {
                return (i, true);
            }
        }
        return (uint256(-1), false);
    }

    /**
    * Returns true if the value is present in the list. Uses indexOf internally.
    * @param A The input array to search
    * @param a The value to find
    * @return Returns isIn for the first occurrence starting from index 0
    */
    function contains(address[] memory A, address a) internal pure returns (bool) {
        (, bool isIn) = indexOf(A, a);
        return isIn;
    }

    /**
    * Returns true if there are 2 elements that are the same in an array
    * @param A The input array to search
    * @return Returns boolean for the first occurrence of a duplicate
    */
    function hasDuplicate(address[] memory A) internal pure returns(bool) {
        require(A.length > 0, "A is empty");

        for (uint256 i = 0; i < A.length - 1; i++) {
            address current = A[i];
            for (uint256 j = i + 1; j < A.length; j++) {
                if (current == A[j]) {
                    return true;
                }
            }
        }
        return false;
    }

    /**
     * @param A The input array to search
     * @param a The address to remove     
     * @return Returns the array with the object removed.
     */
    function remove(address[] memory A, address a)
        internal
        pure
        returns (address[] memory)
    {
        (uint256 index, bool isIn) = indexOf(A, a);
        if (!isIn) {
            revert("Address not in array.");
        } else {
            (address[] memory _A,) = pop(A, index);
            return _A;
        }
    }

    /**
    * Removes specified index from array
    * @param A The input array to search
    * @param index The index to remove
    * @return Returns the new array and the removed entry
    */
    function pop(address[] memory A, uint256 index)
        internal
        pure
        returns (address[] memory, address)
    {
        uint256 length = A.length;
        require(index < A.length, "Index must be < A length");
        address[] memory newAddresses = new address[](length - 1);
        for (uint256 i = 0; i < index; i++) {
            newAddresses[i] = A[i];
        }
        for (uint256 j = index + 1; j < length; j++) {
            newAddresses[j - 1] = A[j];
        }
        return (newAddresses, A[index]);
    }
}
// Dependency file: @openzeppelin/contracts/access/Ownable.sol



// pragma solidity ^0.6.0;

// import "../GSN/Context.sol";
/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// Dependency file: @openzeppelin/contracts/token/ERC20/IERC20.sol



// pragma solidity ^0.6.0;

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

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

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

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

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

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

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

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

/*
    Copyright 2020 Set Labs Inc.

    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.


*/

pragma solidity 0.6.10;

// import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
// import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";
// import { AddressArrayUtils } from "../lib/AddressArrayUtils.sol";


/**
 * @title Controller
 * @author Set Protocol
 *
 * Contract that houses state for approvals and system contracts such as added Sets,
 * modules, factories, resources (like price oracles), and protocol fee configurations.
 */
contract Controller is Ownable {
    using AddressArrayUtils for address[];

    /* ============ Events ============ */

    event FactoryAdded(address indexed _factory);
    event FactoryRemoved(address indexed _factory);
    event FeeEdited(address indexed _module, uint256 indexed _feeType, uint256 _feePercentage);
    event FeeRecipientChanged(address _newFeeRecipient);
    event ModuleAdded(address indexed _module);
    event ModuleRemoved(address indexed _module);
    event ResourceAdded(address indexed _resource, uint256 _id);
    event ResourceRemoved(address indexed _resource, uint256 _id);
    event SetAdded(address indexed _setToken, address indexed _factory);
    event SetRemoved(address indexed _setToken);

    /* ============ Modifiers ============ */

    /**
     * Throws if function is called by any address other than a valid factory.
     */
    modifier onlyFactory() {
        require(isFactory[msg.sender], "Only valid factories can call");
        _;
    }

    modifier onlyInitialized() {
        require(isInitialized, "Contract must be initialized.");
        _;
    }

    /* ============ State Variables ============ */

    // List of enabled Sets
    address[] public sets;
    // List of enabled factories of SetTokens
    address[] public factories;
    // List of enabled Modules; Modules extend the functionality of SetTokens
    address[] public modules;
    // List of enabled Resources; Resources provide data, functionality, or
    // permissions that can be drawn upon from Module, SetTokens or factories
    address[] public resources;

    // Mappings to check whether address is valid Set, Factory, Module or Resource
    mapping(address => bool) public isSet;
    mapping(address => bool) public isFactory;
    mapping(address => bool) public isModule;
    mapping(address => bool) public isResource;

    // Mapping of modules to fee types to fee percentage. A module can have multiple feeTypes
    // Fee is denominated in precise unit percentages (100% = 1e18, 1% = 1e16)
    mapping(address => mapping(uint256 => uint256)) public fees;

    // Mapping of resource ID to resource address, which allows contracts to fetch the correct
    // resource while providing an ID
    mapping(uint256 => address) public resourceId;

    // Recipient of protocol fees
    address public feeRecipient;

    // Return true if the controller is initialized
    bool public isInitialized;

    /* ============ Constructor ============ */

    /**
     * Initializes the initial fee recipient on deployment.
     *
     * @param _feeRecipient          Address of the initial protocol fee recipient
     */
    constructor(address _feeRecipient) public {
        feeRecipient = _feeRecipient;
    }

    /* ============ External Functions ============ */

    /**
     * Initializes any predeployed factories, modules, and resources post deployment. Note: This function can
     * only be called by the owner once to batch initialize the initial system contracts.
     *
     * @param _factories             List of factories to add
     * @param _modules               List of modules to add
     * @param _resources             List of resources to add
     * @param _resourceIds           List of resource IDs associated with the resources
     */
    function initialize(
        address[] memory _factories,
        address[] memory _modules,
        address[] memory _resources,
        uint256[] memory _resourceIds
    )
        external
        onlyOwner
    {
        require(!isInitialized, "Controller is already initialized");
        require(_resources.length == _resourceIds.length, "Array lengths do not match.");

        factories = _factories;
        modules = _modules;
        resources = _resources;

        // Loop through and initialize isModule, isFactory, and isResource mapping
        for (uint256 i = 0; i < _factories.length; i++) {
            require(_factories[i] != address(0), "Zero address submitted.");
            isFactory[_factories[i]] = true;
        }
        for (uint256 i = 0; i < _modules.length; i++) {
            require(_modules[i] != address(0), "Zero address submitted.");
            isModule[_modules[i]] = true;
        }

        for (uint256 i = 0; i < _resources.length; i++) {
            require(_resources[i] != address(0), "Zero address submitted.");
            require(resourceId[_resourceIds[i]] == address(0), "Resource ID already exists");
            isResource[_resources[i]] = true;
            resourceId[_resourceIds[i]] = _resources[i];
        }

        // Set to true to only allow initialization once
        isInitialized = true;
    }

    /**
     * PRIVILEGED FACTORY FUNCTION. Adds a newly deployed SetToken as an enabled SetToken.
     *
     * @param _setToken               Address of the SetToken contract to add
     */
    function addSet(address _setToken) external onlyInitialized onlyFactory {
        require(!isSet[_setToken], "Set already exists");

        isSet[_setToken] = true;

        sets.push(_setToken);

        emit SetAdded(_setToken, msg.sender);
    }

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Allows governance to remove a Set
     *
     * @param _setToken               Address of the SetToken contract to remove
     */
    function removeSet(address _setToken) external onlyInitialized onlyOwner {
        require(isSet[_setToken], "Set does not exist");

        sets = sets.remove(_setToken);

        isSet[_setToken] = false;

        emit SetRemoved(_setToken);
    }

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Allows governance to add a factory
     *
     * @param _factory               Address of the factory contract to add
     */
    function addFactory(address _factory) external onlyInitialized onlyOwner {
        require(!isFactory[_factory], "Factory already exists");

        isFactory[_factory] = true;

        factories.push(_factory);

        emit FactoryAdded(_factory);
    }

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Allows governance to remove a factory
     *
     * @param _factory               Address of the factory contract to remove
     */
    function removeFactory(address _factory) external onlyInitialized onlyOwner {
        require(isFactory[_factory], "Factory does not exist");

        factories = factories.remove(_factory);

        isFactory[_factory] = false;

        emit FactoryRemoved(_factory);
    }

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Allows governance to add a module
     *
     * @param _module               Address of the module contract to add
     */
    function addModule(address _module) external onlyInitialized onlyOwner {
        require(!isModule[_module], "Module already exists");

        isModule[_module] = true;

        modules.push(_module);

        emit ModuleAdded(_module);
    }

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Allows governance to remove a module
     *
     * @param _module               Address of the module contract to remove
     */
    function removeModule(address _module) external onlyInitialized onlyOwner {
        require(isModule[_module], "Module does not exist");

        modules = modules.remove(_module);

        isModule[_module] = false;

        emit ModuleRemoved(_module);
    }

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Allows governance to add a resource
     *
     * @param _resource               Address of the resource contract to add
     * @param _id                     New ID of the resource contract
     */
    function addResource(address _resource, uint256 _id) external onlyInitialized onlyOwner {
        require(!isResource[_resource], "Resource already exists");

        require(resourceId[_id] == address(0), "Resource ID already exists");

        isResource[_resource] = true;

        resourceId[_id] = _resource;

        resources.push(_resource);

        emit ResourceAdded(_resource, _id);
    }

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Allows governance to remove a resource
     *
     * @param _id               ID of the resource contract to remove
     */
    function removeResource(uint256 _id) external onlyInitialized onlyOwner {
        address resourceToRemove = resourceId[_id];

        require(resourceToRemove != address(0), "Resource does not exist");

        resources = resources.remove(resourceToRemove);

        delete resourceId[_id];

        isResource[resourceToRemove] = false;

        emit ResourceRemoved(resourceToRemove, _id);
    }

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Allows governance to add a fee to a module
     *
     * @param _module               Address of the module contract to add fee to
     * @param _feeType              Type of the fee to add in the module
     * @param _newFeePercentage     Percentage of fee to add in the module (denominated in preciseUnits eg 1% = 1e16)
     */
    function addFee(address _module, uint256 _feeType, uint256 _newFeePercentage) external onlyInitialized onlyOwner {
        require(isModule[_module], "Module does not exist");

        require(fees[_module][_feeType] == 0, "Fee type already exists on module");

        fees[_module][_feeType] = _newFeePercentage;

        emit FeeEdited(_module, _feeType, _newFeePercentage);
    }

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Allows governance to edit a fee in an existing module
     *
     * @param _module               Address of the module contract to edit fee
     * @param _feeType              Type of the fee to edit in the module
     * @param _newFeePercentage     Percentage of fee to edit in the module (denominated in preciseUnits eg 1% = 1e16)
     */
    function editFee(address _module, uint256 _feeType, uint256 _newFeePercentage) external onlyInitialized onlyOwner {
        require(isModule[_module], "Module does not exist");

        require(fees[_module][_feeType] != 0, "Fee type does not exist on module");

        fees[_module][_feeType] = _newFeePercentage;

        emit FeeEdited(_module, _feeType, _newFeePercentage);
    }

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Allows governance to edit the protocol fee recipient
     *
     * @param _newFeeRecipient      Address of the new protocol fee recipient
     */
    function editFeeRecipient(address _newFeeRecipient) external onlyInitialized onlyOwner {
        require(_newFeeRecipient != address(0), "Address must not be 0");

        feeRecipient = _newFeeRecipient;

        emit FeeRecipientChanged(_newFeeRecipient);
    }

    /* ============ External Getter Functions ============ */

    function getModuleFee(
        address _moduleAddress,
        uint256 _feeType
    )
        external
        view
        returns (uint256)
    {
        return fees[_moduleAddress][_feeType];
    }

    function getFactories() external view returns (address[] memory) {
        return factories;
    }

    function getModules() external view returns (address[] memory) {
        return modules;
    }

    function getResources() external view returns (address[] memory) {
        return resources;
    }

    function getSets() external view returns (address[] memory) {
        return sets;
    }

    /**
     * Check if a contract address is a module, Set, resource, factory or controller
     *
     * @param  _contractAddress           The contract address to check
     */
    function isSystemContract(address _contractAddress) external view returns (bool) {
        return (
            isSet[_contractAddress] ||
            isModule[_contractAddress] ||
            isResource[_contractAddress] ||
            isFactory[_contractAddress] ||
            _contractAddress == address(this)
        );
    }
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_feeRecipient","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_factory","type":"address"}],"name":"FactoryAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_factory","type":"address"}],"name":"FactoryRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_module","type":"address"},{"indexed":true,"internalType":"uint256","name":"_feeType","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_feePercentage","type":"uint256"}],"name":"FeeEdited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_newFeeRecipient","type":"address"}],"name":"FeeRecipientChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_module","type":"address"}],"name":"ModuleAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_module","type":"address"}],"name":"ModuleRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_resource","type":"address"},{"indexed":false,"internalType":"uint256","name":"_id","type":"uint256"}],"name":"ResourceAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_resource","type":"address"},{"indexed":false,"internalType":"uint256","name":"_id","type":"uint256"}],"name":"ResourceRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_setToken","type":"address"},{"indexed":true,"internalType":"address","name":"_factory","type":"address"}],"name":"SetAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_setToken","type":"address"}],"name":"SetRemoved","type":"event"},{"inputs":[{"internalType":"address","name":"_factory","type":"address"}],"name":"addFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_module","type":"address"},{"internalType":"uint256","name":"_feeType","type":"uint256"},{"internalType":"uint256","name":"_newFeePercentage","type":"uint256"}],"name":"addFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_module","type":"address"}],"name":"addModule","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_resource","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"addResource","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_setToken","type":"address"}],"name":"addSet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_module","type":"address"},{"internalType":"uint256","name":"_feeType","type":"uint256"},{"internalType":"uint256","name":"_newFeePercentage","type":"uint256"}],"name":"editFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newFeeRecipient","type":"address"}],"name":"editFeeRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"factories","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"fees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFactories","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_moduleAddress","type":"address"},{"internalType":"uint256","name":"_feeType","type":"uint256"}],"name":"getModuleFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getModules","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getResources","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSets","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_factories","type":"address[]"},{"internalType":"address[]","name":"_modules","type":"address[]"},{"internalType":"address[]","name":"_resources","type":"address[]"},{"internalType":"uint256[]","name":"_resourceIds","type":"uint256[]"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isFactory","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isModule","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isResource","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isSet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"}],"name":"isSystemContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"modules","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_factory","type":"address"}],"name":"removeFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_module","type":"address"}],"name":"removeModule","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"removeResource","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_setToken","type":"address"}],"name":"removeSet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"resourceId","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"resources","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"sets","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b506040516200299f3803806200299f8339818101604052602081101561003557600080fd5b5051600061004a6001600160e01b036100b916565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600b80546001600160a01b0319166001600160a01b03929092169190911790556100bd565b3390565b6128d280620000cd6000396000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c8063715018a61161011a578063a3c56615116100ad578063d580ded41161007c578063d580ded4146107b8578063e0b75317146107de578063e765ced61461080a578063f2fde38b14610827578063f36b9a9a1461084d576101fb565b8063a3c566151461055b578063b2494df314610782578063c1cc57b01461078a578063c5bb387b14610792576101fb565b80637e6cbb6a116100e95780637e6cbb6a1461050857806381b2248a146105105780638da5cb5b1461052d578063a063246114610535576101fb565b8063715018a61461047c57806374ebe3ec1461048457806376a5bcf6146104aa578063792aa04f146104dc576101fb565b806329ce1ec511610192578063469048401161016157806346904840146104145780634b37c73f1461041c5780635b227f9b14610442578063672383c41461045f576101fb565b806329ce1ec5146103685780632cf7c5311461038e578063392e53cd146103e657806342f6e389146103ee576101fb565b80631ed86f19116101ce5780631ed86f19146102a5578063207a9485146102cb578063244d6daa146102f1578063263a53621461032a576101fb565b806301b98339146102005780630f04ba671461021f57806313bc6d4b1461025957806319e2c3491461027f575b600080fd5b61021d6004803603602081101561021657600080fd5b503561087f565b005b6102456004803603602081101561023557600080fd5b50356001600160a01b0316610a81565b604080519115158252519081900360200190f35b6102456004803603602081101561026f57600080fd5b50356001600160a01b0316610a96565b61021d6004803603602081101561029557600080fd5b50356001600160a01b0316610b34565b61021d600480360360208110156102bb57600080fd5b50356001600160a01b0316610d03565b610245600480360360208110156102e157600080fd5b50356001600160a01b0316610e99565b61030e6004803603602081101561030757600080fd5b5035610eae565b604080516001600160a01b039092168252519081900360200190f35b6103566004803603604081101561034057600080fd5b506001600160a01b038135169060200135610ed5565b60408051918252519081900360200190f35b61021d6004803603602081101561037e57600080fd5b50356001600160a01b0316610ef2565b610396611089565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103d25781810151838201526020016103ba565b505050509050019250505060405180910390f35b6102456110ec565b6102456004803603602081101561040457600080fd5b50356001600160a01b03166110fc565b61030e611111565b61021d6004803603602081101561043257600080fd5b50356001600160a01b0316611120565b61030e6004803603602081101561045857600080fd5b50356112f3565b61030e6004803603602081101561047557600080fd5b5035611300565b61021d61130d565b6102456004803603602081101561049a57600080fd5b50356001600160a01b03166113af565b61021d600480360360608110156104c057600080fd5b506001600160a01b0381351690602081013590604001356113c4565b610356600480360360408110156104f257600080fd5b506001600160a01b03813516906020013561158b565b6103966115b3565b61030e6004803603602081101561052657600080fd5b5035611613565b61030e611620565b61021d6004803603602081101561054b57600080fd5b50356001600160a01b031661162f565b61021d6004803603608081101561057157600080fd5b810190602081018135600160201b81111561058b57600080fd5b82018360208201111561059d57600080fd5b803590602001918460208302840111600160201b831117156105be57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561060d57600080fd5b82018360208201111561061f57600080fd5b803590602001918460208302840111600160201b8311171561064057600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561068f57600080fd5b8201836020820111156106a157600080fd5b803590602001918460208302840111600160201b831117156106c257600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561071157600080fd5b82018360208201111561072357600080fd5b803590602001918460208302840111600160201b8311171561074457600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611801945050505050565b610396611cb1565b610396611d11565b61021d600480360360208110156107a857600080fd5b50356001600160a01b0316611d71565b61021d600480360360208110156107ce57600080fd5b50356001600160a01b0316611ebc565b61021d600480360360408110156107f457600080fd5b506001600160a01b03813516906020013561205c565b61030e6004803603602081101561082057600080fd5b503561228b565b61021d6004803603602081101561083d57600080fd5b50356001600160a01b03166122a6565b61021d6004803603606081101561086357600080fd5b506001600160a01b03813516906020810135906040013561239e565b600b54600160a01b900460ff166108cb576040805162461bcd60e51b815260206004820152601d602482015260008051602061285c833981519152604482015290519081900360640190fd5b6108d3612507565b6000546001600160a01b03908116911614610923576040805162461bcd60e51b8152602060048201819052602482015260008051602061283c833981519152604482015290519081900360640190fd5b6000818152600a60205260409020546001600160a01b03168061098d576040805162461bcd60e51b815260206004820152601760248201527f5265736f7572636520646f6573206e6f74206578697374000000000000000000604482015290519081900360640190fd5b6109fa8160048054806020026020016040519081016040528092919081815260200182805480156109e757602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116109c9575b505050505061250b90919063ffffffff16565b8051610a0e9160049160209091019061274a565b506000828152600a6020908152604080832080546001600160a01b03191690556001600160a01b0384168084526008835292819020805460ff19169055805185815290517fbc7961276d9fc2a4fe4fc4d817e48d15615364e5df46fa0d8fb45637582ae4f8929181900390910190a25050565b60066020526000908152604090205460ff1681565b6001600160a01b03811660009081526005602052604081205460ff1680610ad557506001600160a01b03821660009081526007602052604090205460ff165b80610af857506001600160a01b03821660009081526008602052604090205460ff165b80610b1b57506001600160a01b03821660009081526006602052604090205460ff165b80610b2e57506001600160a01b03821630145b92915050565b600b54600160a01b900460ff16610b80576040805162461bcd60e51b815260206004820152601d602482015260008051602061285c833981519152604482015290519081900360640190fd5b610b88612507565b6000546001600160a01b03908116911614610bd8576040805162461bcd60e51b8152602060048201819052602482015260008051602061283c833981519152604482015290519081900360640190fd5b6001600160a01b03811660009081526005602052604090205460ff16610c3a576040805162461bcd60e51b815260206004820152601260248201527114d95d08191bd95cc81b9bdd08195e1a5cdd60721b604482015290519081900360640190fd5b610ca58160018054806020026020016040519081016040528092919081815260200182805480156109e7576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116109c957505050505061250b90919063ffffffff16565b8051610cb99160019160209091019061274a565b506001600160a01b038116600081815260056020526040808220805460ff19169055517f8e0c505159e335da41fb50766da0ed86ceb6c429d0e6b431e8542cc6c3271b539190a250565b600b54600160a01b900460ff16610d4f576040805162461bcd60e51b815260206004820152601d602482015260008051602061285c833981519152604482015290519081900360640190fd5b610d57612507565b6000546001600160a01b03908116911614610da7576040805162461bcd60e51b8152602060048201819052602482015260008051602061283c833981519152604482015290519081900360640190fd5b6001600160a01b03811660009081526007602052604090205460ff1615610e0d576040805162461bcd60e51b81526020600482015260156024820152744d6f64756c6520616c72656164792065786973747360581b604482015290519081900360640190fd5b6001600160a01b038116600081815260076020526040808220805460ff1916600190811790915560038054918201815583527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b03191684179055517fead6a006345da1073a106d5f32372d2d2204f46cb0b4bca8f5ebafcbbed12b8a9190a250565b60086020526000908152604090205460ff1681565b60048181548110610ebb57fe5b6000918252602090912001546001600160a01b0316905081565b600960209081526000928352604080842090915290825290205481565b600b54600160a01b900460ff16610f3e576040805162461bcd60e51b815260206004820152601d602482015260008051602061285c833981519152604482015290519081900360640190fd5b610f46612507565b6000546001600160a01b03908116911614610f96576040805162461bcd60e51b8152602060048201819052602482015260008051602061283c833981519152604482015290519081900360640190fd5b6001600160a01b03811660009081526006602052604090205460ff1615610ffd576040805162461bcd60e51b8152602060048201526016602482015275466163746f727920616c72656164792065786973747360501b604482015290519081900360640190fd5b6001600160a01b038116600081815260066020526040808220805460ff1916600190811790915560028054918201815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b03191684179055517f6fdc0147105e43e21da80a75b42d0fd464060d5e1a34b0cefbf0b4ccfc2e36a19190a250565b606060018054806020026020016040519081016040528092919081815260200182805480156110e157602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116110c3575b505050505090505b90565b600b54600160a01b900460ff1681565b60076020526000908152604090205460ff1681565b600b546001600160a01b031681565b600b54600160a01b900460ff1661116c576040805162461bcd60e51b815260206004820152601d602482015260008051602061285c833981519152604482015290519081900360640190fd5b611174612507565b6000546001600160a01b039081169116146111c4576040805162461bcd60e51b8152602060048201819052602482015260008051602061283c833981519152604482015290519081900360640190fd5b6001600160a01b03811660009081526006602052604090205460ff1661122a576040805162461bcd60e51b8152602060048201526016602482015275119858dd1bdc9e48191bd95cc81b9bdd08195e1a5cdd60521b604482015290519081900360640190fd5b6112958160028054806020026020016040519081016040528092919081815260200182805480156109e7576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116109c957505050505061250b90919063ffffffff16565b80516112a99160029160209091019061274a565b506001600160a01b038116600081815260066020526040808220805460ff19169055517fafa2737b2090fa39c66b7348625f0c03726240f724defbc6216d679506f944419190a250565b60018181548110610ebb57fe5b60028181548110610ebb57fe5b611315612507565b6000546001600160a01b03908116911614611365576040805162461bcd60e51b8152602060048201819052602482015260008051602061283c833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60056020526000908152604090205460ff1681565b600b54600160a01b900460ff16611410576040805162461bcd60e51b815260206004820152601d602482015260008051602061285c833981519152604482015290519081900360640190fd5b611418612507565b6000546001600160a01b03908116911614611468576040805162461bcd60e51b8152602060048201819052602482015260008051602061283c833981519152604482015290519081900360640190fd5b6001600160a01b03831660009081526007602052604090205460ff166114cd576040805162461bcd60e51b8152602060048201526015602482015274135bd91d5b1948191bd95cc81b9bdd08195e1a5cdd605a1b604482015290519081900360640190fd5b6001600160a01b038316600090815260096020908152604080832085845290915290205461152c5760405162461bcd60e51b81526004018080602001828103825260218152602001806127fa6021913960400191505060405180910390fd5b6001600160a01b0383166000818152600960209081526040808320868452825291829020849055815184815291518593927f84d9943a841552627b79770783a3cfd4da8303efc30bd75b65d863bd909926e392908290030190a3505050565b6001600160a01b03919091166000908152600960209081526040808320938352929052205490565b606060028054806020026020016040519081016040528092919081815260200182805480156110e1576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116110c3575050505050905090565b60038181548110610ebb57fe5b6000546001600160a01b031690565b600b54600160a01b900460ff1661167b576040805162461bcd60e51b815260206004820152601d602482015260008051602061285c833981519152604482015290519081900360640190fd5b611683612507565b6000546001600160a01b039081169116146116d3576040805162461bcd60e51b8152602060048201819052602482015260008051602061283c833981519152604482015290519081900360640190fd5b6001600160a01b03811660009081526007602052604090205460ff16611738576040805162461bcd60e51b8152602060048201526015602482015274135bd91d5b1948191bd95cc81b9bdd08195e1a5cdd605a1b604482015290519081900360640190fd5b6117a38160038054806020026020016040519081016040528092919081815260200182805480156109e7576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116109c957505050505061250b90919063ffffffff16565b80516117b79160039160209091019061274a565b506001600160a01b038116600081815260076020526040808220805460ff19169055517f0a1ee69f55c33d8467c69ca59ce2007a737a88603d75392972520bf67cb513b89190a250565b611809612507565b6000546001600160a01b03908116911614611859576040805162461bcd60e51b8152602060048201819052602482015260008051602061283c833981519152604482015290519081900360640190fd5b600b54600160a01b900460ff16156118a25760405162461bcd60e51b815260040180806020018281038252602181526020018061287c6021913960400191505060405180910390fd5b80518251146118f8576040805162461bcd60e51b815260206004820152601b60248201527f4172726179206c656e6774687320646f206e6f74206d617463682e0000000000604482015290519081900360640190fd5b835161190b90600290602087019061274a565b50825161191f90600390602086019061274a565b50815161193390600490602085019061274a565b5060005b8451811015611a015760006001600160a01b031685828151811061195757fe5b60200260200101516001600160a01b031614156119b5576040805162461bcd60e51b81526020600482015260176024820152762d32b9379030b2323932b9b99039bab136b4ba3a32b21760491b604482015290519081900360640190fd5b6001600660008784815181106119c757fe5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055600101611937565b5060005b8351811015611acf5760006001600160a01b0316848281518110611a2557fe5b60200260200101516001600160a01b03161415611a83576040805162461bcd60e51b81526020600482015260176024820152762d32b9379030b2323932b9b99039bab136b4ba3a32b21760491b604482015290519081900360640190fd5b600160076000868481518110611a9557fe5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055600101611a05565b5060005b8251811015611c975760006001600160a01b0316838281518110611af357fe5b60200260200101516001600160a01b03161415611b51576040805162461bcd60e51b81526020600482015260176024820152762d32b9379030b2323932b9b99039bab136b4ba3a32b21760491b604482015290519081900360640190fd5b60006001600160a01b0316600a6000848481518110611b6c57fe5b6020908102919091018101518252810191909152604001600020546001600160a01b031614611be2576040805162461bcd60e51b815260206004820152601a60248201527f5265736f7572636520494420616c726561647920657869737473000000000000604482015290519081900360640190fd5b600160086000858481518110611bf457fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550828181518110611c3f57fe5b6020026020010151600a6000848481518110611c5757fe5b602090810291909101810151825281019190915260400160002080546001600160a01b0319166001600160a01b0392909216919091179055600101611ad3565b5050600b805460ff60a01b1916600160a01b179055505050565b606060038054806020026020016040519081016040528092919081815260200182805480156110e1576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116110c3575050505050905090565b606060048054806020026020016040519081016040528092919081815260200182805480156110e1576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116110c3575050505050905090565b600b54600160a01b900460ff16611dbd576040805162461bcd60e51b815260206004820152601d602482015260008051602061285c833981519152604482015290519081900360640190fd5b611dc5612507565b6000546001600160a01b03908116911614611e15576040805162461bcd60e51b8152602060048201819052602482015260008051602061283c833981519152604482015290519081900360640190fd5b6001600160a01b038116611e68576040805162461bcd60e51b8152602060048201526015602482015274041646472657373206d757374206e6f74206265203605c1b604482015290519081900360640190fd5b600b80546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f167cccccc6e9b2892a740ec13fc1e51d3de8ea384f25bd87fee7412d588637e29181900360200190a150565b600b54600160a01b900460ff16611f08576040805162461bcd60e51b815260206004820152601d602482015260008051602061285c833981519152604482015290519081900360640190fd5b3360009081526006602052604090205460ff16611f6c576040805162461bcd60e51b815260206004820152601d60248201527f4f6e6c792076616c696420666163746f726965732063616e2063616c6c000000604482015290519081900360640190fd5b6001600160a01b03811660009081526005602052604090205460ff1615611fcf576040805162461bcd60e51b815260206004820152601260248201527153657420616c72656164792065786973747360701b604482015290519081900360640190fd5b6001600160a01b038116600081815260056020526040808220805460ff19166001908117909155805480820182559083527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b03191684179055513392917fdb18a8959c84999e8bddb4624081f905f78eb9d63ec80b48d3daf2d38ae660a291a350565b600b54600160a01b900460ff166120a8576040805162461bcd60e51b815260206004820152601d602482015260008051602061285c833981519152604482015290519081900360640190fd5b6120b0612507565b6000546001600160a01b03908116911614612100576040805162461bcd60e51b8152602060048201819052602482015260008051602061283c833981519152604482015290519081900360640190fd5b6001600160a01b03821660009081526008602052604090205460ff161561216e576040805162461bcd60e51b815260206004820152601760248201527f5265736f7572636520616c726561647920657869737473000000000000000000604482015290519081900360640190fd5b6000818152600a60205260409020546001600160a01b0316156121d8576040805162461bcd60e51b815260206004820152601a60248201527f5265736f7572636520494420616c726561647920657869737473000000000000604482015290519081900360640190fd5b6001600160a01b0382166000818152600860209081526040808320805460ff19166001908117909155858452600a835281842080546001600160a01b031990811687179091556004805492830181559094527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180549093168417909255815184815291517f5674036e091d8b4ee7f8e06cc71d41ee33f3fc331821fc0e017c1a091e8c861e9281900390910190a25050565b600a602052600090815260409020546001600160a01b031681565b6122ae612507565b6000546001600160a01b039081169116146122fe576040805162461bcd60e51b8152602060048201819052602482015260008051602061283c833981519152604482015290519081900360640190fd5b6001600160a01b0381166123435760405162461bcd60e51b81526004018080602001828103825260268152602001806127d46026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600b54600160a01b900460ff166123ea576040805162461bcd60e51b815260206004820152601d602482015260008051602061285c833981519152604482015290519081900360640190fd5b6123f2612507565b6000546001600160a01b03908116911614612442576040805162461bcd60e51b8152602060048201819052602482015260008051602061283c833981519152604482015290519081900360640190fd5b6001600160a01b03831660009081526007602052604090205460ff166124a7576040805162461bcd60e51b8152602060048201526015602482015274135bd91d5b1948191bd95cc81b9bdd08195e1a5cdd605a1b604482015290519081900360640190fd5b6001600160a01b03831660009081526009602090815260408083208584529091529020541561152c5760405162461bcd60e51b815260040180806020018281038252602181526020018061281b6021913960400191505060405180910390fd5b3390565b606060008061251a8585612580565b9150915080612568576040805162461bcd60e51b815260206004820152601560248201527420b2323932b9b9903737ba1034b71030b93930bc9760591b604482015290519081900360640190fd5b606061257486846125e6565b509350610b2e92505050565b81516000908190815b818110156125d357846001600160a01b03168682815181106125a757fe5b60200260200101516001600160a01b031614156125cb579250600191506125df9050565b600101612589565b50600019600092509250505b9250929050565b8151606090600090808410612642576040805162461bcd60e51b815260206004820152601860248201527f496e646578206d757374206265203c2041206c656e6774680000000000000000604482015290519081900360640190fd5b60606001820367ffffffffffffffff8111801561265e57600080fd5b50604051908082528060200260200182016040528015612688578160200160208202803683370190505b50905060005b858110156126d6578681815181106126a257fe5b60200260200101518282815181106126b657fe5b6001600160a01b039092166020928302919091019091015260010161268e565b50600185015b82811015612727578681815181106126f057fe5b602002602001015182600183038151811061270757fe5b6001600160a01b03909216602092830291909101909101526001016126dc565b508086868151811061273557fe5b60200260200101519350935050509250929050565b82805482825590600052602060002090810192821561279f579160200282015b8281111561279f57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061276a565b506127ab9291506127af565b5090565b6110e991905b808211156127ab5780546001600160a01b03191681556001016127b556fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373466565207479706520646f6573206e6f74206578697374206f6e206d6f64756c65466565207479706520616c726561647920657869737473206f6e206d6f64756c654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572436f6e7472616374206d75737420626520696e697469616c697a65642e000000436f6e74726f6c6c657220697320616c726561647920696e697469616c697a6564a264697066735822122076dcd76a63795ba374819b82b87d9924d0ab346e8fc7ea520950086ae66b295764736f6c634300060a003300000000000000000000000069bdb276a17dd90f9d3a545944ccb20e593ae8e3

Deployed ByteCode Sourcemap

10999:12053:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19354:411;;;;;;;;;;;;;;;;-1:-1:-1;19354:411:0;;:::i;:::-;;12762:41;;;;;;;;;;;;;;;;-1:-1:-1;12762:41:0;-1:-1:-1;;;;;12762:41:0;;:::i;:::-;;;;;;;;;;;;;;;;;;22711:338;;;;;;;;;;;;;;;;-1:-1:-1;22711:338:0;-1:-1:-1;;;;;22711:338:0;;:::i;16427:257::-;;;;;;;;;;;;;;;;-1:-1:-1;16427:257:0;-1:-1:-1;;;;;16427:257:0;;:::i;17790:251::-;;;;;;;;;;;;;;;;-1:-1:-1;17790:251:0;-1:-1:-1;;;;;17790:251:0;;:::i;12857:42::-;;;;;;;;;;;;;;;;-1:-1:-1;12857:42:0;-1:-1:-1;;;;;12857:42:0;;:::i;12599:26::-;;;;;;;;;;;;;;;;-1:-1:-1;12599:26:0;;:::i;:::-;;;;-1:-1:-1;;;;;12599:26:0;;;;;;;;;;;;;;13083:59;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;13083:59:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;16870:263;;;;;;;;;;;;;;;;-1:-1:-1;16870:263:0;-1:-1:-1;;;;;16870:263:0;;:::i;22428:90::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13464:25;;;:::i;12810:40::-;;;;;;;;;;;;;;;;-1:-1:-1;12810:40:0;-1:-1:-1;;;;;12810:40:0;;:::i;13375:27::-;;;:::i;17325:282::-;;;;;;;;;;;;;;;;-1:-1:-1;17325:282:0;-1:-1:-1;;;;;17325:282:0;;:::i;12225:21::-;;;;;;;;;;;;;;;;-1:-1:-1;12225:21:0;;:::i;12300:26::-;;;;;;;;;;;;;;;;-1:-1:-1;12300:26:0;;:::i;6520:148::-;;;:::i;12718:37::-;;;;;;;;;;;;;;;;-1:-1:-1;12718:37:0;-1:-1:-1;;;;;12718:37:0;;:::i;20951:392::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;20951:392:0;;;;;;;;;;;;;:::i;21891:209::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21891:209:0;;;;;;;;:::i;22108:100::-;;;:::i;12412:24::-;;;;;;;;;;;;;;;;-1:-1:-1;12412:24:0;;:::i;5878:79::-;;;:::i;18230:268::-;;;;;;;;;;;;;;;;-1:-1:-1;18230:268:0;-1:-1:-1;;;;;18230:268:0;;:::i;14379:1396::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;14379:1396:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;14379:1396:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14379:1396:0;;;;;;;;-1:-1:-1;14379:1396:0;;-1:-1:-1;;;;;14379:1396:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;14379:1396:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14379:1396:0;;;;;;;;-1:-1:-1;14379:1396:0;;-1:-1:-1;;;;;14379:1396:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;14379:1396:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14379:1396:0;;;;;;;;-1:-1:-1;14379:1396:0;;-1:-1:-1;;;;;14379:1396:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;14379:1396:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14379:1396:0;;-1:-1:-1;14379:1396:0;;-1:-1:-1;;;;;14379:1396:0:i;22216:96::-;;;:::i;22320:100::-;;;:::i;21549:269::-;;;;;;;;;;;;;;;;-1:-1:-1;21549:269:0;-1:-1:-1;;;;;21549:269:0;;:::i;15980:257::-;;;;;;;;;;;;;;;;-1:-1:-1;15980:257:0;-1:-1:-1;;;;;15980:257:0;;:::i;18758:412::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;18758:412:0;;;;;;;;:::i;13286:45::-;;;;;;;;;;;;;;;;-1:-1:-1;13286:45:0;;:::i;6823:244::-;;;;;;;;;;;;;;;;-1:-1:-1;6823:244:0;-1:-1:-1;;;;;6823:244:0;;:::i;20157:391::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;20157:391:0;;;;;;;;;;;;;:::i;19354:411::-;12066:13;;-1:-1:-1;;;12066:13:0;;;;12058:55;;;;;-1:-1:-1;;;12058:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;12058:55:0;;;;;;;;;;;;;;;6100:12:::1;:10;:12::i;:::-;6090:6;::::0;-1:-1:-1;;;;;6090:6:0;;::::1;:22:::0;::::1;;6082:67;;;::::0;;-1:-1:-1;;;6082:67:0;;::::1;;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;6082:67:0;;;;;;;;;;;;;::::1;;19437:24:::2;19464:15:::0;;;:10:::2;:15;::::0;;;;;-1:-1:-1;;;;;19464:15:0::2;19500:30:::0;19492:66:::2;;;::::0;;-1:-1:-1;;;19492:66:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;19583:34;19600:16;19583:9;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;19583:16:0::2;::::0;;;;;::::2;::::0;::::2;;::::0;;::::2;;;;;;;;;;;:34;;;;:::i;:::-;19571:46:::0;;::::2;::::0;:9:::2;::::0;:46:::2;::::0;;::::2;::::0;::::2;:::i;:::-;-1:-1:-1::0;19637:15:0::2;::::0;;;:10:::2;:15;::::0;;;;;;;19630:22;;-1:-1:-1;;;;;;19630:22:0::2;::::0;;-1:-1:-1;;;;;19665:28:0;::::2;::::0;;;:10:::2;:28:::0;;;;;;:36;;-1:-1:-1;;19665:36:0::2;::::0;;19719:38;;;;;;;::::2;::::0;;;;;;;;;::::2;6160:1;19354:411:::0;:::o;12762:41::-;;;;;;;;;;;;;;;:::o;22711:338::-;-1:-1:-1;;;;;22825:23:0;;22786:4;22825:23;;;:5;:23;;;;;;;;;:66;;-1:-1:-1;;;;;;22865:26:0;;;;;;:8;:26;;;;;;;;22825:66;:111;;;-1:-1:-1;;;;;;22908:28:0;;;;;;:10;:28;;;;;;;;22825:111;:155;;;-1:-1:-1;;;;;;22953:27:0;;;;;;:9;:27;;;;;;;;22825:155;:205;;;-1:-1:-1;;;;;;22997:33:0;;23025:4;22997:33;22825:205;22803:238;22711:338;-1:-1:-1;;22711:338:0:o;16427:257::-;12066:13;;-1:-1:-1;;;12066:13:0;;;;12058:55;;;;;-1:-1:-1;;;12058:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;12058:55:0;;;;;;;;;;;;;;;6100:12:::1;:10;:12::i;:::-;6090:6;::::0;-1:-1:-1;;;;;6090:6:0;;::::1;:22:::0;::::1;;6082:67;;;::::0;;-1:-1:-1;;;6082:67:0;;::::1;;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;6082:67:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;16519:16:0;::::2;;::::0;;;:5:::2;:16;::::0;;;;;::::2;;16511:47;;;::::0;;-1:-1:-1;;;16511:47:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;16511:47:0;;;;;;;;;;;;;::::2;;16578:22;16590:9;16578:4;:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;16578:11:0::2;::::0;;;;;::::2;::::0;::::2;;::::0;;::::2;;;;;;;;;;:22;;;;:::i;:::-;16571:29:::0;;::::2;::::0;:4:::2;::::0;:29:::2;::::0;;::::2;::::0;::::2;:::i;:::-;-1:-1:-1::0;;;;;;16613:16:0;::::2;16632:5;16613:16:::0;;;:5:::2;:16;::::0;;;;;:24;;-1:-1:-1;;16613:24:0::2;::::0;;16655:21;::::2;::::0;16632:5;16655:21:::2;16427:257:::0;:::o;17790:251::-;12066:13;;-1:-1:-1;;;12066:13:0;;;;12058:55;;;;;-1:-1:-1;;;12058:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;12058:55:0;;;;;;;;;;;;;;;6100:12:::1;:10;:12::i;:::-;6090:6;::::0;-1:-1:-1;;;;;6090:6:0;;::::1;:22:::0;::::1;;6082:67;;;::::0;;-1:-1:-1;;;6082:67:0;;::::1;;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;6082:67:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;17881:17:0;::::2;;::::0;;;:8:::2;:17;::::0;;;;;::::2;;17880:18;17872:52;;;::::0;;-1:-1:-1;;;17872:52:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;17872:52:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;17937:17:0;::::2;;::::0;;;:8:::2;:17;::::0;;;;;:24;;-1:-1:-1;;17937:24:0::2;17957:4;17937:24:::0;;::::2;::::0;;;17974:7:::2;:21:::0;;;;::::2;::::0;;;;;::::2;::::0;;-1:-1:-1;;;;;;17974:21:0::2;::::0;::::2;::::0;;18013:20;::::2;::::0;17937:17;18013:20:::2;17790:251:::0;:::o;12857:42::-;;;;;;;;;;;;;;;:::o;12599:26::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12599:26:0;;-1:-1:-1;12599:26:0;:::o;13083:59::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;16870:263::-;12066:13;;-1:-1:-1;;;12066:13:0;;;;12058:55;;;;;-1:-1:-1;;;12058:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;12058:55:0;;;;;;;;;;;;;;;6100:12:::1;:10;:12::i;:::-;6090:6;::::0;-1:-1:-1;;;;;6090:6:0;;::::1;:22:::0;::::1;;6082:67;;;::::0;;-1:-1:-1;;;6082:67:0;;::::1;;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;6082:67:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;16963:19:0;::::2;;::::0;;;:9:::2;:19;::::0;;;;;::::2;;16962:20;16954:55;;;::::0;;-1:-1:-1;;;16954:55:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;16954:55:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;17022:19:0;::::2;;::::0;;;:9:::2;:19;::::0;;;;;:26;;-1:-1:-1;;17022:26:0::2;17044:4;17022:26:::0;;::::2;::::0;;;17061:9:::2;:24:::0;;;;::::2;::::0;;;;;::::2;::::0;;-1:-1:-1;;;;;;17061:24:0::2;::::0;::::2;::::0;;17103:22;::::2;::::0;17022:19;17103:22:::2;16870:263:::0;:::o;22428:90::-;22470:16;22506:4;22499:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22499:11:0;;;;;;;;;;;;;;;;;;;;;;;22428:90;;:::o;13464:25::-;;;-1:-1:-1;;;13464:25:0;;;;;:::o;12810:40::-;;;;;;;;;;;;;;;:::o;13375:27::-;;;-1:-1:-1;;;;;13375:27:0;;:::o;17325:282::-;12066:13;;-1:-1:-1;;;12066:13:0;;;;12058:55;;;;;-1:-1:-1;;;12058:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;12058:55:0;;;;;;;;;;;;;;;6100:12:::1;:10;:12::i;:::-;6090:6;::::0;-1:-1:-1;;;;;6090:6:0;;::::1;:22:::0;::::1;;6082:67;;;::::0;;-1:-1:-1;;;6082:67:0;;::::1;;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;6082:67:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;17420:19:0;::::2;;::::0;;;:9:::2;:19;::::0;;;;;::::2;;17412:54;;;::::0;;-1:-1:-1;;;17412:54:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;17412:54:0;;;;;;;;;;;;;::::2;;17491:26;17508:8;17491:9;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;17491:16:0::2;::::0;;;;;::::2;::::0;::::2;;::::0;;::::2;;;;;;;;;;:26;;;;:::i;:::-;17479:38:::0;;::::2;::::0;:9:::2;::::0;:38:::2;::::0;;::::2;::::0;::::2;:::i;:::-;-1:-1:-1::0;;;;;;17530:19:0;::::2;17552:5;17530:19:::0;;;:9:::2;:19;::::0;;;;;:27;;-1:-1:-1;;17530:27:0::2;::::0;;17575:24;::::2;::::0;17552:5;17575:24:::2;17325:282:::0;:::o;12225:21::-;;;;;;;;;;12300:26;;;;;;;;;;6520:148;6100:12;:10;:12::i;:::-;6090:6;;-1:-1:-1;;;;;6090:6:0;;;:22;;;6082:67;;;;;-1:-1:-1;;;6082:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;6082:67:0;;;;;;;;;;;;;;;6627:1:::1;6611:6:::0;;6590:40:::1;::::0;-1:-1:-1;;;;;6611:6:0;;::::1;::::0;6590:40:::1;::::0;6627:1;;6590:40:::1;6658:1;6641:19:::0;;-1:-1:-1;;;;;;6641:19:0::1;::::0;;6520:148::o;12718:37::-;;;;;;;;;;;;;;;:::o;20951:392::-;12066:13;;-1:-1:-1;;;12066:13:0;;;;12058:55;;;;;-1:-1:-1;;;12058:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;12058:55:0;;;;;;;;;;;;;;;6100:12:::1;:10;:12::i;:::-;6090:6;::::0;-1:-1:-1;;;;;6090:6:0;;::::1;:22:::0;::::1;;6082:67;;;::::0;;-1:-1:-1;;;6082:67:0;;::::1;;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;6082:67:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;21084:17:0;::::2;;::::0;;;:8:::2;:17;::::0;;;;;::::2;;21076:51;;;::::0;;-1:-1:-1;;;21076:51:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;21076:51:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;21148:13:0;::::2;;::::0;;;:4:::2;:13;::::0;;;;;;;:23;;;;;;;;;21140:74:::2;;;;-1:-1:-1::0;;;21140:74:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;21227:13:0;::::2;;::::0;;;:4:::2;:13;::::0;;;;;;;:23;;;;;;;;;:43;;;21288:47;;;;;;;21241:8;;21227:13;21288:47:::2;::::0;;;;;;;::::2;20951:392:::0;;;:::o;21891:209::-;-1:-1:-1;;;;;22062:20:0;;;;22030:7;22062:20;;;:4;:20;;;;;;;;:30;;;;;;;;;21891:209::o;22108:100::-;22155:16;22191:9;22184:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22184:16:0;;;;;;;;;;;;;;;;;;;;;;22108:100;:::o;12412:24::-;;;;;;;;;;5878:79;5916:7;5943:6;-1:-1:-1;;;;;5943:6:0;5878:79;:::o;18230:268::-;12066:13;;-1:-1:-1;;;12066:13:0;;;;12058:55;;;;;-1:-1:-1;;;12058:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;12058:55:0;;;;;;;;;;;;;;;6100:12:::1;:10;:12::i;:::-;6090:6;::::0;-1:-1:-1;;;;;6090:6:0;;::::1;:22:::0;::::1;;6082:67;;;::::0;;-1:-1:-1;;;6082:67:0;;::::1;;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;6082:67:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;18323:17:0;::::2;;::::0;;;:8:::2;:17;::::0;;;;;::::2;;18315:51;;;::::0;;-1:-1:-1;;;18315:51:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;18315:51:0;;;;;;;;;;;;;::::2;;18389:23;18404:7;18389;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;18389:14:0::2;::::0;;;;;::::2;::::0;::::2;;::::0;;::::2;;;;;;;;;;:23;;;;:::i;:::-;18379:33:::0;;::::2;::::0;:7:::2;::::0;:33:::2;::::0;;::::2;::::0;::::2;:::i;:::-;-1:-1:-1::0;;;;;;18425:17:0;::::2;18445:5;18425:17:::0;;;:8:::2;:17;::::0;;;;;:25;;-1:-1:-1;;18425:25:0::2;::::0;;18468:22;::::2;::::0;18445:5;18468:22:::2;18230:268:::0;:::o;14379:1396::-;6100:12;:10;:12::i;:::-;6090:6;;-1:-1:-1;;;;;6090:6:0;;;:22;;;6082:67;;;;;-1:-1:-1;;;6082:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;6082:67:0;;;;;;;;;;;;;;;14620:13:::1;::::0;-1:-1:-1;;;14620:13:0;::::1;;;14619:14;14611:60;;;;-1:-1:-1::0;;;14611:60:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14711:12;:19;14690:10;:17;:40;14682:80;;;::::0;;-1:-1:-1;;;14682:80:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;14775:22:::0;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;14808:18:0;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;14837:22:0;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;14961:9:0::1;14956:184;14980:10;:17;14976:1;:21;14956:184;;;15052:1;-1:-1:-1::0;;;;;15027:27:0::1;:10;15038:1;15027:13;;;;;;;;;;;;;;-1:-1:-1::0;;;;;15027:27:0::1;;;15019:63;;;::::0;;-1:-1:-1;;;15019:63:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;15019:63:0;;;;;;;;;;;;;::::1;;15124:4;15097:9;:24;15107:10;15118:1;15107:13;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;15097:24:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;15097:24:0;:31;;-1:-1:-1;;15097:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;14999:3:0::1;14956:184;;;-1:-1:-1::0;15155:9:0::1;15150:177;15174:8;:15;15170:1;:19;15150:177;;;15242:1;-1:-1:-1::0;;;;;15219:25:0::1;:8;15228:1;15219:11;;;;;;;;;;;;;;-1:-1:-1::0;;;;;15219:25:0::1;;;15211:61;;;::::0;;-1:-1:-1;;;15211:61:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;15211:61:0;;;;;;;;;;;;;::::1;;15311:4;15287:8;:21;15296:8;15305:1;15296:11;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;15287:21:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;15287:21:0;:28;;-1:-1:-1;;15287:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;15191:3:0::1;15150:177;;;-1:-1:-1::0;15344:9:0::1;15339:338;15363:10;:17;15359:1;:21;15339:338;;;15435:1;-1:-1:-1::0;;;;;15410:27:0::1;:10;15421:1;15410:13;;;;;;;;;;;;;;-1:-1:-1::0;;;;;15410:27:0::1;;;15402:63;;;::::0;;-1:-1:-1;;;15402:63:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;15402:63:0;;;;;;;;;;;;;::::1;;15527:1;-1:-1:-1::0;;;;;15488:41:0::1;:10;:27;15499:12;15512:1;15499:15;;;;;;;;;::::0;;::::1;::::0;;;;;;;15488:27;;;::::1;::::0;;;;;;-1:-1:-1;15488:27:0;;-1:-1:-1;;;;;15488:27:0::1;:41;15480:80;;;::::0;;-1:-1:-1;;;15480:80:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;15603:4;15575:10;:25;15586:10;15597:1;15586:13;;;;;;;;;;;;;;-1:-1:-1::0;;;;;15575:25:0::1;-1:-1:-1::0;;;;;15575:25:0::1;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;15652:10;15663:1;15652:13;;;;;;;;;;;;;;15622:10;:27;15633:12;15646:1;15633:15;;;;;;;;;::::0;;::::1;::::0;;;;;;;15622:27;;;::::1;::::0;;;;;;-1:-1:-1;15622:27:0;:43;;-1:-1:-1;;;;;;15622:43:0::1;-1:-1:-1::0;;;;;15622:43:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;15382:3:0::1;15339:338;;;-1:-1:-1::0;;15747:13:0::1;:20:::0;;-1:-1:-1;;;;15747:20:0::1;-1:-1:-1::0;;;15747:20:0::1;::::0;;-1:-1:-1;;;14379:1396:0:o;22216:96::-;22261:16;22297:7;22290:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22290:14:0;;;;;;;;;;;;;;;;;;;;;;22216:96;:::o;22320:100::-;22367:16;22403:9;22396:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22396:16:0;;;;;;;;;;;;;;;;;;;;;;22320:100;:::o;21549:269::-;12066:13;;-1:-1:-1;;;12066:13:0;;;;12058:55;;;;;-1:-1:-1;;;12058:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;12058:55:0;;;;;;;;;;;;;;;6100:12:::1;:10;:12::i;:::-;6090:6;::::0;-1:-1:-1;;;;;6090:6:0;;::::1;:22:::0;::::1;;6082:67;;;::::0;;-1:-1:-1;;;6082:67:0;;::::1;;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;6082:67:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;21655:30:0;::::2;21647:64;;;::::0;;-1:-1:-1;;;21647:64:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;21647:64:0;;;;;;;;;;;;;::::2;;21724:12;:31:::0;;-1:-1:-1;;;;;21724:31:0;::::2;-1:-1:-1::0;;;;;;21724:31:0;;::::2;::::0;::::2;::::0;;;21773:37:::2;::::0;;;;;;::::2;::::0;;;;::::2;::::0;;::::2;21549:269:::0;:::o;15980:257::-;12066:13;;-1:-1:-1;;;12066:13:0;;;;12058:55;;;;;-1:-1:-1;;;12058:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;12058:55:0;;;;;;;;;;;;;;;11947:10:::1;11937:21;::::0;;;:9:::1;:21;::::0;;;;;::::1;;11929:63;;;::::0;;-1:-1:-1;;;11929:63:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;16072:16:0;::::2;;::::0;;;:5:::2;:16;::::0;;;;;::::2;;16071:17;16063:48;;;::::0;;-1:-1:-1;;;16063:48:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;16063:48:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;16124:16:0;::::2;;::::0;;;:5:::2;:16;::::0;;;;;:23;;-1:-1:-1;;16124:23:0::2;16143:4;16124:23:::0;;::::2;::::0;;;16160:20;;;;::::2;::::0;;;;;;::::2;::::0;;-1:-1:-1;;;;;;16160:20:0::2;::::0;::::2;::::0;;16198:31;16218:10:::2;::::0;16124:16;16198:31:::2;::::0;::::2;15980:257:::0;:::o;18758:412::-;12066:13;;-1:-1:-1;;;12066:13:0;;;;12058:55;;;;;-1:-1:-1;;;12058:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;12058:55:0;;;;;;;;;;;;;;;6100:12:::1;:10;:12::i;:::-;6090:6;::::0;-1:-1:-1;;;;;6090:6:0;;::::1;:22:::0;::::1;;6082:67;;;::::0;;-1:-1:-1;;;6082:67:0;;::::1;;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;6082:67:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;18866:21:0;::::2;;::::0;;;:10:::2;:21;::::0;;;;;::::2;;18865:22;18857:58;;;::::0;;-1:-1:-1;;;18857:58:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;18963:1;18936:15:::0;;;:10:::2;:15;::::0;;;;;-1:-1:-1;;;;;18936:15:0::2;:29:::0;18928:68:::2;;;::::0;;-1:-1:-1;;;18928:68:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;19009:21:0;::::2;;::::0;;;:10:::2;:21;::::0;;;;;;;:28;;-1:-1:-1;;19009:28:0::2;19033:4;19009:28:::0;;::::2;::::0;;;19050:15;;;:10:::2;:15:::0;;;;;:27;;-1:-1:-1;;;;;;19050:27:0;;::::2;::::0;::::2;::::0;;;19090:9:::2;:25:::0;;;;::::2;::::0;;;;;;::::2;::::0;;;;::::2;::::0;::::2;::::0;;;19133:29;;;;;;;::::2;::::0;;;;;;;;::::2;18758:412:::0;;:::o;13286:45::-;;;;;;;;;;;;-1:-1:-1;;;;;13286:45:0;;:::o;6823:244::-;6100:12;:10;:12::i;:::-;6090:6;;-1:-1:-1;;;;;6090:6:0;;;:22;;;6082:67;;;;;-1:-1:-1;;;6082:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;6082:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;6912:22:0;::::1;6904:73;;;;-1:-1:-1::0;;;6904:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7014:6;::::0;;6993:38:::1;::::0;-1:-1:-1;;;;;6993:38:0;;::::1;::::0;7014:6;::::1;::::0;6993:38:::1;::::0;::::1;7042:6;:17:::0;;-1:-1:-1;;;;;;7042:17:0::1;-1:-1:-1::0;;;;;7042:17:0;;;::::1;::::0;;;::::1;::::0;;6823:244::o;20157:391::-;12066:13;;-1:-1:-1;;;12066:13:0;;;;12058:55;;;;;-1:-1:-1;;;12058:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;12058:55:0;;;;;;;;;;;;;;;6100:12:::1;:10;:12::i;:::-;6090:6;::::0;-1:-1:-1;;;;;6090:6:0;;::::1;:22:::0;::::1;;6082:67;;;::::0;;-1:-1:-1;;;6082:67:0;;::::1;;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;6082:67:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;20289:17:0;::::2;;::::0;;;:8:::2;:17;::::0;;;;;::::2;;20281:51;;;::::0;;-1:-1:-1;;;20281:51:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;20281:51:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;20353:13:0;::::2;;::::0;;;:4:::2;:13;::::0;;;;;;;:23;;;;;;;;;:28;20345:74:::2;;;;-1:-1:-1::0;;;20345:74:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;640:106:::0;728:10;640:106;:::o;3618:355::-;3715:16;3750:13;3765:9;3778:13;3786:1;3789;3778:7;:13::i;:::-;3749:42;;;;3807:4;3802:164;;3828:31;;;-1:-1:-1;;;3828:31:0;;;;;;;;;;;;-1:-1:-1;;;3828:31:0;;;;;;;;;;;;;;3802:164;3893:19;3917:13;3921:1;3924:5;3917:3;:13::i;:::-;-1:-1:-1;3892:38:0;-1:-1:-1;3945:9:0;;-1:-1:-1;;;3945:9:0;2104:307;2218:8;;2175:7;;;;;2237:129;2261:6;2257:1;:10;2237:129;;;2301:1;-1:-1:-1;;;;;2293:9:0;:1;2295;2293:4;;;;;;;;;;;;;;-1:-1:-1;;;;;2293:9:0;;2289:66;;;2331:1;-1:-1:-1;2334:4:0;;-1:-1:-1;2323:16:0;;-1:-1:-1;2323:16:0;2289:66;2269:3;;2237:129;;;;-1:-1:-1;;2397:5:0;2376:27;;;;;2104:307;;;;;;:::o;4181:551::-;4339:8;;4279:16;;4297:7;;4366:16;;;4358:53;;;;;-1:-1:-1;;;4358:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;4422:29;4477:1;4468:6;:10;4454:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4454:25:0;-1:-1:-1;4422:57:0;-1:-1:-1;4495:9:0;4490:85;4514:5;4510:1;:9;4490:85;;;4559:1;4561;4559:4;;;;;;;;;;;;;;4541:12;4554:1;4541:15;;;;;;;;-1:-1:-1;;;;;4541:22:0;;;:15;;;;;;;;;;;:22;4521:3;;4490:85;;;-1:-1:-1;4610:1:0;4602:9;;4585:98;4617:6;4613:1;:10;4585:98;;;4667:1;4669;4667:4;;;;;;;;;;;;;;4645:12;4662:1;4658;:5;4645:19;;;;;;;;-1:-1:-1;;;;;4645:26:0;;;:19;;;;;;;;;;;:26;4625:3;;4585:98;;;;4701:12;4715:1;4717:5;4715:8;;;;;;;;;;;;;;4693:31;;;;;;4181:551;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

ipfs://76dcd76a63795ba374819b82b87d9924d0ab346e8fc7ea520950086ae66b2957
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading