FTM Price: $0.723587 (+5.59%)
 

Overview

FTM Balance

Fantom LogoFantom LogoFantom Logo0 FTM

FTM Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

1 Internal Transaction found.

Latest 1 internal transaction

Parent Transaction Hash Block From To
188426732021-10-11 16:15:311191 days ago1633968931  Contract Creation0 FTM
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
StrategiesHelper

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at ftmscan.com on 2021-10-11
*/

/**
 *Submitted for verification at Etherscan.io on 2021-07-09
 */

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.6;

interface IV2Strategy {
    function name() external view returns (string memory);

    function apiVersion() external view returns (string memory);

    function strategist() external view returns (address);

    function rewards() external view returns (address);

    function vault() external view returns (address);

    function keeper() external view returns (address);

    function want() external view returns (address);

    function emergencyExit() external view returns (bool);

    function isActive() external view returns (bool);

    function delegatedAssets() external view returns (uint256);

    function estimatedTotalAssets() external view returns (uint256);

    function doHealthCheck() external view returns (bool);

    function healthCheck() external view returns (address);
}

interface IAddressesGenerator {
    function assetsAddresses() external view returns (address[] memory);
}

interface IV2Vault {
    function withdrawalQueue(uint256 arg0) external view returns (address);
}

interface IAddressMergeHelper {
    function mergeAddresses(address[][] memory addressesSets)
        external
        view
        returns (address[] memory);
}

interface IERC20 {
    function decimals() external view returns (uint8);

    function symbol() external view returns (string memory);
}

interface IOracle {
    function getNormalizedValueUsdc(
        address tokenAddress,
        uint256 amount,
        uint256 priceUsdc
    ) external view returns (uint256);

    function getPriceUsdcRecommended(address tokenAddress)
        external
        view
        returns (uint256);
}

contract StrategiesHelper {
    address public addressesGeneratorAddress;
    address public addressesMergeHelperAddress;
    address public oracleAddress;
    address public ownerAddress;

    struct StrategyMetadata {
        string name;
        address id;
        string apiVersion;
        address strategist;
        address rewards;
        address vault;
        address keeper;
        address want;
        uint256 wantPriceUsdc;
        uint8 wantDecimals;
        string wantSymbol;
        bool emergencyExit;
        bool isActive;
        uint256 delegatedAssets;
        uint256 estimatedTotalAssets;
        uint256 estimatedTotalAssetsUsdc;
        bool doHealthCheck;
        address healthCheckAddress;
    }

    constructor(
        address _addressesGeneratorAddress,
        address _addressesMergeHelperAddress,
        address _oracleAddress
    ) {
        addressesGeneratorAddress = _addressesGeneratorAddress;
        addressesMergeHelperAddress = _addressesMergeHelperAddress;
        oracleAddress = _oracleAddress;
        ownerAddress = msg.sender;
    }

    /**
     * Fetch the number of strategies for a vault
     */
    function assetStrategiesLength(address assetAddress)
        public
        view
        returns (uint256)
    {
        IV2Vault vault = IV2Vault(assetAddress);
        uint256 strategyIdx;
        while (true) {
            address strategyAddress = vault.withdrawalQueue(strategyIdx);
            if (strategyAddress == address(0)) {
                break;
            }
            strategyIdx++;
        }
        return strategyIdx;
    }

    /**
     * Fetch the total number of strategies for all vaults
     */
    function assetsStrategiesLength() public view returns (uint256) {
        return assetsStrategiesAddresses().length;
    }

    /**
     * Fetch strategy addresses given a vault address
     */
    function assetStrategiesAddresses(address assetAddress)
        public
        view
        returns (address[] memory)
    {
        IV2Vault vault = IV2Vault(assetAddress);
        uint256 numberOfStrategies = assetStrategiesLength(assetAddress);
        address[] memory _strategiesAddresses = new address[](
            numberOfStrategies
        );
        for (
            uint256 strategyIdx = 0;
            strategyIdx < numberOfStrategies;
            strategyIdx++
        ) {
            address strategyAddress = vault.withdrawalQueue(strategyIdx);
            _strategiesAddresses[strategyIdx] = strategyAddress;
        }
        return _strategiesAddresses;
    }

    /**
     * Fetch all strategy addresses for all vaults
     */
    function assetsStrategiesAddresses()
        public
        view
        returns (address[] memory)
    {
        address[] memory _assetsAddresses = IAddressesGenerator(
            addressesGeneratorAddress
        ).assetsAddresses();
        return assetsStrategiesAddresses(_assetsAddresses);
    }

    /**
     * Convert an ASCII string to a number given a string and a base
     */
    function atoi(string memory a, uint8 base)
        internal
        pure
        returns (uint256 i)
    {
        require(base == 2 || base == 8 || base == 10 || base == 16);
        bytes memory buf = bytes(a);
        for (uint256 p = 0; p < buf.length; p++) {
            uint8 digit = uint8(buf[p]) - 0x30;
            if (digit > 10) {
                digit -= 7;
            }
            require(digit < base);
            i *= base;
            i += digit;
        }
        return i;
    }

    /**
     * Check to see if two strings are exactly equal
     */
    function stringsEqual(string memory input1, string memory input2)
        internal
        pure
        returns (bool)
    {
        bytes32 input1Bytes32;
        bytes32 input2Bytes32;
        assembly {
            input1Bytes32 := mload(add(input1, 32))
            input2Bytes32 := mload(add(input2, 32))
        }
        return input1Bytes32 == input2Bytes32;
    }

    /**
     * Fetch strategy addresses by filter
     */
    function assetsStrategiesAddressesByFilter(string[][] memory filter)
        public
        view
        returns (address[] memory)
    {

            address[] memory _assetsStrategiesAddresses
         = assetsStrategiesAddresses();
        return
            assetsStrategiesAddressesByFilter(
                _assetsStrategiesAddresses,
                filter
            );
    }

    /**
     * Fetch strategy addresses by filter
     */
    function assetsStrategiesAddressesByFilter(
        address[] memory _strategiesAddresses,
        string[][] memory filter
    ) public view returns (address[] memory) {
        uint256 numberOfStrategies = _strategiesAddresses.length;
        uint256 numberOfFilteredStrategies;
        for (
            uint256 strategyIdx = 0;
            strategyIdx < numberOfStrategies;
            strategyIdx++
        ) {
            address strategyAddress = _strategiesAddresses[strategyIdx];
            if (strategyPassesFilter(strategyAddress, filter)) {
                _strategiesAddresses[
                    numberOfFilteredStrategies
                ] = strategyAddress;
                numberOfFilteredStrategies++;
            }
        }
        bytes memory encodedAddresses = abi.encode(_strategiesAddresses);
        assembly {
            mstore(add(encodedAddresses, 0x40), numberOfFilteredStrategies)
        }
        address[] memory filteredAddresses = abi.decode(
            encodedAddresses,
            (address[])
        );
        return filteredAddresses;
    }

    /**
     * Fetch all strategy addresses given an array of vaults
     */
    function assetsStrategiesAddresses(address[] memory _assetsAddresses)
        public
        view
        returns (address[] memory)
    {
        uint256 numberOfAssets = _assetsAddresses.length;
        address[][] memory _strategiesForAssets = new address[][](
            numberOfAssets
        );
        for (uint256 assetIdx = 0; assetIdx < numberOfAssets; assetIdx++) {
            address assetAddress = _assetsAddresses[assetIdx];


                address[] memory _assetStrategiessAddresses
             = assetStrategiesAddresses(assetAddress);
            _strategiesForAssets[assetIdx] = _assetStrategiessAddresses;
        }
        address[] memory mergedAddresses = IAddressMergeHelper(
            addressesMergeHelperAddress
        ).mergeAddresses(_strategiesForAssets);
        return mergedAddresses;
    }

    /**
     * Fetch total delegated balance for all strategies
     */
    function assetsStrategiesDelegatedBalance()
        external
        view
        returns (uint256)
    {
        address[] memory _assetsAddresses = IAddressesGenerator(
            addressesGeneratorAddress
        ).assetsAddresses();
        uint256 numberOfAssets = _assetsAddresses.length;
        uint256 assetsDelegatedBalance;
        for (uint256 assetIdx = 0; assetIdx < numberOfAssets; assetIdx++) {
            address assetAddress = _assetsAddresses[assetIdx];
            uint256 assetDelegatedBalance = assetStrategiesDelegatedBalance(
                assetAddress
            );
            assetsDelegatedBalance += assetDelegatedBalance;
        }
        return assetsDelegatedBalance;
    }

    /**
     * Fetch delegated balance for all of a vault's strategies
     */
    function assetStrategiesDelegatedBalance(address assetAddress)
        public
        view
        returns (uint256)
    {
        address[] memory _assetStrategiesAddresses = assetStrategiesAddresses(
            assetAddress
        );
        uint256 numberOfStrategies = _assetStrategiesAddresses.length;
        uint256 strategiesDelegatedBalance;
        for (
            uint256 strategyIdx = 0;
            strategyIdx < numberOfStrategies;
            strategyIdx++
        ) {
            address strategyAddress = _assetStrategiesAddresses[strategyIdx];
            IV2Strategy _strategy = IV2Strategy(strategyAddress);
            uint256 strategyDelegatedBalance = _strategy.delegatedAssets();
            strategiesDelegatedBalance += strategyDelegatedBalance;
        }
        return strategiesDelegatedBalance;
    }

    /**
     * Fetch metadata for all strategies scoped to a vault
     */
    function assetStrategies(address assetAddress)
        external
        view
        returns (StrategyMetadata[] memory)
    {
        IV2Vault vault = IV2Vault(assetAddress);
        uint256 numberOfStrategies = assetStrategiesLength(assetAddress);
        StrategyMetadata[] memory _strategies = new StrategyMetadata[](
            numberOfStrategies
        );
        for (
            uint256 strategyIdx = 0;
            strategyIdx < numberOfStrategies;
            strategyIdx++
        ) {
            address strategyAddress = vault.withdrawalQueue(strategyIdx);
            StrategyMetadata memory _strategy = strategy(strategyAddress);
            _strategies[strategyIdx] = _strategy;
        }
        return _strategies;
    }

    /**
     * Fetch metadata for all strategies
     */
    function assetsStrategies()
        external
        view
        returns (StrategyMetadata[] memory)
    {

            address[] memory _assetsStrategiesAddresses
         = assetsStrategiesAddresses();
        return strategies(_assetsStrategiesAddresses);
    }

    /**
     * Fetch metadata for all strategies
     */
    function assetsStrategiesByFilter(string[][] memory _filter)
        external
        view
        returns (StrategyMetadata[] memory)
    {

            address[] memory _assetsStrategiesAddresses
         = assetsStrategiesAddressesByFilter(_filter);
        return strategies(_assetsStrategiesAddresses);
    }

    /**
     * Fetch metadata for strategies given an array of vault addresses
     */
    function assetsStrategies(address[] memory _assetsAddresses)
        public
        view
        returns (StrategyMetadata[] memory)
    {
        return strategies(assetsStrategiesAddresses(_assetsAddresses));
    }

    /**
     * Fetch metadata for strategies given an array of vault addresses and a filter
     */
    function assetsStrategiesByFilter(
        address[] memory _assetsAddresses,
        string[][] memory _filter
    ) public view returns (StrategyMetadata[] memory) {
        return
            strategies(
                assetsStrategiesAddressesByFilter(_assetsAddresses, _filter)
            );
    }

    /**
     * Fetch metadata for a strategy given a strategy address
     */
    function strategy(address strategyAddress)
        public
        view
        returns (StrategyMetadata memory)
    {
        IV2Strategy _strategy = IV2Strategy(strategyAddress);
        IOracle _oracle = IOracle(oracleAddress);
        bool _doHealthCheck;
        address _healthCheckAddress;
        address _wantAddress = _strategy.want();
        IERC20 _want = IERC20(_wantAddress);
        uint256 _wantPriceUsdc = _oracle.getPriceUsdcRecommended(_wantAddress);
        uint256 _estimatedTotalAssets = _strategy.estimatedTotalAssets();
        try _strategy.doHealthCheck() {
            _doHealthCheck = _strategy.doHealthCheck();
        } catch {}
        try _strategy.healthCheck() {
            _healthCheckAddress = _strategy.healthCheck();
        } catch {}
        return
            StrategyMetadata({
                name: _strategy.name(),
                id: strategyAddress,
                apiVersion: _strategy.apiVersion(),
                strategist: _strategy.strategist(),
                rewards: _strategy.rewards(),
                vault: _strategy.vault(),
                keeper: _strategy.keeper(),
                want: _wantAddress,
                wantPriceUsdc: _wantPriceUsdc,
                wantDecimals: _want.decimals(),
                wantSymbol: _want.symbol(),
                emergencyExit: _strategy.emergencyExit(),
                isActive: _strategy.isActive(),
                delegatedAssets: _strategy.delegatedAssets(),
                estimatedTotalAssets: _estimatedTotalAssets,
                estimatedTotalAssetsUsdc: _oracle.getNormalizedValueUsdc(
                    _wantAddress,
                    _estimatedTotalAssets,
                    _wantPriceUsdc
                ),
                doHealthCheck: _doHealthCheck,
                healthCheckAddress: _healthCheckAddress
            });
    }

    /**
     * Fetch metadata for strategies given an array of strategy addresses
     */
    function strategies(address[] memory _strategiesAddresses)
        public
        view
        returns (StrategyMetadata[] memory)
    {
        uint256 numberOfStrategies = _strategiesAddresses.length;
        StrategyMetadata[] memory _strategies = new StrategyMetadata[](
            numberOfStrategies
        );
        for (
            uint256 strategyIdx = 0;
            strategyIdx < numberOfStrategies;
            strategyIdx++
        ) {
            address strategyAddress = _strategiesAddresses[strategyIdx];
            StrategyMetadata memory _strategy = strategy(strategyAddress);
            _strategies[strategyIdx] = _strategy;
        }
        return _strategies;
    }

    /**
     * Filter a strategy using a reverse polish notation (RPM) query language
     *
     * Each instruction is a tuple of either two or three strings.
     *
     * Argument 0 - Operand type
     * -------------------------
     * KEY      - Denotes a value should be fetched using a function sighash derived from argument 1
     * VALUE    - A value to be added directly to the stack
     * OPERATOR - The name of the instruction to execute
     *
     * Argument 1 - Key/Value or operator
     * ----------------------------------
     * Data     - If KEY or VALUE are specified in argument 0, argument 1 represents either the key
     *            to fetch data with or the value to be added to the stack
     * Operator - If OPERATOR is specified in argument 0, argument 1 represents the operator to execute.
     *            Valid operators are: EQ, GT, GTE, LT, LTE, OR, AND, NE and LIKE
     *
     * Argument 2 - Value type
     * -----------------------
     * For key/value operands argument 2 describes how to parse a value to be placed on the stack.
     * Valid options are: STRING, HEX, DECIMAL
     *
     * Note: The stack size is 32 bytes. Any values beyond this will be truncated.
     *
     * Example Filter
     * ==============
     * Description: Find all strategies whose apiVersion is like 0.3.5 or 0.3.3
     *              where strategist address is C3D6880fD95E06C816cB030fAc45b3ffe3651Cb0
     * filter = [
     *     ["KEY",        "apiVersion", "STRING"],
     *     ["VALUE",      "0.3.5", "STRING"],
     *     ["OPERATOR",   "LIKE"],
     *     ["KEY",        "apiVersion", "STRING"],
     *     ["VALUE",      "0.3.3", "STRING"],
     *     ["OPERATOR",   "LIKE"],
     *     ["OPERATOR",   "OR"],
     *     ["KEY",        "strategist", "HEX"],
     *     ["VALUE",      "C3D6880fD95E06C816cB030fAc45b3ffe3651Cb0", "HEX"],
     *     ["OPERATOR",   "EQ"],
     *     ["OPERATOR",   "AND"]
     * ];
     */
    function strategyPassesFilter(
        address strategyAddress,
        string[][] memory instructions
    ) public view returns (bool) {
        bytes32[] memory stack = new bytes32[](instructions.length * 3);
        uint256 stackLength;
        for (
            uint256 instructionsIdx;
            instructionsIdx < instructions.length;
            instructionsIdx++
        ) {
            string[] memory instruction = instructions[instructionsIdx];
            string memory instructionPart1 = instruction[1];
            bool operandIsOperator = stringsEqual(instruction[0], "OPERATOR");
            if (operandIsOperator) {
                bool result;
                bytes32 operandTwo = stack[stackLength - 1];
                bytes32 operandOne = stack[stackLength - 2];
                if (stringsEqual(instruction[1], "EQ")) {
                    result = uint256(operandTwo) == uint256(operandOne);
                }
                if (stringsEqual(instruction[1], "NE")) {
                    result = uint256(operandTwo) != uint256(operandOne);
                }
                if (stringsEqual(instruction[1], "GT")) {
                    result = uint256(operandTwo) > uint256(operandOne);
                }
                if (stringsEqual(instruction[1], "GTE")) {
                    result = uint256(operandTwo) >= uint256(operandOne);
                }
                if (stringsEqual(instruction[1], "LT")) {
                    result = uint256(operandTwo) < uint256(operandOne);
                }
                if (stringsEqual(instruction[1], "LTE")) {
                    result = uint256(operandTwo) <= uint256(operandOne);
                }
                if (stringsEqual(instruction[1], "AND")) {
                    result = uint256(operandTwo & operandOne) == 1;
                }
                if (stringsEqual(instruction[1], "OR")) {
                    result = uint256(operandTwo | operandOne) == 1;
                }
                if (stringsEqual(instruction[1], "LIKE")) {
                    string memory haystack = String.bytes32ToString(operandOne);
                    string memory needle = String.bytes32ToString(operandTwo);
                    result = String.contains(haystack, needle);
                }
                if (result) {
                    stack[stackLength - 2] = bytes32(uint256(1));
                } else {
                    stack[stackLength - 2] = bytes32(uint256(0));
                }
                stackLength--;
            } else {
                bytes32 stackItem;
                bool operandIsKey = stringsEqual(instruction[0], "KEY");
                bytes memory data;
                if (operandIsKey) {
                    (, bytes memory matchBytes) = address(strategyAddress)
                    .staticcall(
                        abi.encodeWithSignature(
                            string(abi.encodePacked(instruction[1], "()"))
                        )
                    );
                    data = matchBytes;
                }
                if (stringsEqual(instruction[2], "HEX")) {
                    if (operandIsKey == true) {
                        assembly {
                            stackItem := mload(add(data, 0x20))
                        }
                    } else {
                        stackItem = bytes32(
                            atoi(String.uppercase(instruction[1]), 16)
                        );
                    }
                } else if (stringsEqual(instruction[2], "STRING")) {
                    if (operandIsKey == true) {
                        assembly {
                            stackItem := mload(add(data, 0x60))
                        }
                    } else {
                        assembly {
                            stackItem := mload(add(instructionPart1, 0x20))
                        }
                    }
                } else if (stringsEqual(instruction[2], "DECIMAL")) {
                    if (operandIsKey == true) {
                        assembly {
                            stackItem := mload(add(data, 0x20))
                        }
                    } else {
                        stackItem = bytes32(atoi(instruction[1], 10));
                    }
                }
                stack[stackLength] = stackItem;
                stackLength++;
            }
        }
        if (uint256(stack[0]) == 1) {
            return true;
        }
        return false;
    }

    /**
     * Allow storage slots to be manually updated
     */
    function updateSlot(bytes32 slot, bytes32 value) external {
        require(msg.sender == ownerAddress, "Caller is not the owner");
        assembly {
            sstore(slot, value)
        }
    }
}

library String {
    /**
     * Convert a string to lowercase
     */
    function lowercase(string memory input)
        internal
        pure
        returns (string memory)
    {
        bytes memory _input = bytes(input);
        for (uint256 inputIdx = 0; inputIdx < _input.length; inputIdx++) {
            uint8 character = uint8(_input[inputIdx]);
            if (character >= 65 && character <= 90) {
                character += 0x20;
                _input[inputIdx] = bytes1(character);
            }
        }
        return string(_input);
    }

    /**
     * Convert a string to uppercase
     */
    function uppercase(string memory input)
        internal
        pure
        returns (string memory)
    {
        bytes memory _input = bytes(input);
        for (uint256 inputIdx = 0; inputIdx < _input.length; inputIdx++) {
            uint8 character = uint8(_input[inputIdx]);
            if (character >= 97 && character <= 122) {
                character -= 0x20;
                _input[inputIdx] = bytes1(character);
            }
        }
        return string(_input);
    }

    /**
     * Search for a needle in a haystack
     */
    function contains(string memory haystack, string memory needle)
        internal
        pure
        returns (bool)
    {
        return indexOf(needle, haystack) >= 0;
    }

    /**
     * Convert bytes32 to string and remove padding
     */
    function bytes32ToString(bytes32 _bytes32)
        public
        pure
        returns (string memory)
    {
        uint8 i = 0;
        while (i < 32 && _bytes32[i] != 0) {
            i++;
        }
        bytes memory bytesArray = new bytes(i);
        for (i = 0; i < 32 && _bytes32[i] != 0; i++) {
            bytesArray[i] = _bytes32[i];
        }
        return string(bytesArray);
    }

    /**
     * Case insensitive string search
     *
     * @param needle The string to search for
     * @param haystack The string to search in
     * @return Returns -1 if no match is found, otherwise returns the index of the match
     */
    function indexOf(string memory needle, string memory haystack)
        internal
        pure
        returns (int256)
    {
        bytes memory _needle = bytes(lowercase(needle));
        bytes memory _haystack = bytes(lowercase(haystack));
        if (_haystack.length < _needle.length) {
            return -1;
        }
        bool _match;
        for (
            uint256 haystackIdx;
            haystackIdx < _haystack.length;
            haystackIdx++
        ) {
            for (uint256 needleIdx; needleIdx < _needle.length; needleIdx++) {
                uint8 needleChar = uint8(_needle[needleIdx]);
                if (haystackIdx + needleIdx >= _haystack.length) {
                    return -1;
                }
                uint8 haystackChar = uint8(_haystack[haystackIdx + needleIdx]);
                if (needleChar == haystackChar) {
                    _match = true;
                    if (needleIdx == _needle.length - 1) {
                        return int256(haystackIdx);
                    }
                } else {
                    _match = false;
                    break;
                }
            }
        }
        return -1;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_addressesGeneratorAddress","type":"address"},{"internalType":"address","name":"_addressesMergeHelperAddress","type":"address"},{"internalType":"address","name":"_oracleAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"addressesGeneratorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"addressesMergeHelperAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"assetAddress","type":"address"}],"name":"assetStrategies","outputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"id","type":"address"},{"internalType":"string","name":"apiVersion","type":"string"},{"internalType":"address","name":"strategist","type":"address"},{"internalType":"address","name":"rewards","type":"address"},{"internalType":"address","name":"vault","type":"address"},{"internalType":"address","name":"keeper","type":"address"},{"internalType":"address","name":"want","type":"address"},{"internalType":"uint256","name":"wantPriceUsdc","type":"uint256"},{"internalType":"uint8","name":"wantDecimals","type":"uint8"},{"internalType":"string","name":"wantSymbol","type":"string"},{"internalType":"bool","name":"emergencyExit","type":"bool"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"uint256","name":"delegatedAssets","type":"uint256"},{"internalType":"uint256","name":"estimatedTotalAssets","type":"uint256"},{"internalType":"uint256","name":"estimatedTotalAssetsUsdc","type":"uint256"},{"internalType":"bool","name":"doHealthCheck","type":"bool"},{"internalType":"address","name":"healthCheckAddress","type":"address"}],"internalType":"struct StrategiesHelper.StrategyMetadata[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"assetAddress","type":"address"}],"name":"assetStrategiesAddresses","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"assetAddress","type":"address"}],"name":"assetStrategiesDelegatedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"assetAddress","type":"address"}],"name":"assetStrategiesLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_assetsAddresses","type":"address[]"}],"name":"assetsStrategies","outputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"id","type":"address"},{"internalType":"string","name":"apiVersion","type":"string"},{"internalType":"address","name":"strategist","type":"address"},{"internalType":"address","name":"rewards","type":"address"},{"internalType":"address","name":"vault","type":"address"},{"internalType":"address","name":"keeper","type":"address"},{"internalType":"address","name":"want","type":"address"},{"internalType":"uint256","name":"wantPriceUsdc","type":"uint256"},{"internalType":"uint8","name":"wantDecimals","type":"uint8"},{"internalType":"string","name":"wantSymbol","type":"string"},{"internalType":"bool","name":"emergencyExit","type":"bool"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"uint256","name":"delegatedAssets","type":"uint256"},{"internalType":"uint256","name":"estimatedTotalAssets","type":"uint256"},{"internalType":"uint256","name":"estimatedTotalAssetsUsdc","type":"uint256"},{"internalType":"bool","name":"doHealthCheck","type":"bool"},{"internalType":"address","name":"healthCheckAddress","type":"address"}],"internalType":"struct StrategiesHelper.StrategyMetadata[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"assetsStrategies","outputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"id","type":"address"},{"internalType":"string","name":"apiVersion","type":"string"},{"internalType":"address","name":"strategist","type":"address"},{"internalType":"address","name":"rewards","type":"address"},{"internalType":"address","name":"vault","type":"address"},{"internalType":"address","name":"keeper","type":"address"},{"internalType":"address","name":"want","type":"address"},{"internalType":"uint256","name":"wantPriceUsdc","type":"uint256"},{"internalType":"uint8","name":"wantDecimals","type":"uint8"},{"internalType":"string","name":"wantSymbol","type":"string"},{"internalType":"bool","name":"emergencyExit","type":"bool"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"uint256","name":"delegatedAssets","type":"uint256"},{"internalType":"uint256","name":"estimatedTotalAssets","type":"uint256"},{"internalType":"uint256","name":"estimatedTotalAssetsUsdc","type":"uint256"},{"internalType":"bool","name":"doHealthCheck","type":"bool"},{"internalType":"address","name":"healthCheckAddress","type":"address"}],"internalType":"struct StrategiesHelper.StrategyMetadata[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"assetsStrategiesAddresses","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_assetsAddresses","type":"address[]"}],"name":"assetsStrategiesAddresses","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string[][]","name":"filter","type":"string[][]"}],"name":"assetsStrategiesAddressesByFilter","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_strategiesAddresses","type":"address[]"},{"internalType":"string[][]","name":"filter","type":"string[][]"}],"name":"assetsStrategiesAddressesByFilter","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string[][]","name":"_filter","type":"string[][]"}],"name":"assetsStrategiesByFilter","outputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"id","type":"address"},{"internalType":"string","name":"apiVersion","type":"string"},{"internalType":"address","name":"strategist","type":"address"},{"internalType":"address","name":"rewards","type":"address"},{"internalType":"address","name":"vault","type":"address"},{"internalType":"address","name":"keeper","type":"address"},{"internalType":"address","name":"want","type":"address"},{"internalType":"uint256","name":"wantPriceUsdc","type":"uint256"},{"internalType":"uint8","name":"wantDecimals","type":"uint8"},{"internalType":"string","name":"wantSymbol","type":"string"},{"internalType":"bool","name":"emergencyExit","type":"bool"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"uint256","name":"delegatedAssets","type":"uint256"},{"internalType":"uint256","name":"estimatedTotalAssets","type":"uint256"},{"internalType":"uint256","name":"estimatedTotalAssetsUsdc","type":"uint256"},{"internalType":"bool","name":"doHealthCheck","type":"bool"},{"internalType":"address","name":"healthCheckAddress","type":"address"}],"internalType":"struct StrategiesHelper.StrategyMetadata[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_assetsAddresses","type":"address[]"},{"internalType":"string[][]","name":"_filter","type":"string[][]"}],"name":"assetsStrategiesByFilter","outputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"id","type":"address"},{"internalType":"string","name":"apiVersion","type":"string"},{"internalType":"address","name":"strategist","type":"address"},{"internalType":"address","name":"rewards","type":"address"},{"internalType":"address","name":"vault","type":"address"},{"internalType":"address","name":"keeper","type":"address"},{"internalType":"address","name":"want","type":"address"},{"internalType":"uint256","name":"wantPriceUsdc","type":"uint256"},{"internalType":"uint8","name":"wantDecimals","type":"uint8"},{"internalType":"string","name":"wantSymbol","type":"string"},{"internalType":"bool","name":"emergencyExit","type":"bool"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"uint256","name":"delegatedAssets","type":"uint256"},{"internalType":"uint256","name":"estimatedTotalAssets","type":"uint256"},{"internalType":"uint256","name":"estimatedTotalAssetsUsdc","type":"uint256"},{"internalType":"bool","name":"doHealthCheck","type":"bool"},{"internalType":"address","name":"healthCheckAddress","type":"address"}],"internalType":"struct StrategiesHelper.StrategyMetadata[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"assetsStrategiesDelegatedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"assetsStrategiesLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracleAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_strategiesAddresses","type":"address[]"}],"name":"strategies","outputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"id","type":"address"},{"internalType":"string","name":"apiVersion","type":"string"},{"internalType":"address","name":"strategist","type":"address"},{"internalType":"address","name":"rewards","type":"address"},{"internalType":"address","name":"vault","type":"address"},{"internalType":"address","name":"keeper","type":"address"},{"internalType":"address","name":"want","type":"address"},{"internalType":"uint256","name":"wantPriceUsdc","type":"uint256"},{"internalType":"uint8","name":"wantDecimals","type":"uint8"},{"internalType":"string","name":"wantSymbol","type":"string"},{"internalType":"bool","name":"emergencyExit","type":"bool"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"uint256","name":"delegatedAssets","type":"uint256"},{"internalType":"uint256","name":"estimatedTotalAssets","type":"uint256"},{"internalType":"uint256","name":"estimatedTotalAssetsUsdc","type":"uint256"},{"internalType":"bool","name":"doHealthCheck","type":"bool"},{"internalType":"address","name":"healthCheckAddress","type":"address"}],"internalType":"struct StrategiesHelper.StrategyMetadata[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"strategyAddress","type":"address"}],"name":"strategy","outputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"id","type":"address"},{"internalType":"string","name":"apiVersion","type":"string"},{"internalType":"address","name":"strategist","type":"address"},{"internalType":"address","name":"rewards","type":"address"},{"internalType":"address","name":"vault","type":"address"},{"internalType":"address","name":"keeper","type":"address"},{"internalType":"address","name":"want","type":"address"},{"internalType":"uint256","name":"wantPriceUsdc","type":"uint256"},{"internalType":"uint8","name":"wantDecimals","type":"uint8"},{"internalType":"string","name":"wantSymbol","type":"string"},{"internalType":"bool","name":"emergencyExit","type":"bool"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"uint256","name":"delegatedAssets","type":"uint256"},{"internalType":"uint256","name":"estimatedTotalAssets","type":"uint256"},{"internalType":"uint256","name":"estimatedTotalAssetsUsdc","type":"uint256"},{"internalType":"bool","name":"doHealthCheck","type":"bool"},{"internalType":"address","name":"healthCheckAddress","type":"address"}],"internalType":"struct StrategiesHelper.StrategyMetadata","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"strategyAddress","type":"address"},{"internalType":"string[][]","name":"instructions","type":"string[][]"}],"name":"strategyPassesFilter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"slot","type":"bytes32"},{"internalType":"bytes32","name":"value","type":"bytes32"}],"name":"updateSlot","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162002d6038038062002d608339810160408190526200003491620000a1565b600080546001600160a01b039485166001600160a01b03199182161790915560018054938516938216939093179092556002805491909316908216179091556003805490911633179055620000eb565b80516001600160a01b03811681146200009c57600080fd5b919050565b600080600060608486031215620000b757600080fd5b620000c28462000084565b9250620000d26020850162000084565b9150620000e26040850162000084565b90509250925092565b612c6580620000fb6000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c806391ea83e8116100b8578063a89ae4ba1161007c578063a89ae4ba146102be578063d09b7ab7146102d1578063d829c2b3146102e4578063f01c2668146102ec578063f7520f4e146102ff578063fbfdf0791461031257600080fd5b806391ea83e81461026857806397a077b91461027d5780639add9d0214610290578063a1a31444146102a3578063a5b166fb146102ab57600080fd5b80635616c3e41161010a5780635616c3e4146101db57806359bd3909146101f1578063611175121461021c5780636f961bf11461022f57806380a0c5cd146102425780638f84aa091461025557600080fd5b80630ec82f5b146101475780632096c59e14610170578063228bfd9f14610193578063336b5eb2146101b357806347411919146101d3575b600080fd5b61015a61015536600461263c565b610325565b6040516101679190612986565b60405180910390f35b61018361017e3660046124b8565b610344565b6040519015158152602001610167565b6101a66101a136600461247e565b610c4f565b6040516101679190612a50565b6101c66101c1366004612507565b6115e7565b60405161016791906129fb565b61015a6116b3565b6101e3611746565b604051908152602001610167565b600054610204906001600160a01b031681565b6040516001600160a01b039091168152602001610167565b6101e361022a36600461247e565b611823565b6101c661023d366004612507565b611903565b61015a610250366004612507565b61190d565b600354610204906001600160a01b031681565b61027b610276366004612692565b611a5a565b005b61015a61028b36600461247e565b611abc565b6101c661029e36600461263c565b611bd8565b6101c6611bf0565b6101e36102b936600461247e565b611c07565b600254610204906001600160a01b031681565b600154610204906001600160a01b031681565b6101e3611cb0565b6101c66102fa36600461247e565b611cc0565b61015a61030d3660046125e3565b611dee565b6101c66103203660046125e3565b611ec4565b606060006103316116b3565b905061033d8184611dee565b9392505050565b600080825160036103559190612b1a565b6001600160401b0381111561036c5761036c612c01565b604051908082528060200260200182016040528015610395578160200160208202803683370190505b5090506000805b8451811015610c105760008582815181106103b9576103b9612beb565b602002602001015190506000816001815181106103d8576103d8612beb565b602002602001015190506000610430836000815181106103fa576103fa612beb565b60200260200101516040518060400160405280600881526020016727a822a920aa27a960c11b8152506020918201519101511490565b905080156109095760008087610447600189612b39565b8151811061045757610457612beb565b602002602001015190506000886002896104719190612b39565b8151811061048157610481612beb565b602002602001015190506104d1866001815181106104a1576104a1612beb565b602002602001015160405180604001604052806002815260200161455160f01b8152506020918201519101511490565b156104dc5781811492505b610522866001815181106104f2576104f2612beb565b6020026020010151604051806040016040528060028152602001614e4560f01b8152506020918201519101511490565b1561052e578181141592505b6105748660018151811061054457610544612beb565b60200260200101516040518060400160405280600281526020016111d560f21b8152506020918201519101511490565b1561057f5780821192505b6105c68660018151811061059557610595612beb565b60200260200101516040518060400160405280600381526020016247544560e81b8152506020918201519101511490565b156105d2578082101592505b610618866001815181106105e8576105e8612beb565b602002602001015160405180604001604052806002815260200161131560f21b8152506020918201519101511490565b156106235780821092505b61066a8660018151811061063957610639612beb565b6020026020010151604051806040016040528060038152602001624c544560e81b8152506020918201519101511490565b15610676578082111592505b6106bd8660018151811061068c5761068c612beb565b60200260200101516040518060400160405280600381526020016210539160ea1b8152506020918201519101511490565b156106cb5760018282161492505b610711866001815181106106e1576106e1612beb565b60200260200101516040518060400160405280600281526020016127a960f11b8152506020918201519101511490565b1561071f5760018282171492505b6107678660018151811061073557610735612beb565b6020026020010151604051806040016040528060048152602001634c494b4560e01b8152506020918201519101511490565b1561089457604051639201de5560e01b81526004810182905260009073d471af5f1e7d0e2f1523e8e3c5f290b193e3150b90639201de559060240160006040518083038186803b1580156107ba57600080fd5b505af41580156107ce573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526107f691908101906126b4565b604051639201de5560e01b81526004810185905290915060009073d471af5f1e7d0e2f1523e8e3c5f290b193e3150b90639201de559060240160006040518083038186803b15801561084757600080fd5b505af415801561085b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261088391908101906126b4565b905061088f8282611ed3565b945050505b82156108c9576001896108a860028b612b39565b815181106108b8576108b8612beb565b6020026020010181815250506108f4565b6000896108d760028b612b39565b815181106108e7576108e7612beb565b6020026020010181815250505b876108fe81612ba3565b985050505050610bfa565b6000806109538560008151811061092257610922612beb565b6020026020010151604051806040016040528060038152602001624b455960e81b8152506020918201519101511490565b905060608115610a335760008c6001600160a01b03168760018151811061097c5761097c612beb565b60200260200101516040516020016109949190612960565b60408051601f198184030181526004835260248301918290526109b691612944565b60408051918290039091206020830180516001600160e01b03166001600160e01b0319909216919091179052516109ed9190612944565b600060405180830381855afa9150503d8060008114610a28576040519150601f19603f3d011682016040523d82523d6000602084013e610a2d565b606091505b50925050505b610a7a86600281518110610a4957610a49612beb565b6020026020010151604051806040016040528060038152602001620908ab60eb1b8152506020918201519101511490565b15610aca5760018215151415610a965760208101519250610bcb565b610ac3610abc87600181518110610aaf57610aaf612beb565b6020026020010151611ee9565b6010611f85565b9250610bcb565b610b1486600281518110610ae057610ae0612beb565b602002602001015160405180604001604052806006815260200165535452494e4760d01b8152506020918201519101511490565b15610b3c5760018215151415610b305760608101519250610bcb565b60208501519250610bcb565b610b8786600281518110610b5257610b52612beb565b602002602001015160405180604001604052806007815260200166111150d253505360ca1b8152506020918201519101511490565b15610bcb5760018215151415610ba35760208101519250610bcb565b610bc886600181518110610bb957610bb9612beb565b6020026020010151600a611f85565b92505b82898981518110610bde57610bde612beb565b602090810291909101015287610bf381612bba565b9850505050505b5050508080610c0890612bba565b91505061039c565b5081600081518110610c2457610c24612beb565b602002602001015160001c60011415610c4257600192505050610c49565b6000925050505b92915050565b610c5761221f565b60008290506000600260009054906101000a90046001600160a01b031690506000806000846001600160a01b0316631f1fcd516040518163ffffffff1660e01b815260040160206040518083038186803b158015610cb457600080fd5b505afa158015610cc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cec919061249b565b604051632415d18360e11b81526001600160a01b03808316600483015291925082916000919087169063482ba3069060240160206040518083038186803b158015610d3657600080fd5b505afa158015610d4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6e9190612721565b90506000876001600160a01b031663efbb5cb06040518163ffffffff1660e01b815260040160206040518083038186803b158015610dab57600080fd5b505afa158015610dbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de39190612721565b9050876001600160a01b0316636718835f6040518163ffffffff1660e01b815260040160206040518083038186803b158015610e1e57600080fd5b505afa925050508015610e4e575060408051601f3d908101601f19168201909252610e4b91810190612670565b60015b610e5757610ecc565b50876001600160a01b0316636718835f6040518163ffffffff1660e01b815260040160206040518083038186803b158015610e9157600080fd5b505afa158015610ea5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec99190612670565b95505b876001600160a01b031663b252720b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f0557600080fd5b505afa925050508015610f35575060408051601f3d908101601f19168201909252610f329181019061249b565b60015b610f3e57610fb3565b50876001600160a01b031663b252720b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f7857600080fd5b505afa158015610f8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb0919061249b565b94505b604051806102400160405280896001600160a01b03166306fdde036040518163ffffffff1660e01b815260040160006040518083038186803b158015610ff857600080fd5b505afa15801561100c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261103491908101906126b4565b81526020018b6001600160a01b03168152602001896001600160a01b031663258294106040518163ffffffff1660e01b815260040160006040518083038186803b15801561108157600080fd5b505afa158015611095573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110bd91908101906126b4565b8152602001896001600160a01b0316631fe4a6866040518163ffffffff1660e01b815260040160206040518083038186803b1580156110fb57600080fd5b505afa15801561110f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611133919061249b565b6001600160a01b03168152602001896001600160a01b0316639ec5a8946040518163ffffffff1660e01b815260040160206040518083038186803b15801561117a57600080fd5b505afa15801561118e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b2919061249b565b6001600160a01b03168152602001896001600160a01b031663fbfa77cf6040518163ffffffff1660e01b815260040160206040518083038186803b1580156111f957600080fd5b505afa15801561120d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611231919061249b565b6001600160a01b03168152602001896001600160a01b031663aced16616040518163ffffffff1660e01b815260040160206040518083038186803b15801561127857600080fd5b505afa15801561128c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b0919061249b565b6001600160a01b03168152602001856001600160a01b03168152602001838152602001846001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561130c57600080fd5b505afa158015611320573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611344919061273a565b60ff168152602001846001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b15801561138557600080fd5b505afa158015611399573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113c191908101906126b4565b8152602001896001600160a01b0316635641ec036040518163ffffffff1660e01b815260040160206040518083038186803b1580156113ff57600080fd5b505afa158015611413573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114379190612670565b15158152602001896001600160a01b03166322f3e2d46040518163ffffffff1660e01b815260040160206040518083038186803b15801561147757600080fd5b505afa15801561148b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114af9190612670565b15158152602001896001600160a01b0316638e6350e26040518163ffffffff1660e01b815260040160206040518083038186803b1580156114ef57600080fd5b505afa158015611503573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115279190612721565b81526020810183905260408051636816905560e11b81526001600160a01b03888116600483015260248201869052604482018790529190920191908a169063d02d20aa9060640160206040518083038186803b15801561158657600080fd5b505afa15801561159a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115be9190612721565b81526020018715158152602001866001600160a01b031681525098505050505050505050919050565b80516060906000816001600160401b0381111561160657611606612c01565b60405190808252806020026020018201604052801561163f57816020015b61162c61221f565b8152602001906001900390816116245790505b50905060005b828110156116ab57600085828151811061166157611661612beb565b60200260200101519050600061167682610c4f565b90508084848151811061168b5761168b612beb565b6020026020010181905250505080806116a390612bba565b915050611645565b509392505050565b600080546040805163a31091c760e01b81529051606093926001600160a01b03169163a31091c79160048083019286929190829003018186803b1580156116f957600080fd5b505afa15801561170d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526117359190810190612543565b90506117408161190d565b91505090565b600080546040805163a31091c760e01b8152905183926001600160a01b03169163a31091c79160048083019286929190829003018186803b15801561178a57600080fd5b505afa15801561179e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526117c69190810190612543565b80519091506000805b828110156116ab5760008482815181106117eb576117eb612beb565b60200260200101519050600061180082611823565b905061180c8185612add565b93505050808061181b90612bba565b9150506117cf565b60008061182f83611abc565b80519091506000805b828110156118fa57600084828151811061185457611854612beb565b6020026020010151905060008190506000816001600160a01b0316638e6350e26040518163ffffffff1660e01b815260040160206040518083038186803b15801561189e57600080fd5b505afa1580156118b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d69190612721565b90506118e28186612add565b945050505080806118f290612bba565b915050611838565b50949350505050565b6060610c496101c1835b80516060906000816001600160401b0381111561192c5761192c612c01565b60405190808252806020026020018201604052801561195f57816020015b606081526020019060019003908161194a5790505b50905060005b828110156119cb57600085828151811061198157611981612beb565b60200260200101519050600061199682611abc565b9050808484815181106119ab576119ab612beb565b6020026020010181905250505080806119c390612bba565b915050611965565b50600154604051631819535760e31b81526000916001600160a01b03169063c0ca9ab8906119fd908590600401612999565b60006040518083038186803b158015611a1557600080fd5b505afa158015611a29573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611a519190810190612543565b95945050505050565b6003546001600160a01b03163314611ab85760405162461bcd60e51b815260206004820152601760248201527f43616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015260640160405180910390fd5b9055565b6060816000611aca82611c07565b90506000816001600160401b03811115611ae657611ae6612c01565b604051908082528060200260200182016040528015611b0f578160200160208202803683370190505b50905060005b828110156118fa5760405163641156ed60e11b8152600481018290526000906001600160a01b0386169063c822adda9060240160206040518083038186803b158015611b6057600080fd5b505afa158015611b74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b98919061249b565b905080838381518110611bad57611bad612beb565b6001600160a01b03909216602092830291909101909101525080611bd081612bba565b915050611b15565b60606000611be583610325565b905061033d816115e7565b60606000611bfc6116b3565b9050611740816115e7565b600081815b60405163641156ed60e11b8152600481018290526000906001600160a01b0384169063c822adda9060240160206040518083038186803b158015611c4f57600080fd5b505afa158015611c63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c87919061249b565b90506001600160a01b038116611c9d575061033d565b81611ca781612bba565b92505050611c0c565b6000611cba6116b3565b51905090565b6060816000611cce82611c07565b90506000816001600160401b03811115611cea57611cea612c01565b604051908082528060200260200182016040528015611d2357816020015b611d1061221f565b815260200190600190039081611d085790505b50905060005b828110156118fa5760405163641156ed60e11b8152600481018290526000906001600160a01b0386169063c822adda9060240160206040518083038186803b158015611d7457600080fd5b505afa158015611d88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dac919061249b565b90506000611db982610c4f565b905080848481518110611dce57611dce612beb565b602002602001018190525050508080611de690612bba565b915050611d29565b81516060906000805b82811015611e78576000868281518110611e1357611e13612beb565b60200260200101519050611e278187610344565b15611e655780878481518110611e3f57611e3f612beb565b6001600160a01b039092166020928302919091019091015282611e6181612bba565b9350505b5080611e7081612bba565b915050611df7565b50600085604051602001611e8c9190612986565b6040516020818303038152906040529050816040820152600081806020019051810190611eb99190612543565b979650505050505050565b606061033d6101c18484611dee565b600080611ee0838561205e565b12159392505050565b60608160005b8151811015611f7e576000828281518110611f0c57611f0c612beb565b016020015160f81c905060618110801590611f2b5750607a8160ff1611155b15611f6b57611f3b602082612b50565b90508060f81b838381518110611f5357611f53612beb565b60200101906001600160f81b031916908160001a9053505b5080611f7681612bba565b915050611eef565b5092915050565b60008160ff1660021480611f9c57508160ff166008145b80611faa57508160ff16600a145b80611fb857508160ff166010145b611fc157600080fd5b8260005b81518110156120565760006030838381518110611fe457611fe4612beb565b0160200151611ff6919060f81c612b50565b9050600a8160ff1611156120125761200f600782612b50565b90505b8460ff168160ff161061202457600080fd5b61203160ff861685612b1a565b935061204060ff821685612add565b935050808061204e90612bba565b915050611fc5565b505092915050565b60008061206a8461218a565b905060006120778461218a565b905081518151101561208f5760001992505050610c49565b6000805b825181101561217c5760005b84518110156121695760008582815181106120bc576120bc612beb565b0160200151855160f89190911c91506120d58385612add565b106120ea576000199650505050505050610c49565b6000856120f78486612add565b8151811061210757612107612beb565b016020015160f81c905060ff821681141561214957600194506001875161212e9190612b39565b8314156121445783975050505050505050610c49565b612154565b600094505050612169565b5050808061216190612bba565b91505061209f565b508061217481612bba565b915050612093565b506000199695505050505050565b60608160005b8151811015611f7e5760008282815181106121ad576121ad612beb565b016020015160f81c9050604181108015906121cc5750605a8160ff1611155b1561220c576121dc602082612af5565b90508060f81b8383815181106121f4576121f4612beb565b60200101906001600160f81b031916908160001a9053505b508061221781612bba565b915050612190565b604080516102408101825260608082526000602083018190529282018190528082018390526080820183905260a0820183905260c0820183905260e0820183905261010082018390526101208201839052610140820152610160810182905261018081018290526101a081018290526101c081018290526101e08101829052610200810182905261022081019190915290565b600082601f8301126122c357600080fd5b813560206122d86122d383612a93565b612a63565b80838252828201915082860187848660051b89010111156122f857600080fd5b60005b8581101561232057813561230e81612c17565b845292840192908401906001016122fb565b5090979650505050505050565b600082601f83011261233e57600080fd5b61234b6122d38335612a93565b808335825260208201915060208401856020863560051b870101111561237057600080fd5b60005b8535811015612473576001600160401b038235111561239157600080fd5b8135860187603f8201126123a457600080fd5b60208101356123b56122d382612a93565b80828252602082019150604084018b60408560051b87010111156123d857600080fd5b60005b84811015612459576001600160401b03823511156123f857600080fd5b813586018d605f82011261240b57600080fd5b604081013561241c6122d382612ab6565b8181528f606083850101111561243157600080fd5b81606084016020830137600060209282018301528652948501949290920191506001016123db565b505087525050602094850194929092019150600101612373565b509095945050505050565b60006020828403121561249057600080fd5b813561033d81612c17565b6000602082840312156124ad57600080fd5b815161033d81612c17565b600080604083850312156124cb57600080fd5b82356124d681612c17565b915060208301356001600160401b038111156124f157600080fd5b6124fd8582860161232d565b9150509250929050565b60006020828403121561251957600080fd5b81356001600160401b0381111561252f57600080fd5b61253b848285016122b2565b949350505050565b6000602080838503121561255657600080fd5b82516001600160401b0381111561256c57600080fd5b8301601f8101851361257d57600080fd5b805161258b6122d382612a93565b80828252848201915084840188868560051b87010111156125ab57600080fd5b600094505b838510156125d75780516125c381612c17565b8352600194909401939185019185016125b0565b50979650505050505050565b600080604083850312156125f657600080fd5b82356001600160401b038082111561260d57600080fd5b612619868387016122b2565b9350602085013591508082111561262f57600080fd5b506124fd8582860161232d565b60006020828403121561264e57600080fd5b81356001600160401b0381111561266457600080fd5b61253b8482850161232d565b60006020828403121561268257600080fd5b8151801515811461033d57600080fd5b600080604083850312156126a557600080fd5b50508035926020909101359150565b6000602082840312156126c657600080fd5b81516001600160401b038111156126dc57600080fd5b8201601f810184136126ed57600080fd5b80516126fb6122d382612ab6565b81815285602083850101111561271057600080fd5b611a51826020830160208601612b73565b60006020828403121561273357600080fd5b5051919050565b60006020828403121561274c57600080fd5b815160ff8116811461033d57600080fd5b600081518084526020808501945080840160005b838110156127965781516001600160a01b031687529582019590820190600101612771565b509495945050505050565b600081518084526127b9816020860160208601612b73565b601f01601f19169290920160200192915050565b600061024082518185526127e3828601826127a1565b915050602083015161280060208601826001600160a01b03169052565b506040830151848203604086015261281882826127a1565b915050606083015161283560608601826001600160a01b03169052565b50608083015161285060808601826001600160a01b03169052565b5060a083015161286b60a08601826001600160a01b03169052565b5060c083015161288660c08601826001600160a01b03169052565b5060e08301516128a160e08601826001600160a01b03169052565b5061010083810151908501526101208084015160ff169085015261014080840151858303828701526128d383826127a1565b92505050610160808401516128eb8287018215159052565b5050610180838101511515908501526101a080840151908501526101c080840151908501526101e0808401519085015261020080840151151590850152610220928301516001600160a01b031692909301919091525090565b60008251612956818460208701612b73565b9190910192915050565b60008251612972818460208701612b73565b61282960f01b920191825250600201919050565b60208152600061033d602083018461275d565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156129ee57603f198886030184526129dc85835161275d565b945092850192908501906001016129c0565b5092979650505050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156129ee57603f19888603018452612a3e8583516127cd565b94509285019290850190600101612a22565b60208152600061033d60208301846127cd565b604051601f8201601f191681016001600160401b0381118282101715612a8b57612a8b612c01565b604052919050565b60006001600160401b03821115612aac57612aac612c01565b5060051b60200190565b60006001600160401b03821115612acf57612acf612c01565b50601f01601f191660200190565b60008219821115612af057612af0612bd5565b500190565b600060ff821660ff84168060ff03821115612b1257612b12612bd5565b019392505050565b6000816000190483118215151615612b3457612b34612bd5565b500290565b600082821015612b4b57612b4b612bd5565b500390565b600060ff821660ff841680821015612b6a57612b6a612bd5565b90039392505050565b60005b83811015612b8e578181015183820152602001612b76565b83811115612b9d576000848401525b50505050565b600081612bb257612bb2612bd5565b506000190190565b6000600019821415612bce57612bce612bd5565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114612c2c57600080fd5b5056fea264697066735822122083a4b901805d99a41fdb2132422e98acd6ecde5a7c70bad6d9b5b7bdf0b576ed64736f6c634300080600330000000000000000000000008ca27a3ab8917a033f278d20135d2467faa099ba000000000000000000000000001d0a58b336f60ee050cb11ee455fd7eb98451800000000000000000000000057aa88a0810dfe3f9b71a9b179dd8bf5f956c46a

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101425760003560e01c806391ea83e8116100b8578063a89ae4ba1161007c578063a89ae4ba146102be578063d09b7ab7146102d1578063d829c2b3146102e4578063f01c2668146102ec578063f7520f4e146102ff578063fbfdf0791461031257600080fd5b806391ea83e81461026857806397a077b91461027d5780639add9d0214610290578063a1a31444146102a3578063a5b166fb146102ab57600080fd5b80635616c3e41161010a5780635616c3e4146101db57806359bd3909146101f1578063611175121461021c5780636f961bf11461022f57806380a0c5cd146102425780638f84aa091461025557600080fd5b80630ec82f5b146101475780632096c59e14610170578063228bfd9f14610193578063336b5eb2146101b357806347411919146101d3575b600080fd5b61015a61015536600461263c565b610325565b6040516101679190612986565b60405180910390f35b61018361017e3660046124b8565b610344565b6040519015158152602001610167565b6101a66101a136600461247e565b610c4f565b6040516101679190612a50565b6101c66101c1366004612507565b6115e7565b60405161016791906129fb565b61015a6116b3565b6101e3611746565b604051908152602001610167565b600054610204906001600160a01b031681565b6040516001600160a01b039091168152602001610167565b6101e361022a36600461247e565b611823565b6101c661023d366004612507565b611903565b61015a610250366004612507565b61190d565b600354610204906001600160a01b031681565b61027b610276366004612692565b611a5a565b005b61015a61028b36600461247e565b611abc565b6101c661029e36600461263c565b611bd8565b6101c6611bf0565b6101e36102b936600461247e565b611c07565b600254610204906001600160a01b031681565b600154610204906001600160a01b031681565b6101e3611cb0565b6101c66102fa36600461247e565b611cc0565b61015a61030d3660046125e3565b611dee565b6101c66103203660046125e3565b611ec4565b606060006103316116b3565b905061033d8184611dee565b9392505050565b600080825160036103559190612b1a565b6001600160401b0381111561036c5761036c612c01565b604051908082528060200260200182016040528015610395578160200160208202803683370190505b5090506000805b8451811015610c105760008582815181106103b9576103b9612beb565b602002602001015190506000816001815181106103d8576103d8612beb565b602002602001015190506000610430836000815181106103fa576103fa612beb565b60200260200101516040518060400160405280600881526020016727a822a920aa27a960c11b8152506020918201519101511490565b905080156109095760008087610447600189612b39565b8151811061045757610457612beb565b602002602001015190506000886002896104719190612b39565b8151811061048157610481612beb565b602002602001015190506104d1866001815181106104a1576104a1612beb565b602002602001015160405180604001604052806002815260200161455160f01b8152506020918201519101511490565b156104dc5781811492505b610522866001815181106104f2576104f2612beb565b6020026020010151604051806040016040528060028152602001614e4560f01b8152506020918201519101511490565b1561052e578181141592505b6105748660018151811061054457610544612beb565b60200260200101516040518060400160405280600281526020016111d560f21b8152506020918201519101511490565b1561057f5780821192505b6105c68660018151811061059557610595612beb565b60200260200101516040518060400160405280600381526020016247544560e81b8152506020918201519101511490565b156105d2578082101592505b610618866001815181106105e8576105e8612beb565b602002602001015160405180604001604052806002815260200161131560f21b8152506020918201519101511490565b156106235780821092505b61066a8660018151811061063957610639612beb565b6020026020010151604051806040016040528060038152602001624c544560e81b8152506020918201519101511490565b15610676578082111592505b6106bd8660018151811061068c5761068c612beb565b60200260200101516040518060400160405280600381526020016210539160ea1b8152506020918201519101511490565b156106cb5760018282161492505b610711866001815181106106e1576106e1612beb565b60200260200101516040518060400160405280600281526020016127a960f11b8152506020918201519101511490565b1561071f5760018282171492505b6107678660018151811061073557610735612beb565b6020026020010151604051806040016040528060048152602001634c494b4560e01b8152506020918201519101511490565b1561089457604051639201de5560e01b81526004810182905260009073d471af5f1e7d0e2f1523e8e3c5f290b193e3150b90639201de559060240160006040518083038186803b1580156107ba57600080fd5b505af41580156107ce573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526107f691908101906126b4565b604051639201de5560e01b81526004810185905290915060009073d471af5f1e7d0e2f1523e8e3c5f290b193e3150b90639201de559060240160006040518083038186803b15801561084757600080fd5b505af415801561085b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261088391908101906126b4565b905061088f8282611ed3565b945050505b82156108c9576001896108a860028b612b39565b815181106108b8576108b8612beb565b6020026020010181815250506108f4565b6000896108d760028b612b39565b815181106108e7576108e7612beb565b6020026020010181815250505b876108fe81612ba3565b985050505050610bfa565b6000806109538560008151811061092257610922612beb565b6020026020010151604051806040016040528060038152602001624b455960e81b8152506020918201519101511490565b905060608115610a335760008c6001600160a01b03168760018151811061097c5761097c612beb565b60200260200101516040516020016109949190612960565b60408051601f198184030181526004835260248301918290526109b691612944565b60408051918290039091206020830180516001600160e01b03166001600160e01b0319909216919091179052516109ed9190612944565b600060405180830381855afa9150503d8060008114610a28576040519150601f19603f3d011682016040523d82523d6000602084013e610a2d565b606091505b50925050505b610a7a86600281518110610a4957610a49612beb565b6020026020010151604051806040016040528060038152602001620908ab60eb1b8152506020918201519101511490565b15610aca5760018215151415610a965760208101519250610bcb565b610ac3610abc87600181518110610aaf57610aaf612beb565b6020026020010151611ee9565b6010611f85565b9250610bcb565b610b1486600281518110610ae057610ae0612beb565b602002602001015160405180604001604052806006815260200165535452494e4760d01b8152506020918201519101511490565b15610b3c5760018215151415610b305760608101519250610bcb565b60208501519250610bcb565b610b8786600281518110610b5257610b52612beb565b602002602001015160405180604001604052806007815260200166111150d253505360ca1b8152506020918201519101511490565b15610bcb5760018215151415610ba35760208101519250610bcb565b610bc886600181518110610bb957610bb9612beb565b6020026020010151600a611f85565b92505b82898981518110610bde57610bde612beb565b602090810291909101015287610bf381612bba565b9850505050505b5050508080610c0890612bba565b91505061039c565b5081600081518110610c2457610c24612beb565b602002602001015160001c60011415610c4257600192505050610c49565b6000925050505b92915050565b610c5761221f565b60008290506000600260009054906101000a90046001600160a01b031690506000806000846001600160a01b0316631f1fcd516040518163ffffffff1660e01b815260040160206040518083038186803b158015610cb457600080fd5b505afa158015610cc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cec919061249b565b604051632415d18360e11b81526001600160a01b03808316600483015291925082916000919087169063482ba3069060240160206040518083038186803b158015610d3657600080fd5b505afa158015610d4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6e9190612721565b90506000876001600160a01b031663efbb5cb06040518163ffffffff1660e01b815260040160206040518083038186803b158015610dab57600080fd5b505afa158015610dbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de39190612721565b9050876001600160a01b0316636718835f6040518163ffffffff1660e01b815260040160206040518083038186803b158015610e1e57600080fd5b505afa925050508015610e4e575060408051601f3d908101601f19168201909252610e4b91810190612670565b60015b610e5757610ecc565b50876001600160a01b0316636718835f6040518163ffffffff1660e01b815260040160206040518083038186803b158015610e9157600080fd5b505afa158015610ea5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec99190612670565b95505b876001600160a01b031663b252720b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f0557600080fd5b505afa925050508015610f35575060408051601f3d908101601f19168201909252610f329181019061249b565b60015b610f3e57610fb3565b50876001600160a01b031663b252720b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f7857600080fd5b505afa158015610f8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb0919061249b565b94505b604051806102400160405280896001600160a01b03166306fdde036040518163ffffffff1660e01b815260040160006040518083038186803b158015610ff857600080fd5b505afa15801561100c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261103491908101906126b4565b81526020018b6001600160a01b03168152602001896001600160a01b031663258294106040518163ffffffff1660e01b815260040160006040518083038186803b15801561108157600080fd5b505afa158015611095573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110bd91908101906126b4565b8152602001896001600160a01b0316631fe4a6866040518163ffffffff1660e01b815260040160206040518083038186803b1580156110fb57600080fd5b505afa15801561110f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611133919061249b565b6001600160a01b03168152602001896001600160a01b0316639ec5a8946040518163ffffffff1660e01b815260040160206040518083038186803b15801561117a57600080fd5b505afa15801561118e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b2919061249b565b6001600160a01b03168152602001896001600160a01b031663fbfa77cf6040518163ffffffff1660e01b815260040160206040518083038186803b1580156111f957600080fd5b505afa15801561120d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611231919061249b565b6001600160a01b03168152602001896001600160a01b031663aced16616040518163ffffffff1660e01b815260040160206040518083038186803b15801561127857600080fd5b505afa15801561128c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b0919061249b565b6001600160a01b03168152602001856001600160a01b03168152602001838152602001846001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561130c57600080fd5b505afa158015611320573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611344919061273a565b60ff168152602001846001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b15801561138557600080fd5b505afa158015611399573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113c191908101906126b4565b8152602001896001600160a01b0316635641ec036040518163ffffffff1660e01b815260040160206040518083038186803b1580156113ff57600080fd5b505afa158015611413573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114379190612670565b15158152602001896001600160a01b03166322f3e2d46040518163ffffffff1660e01b815260040160206040518083038186803b15801561147757600080fd5b505afa15801561148b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114af9190612670565b15158152602001896001600160a01b0316638e6350e26040518163ffffffff1660e01b815260040160206040518083038186803b1580156114ef57600080fd5b505afa158015611503573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115279190612721565b81526020810183905260408051636816905560e11b81526001600160a01b03888116600483015260248201869052604482018790529190920191908a169063d02d20aa9060640160206040518083038186803b15801561158657600080fd5b505afa15801561159a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115be9190612721565b81526020018715158152602001866001600160a01b031681525098505050505050505050919050565b80516060906000816001600160401b0381111561160657611606612c01565b60405190808252806020026020018201604052801561163f57816020015b61162c61221f565b8152602001906001900390816116245790505b50905060005b828110156116ab57600085828151811061166157611661612beb565b60200260200101519050600061167682610c4f565b90508084848151811061168b5761168b612beb565b6020026020010181905250505080806116a390612bba565b915050611645565b509392505050565b600080546040805163a31091c760e01b81529051606093926001600160a01b03169163a31091c79160048083019286929190829003018186803b1580156116f957600080fd5b505afa15801561170d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526117359190810190612543565b90506117408161190d565b91505090565b600080546040805163a31091c760e01b8152905183926001600160a01b03169163a31091c79160048083019286929190829003018186803b15801561178a57600080fd5b505afa15801561179e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526117c69190810190612543565b80519091506000805b828110156116ab5760008482815181106117eb576117eb612beb565b60200260200101519050600061180082611823565b905061180c8185612add565b93505050808061181b90612bba565b9150506117cf565b60008061182f83611abc565b80519091506000805b828110156118fa57600084828151811061185457611854612beb565b6020026020010151905060008190506000816001600160a01b0316638e6350e26040518163ffffffff1660e01b815260040160206040518083038186803b15801561189e57600080fd5b505afa1580156118b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d69190612721565b90506118e28186612add565b945050505080806118f290612bba565b915050611838565b50949350505050565b6060610c496101c1835b80516060906000816001600160401b0381111561192c5761192c612c01565b60405190808252806020026020018201604052801561195f57816020015b606081526020019060019003908161194a5790505b50905060005b828110156119cb57600085828151811061198157611981612beb565b60200260200101519050600061199682611abc565b9050808484815181106119ab576119ab612beb565b6020026020010181905250505080806119c390612bba565b915050611965565b50600154604051631819535760e31b81526000916001600160a01b03169063c0ca9ab8906119fd908590600401612999565b60006040518083038186803b158015611a1557600080fd5b505afa158015611a29573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611a519190810190612543565b95945050505050565b6003546001600160a01b03163314611ab85760405162461bcd60e51b815260206004820152601760248201527f43616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015260640160405180910390fd5b9055565b6060816000611aca82611c07565b90506000816001600160401b03811115611ae657611ae6612c01565b604051908082528060200260200182016040528015611b0f578160200160208202803683370190505b50905060005b828110156118fa5760405163641156ed60e11b8152600481018290526000906001600160a01b0386169063c822adda9060240160206040518083038186803b158015611b6057600080fd5b505afa158015611b74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b98919061249b565b905080838381518110611bad57611bad612beb565b6001600160a01b03909216602092830291909101909101525080611bd081612bba565b915050611b15565b60606000611be583610325565b905061033d816115e7565b60606000611bfc6116b3565b9050611740816115e7565b600081815b60405163641156ed60e11b8152600481018290526000906001600160a01b0384169063c822adda9060240160206040518083038186803b158015611c4f57600080fd5b505afa158015611c63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c87919061249b565b90506001600160a01b038116611c9d575061033d565b81611ca781612bba565b92505050611c0c565b6000611cba6116b3565b51905090565b6060816000611cce82611c07565b90506000816001600160401b03811115611cea57611cea612c01565b604051908082528060200260200182016040528015611d2357816020015b611d1061221f565b815260200190600190039081611d085790505b50905060005b828110156118fa5760405163641156ed60e11b8152600481018290526000906001600160a01b0386169063c822adda9060240160206040518083038186803b158015611d7457600080fd5b505afa158015611d88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dac919061249b565b90506000611db982610c4f565b905080848481518110611dce57611dce612beb565b602002602001018190525050508080611de690612bba565b915050611d29565b81516060906000805b82811015611e78576000868281518110611e1357611e13612beb565b60200260200101519050611e278187610344565b15611e655780878481518110611e3f57611e3f612beb565b6001600160a01b039092166020928302919091019091015282611e6181612bba565b9350505b5080611e7081612bba565b915050611df7565b50600085604051602001611e8c9190612986565b6040516020818303038152906040529050816040820152600081806020019051810190611eb99190612543565b979650505050505050565b606061033d6101c18484611dee565b600080611ee0838561205e565b12159392505050565b60608160005b8151811015611f7e576000828281518110611f0c57611f0c612beb565b016020015160f81c905060618110801590611f2b5750607a8160ff1611155b15611f6b57611f3b602082612b50565b90508060f81b838381518110611f5357611f53612beb565b60200101906001600160f81b031916908160001a9053505b5080611f7681612bba565b915050611eef565b5092915050565b60008160ff1660021480611f9c57508160ff166008145b80611faa57508160ff16600a145b80611fb857508160ff166010145b611fc157600080fd5b8260005b81518110156120565760006030838381518110611fe457611fe4612beb565b0160200151611ff6919060f81c612b50565b9050600a8160ff1611156120125761200f600782612b50565b90505b8460ff168160ff161061202457600080fd5b61203160ff861685612b1a565b935061204060ff821685612add565b935050808061204e90612bba565b915050611fc5565b505092915050565b60008061206a8461218a565b905060006120778461218a565b905081518151101561208f5760001992505050610c49565b6000805b825181101561217c5760005b84518110156121695760008582815181106120bc576120bc612beb565b0160200151855160f89190911c91506120d58385612add565b106120ea576000199650505050505050610c49565b6000856120f78486612add565b8151811061210757612107612beb565b016020015160f81c905060ff821681141561214957600194506001875161212e9190612b39565b8314156121445783975050505050505050610c49565b612154565b600094505050612169565b5050808061216190612bba565b91505061209f565b508061217481612bba565b915050612093565b506000199695505050505050565b60608160005b8151811015611f7e5760008282815181106121ad576121ad612beb565b016020015160f81c9050604181108015906121cc5750605a8160ff1611155b1561220c576121dc602082612af5565b90508060f81b8383815181106121f4576121f4612beb565b60200101906001600160f81b031916908160001a9053505b508061221781612bba565b915050612190565b604080516102408101825260608082526000602083018190529282018190528082018390526080820183905260a0820183905260c0820183905260e0820183905261010082018390526101208201839052610140820152610160810182905261018081018290526101a081018290526101c081018290526101e08101829052610200810182905261022081019190915290565b600082601f8301126122c357600080fd5b813560206122d86122d383612a93565b612a63565b80838252828201915082860187848660051b89010111156122f857600080fd5b60005b8581101561232057813561230e81612c17565b845292840192908401906001016122fb565b5090979650505050505050565b600082601f83011261233e57600080fd5b61234b6122d38335612a93565b808335825260208201915060208401856020863560051b870101111561237057600080fd5b60005b8535811015612473576001600160401b038235111561239157600080fd5b8135860187603f8201126123a457600080fd5b60208101356123b56122d382612a93565b80828252602082019150604084018b60408560051b87010111156123d857600080fd5b60005b84811015612459576001600160401b03823511156123f857600080fd5b813586018d605f82011261240b57600080fd5b604081013561241c6122d382612ab6565b8181528f606083850101111561243157600080fd5b81606084016020830137600060209282018301528652948501949290920191506001016123db565b505087525050602094850194929092019150600101612373565b509095945050505050565b60006020828403121561249057600080fd5b813561033d81612c17565b6000602082840312156124ad57600080fd5b815161033d81612c17565b600080604083850312156124cb57600080fd5b82356124d681612c17565b915060208301356001600160401b038111156124f157600080fd5b6124fd8582860161232d565b9150509250929050565b60006020828403121561251957600080fd5b81356001600160401b0381111561252f57600080fd5b61253b848285016122b2565b949350505050565b6000602080838503121561255657600080fd5b82516001600160401b0381111561256c57600080fd5b8301601f8101851361257d57600080fd5b805161258b6122d382612a93565b80828252848201915084840188868560051b87010111156125ab57600080fd5b600094505b838510156125d75780516125c381612c17565b8352600194909401939185019185016125b0565b50979650505050505050565b600080604083850312156125f657600080fd5b82356001600160401b038082111561260d57600080fd5b612619868387016122b2565b9350602085013591508082111561262f57600080fd5b506124fd8582860161232d565b60006020828403121561264e57600080fd5b81356001600160401b0381111561266457600080fd5b61253b8482850161232d565b60006020828403121561268257600080fd5b8151801515811461033d57600080fd5b600080604083850312156126a557600080fd5b50508035926020909101359150565b6000602082840312156126c657600080fd5b81516001600160401b038111156126dc57600080fd5b8201601f810184136126ed57600080fd5b80516126fb6122d382612ab6565b81815285602083850101111561271057600080fd5b611a51826020830160208601612b73565b60006020828403121561273357600080fd5b5051919050565b60006020828403121561274c57600080fd5b815160ff8116811461033d57600080fd5b600081518084526020808501945080840160005b838110156127965781516001600160a01b031687529582019590820190600101612771565b509495945050505050565b600081518084526127b9816020860160208601612b73565b601f01601f19169290920160200192915050565b600061024082518185526127e3828601826127a1565b915050602083015161280060208601826001600160a01b03169052565b506040830151848203604086015261281882826127a1565b915050606083015161283560608601826001600160a01b03169052565b50608083015161285060808601826001600160a01b03169052565b5060a083015161286b60a08601826001600160a01b03169052565b5060c083015161288660c08601826001600160a01b03169052565b5060e08301516128a160e08601826001600160a01b03169052565b5061010083810151908501526101208084015160ff169085015261014080840151858303828701526128d383826127a1565b92505050610160808401516128eb8287018215159052565b5050610180838101511515908501526101a080840151908501526101c080840151908501526101e0808401519085015261020080840151151590850152610220928301516001600160a01b031692909301919091525090565b60008251612956818460208701612b73565b9190910192915050565b60008251612972818460208701612b73565b61282960f01b920191825250600201919050565b60208152600061033d602083018461275d565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156129ee57603f198886030184526129dc85835161275d565b945092850192908501906001016129c0565b5092979650505050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156129ee57603f19888603018452612a3e8583516127cd565b94509285019290850190600101612a22565b60208152600061033d60208301846127cd565b604051601f8201601f191681016001600160401b0381118282101715612a8b57612a8b612c01565b604052919050565b60006001600160401b03821115612aac57612aac612c01565b5060051b60200190565b60006001600160401b03821115612acf57612acf612c01565b50601f01601f191660200190565b60008219821115612af057612af0612bd5565b500190565b600060ff821660ff84168060ff03821115612b1257612b12612bd5565b019392505050565b6000816000190483118215151615612b3457612b34612bd5565b500290565b600082821015612b4b57612b4b612bd5565b500390565b600060ff821660ff841680821015612b6a57612b6a612bd5565b90039392505050565b60005b83811015612b8e578181015183820152602001612b76565b83811115612b9d576000848401525b50505050565b600081612bb257612bb2612bd5565b506000190190565b6000600019821415612bce57612bce612bd5565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114612c2c57600080fd5b5056fea264697066735822122083a4b901805d99a41fdb2132422e98acd6ecde5a7c70bad6d9b5b7bdf0b576ed64736f6c63430008060033

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

0000000000000000000000008ca27a3ab8917a033f278d20135d2467faa099ba000000000000000000000000001d0a58b336f60ee050cb11ee455fd7eb98451800000000000000000000000057aa88a0810dfe3f9b71a9b179dd8bf5f956c46a

-----Decoded View---------------
Arg [0] : _addressesGeneratorAddress (address): 0x8ca27a3ab8917a033f278D20135d2467faA099bA
Arg [1] : _addressesMergeHelperAddress (address): 0x001d0a58B336F60ee050cB11EE455Fd7eB984518
Arg [2] : _oracleAddress (address): 0x57AA88A0810dfe3f9b71a9b179Dd8bF5F956C46A

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000008ca27a3ab8917a033f278d20135d2467faa099ba
Arg [1] : 000000000000000000000000001d0a58b336f60ee050cb11ee455fd7eb984518
Arg [2] : 00000000000000000000000057aa88a0810dfe3f9b71a9b179dd8bf5f956c46a


Library Used


Deployed Bytecode Sourcemap

1807:20474:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5992:397;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17409:4589;;;;;;:::i;:::-;;:::i;:::-;;;14825:14:1;;14818:22;14800:41;;14788:2;14773:18;17409:4589:0;14755:92:1;12679:1912:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;14692:712::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;4535:312::-;;;:::i;8594:729::-;;;:::i;:::-;;;15006:25:1;;;14994:2;14979:18;8594:729:0;14961:76:1;1840:40:0;;;;;-1:-1:-1;;;;;1840:40:0;;;;;;-1:-1:-1;;;;;12280:32:1;;;12262:51;;12250:2;12235:18;1840:40:0;12217:102:1;9413:855:0;;;;;;:::i;:::-;;:::i;11945:222::-;;;;;;:::i;:::-;;:::i;7660:851::-;;;;;;:::i;:::-;;:::i;1971:27::-;;;;;-1:-1:-1;;;;;1971:27:0;;;22075:203;;;;;;:::i;:::-;;:::i;:::-;;3759:698;;;;;;:::i;:::-;;:::i;11525:322::-;;;;;;:::i;:::-;;:::i;11183:274::-;;;:::i;3009:459::-;;;;;;:::i;:::-;;:::i;1936:28::-;;;;;-1:-1:-1;;;;;1936:28:0;;;1887:42;;;;;-1:-1:-1;;;;;1887:42:0;;;3554:124;;;:::i;10354:761::-;;;;;;:::i;:::-;;:::i;6458:1114::-;;;;;;:::i;:::-;;:::i;12278:312::-;;;;;;:::i;:::-;;:::i;5992:397::-;6109:16;6149:43;6205:27;:25;:27::i;:::-;6149:83;;6263:118;6315:26;6360:6;6263:33;:118::i;:::-;6243:138;5992:397;-1:-1:-1;;;5992:397:0:o;17409:4589::-;17542:4;17559:22;17598:12;:19;17620:1;17598:23;;;;:::i;:::-;-1:-1:-1;;;;;17584:38:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17584:38:0;;17559:63;;17633:19;17682:23;17663:4229;17738:12;:19;17720:15;:37;17663:4229;;;17816:27;17846:12;17859:15;17846:29;;;;;;;;:::i;:::-;;;;;;;17816:59;;17890:30;17923:11;17935:1;17923:14;;;;;;;;:::i;:::-;;;;;;;17890:47;;17952:22;17977:40;17990:11;18002:1;17990:14;;;;;;;;:::i;:::-;;;;;;;17977:40;;;;;;;;;;;;;-1:-1:-1;;;17977:40:0;;;5800:2;5788:15;;;5782:22;5841:15;;5835:22;5885:30;;5539:384;17977:40;17952:65;;18036:17;18032:3849;;;18074:11;;18125:5;18131:15;18145:1;18131:11;:15;:::i;:::-;18125:22;;;;;;;;:::i;:::-;;;;;;;18104:43;;18166:18;18187:5;18207:1;18193:11;:15;;;;:::i;:::-;18187:22;;;;;;;;:::i;:::-;;;;;;;18166:43;;18232:34;18245:11;18257:1;18245:14;;;;;;;;:::i;:::-;;;;;;;18232:34;;;;;;;;;;;;;-1:-1:-1;;;18232:34:0;;;5800:2;5788:15;;;5782:22;5841:15;;5835:22;5885:30;;5539:384;18232:34;18228:134;;;18300:42;;;;-1:-1:-1;18228:134:0;18384:34;18397:11;18409:1;18397:14;;;;;;;;:::i;:::-;;;;;;;18384:34;;;;;;;;;;;;;-1:-1:-1;;;18384:34:0;;;5800:2;5788:15;;;5782:22;5841:15;;5835:22;5885:30;;5539:384;18384:34;18380:134;;;18452:42;;;;;-1:-1:-1;18380:134:0;18536:34;18549:11;18561:1;18549:14;;;;;;;;:::i;:::-;;;;;;;18536:34;;;;;;;;;;;;;-1:-1:-1;;;18536:34:0;;;5800:2;5788:15;;;5782:22;5841:15;;5835:22;5885:30;;5539:384;18536:34;18532:133;;;18604:41;;;;-1:-1:-1;18532:133:0;18687:35;18700:11;18712:1;18700:14;;;;;;;;:::i;:::-;;;;;;;18687:35;;;;;;;;;;;;;-1:-1:-1;;;18687:35:0;;;5800:2;5788:15;;;5782:22;5841:15;;5835:22;5885:30;;5539:384;18687:35;18683:135;;;18756:42;;;;;-1:-1:-1;18683:135:0;18840:34;18853:11;18865:1;18853:14;;;;;;;;:::i;:::-;;;;;;;18840:34;;;;;;;;;;;;;-1:-1:-1;;;18840:34:0;;;5800:2;5788:15;;;5782:22;5841:15;;5835:22;5885:30;;5539:384;18840:34;18836:133;;;18908:41;;;;-1:-1:-1;18836:133:0;18991:35;19004:11;19016:1;19004:14;;;;;;;;:::i;:::-;;;;;;;18991:35;;;;;;;;;;;;;-1:-1:-1;;;18991:35:0;;;5800:2;5788:15;;;5782:22;5841:15;;5835:22;5885:30;;5539:384;18991:35;18987:135;;;19060:42;;;;;-1:-1:-1;18987:135:0;19144:35;19157:11;19169:1;19157:14;;;;;;;;:::i;:::-;;;;;;;19144:35;;;;;;;;;;;;;-1:-1:-1;;;19144:35:0;;;5800:2;5788:15;;;5782:22;5841:15;;5835:22;5885:30;;5539:384;19144:35;19140:130;;;19249:1;19221:23;;;19213:37;;-1:-1:-1;19140:130:0;19292:34;19305:11;19317:1;19305:14;;;;;;;;:::i;:::-;;;;;;;19292:34;;;;;;;;;;;;;-1:-1:-1;;;19292:34:0;;;5800:2;5788:15;;;5782:22;5841:15;;5835:22;5885:30;;5539:384;19292:34;19288:129;;;19396:1;19368:23;;;19360:37;;-1:-1:-1;19288:129:0;19439:36;19452:11;19464:1;19452:14;;;;;;;;:::i;:::-;;;;;;;19439:36;;;;;;;;;;;;;-1:-1:-1;;;19439:36:0;;;5800:2;5788:15;;;5782:22;5841:15;;5835:22;5885:30;;5539:384;19439:36;19435:289;;;19525:34;;-1:-1:-1;;;19525:34:0;;;;;15006:25:1;;;19500:22:0;;19525:6;;:22;;14979:18:1;;19525:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;19525:34:0;;;;;;;;;;;;:::i;:::-;19605;;-1:-1:-1;;;19605:34:0;;;;;15006:25:1;;;19500:59:0;;-1:-1:-1;19582:20:0;;19605:6;;:22;;14979:18:1;;19605:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;19605:34:0;;;;;;;;;;;;:::i;:::-;19582:57;;19671:33;19687:8;19697:6;19671:15;:33::i;:::-;19662:42;;19477:247;;19435:289;19746:6;19742:192;;;19818:1;19777:5;19783:15;19797:1;19783:11;:15;:::i;:::-;19777:22;;;;;;;;:::i;:::-;;;;;;:44;;;;;19742:192;;;19911:1;19870:5;19876:15;19890:1;19876:11;:15;:::i;:::-;19870:22;;;;;;;;:::i;:::-;;;;;;:44;;;;;19742:192;19952:13;;;;:::i;:::-;;;;18055:1926;;;18032:3849;;;20006:17;20042;20062:35;20075:11;20087:1;20075:14;;;;;;;;:::i;:::-;;;;;;;20062:35;;;;;;;;;;;;;-1:-1:-1;;;20062:35:0;;;5800:2;5788:15;;;5782:22;5841:15;;5835:22;5885:30;;5539:384;20062:35;20042:55;;20116:17;20156:12;20152:365;;;20196:23;20231:15;-1:-1:-1;;;;;20223:57:0;20385:11;20397:1;20385:14;;;;;;;;:::i;:::-;;;;;;;20368:38;;;;;;;;:::i;:::-;;;;-1:-1:-1;;20368:38:0;;;;;;20307:127;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20307:127:0;-1:-1:-1;;;;;;20307:127:0;;;;;;;;;20223:234;;;20307:127;20223:234;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20193:264:0;-1:-1:-1;;;20152:365:0;20539:35;20552:11;20564:1;20552:14;;;;;;;;:::i;:::-;;;;;;;20539:35;;;;;;;;;;;;;-1:-1:-1;;;20539:35:0;;;5800:2;5788:15;;;5782:22;5841:15;;5835:22;5885:30;;5539:384;20539:35;20535:1250;;;20619:4;20603:20;;;;20599:354;;;20721:4;20715;20711:15;20705:22;20692:35;;20535:1250;;20599:354;20860:42;20865:32;20882:11;20894:1;20882:14;;;;;;;;:::i;:::-;;;;;;;20865:16;:32::i;:::-;20899:2;20860:4;:42::i;:::-;20822:107;-1:-1:-1;20535:1250:0;;;20982:38;20995:11;21007:1;20995:14;;;;;;;;:::i;:::-;;;;;;;20982:38;;;;;;;;;;;;;-1:-1:-1;;;20982:38:0;;;5800:2;5788:15;;;5782:22;5841:15;;5835:22;5885:30;;5539:384;20982:38;20978:807;;;21065:4;21049:20;;;;21045:348;;;21167:4;21161;21157:15;21151:22;21138:35;;20978:807;;21045:348;21337:4;21319:16;21315:27;21309:34;21296:47;;20978:807;;;21422:39;21435:11;21447:1;21435:14;;;;;;;;:::i;:::-;;;;;;;21422:39;;;;;;;;;;;;;-1:-1:-1;;;21422:39:0;;;5800:2;5788:15;;;5782:22;5841:15;;5835:22;5885:30;;5539:384;21422:39;21418:367;;;21506:4;21490:20;;;;21486:280;;;21608:4;21602;21598:15;21592:22;21579:35;;21486:280;;;21717:24;21722:11;21734:1;21722:14;;;;;;;;:::i;:::-;;;;;;;21738:2;21717:4;:24::i;:::-;21709:33;-1:-1:-1;21486:280:0;21824:9;21803:5;21809:11;21803:18;;;;;;;;:::i;:::-;;;;;;;;;;:30;21852:13;;;;:::i;:::-;;;;19987:1894;;;18032:3849;17801:4091;;;17772:17;;;;;:::i;:::-;;;;17663:4229;;;;21914:5;21920:1;21914:8;;;;;;;;:::i;:::-;;;;;;;21906:17;;21927:1;21906:22;21902:66;;;21952:4;21945:11;;;;;;21902:66;21985:5;21978:12;;;;17409:4589;;;;;:::o;12679:1912::-;12770:23;;:::i;:::-;12811:21;12847:15;12811:52;;12874:15;12900:13;;;;;;;;;-1:-1:-1;;;;;12900:13:0;12874:40;;12925:19;12955:27;12993:20;13016:9;-1:-1:-1;;;;;13016:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13114:45;;-1:-1:-1;;;13114:45:0;;-1:-1:-1;;;;;12280:32:1;;;13114:45:0;;;12262:51:1;12993:39:0;;-1:-1:-1;12993:39:0;;13043:12;;13114:31;;;;;;12235:18:1;;13114:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13089:70;;13170:29;13202:9;-1:-1:-1;;;;;13202:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13170:64;;13249:9;-1:-1:-1;;;;;13249:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13249:25:0;;;;;;;;-1:-1:-1;;13249:25:0;;;;;;;;;;;;:::i;:::-;;;13245:108;;;;;;13307:9;-1:-1:-1;;;;;13307:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13290:42;;13245:108;13367:9;-1:-1:-1;;;;;13367:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13367:23:0;;;;;;;;-1:-1:-1;;13367:23:0;;;;;;;;;;;;:::i;:::-;;;13363:109;;;;;;13428:9;-1:-1:-1;;;;;13428:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13406:45;;13363:109;13502:1081;;;;;;;;13544:9;-1:-1:-1;;;;;13544:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;13544:16:0;;;;;;;;;;;;:::i;:::-;13502:1081;;;;13583:15;-1:-1:-1;;;;;13502:1081:0;;;;;13629:9;-1:-1:-1;;;;;13629:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;13629:22:0;;;;;;;;;;;;:::i;:::-;13502:1081;;;;13682:9;-1:-1:-1;;;;;13682:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;13502:1081:0;;;;;13732:9;-1:-1:-1;;;;;13732:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;13502:1081:0;;;;;13777:9;-1:-1:-1;;;;;13777:15:0;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;13502:1081:0;;;;;13821:9;-1:-1:-1;;;;;13821:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;13502:1081:0;;;;;13864:12;-1:-1:-1;;;;;13502:1081:0;;;;;13910:14;13502:1081;;;;13957:5;-1:-1:-1;;;;;13957:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13502:1081;;;;;;14004:5;-1:-1:-1;;;;;14004:12:0;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;14004:14:0;;;;;;;;;;;;:::i;:::-;13502:1081;;;;14052:9;-1:-1:-1;;;;;14052:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13502:1081;;;;;;14106:9;-1:-1:-1;;;;;14106:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13502:1081;;;;;;14162:9;-1:-1:-1;;;;;14162:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13502:1081;;;;;;;;;14296:165;;-1:-1:-1;;;14296:165:0;;-1:-1:-1;;;;;12544:32:1;;;14296:165:0;;;12526:51:1;12593:18;;;12586:34;;;12636:18;;;12629:34;;;13502:1081:0;;;;;14296:30;;;;;;12499:18:1;;14296:165:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13502:1081;;;;14495:14;13502:1081;;;;;;14548:19;-1:-1:-1;;;;;13502:1081:0;;;;13482:1101;;;;;;;;;;12679:1912;;;:::o;14692:712::-;14871:27;;14799:25;;14842:26;14871:27;-1:-1:-1;;;;;14949:66:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;14909:106;;15045:19;15026:342;15097:18;15083:11;:32;15026:342;;;15170:23;15196:20;15217:11;15196:33;;;;;;;;:::i;:::-;;;;;;;15170:59;;15244:33;15280:25;15289:15;15280:8;:25::i;:::-;15244:61;;15347:9;15320:11;15332;15320:24;;;;;;;;:::i;:::-;;;;;;:36;;;;15155:213;;15130:13;;;;;:::i;:::-;;;;15026:342;;;-1:-1:-1;15385:11:0;14692:712;-1:-1:-1;;;14692:712:0:o;4535:312::-;4654:33;4724:25;;4690:88;;;-1:-1:-1;;;4690:88:0;;;;4620:16;;4654:33;-1:-1:-1;;;;;4724:25:0;;4690:86;;:88;;;;;4654:33;;4690:88;;;;;;;4724:25;4690:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4690:88:0;;;;;;;;;;;;:::i;:::-;4654:124;;4796:43;4822:16;4796:25;:43::i;:::-;4789:50;;;4535:312;:::o;8594:729::-;8688:7;8783:25;;8749:88;;;-1:-1:-1;;;8749:88:0;;;;8688:7;;-1:-1:-1;;;;;8783:25:0;;8749:86;;:88;;;;;8688:7;;8749:88;;;;;;;8783:25;8749:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8749:88:0;;;;;;;;;;;;:::i;:::-;8873:23;;8713:124;;-1:-1:-1;8848:22:0;;8948:328;8986:14;8975:8;:25;8948:328;;;9029:20;9052:16;9069:8;9052:26;;;;;;;;:::i;:::-;;;;;;;9029:49;;9093:29;9125:77;9175:12;9125:31;:77::i;:::-;9093:109;-1:-1:-1;9217:47:0;9093:109;9217:47;;:::i;:::-;;;9014:262;;9002:10;;;;;:::i;:::-;;;;8948:328;;9413:855;9524:7;9549:42;9594:62;9633:12;9594:24;:62::i;:::-;9696:32;;9549:107;;-1:-1:-1;9667:26:0;;9784:433;9855:18;9841:11;:32;9784:433;;;9928:23;9954:25;9980:11;9954:38;;;;;;;;:::i;:::-;;;;;;;9928:64;;10007:21;10043:15;10007:52;;10074:32;10109:9;-1:-1:-1;;;;;10109:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10074:62;-1:-1:-1;10151:54:0;10074:62;10151:54;;:::i;:::-;;;9913:304;;;9888:13;;;;;:::i;:::-;;;;9784:433;;;-1:-1:-1;10234:26:0;9413:855;-1:-1:-1;;;;9413:855:0:o;11945:222::-;12054:25;12104:55;12115:43;12141:16;7660:851;7837:23;;7778:16;;7812:22;7837:23;-1:-1:-1;;;;;7913:55:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7871:97;;7984:16;7979:337;8017:14;8006:8;:25;7979:337;;;8060:20;8083:16;8100:8;8083:26;;;;;;;;:::i;:::-;;;;;;;8060:49;;8132:43;8192:38;8217:12;8192:24;:38::i;:::-;8132:98;;8278:26;8245:20;8266:8;8245:30;;;;;;;;:::i;:::-;;;;;;:59;;;;8045:271;;8033:10;;;;;:::i;:::-;;;;7979:337;;;-1:-1:-1;8395:27:0;;8361:109;;-1:-1:-1;;;8361:109:0;;8326:32;;-1:-1:-1;;;;;8395:27:0;;8361:87;;:109;;8449:20;;8361:109;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8361:109:0;;;;;;;;;;;;:::i;:::-;8326:144;7660:851;-1:-1:-1;;;;;7660:851:0:o;22075:203::-;22166:12;;-1:-1:-1;;;;;22166:12:0;22152:10;:26;22144:62;;;;-1:-1:-1;;;22144:62:0;;15244:2:1;22144:62:0;;;15226:21:1;15283:2;15263:18;;;15256:30;15322:25;15302:18;;;15295:53;15365:18;;22144:62:0;;;;;;;;22241:19;;22075:203::o;3759:698::-;3863:16;3923:12;3897:14;3976:35;3923:12;3976:21;:35::i;:::-;3947:64;;4022:37;4090:18;-1:-1:-1;;;;;4062:57:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4062:57:0;;4022:97;;4149:19;4130:282;4201:18;4187:11;:32;4130:282;;;4300:34;;-1:-1:-1;;;4300:34:0;;;;;15006:25:1;;;4274:23:0;;-1:-1:-1;;;;;4300:21:0;;;;;14979:18:1;;4300:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4274:60;;4385:15;4349:20;4370:11;4349:33;;;;;;;;:::i;:::-;-1:-1:-1;;;;;4349:51:0;;;:33;;;;;;;;;;;:51;-1:-1:-1;4234:13:0;;;;:::i;:::-;;;;4130:282;;11525:322;11636:25;11685:43;11741:42;11775:7;11741:33;:42::i;:::-;11685:98;;11801:38;11812:26;11801:10;:38::i;11183:274::-;11261:25;11310:43;11366:27;:25;:27::i;:::-;11310:83;;11411:38;11422:26;11411:10;:38::i;3009:459::-;3110:7;3161:12;3110:7;3215:217;3269:34;;-1:-1:-1;;;3269:34:0;;;;;15006:25:1;;;3243:23:0;;-1:-1:-1;;;;;3269:21:0;;;;;14979:18:1;;3269:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3243:60;-1:-1:-1;;;;;;3322:29:0;;3318:75;;3372:5;;;3318:75;3407:13;;;;:::i;:::-;;;;3228:204;3215:217;;3554:124;3609:7;3636:27;:25;:27::i;:::-;:34;3629:41;;3554:124;:::o;10354:761::-;10451:25;10520:12;10494:14;10573:35;10520:12;10573:21;:35::i;:::-;10544:64;;10619:37;10696:18;-1:-1:-1;;;;;10659:66:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;10619:106;;10755:19;10736:343;10807:18;10793:11;:32;10736:343;;;10906:34;;-1:-1:-1;;;10906:34:0;;;;;15006:25:1;;;10880:23:0;;-1:-1:-1;;;;;10906:21:0;;;;;14979:18:1;;10906:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10880:60;;10955:33;10991:25;11000:15;10991:8;:25::i;:::-;10955:61;;11058:9;11031:11;11043;11031:24;;;;;;;;:::i;:::-;;;;;;:36;;;;10865:214;;10840:13;;;;;:::i;:::-;;;;10736:343;;6458:1114;6670:27;;6612:16;;6641:26;;6753:468;6824:18;6810:11;:32;6753:468;;;6897:23;6923:20;6944:11;6923:33;;;;;;;;:::i;:::-;;;;;;;6897:59;;6975:45;6996:15;7013:6;6975:20;:45::i;:::-;6971:239;;;7132:15;7041:20;7084:26;7041:88;;;;;;;;:::i;:::-;-1:-1:-1;;;;;7041:106:0;;;:88;;;;;;;;;;;:106;7166:28;;;;:::i;:::-;;;;6971:239;-1:-1:-1;6857:13:0;;;;:::i;:::-;;;;6753:468;;;;7231:29;7274:20;7263:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;7231:64;;7366:26;7359:4;7341:16;7337:27;7330:63;7414:34;7476:16;7451:78;;;;;;;;;;;;:::i;:::-;7414:115;6458:1114;-1:-1:-1;;;;;;;6458:1114:0:o;12278:312::-;12420:25;12478:104;12507:60;12541:16;12559:7;12507:33;:60::i;23494:181::-;23608:4;23666:1;23637:25;23645:6;23653:8;23637:7;:25::i;:::-;:30;;;23494:181;-1:-1:-1;;;23494:181:0:o;22926:500::-;23016:13;23075:5;23047:19;23092:295;23130:6;:13;23119:8;:24;23092:295;;;23172:15;23196:6;23203:8;23196:16;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;23245:2:0;23232:15;;;;;:35;;;23264:3;23251:9;:16;;;;23232:35;23228:148;;;23288:17;23301:4;23288:17;;:::i;:::-;;;23350:9;23343:17;;23324:6;23331:8;23324:16;;;;;;;;:::i;:::-;;;;:36;-1:-1:-1;;;;;23324:36:0;;;;;;;;;23228:148;-1:-1:-1;23145:10:0;;;;:::i;:::-;;;;23092:295;;;-1:-1:-1;23411:6:0;22926:500;-1:-1:-1;;22926:500:0:o;4943:516::-;5036:9;5071:4;:9;;5079:1;5071:9;:22;;;;5084:4;:9;;5092:1;5084:9;5071:22;:36;;;;5097:4;:10;;5105:2;5097:10;5071:36;:50;;;;5111:4;:10;;5119:2;5111:10;5071:50;5063:59;;;;;;5158:1;5133:16;5171:262;5195:3;:10;5191:1;:14;5171:262;;;5227:11;5257:4;5247:3;5251:1;5247:6;;;;;;;;:::i;:::-;;;;;5241:20;;;5247:6;;5241:20;:::i;:::-;5227:34;;5288:2;5280:5;:10;;;5276:61;;;5311:10;5320:1;5311:10;;:::i;:::-;;;5276:61;5367:4;5359:12;;:5;:12;;;5351:21;;;;;;5387:9;;;;;;:::i;:::-;;-1:-1:-1;5411:10:0;;;;5387:9;5411:10;:::i;:::-;;;5212:221;5207:3;;;;;:::i;:::-;;;;5171:262;;;;5443:8;4943:516;;;;:::o;24422:1217::-;24535:6;24559:20;24588:17;24598:6;24588:9;:17::i;:::-;24559:47;;24617:22;24648:19;24658:8;24648:9;:19::i;:::-;24617:51;;24702:7;:14;24683:9;:16;:33;24679:75;;;-1:-1:-1;;24733:9:0;;;;;;24679:75;24764:11;24805:19;24786:826;24853:9;:16;24839:11;:30;24786:826;;;24929:17;24924:677;24960:7;:14;24948:9;:26;24924:677;;;25008:16;25033:7;25041:9;25033:18;;;;;;;;:::i;:::-;;;;;25102:16;;25033:18;;;;;;-1:-1:-1;25075:23:0;25089:9;25075:11;:23;:::i;:::-;:43;25071:101;;-1:-1:-1;;25143:9:0;;;;;;;;;;25071:101;25190:18;25217:9;25227:23;25241:9;25227:11;:23;:::i;:::-;25217:34;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;25211:41:0;25275:26;;;;25271:315;;;25335:4;25326:13;;25396:1;25379:7;:14;:18;;;;:::i;:::-;25366:9;:31;25362:114;;;25440:11;25426:26;;;;;;;;;;;25362:114;25271:315;;;25533:5;25524:14;;25561:5;;;;25271:315;24989:612;;24976:11;;;;;:::i;:::-;;;;24924:677;;;-1:-1:-1;24884:13:0;;;;:::i;:::-;;;;24786:826;;;-1:-1:-1;;;25629:2:0;24422:1217;-1:-1:-1;;;;;;24422:1217:0:o;22363:499::-;22453:13;22512:5;22484:19;22529:294;22567:6;:13;22556:8;:24;22529:294;;;22609:15;22633:6;22640:8;22633:16;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;22682:2:0;22669:15;;;;;:34;;;22701:2;22688:9;:15;;;;22669:34;22665:147;;;22724:17;22737:4;22724:17;;:::i;:::-;;;22786:9;22779:17;;22760:6;22767:8;22760:16;;;;;;;;:::i;:::-;;;;:36;-1:-1:-1;;;;;22760:36:0;;;;;;;;;22665:147;-1:-1:-1;22582:10:0;;;;:::i;:::-;;;;22529:294;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:748:1:-;68:5;121:3;114:4;106:6;102:17;98:27;88:2;;139:1;136;129:12;88:2;175:6;162:20;201:4;225:60;241:43;281:2;241:43;:::i;:::-;225:60;:::i;:::-;307:3;331:2;326:3;319:15;359:2;354:3;350:12;343:19;;394:2;386:6;382:15;446:3;441:2;435;432:1;428:10;420:6;416:23;412:32;409:41;406:2;;;463:1;460;453:12;406:2;485:1;495:238;509:2;506:1;503:9;495:238;;;580:3;567:17;597:31;622:5;597:31;:::i;:::-;641:18;;679:12;;;;711;;;;527:1;520:9;495:238;;;-1:-1:-1;751:5:1;;78:684;-1:-1:-1;;;;;;;78:684:1:o;767:2009::-;830:5;883:3;876:4;868:6;864:17;860:27;850:2;;901:1;898;891:12;850:2;925:78;941:61;994:6;981:20;941:61;:::i;925:78::-;1025:3;1062:6;1049:20;1044:3;1037:33;1095:4;1090:3;1086:14;1079:21;;1132:4;1124:6;1120:17;1206:3;1199:4;1188:6;1175:20;1172:1;1168:28;1160:6;1156:41;1152:52;1149:61;1146:2;;;1223:1;1220;1213:12;1146:2;1245:1;1255:1492;1282:6;1269:20;1266:1;1263:27;1255:1492;;;-1:-1:-1;;;;;1351:3:1;1338:17;1335:41;1332:2;;;1389:1;1386;1379:12;1332:2;1441:3;1428:17;1420:6;1416:30;1486:3;1481:2;1477;1473:11;1469:21;1459:2;;1504:1;1501;1494:12;1459:2;1552:4;1548:2;1544:13;1531:27;1584:60;1600:43;1640:2;1600:43;:::i;1584:60::-;1670:5;1702:2;1695:5;1688:17;1738:4;1731:5;1727:16;1718:25;;1777:2;1773;1769:11;1829:3;1824:2;1818;1815:1;1811:10;1807:2;1803:19;1799:28;1796:37;1793:2;;;1846:1;1843;1836:12;1793:2;1874:1;1888:750;1904:2;1899:3;1896:11;1888:750;;;-1:-1:-1;;;;;1980:5:1;1967:19;1964:43;1961:2;;;2020:1;2017;2010:12;1961:2;2072:5;2059:19;2055:2;2051:28;2123:3;2118:2;2114;2110:11;2106:21;2096:2;;2141:1;2138;2131:12;2096:2;2193;2189;2185:11;2172:25;2229:49;2245:32;2274:2;2245:32;:::i;2229:49::-;2311:2;2302:7;2295:19;2359:3;2354:2;2349;2345;2341:11;2337:20;2334:29;2331:2;;;2376:1;2373;2366:12;2331:2;2443;2438;2434;2430:11;2423:4;2414:7;2410:18;2397:49;2499:1;2492:4;2474:16;;;2470:27;;2463:38;2518:22;;2566:16;;;;2608;;;;;-1:-1:-1;1926:1:1;1917:11;1888:750;;;-1:-1:-1;;2651:18:1;;-1:-1:-1;;2698:4:1;2689:14;;;;2723;;;;;-1:-1:-1;1305:1:1;1298:9;1255:1492;;;-1:-1:-1;2765:5:1;;840:1936;-1:-1:-1;;;;;840:1936:1:o;2781:247::-;2840:6;2893:2;2881:9;2872:7;2868:23;2864:32;2861:2;;;2909:1;2906;2899:12;2861:2;2948:9;2935:23;2967:31;2992:5;2967:31;:::i;3033:251::-;3103:6;3156:2;3144:9;3135:7;3131:23;3127:32;3124:2;;;3172:1;3169;3162:12;3124:2;3204:9;3198:16;3223:31;3248:5;3223:31;:::i;3289:527::-;3417:6;3425;3478:2;3466:9;3457:7;3453:23;3449:32;3446:2;;;3494:1;3491;3484:12;3446:2;3533:9;3520:23;3552:31;3577:5;3552:31;:::i;:::-;3602:5;-1:-1:-1;3658:2:1;3643:18;;3630:32;-1:-1:-1;;;;;3674:30:1;;3671:2;;;3717:1;3714;3707:12;3671:2;3740:70;3802:7;3793:6;3782:9;3778:22;3740:70;:::i;:::-;3730:80;;;3436:380;;;;;:::o;3821:348::-;3905:6;3958:2;3946:9;3937:7;3933:23;3929:32;3926:2;;;3974:1;3971;3964:12;3926:2;4014:9;4001:23;-1:-1:-1;;;;;4039:6:1;4036:30;4033:2;;;4079:1;4076;4069:12;4033:2;4102:61;4155:7;4146:6;4135:9;4131:22;4102:61;:::i;:::-;4092:71;3916:253;-1:-1:-1;;;;3916:253:1:o;4174:967::-;4269:6;4300:2;4343;4331:9;4322:7;4318:23;4314:32;4311:2;;;4359:1;4356;4349:12;4311:2;4392:9;4386:16;-1:-1:-1;;;;;4417:6:1;4414:30;4411:2;;;4457:1;4454;4447:12;4411:2;4480:22;;4533:4;4525:13;;4521:27;-1:-1:-1;4511:2:1;;4562:1;4559;4552:12;4511:2;4591;4585:9;4614:60;4630:43;4670:2;4630:43;:::i;4614:60::-;4696:3;4720:2;4715:3;4708:15;4748:2;4743:3;4739:12;4732:19;;4779:2;4775;4771:11;4827:7;4822:2;4816;4813:1;4809:10;4805:2;4801:19;4797:28;4794:41;4791:2;;;4848:1;4845;4838:12;4791:2;4870:1;4861:10;;4880:231;4894:2;4891:1;4888:9;4880:231;;;4958:3;4952:10;4975:31;5000:5;4975:31;:::i;:::-;5019:18;;4912:1;4905:9;;;;;5057:12;;;;5089;;4880:231;;;-1:-1:-1;5130:5:1;4280:861;-1:-1:-1;;;;;;;4280:861:1:o;5146:639::-;5299:6;5307;5360:2;5348:9;5339:7;5335:23;5331:32;5328:2;;;5376:1;5373;5366:12;5328:2;5416:9;5403:23;-1:-1:-1;;;;;5486:2:1;5478:6;5475:14;5472:2;;;5502:1;5499;5492:12;5472:2;5525:61;5578:7;5569:6;5558:9;5554:22;5525:61;:::i;:::-;5515:71;;5639:2;5628:9;5624:18;5611:32;5595:48;;5668:2;5658:8;5655:16;5652:2;;;5684:1;5681;5674:12;5652:2;;5707:72;5771:7;5760:8;5749:9;5745:24;5707:72;:::i;5790:392::-;5909:6;5962:2;5950:9;5941:7;5937:23;5933:32;5930:2;;;5978:1;5975;5968:12;5930:2;6018:9;6005:23;-1:-1:-1;;;;;6043:6:1;6040:30;6037:2;;;6083:1;6080;6073:12;6037:2;6106:70;6168:7;6159:6;6148:9;6144:22;6106:70;:::i;6187:277::-;6254:6;6307:2;6295:9;6286:7;6282:23;6278:32;6275:2;;;6323:1;6320;6313:12;6275:2;6355:9;6349:16;6408:5;6401:13;6394:21;6387:5;6384:32;6374:2;;6430:1;6427;6420:12;6469:248;6537:6;6545;6598:2;6586:9;6577:7;6573:23;6569:32;6566:2;;;6614:1;6611;6604:12;6566:2;-1:-1:-1;;6637:23:1;;;6707:2;6692:18;;;6679:32;;-1:-1:-1;6556:161:1:o;6722:636::-;6802:6;6855:2;6843:9;6834:7;6830:23;6826:32;6823:2;;;6871:1;6868;6861:12;6823:2;6904:9;6898:16;-1:-1:-1;;;;;6929:6:1;6926:30;6923:2;;;6969:1;6966;6959:12;6923:2;6992:22;;7045:4;7037:13;;7033:27;-1:-1:-1;7023:2:1;;7074:1;7071;7064:12;7023:2;7103;7097:9;7128:49;7144:32;7173:2;7144:32;:::i;7128:49::-;7200:2;7193:5;7186:17;7240:7;7235:2;7230;7226;7222:11;7218:20;7215:33;7212:2;;;7261:1;7258;7251:12;7212:2;7274:54;7325:2;7320;7313:5;7309:14;7304:2;7300;7296:11;7274:54;:::i;7363:184::-;7433:6;7486:2;7474:9;7465:7;7461:23;7457:32;7454:2;;;7502:1;7499;7492:12;7454:2;-1:-1:-1;7525:16:1;;7444:103;-1:-1:-1;7444:103:1:o;7552:273::-;7620:6;7673:2;7661:9;7652:7;7648:23;7644:32;7641:2;;;7689:1;7686;7679:12;7641:2;7721:9;7715:16;7771:4;7764:5;7760:16;7753:5;7750:27;7740:2;;7791:1;7788;7781:12;7939:461;7992:3;8030:5;8024:12;8057:6;8052:3;8045:19;8083:4;8112:2;8107:3;8103:12;8096:19;;8149:2;8142:5;8138:14;8170:1;8180:195;8194:6;8191:1;8188:13;8180:195;;;8259:13;;-1:-1:-1;;;;;8255:39:1;8243:52;;8315:12;;;;8350:15;;;;8291:1;8209:9;8180:195;;;-1:-1:-1;8391:3:1;;8000:400;-1:-1:-1;;;;;8000:400:1:o;8501:258::-;8543:3;8581:5;8575:12;8608:6;8603:3;8596:19;8624:63;8680:6;8673:4;8668:3;8664:14;8657:4;8650:5;8646:16;8624:63;:::i;:::-;8741:2;8720:15;-1:-1:-1;;8716:29:1;8707:39;;;;8748:4;8703:50;;8551:208;-1:-1:-1;;8551:208:1:o;8764:2262::-;8823:3;8851:6;8892:5;8886:12;8919:2;8914:3;8907:15;8943:45;8984:2;8979:3;8975:12;8961;8943:45;:::i;:::-;8931:57;;;9036:4;9029:5;9025:16;9019:23;9051:50;9095:4;9090:3;9086:14;9070;-1:-1:-1;;;;;7896:31:1;7884:44;;7874:60;9051:50;;9149:4;9142:5;9138:16;9132:23;9197:3;9191:4;9187:14;9180:4;9175:3;9171:14;9164:38;9225:39;9259:4;9243:14;9225:39;:::i;:::-;9211:53;;;9312:4;9305:5;9301:16;9295:23;9327:50;9371:4;9366:3;9362:14;9346;-1:-1:-1;;;;;7896:31:1;7884:44;;7874:60;9327:50;;9425:4;9418:5;9414:16;9408:23;9440:50;9484:4;9479:3;9475:14;9459;-1:-1:-1;;;;;7896:31:1;7884:44;;7874:60;9440:50;;9538:4;9531:5;9527:16;9521:23;9553:50;9597:4;9592:3;9588:14;9572;-1:-1:-1;;;;;7896:31:1;7884:44;;7874:60;9553:50;;9651:4;9644:5;9640:16;9634:23;9666:50;9710:4;9705:3;9701:14;9685;-1:-1:-1;;;;;7896:31:1;7884:44;;7874:60;9666:50;;9764:4;9757:5;9753:16;9747:23;9779:50;9823:4;9818:3;9814:14;9798;-1:-1:-1;;;;;7896:31:1;7884:44;;7874:60;9779:50;-1:-1:-1;9848:6:1;9890:14;;;9884:21;9870:12;;;9863:43;9925:6;9968:14;;;9962:21;11098:4;11087:16;10025:12;;;11075:29;10057:6;10100:14;;;10094:21;10145:16;;;10131:12;;;10124:38;10185:41;10149:6;10094:21;10185:41;:::i;:::-;10171:55;;;;10245:6;10300:2;10293:5;10289:14;10283:21;10313:46;10355:2;10350:3;10346:12;10329:15;8475:13;8468:21;8456:34;;8446:50;10313:46;-1:-1:-1;;10378:6:1;10422:14;;;10416:21;8475:13;8468:21;10479:12;;;8456:34;10511:6;10553:14;;;10547:21;10533:12;;;10526:43;10588:6;10630:14;;;10624:21;10610:12;;;10603:43;10665:6;10707:14;;;10701:21;10687:12;;;10680:43;10743:6;10787:15;;;10781:22;8475:13;8468:21;10845:13;;;8456:34;10879:6;10923:15;;;10917:22;-1:-1:-1;;;;;7896:31:1;10984:13;;;;7884:44;;;;-1:-1:-1;11014:6:1;8831:2195::o;11111:274::-;11240:3;11278:6;11272:13;11294:53;11340:6;11335:3;11328:4;11320:6;11316:17;11294:53;:::i;:::-;11363:16;;;;;11248:137;-1:-1:-1;;11248:137:1:o;11671:440::-;11903:3;11941:6;11935:13;11957:53;12003:6;11998:3;11991:4;11983:6;11979:17;11957:53;:::i;:::-;-1:-1:-1;;;12032:16:1;;12057:19;;;-1:-1:-1;12103:1:1;12092:13;;11911:200;-1:-1:-1;11911:200:1:o;12674:261::-;12853:2;12842:9;12835:21;12816:4;12873:56;12925:2;12914:9;12910:18;12902:6;12873:56;:::i;12940:844::-;13132:4;13161:2;13201;13190:9;13186:18;13231:2;13220:9;13213:21;13254:6;13289;13283:13;13320:6;13312;13305:22;13358:2;13347:9;13343:18;13336:25;;13420:2;13410:6;13407:1;13403:14;13392:9;13388:30;13384:39;13370:53;;13458:2;13450:6;13446:15;13479:1;13489:266;13503:6;13500:1;13497:13;13489:266;;;13596:2;13592:7;13580:9;13572:6;13568:22;13564:36;13559:3;13552:49;13624:51;13668:6;13659;13653:13;13624:51;:::i;:::-;13614:61;-1:-1:-1;13733:12:1;;;;13698:15;;;;13525:1;13518:9;13489:266;;;-1:-1:-1;13772:6:1;;13141:643;-1:-1:-1;;;;;;;13141:643:1:o;13789:866::-;13997:4;14026:2;14066;14055:9;14051:18;14096:2;14085:9;14078:21;14119:6;14154;14148:13;14185:6;14177;14170:22;14223:2;14212:9;14208:18;14201:25;;14285:2;14275:6;14272:1;14268:14;14257:9;14253:30;14249:39;14235:53;;14323:2;14315:6;14311:15;14344:1;14354:272;14368:6;14365:1;14362:13;14354:272;;;14461:2;14457:7;14445:9;14437:6;14433:22;14429:36;14424:3;14417:49;14489:57;14539:6;14530;14524:13;14489:57;:::i;:::-;14479:67;-1:-1:-1;14604:12:1;;;;14569:15;;;;14390:1;14383:9;14354:272;;15394:283;15589:2;15578:9;15571:21;15552:4;15609:62;15667:2;15656:9;15652:18;15644:6;15609:62;:::i;15864:275::-;15935:2;15929:9;16000:2;15981:13;;-1:-1:-1;;15977:27:1;15965:40;;-1:-1:-1;;;;;16020:34:1;;16056:22;;;16017:62;16014:2;;;16082:18;;:::i;:::-;16118:2;16111:22;15909:230;;-1:-1:-1;15909:230:1:o;16144:183::-;16204:4;-1:-1:-1;;;;;16229:6:1;16226:30;16223:2;;;16259:18;;:::i;:::-;-1:-1:-1;16304:1:1;16300:14;16316:4;16296:25;;16213:114::o;16332:187::-;16381:4;-1:-1:-1;;;;;16406:6:1;16403:30;16400:2;;;16436:18;;:::i;:::-;-1:-1:-1;16502:2:1;16481:15;-1:-1:-1;;16477:29:1;16508:4;16473:40;;16390:129::o;16524:128::-;16564:3;16595:1;16591:6;16588:1;16585:13;16582:2;;;16601:18;;:::i;:::-;-1:-1:-1;16637:9:1;;16572:80::o;16657:204::-;16695:3;16731:4;16728:1;16724:12;16763:4;16760:1;16756:12;16798:3;16792:4;16788:14;16783:3;16780:23;16777:2;;;16806:18;;:::i;:::-;16842:13;;16703:158;-1:-1:-1;;;16703:158:1:o;16866:168::-;16906:7;16972:1;16968;16964:6;16960:14;16957:1;16954:21;16949:1;16942:9;16935:17;16931:45;16928:2;;;16979:18;;:::i;:::-;-1:-1:-1;17019:9:1;;16918:116::o;17039:125::-;17079:4;17107:1;17104;17101:8;17098:2;;;17112:18;;:::i;:::-;-1:-1:-1;17149:9:1;;17088:76::o;17169:195::-;17207:4;17244;17241:1;17237:12;17276:4;17273:1;17269:12;17301:3;17296;17293:12;17290:2;;;17308:18;;:::i;:::-;17345:13;;;17216:148;-1:-1:-1;;;17216:148:1:o;17369:258::-;17441:1;17451:113;17465:6;17462:1;17459:13;17451:113;;;17541:11;;;17535:18;17522:11;;;17515:39;17487:2;17480:10;17451:113;;;17582:6;17579:1;17576:13;17573:2;;;17617:1;17608:6;17603:3;17599:16;17592:27;17573:2;;17422:205;;;:::o;17632:136::-;17671:3;17699:5;17689:2;;17708:18;;:::i;:::-;-1:-1:-1;;;17744:18:1;;17679:89::o;17773:135::-;17812:3;-1:-1:-1;;17833:17:1;;17830:2;;;17853:18;;:::i;:::-;-1:-1:-1;17900:1:1;17889:13;;17820:88::o;17913:127::-;17974:10;17969:3;17965:20;17962:1;17955:31;18005:4;18002:1;17995:15;18029:4;18026:1;18019:15;18045:127;18106:10;18101:3;18097:20;18094:1;18087:31;18137:4;18134:1;18127:15;18161:4;18158:1;18151:15;18177:127;18238:10;18233:3;18229:20;18226:1;18219:31;18269:4;18266:1;18259:15;18293:4;18290:1;18283:15;18309:131;-1:-1:-1;;;;;18384:31:1;;18374:42;;18364:2;;18430:1;18427;18420:12;18364:2;18354:86;:::o

Swarm Source

ipfs://83a4b901805d99a41fdb2132422e98acd6ecde5a7c70bad6d9b5b7bdf0b576ed

Block Transaction Gas Used Reward
view all blocks produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.