Contract 0x046fc9f35EB7Cb165a5e07915d37bF4022b8dE33 7

 
Txn Hash Method
Block
From
To
Value
0x4293c0db11a8b80d6bf7821b0c8510b40286de15e4cbd8eaadceb9f24d0f0dabSet Allowed Acti...1079412302023-08-08 7:53:57196 days 18 hrs ago0xba32a3d407353fc3adaa6f7ec6264df5bca51c4b IN  0x046fc9f35eb7cb165a5e07915d37bf4022b8de330 ETH0.0000952401542.595412258
0x927e9bcfa3262ec09b51dd188c395d9f163c82313266dc827be69aaaf24091ffSet Allowed Acti...1079412252023-08-08 7:53:47196 days 18 hrs ago0xba32a3d407353fc3adaa6f7ec6264df5bca51c4b IN  0x046fc9f35eb7cb165a5e07915d37bf4022b8de330 ETH0.0000960765522.593743782
0xdab765d8d95a885bd0c5293976343aa8ce2043232d351ed5bdf4aa62ab3af56dSet Allowed Acti...843769082023-03-28 16:41:45329 days 9 hrs ago0xba32a3d407353fc3adaa6f7ec6264df5bca51c4b IN  0x046fc9f35eb7cb165a5e07915d37bf4022b8de330 ETH0.0001085949740.001
0x0aa5e034af7e38c2bd08f9de61b86b840e4263618e14ccf5441d37990a4293cdSet Allowed Acti...809342292023-03-14 23:52:35343 days 2 hrs ago0xba32a3d407353fc3adaa6f7ec6264df5bca51c4b IN  0x046fc9f35eb7cb165a5e07915d37bf4022b8de330 ETH0.000123519740.001024961
0x7e8997fbccecc644253d95357fb7eafdea70d7b41c1174da4a273b99fc645aacAdd Pricing Modu...809340702023-03-14 23:51:19343 days 2 hrs ago0xba32a3d407353fc3adaa6f7ec6264df5bca51c4b IN  0x046fc9f35eb7cb165a5e07915d37bf4022b8de330 ETH0.0001187630110.001024961
0x0e3cda980678bba6062adef907fec2a05e66c37a64f464a97eb73a13ea505fbc0x3d471e5c809340462023-03-14 23:51:04343 days 2 hrs ago0xba32a3d407353fc3adaa6f7ec6264df5bca51c4b IN  0x046fc9f35eb7cb165a5e07915d37bf4022b8de330 ETH0.000144911750.001024961
0x65c25d8cec9bd03eda634088e6439d1d2432dcf7ba5c9feb1b7a17dc39493f670x3d471e5c809340332023-03-14 23:51:04343 days 2 hrs ago0xba32a3d407353fc3adaa6f7ec6264df5bca51c4b IN  0x046fc9f35eb7cb165a5e07915d37bf4022b8de330 ETH0.0001377090350.001024961
0x7b217afbbdc075d58c876e2f1de6f1494c31b0ef140d3c6cce738b28124d88990x60c06040809338382023-03-14 23:49:18343 days 2 hrs ago0xba32a3d407353fc3adaa6f7ec6264df5bca51c4b IN  Create: MainRegistry0 ETH0.0050563980790.001024961
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x9d767e262a23a8b6858093e9579f609a77729563c77bec086b8c79d2a315c2ba1074332712023-07-27 13:41:59208 days 12 hrs ago 0x046fc9f35eb7cb165a5e07915d37bf4022b8de33 0xc000d75d4221ba9d7a788c81dcc0a4714b4ae9e50 ETH
0x9d767e262a23a8b6858093e9579f609a77729563c77bec086b8c79d2a315c2ba1074332712023-07-27 13:41:59208 days 12 hrs ago 0x046fc9f35eb7cb165a5e07915d37bf4022b8de33 0x00cb53780ea58503d3059fc02ddd596d0be926cb0 ETH
0x9d767e262a23a8b6858093e9579f609a77729563c77bec086b8c79d2a315c2ba1074332712023-07-27 13:41:59208 days 12 hrs ago 0x4fad69ce039ccfbf5c494a2e89a1d2b35bea2842 0x046fc9f35eb7cb165a5e07915d37bf4022b8de330 ETH
0x362d406e865450136596aec3296a1a592e2a56c3ad2fb77590c9a36ccbad03dd1074332522023-07-27 13:41:21208 days 12 hrs ago 0x046fc9f35eb7cb165a5e07915d37bf4022b8de33 0xc000d75d4221ba9d7a788c81dcc0a4714b4ae9e50 ETH
0x362d406e865450136596aec3296a1a592e2a56c3ad2fb77590c9a36ccbad03dd1074332522023-07-27 13:41:21208 days 12 hrs ago 0x046fc9f35eb7cb165a5e07915d37bf4022b8de33 0x00cb53780ea58503d3059fc02ddd596d0be926cb0 ETH
0x362d406e865450136596aec3296a1a592e2a56c3ad2fb77590c9a36ccbad03dd1074332522023-07-27 13:41:21208 days 12 hrs ago 0x4fad69ce039ccfbf5c494a2e89a1d2b35bea2842 0x046fc9f35eb7cb165a5e07915d37bf4022b8de330 ETH
0x0bfba24bd7c15265b5b6503e16724c8d7015e12b1c3c4df51f8096a772f9e2661074008432023-07-26 19:41:03209 days 6 hrs ago 0x046fc9f35eb7cb165a5e07915d37bf4022b8de33 0xc000d75d4221ba9d7a788c81dcc0a4714b4ae9e50 ETH
0x0bfba24bd7c15265b5b6503e16724c8d7015e12b1c3c4df51f8096a772f9e2661074008432023-07-26 19:41:03209 days 6 hrs ago 0x046fc9f35eb7cb165a5e07915d37bf4022b8de33 0xc000d75d4221ba9d7a788c81dcc0a4714b4ae9e50 ETH
0x0bfba24bd7c15265b5b6503e16724c8d7015e12b1c3c4df51f8096a772f9e2661074008432023-07-26 19:41:03209 days 6 hrs ago 0x046fc9f35eb7cb165a5e07915d37bf4022b8de33 0x00cb53780ea58503d3059fc02ddd596d0be926cb0 ETH
0x0bfba24bd7c15265b5b6503e16724c8d7015e12b1c3c4df51f8096a772f9e2661074008432023-07-26 19:41:03209 days 6 hrs ago 0x6276507001e92d3eea0c14d707441c0a99dfebb3 0x046fc9f35eb7cb165a5e07915d37bf4022b8de330 ETH
0x808baeabef9d6cdaa5e2debff5ef8e2eebb16529dfb1cdfff1986de3af5feb3d1074008182023-07-26 19:40:13209 days 6 hrs ago 0x046fc9f35eb7cb165a5e07915d37bf4022b8de33 0xc000d75d4221ba9d7a788c81dcc0a4714b4ae9e50 ETH
0x808baeabef9d6cdaa5e2debff5ef8e2eebb16529dfb1cdfff1986de3af5feb3d1074008182023-07-26 19:40:13209 days 6 hrs ago 0x046fc9f35eb7cb165a5e07915d37bf4022b8de33 0xc000d75d4221ba9d7a788c81dcc0a4714b4ae9e50 ETH
0x808baeabef9d6cdaa5e2debff5ef8e2eebb16529dfb1cdfff1986de3af5feb3d1074008182023-07-26 19:40:13209 days 6 hrs ago 0x046fc9f35eb7cb165a5e07915d37bf4022b8de33 0x00cb53780ea58503d3059fc02ddd596d0be926cb0 ETH
0x808baeabef9d6cdaa5e2debff5ef8e2eebb16529dfb1cdfff1986de3af5feb3d1074008182023-07-26 19:40:13209 days 6 hrs ago 0x6276507001e92d3eea0c14d707441c0a99dfebb3 0x046fc9f35eb7cb165a5e07915d37bf4022b8de330 ETH
0x808baeabef9d6cdaa5e2debff5ef8e2eebb16529dfb1cdfff1986de3af5feb3d1074008182023-07-26 19:40:13209 days 6 hrs ago 0x046fc9f35eb7cb165a5e07915d37bf4022b8de33 0xc000d75d4221ba9d7a788c81dcc0a4714b4ae9e50 ETH
0x808baeabef9d6cdaa5e2debff5ef8e2eebb16529dfb1cdfff1986de3af5feb3d1074008182023-07-26 19:40:13209 days 6 hrs ago 0x046fc9f35eb7cb165a5e07915d37bf4022b8de33 0x00cb53780ea58503d3059fc02ddd596d0be926cb0 ETH
0x808baeabef9d6cdaa5e2debff5ef8e2eebb16529dfb1cdfff1986de3af5feb3d1074008182023-07-26 19:40:13209 days 6 hrs ago 0x6276507001e92d3eea0c14d707441c0a99dfebb3 0x046fc9f35eb7cb165a5e07915d37bf4022b8de330 ETH
0x808baeabef9d6cdaa5e2debff5ef8e2eebb16529dfb1cdfff1986de3af5feb3d1074008182023-07-26 19:40:13209 days 6 hrs ago 0x6276507001e92d3eea0c14d707441c0a99dfebb3 0x046fc9f35eb7cb165a5e07915d37bf4022b8de330 ETH
0x54bcd8ba12687f9c74df5ef71542c40f96a6af7299abdc91745bd3237408afed1074007822023-07-26 19:39:01209 days 6 hrs ago 0x046fc9f35eb7cb165a5e07915d37bf4022b8de33 0xc000d75d4221ba9d7a788c81dcc0a4714b4ae9e50 ETH
0x54bcd8ba12687f9c74df5ef71542c40f96a6af7299abdc91745bd3237408afed1074007822023-07-26 19:39:01209 days 6 hrs ago 0x046fc9f35eb7cb165a5e07915d37bf4022b8de33 0x00cb53780ea58503d3059fc02ddd596d0be926cb0 ETH
0x54bcd8ba12687f9c74df5ef71542c40f96a6af7299abdc91745bd3237408afed1074007822023-07-26 19:39:01209 days 6 hrs ago 0xfebccc52875b768dad7d74aa36f49b096fa88433 0x046fc9f35eb7cb165a5e07915d37bf4022b8de330 ETH
0x26e9b9d8821a4848be90d5ab71d79a92e4a00d8f660ccc88e2c32d36826047cb1073890812023-07-26 13:08:59209 days 13 hrs ago 0x046fc9f35eb7cb165a5e07915d37bf4022b8de33 0xc000d75d4221ba9d7a788c81dcc0a4714b4ae9e50 ETH
0x26e9b9d8821a4848be90d5ab71d79a92e4a00d8f660ccc88e2c32d36826047cb1073890812023-07-26 13:08:59209 days 13 hrs ago 0x046fc9f35eb7cb165a5e07915d37bf4022b8de33 0xc000d75d4221ba9d7a788c81dcc0a4714b4ae9e50 ETH
0x26e9b9d8821a4848be90d5ab71d79a92e4a00d8f660ccc88e2c32d36826047cb1073890812023-07-26 13:08:59209 days 13 hrs ago 0x046fc9f35eb7cb165a5e07915d37bf4022b8de33 0x00cb53780ea58503d3059fc02ddd596d0be926cb0 ETH
0x26e9b9d8821a4848be90d5ab71d79a92e4a00d8f660ccc88e2c32d36826047cb1073890812023-07-26 13:08:59209 days 13 hrs ago 0x815e541e89d4c4257119e545e4b7cf5bbc5411c9 0x046fc9f35eb7cb165a5e07915d37bf4022b8de330 ETH
[ Download CSV Export 
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
MainRegistry

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, BSL 1.1 license
File 7 of 11: MainRegistry.sol
/**
 * Created by Pragma Labs
 * SPDX-License-Identifier: BUSL-1.1
 */
pragma solidity ^0.8.13;

import { IChainLinkData } from "IChainLinkData.sol";
import { IFactory } from "IFactory.sol";
import { IPricingModule } from "IPricingModule.sol";
import { IMainRegistry } from "IMainRegistry.sol";
import { FixedPointMathLib } from "FixedPointMathLib.sol";
import { RiskModule } from "RiskModule.sol";
import { MainRegistryGuardian } from "MainRegistryGuardian.sol";

/**
 * @title Main Asset registry
 * @author Pragma Labs
 * @notice The Main Registry stores basic information for each token that can, or could at some point, be deposited in the Vaults.
 * @dev No end-user should directly interact with the Main Registry, only vaults, Pricing Modules or the contract owner.
 */
contract MainRegistry is IMainRegistry, MainRegistryGuardian {
    using FixedPointMathLib for uint256;

    /* //////////////////////////////////////////////////////////////
                                STORAGE
    ////////////////////////////////////////////////////////////// */

    // The contract address of the this contract,
    // used to prevent delegateCalls for certain functions.
    address immutable _this;
    // Counter for the number of baseCurrencies in use.
    uint256 public baseCurrencyCounter;
    // Contract address of the Factory.
    address public immutable factory;

    // Array with all the contract addresses of Pricing Modules.
    address[] public pricingModules;
    // Array with all the contract addresses of Tokens that can be Priced.
    address[] public assetsInMainRegistry;
    // Array with all the contract addresses of baseCurrencies.
    address[] public baseCurrencies;

    // Map mainRegistry => flag.
    mapping(address => bool) public inMainRegistry;
    // Map pricingModule => flag.
    mapping(address => bool) public isPricingModule;
    // Map baseCurrency => flag.
    mapping(address => bool) public isBaseCurrency;
    // Map action => flag.
    mapping(address => bool) public isActionAllowed;
    // Map baseCurrency => baseCurrencyIdentifier.
    mapping(address => uint256) public assetToBaseCurrency;
    // Map asset => assetInformation.
    mapping(address => AssetInformation) public assetToAssetInformation;
    // Map baseCurrencyIdentifier => baseCurrencyInformation.
    mapping(uint256 => BaseCurrencyInformation) public baseCurrencyToInformation;

    // Struct with additional information for a specific asset.
    struct AssetInformation {
        uint96 assetType; // Identifier for the token standard of the asset.
        address pricingModule; // Contract address of the module that can price the specific asset.
    }

    // Struct with additional information for a specific baseCurrency.
    struct BaseCurrencyInformation {
        uint64 baseCurrencyUnitCorrection; // The factor with which the baseCurrency should be multiplied to bring it to 18 decimals.
        address assetAddress; // The contract address of the baseCurrency.
        uint64 baseCurrencyToUsdOracleUnit; // The unit of the oracle, equal to 10^decimalsOracle.
        address baseCurrencyToUsdOracle; // The contract address of the pricing oracle for baseCurrency -> USD.
        bytes8 baseCurrencyLabel; // Human readable label.
    }

    /* //////////////////////////////////////////////////////////////
                                EVENTS
    ////////////////////////////////////////////////////////////// */

    event BaseCurrencyAdded(address indexed assetAddress, uint8 indexed baseCurrencyId, bytes8 label);
    event AllowedActionSet(address indexed action, bool allowed);
    event PricingModuleAdded(address pricingModule);
    event AssetAdded(address indexed assetAddress, address indexed pricingModule, uint8 assetType);

    /* //////////////////////////////////////////////////////////////
                                MODIFIERS
    ////////////////////////////////////////////////////////////// */

    /**
     * @dev Only Pricing Modules can call functions with this modifier.
     */
    modifier onlyPricingModule() {
        require(isPricingModule[msg.sender], "MR: Only PriceMod.");
        _;
    }

    /**
     * @dev Only Vaults can call functions with this modifier.
     * @dev Cannot be called via delegate calls.
     */
    modifier onlyVault() {
        require(IFactory(factory).isVault(msg.sender), "MR: Only Vaults.");
        require(address(this) == _this, "MR: No delegate.");
        _;
    }

    /* //////////////////////////////////////////////////////////////
                                CONSTRUCTOR
    ////////////////////////////////////////////////////////////// */

    /**
     * @param factory_ The contract address of the Factory.
     * @dev The mainRegistry must be initialised with baseCurrency USD, at baseCurrencyCounter of 0.
     * Usd is initialised with the following BaseCurrencyInformation.
     * - baseCurrencyToUsdOracleUnit: Since there is no price oracle for usd to USD, this is 0 by default for USD.
     * - baseCurrencyUnitCorrection: We use 18 decimals precision for USD, so unitCorrection is 1 for USD.
     * - assetAddress: Since there is no native token for usd, this is the 0 address by default for USD.
     * - baseCurrencyToUsdOracle: Since there is no price oracle for usd to USD, this is the 0 address by default for USD.
     * - baseCurrencyLabel: 'USD' (only used for readability purpose).
     */
    constructor(address factory_) {
        _this = address(this);
        factory = factory_;

        //Main Registry must be initialised with usd, other values of baseCurrencyToInformation[0] are 0 or the zero-address.
        baseCurrencyToInformation[0].baseCurrencyLabel = "USD";
        baseCurrencyToInformation[0].baseCurrencyUnitCorrection = 1;

        //Usd is the first baseCurrency at index 0 of array baseCurrencies.
        isBaseCurrency[address(0)] = true;
        baseCurrencies.push(address(0));
        baseCurrencyCounter = 1;

        emit BaseCurrencyAdded(address(0), 0, "USD");
    }

    /* ///////////////////////////////////////////////////////////////
                        EXTERNAL CONTRACTS
    /////////////////////////////////////////////////////////////// */

    /**
     * @notice Sets an allowed action handler.
     * @param action The address of the action handler.
     * @param allowed Bool to indicate its status.
     * @dev Can only be called by owner.
     */
    function setAllowedAction(address action, bool allowed) external onlyOwner {
        isActionAllowed[action] = allowed;

        emit AllowedActionSet(action, allowed);
    }

    /* ///////////////////////////////////////////////////////////////
                        BASE CURRENCY MANAGEMENT
    /////////////////////////////////////////////////////////////// */

    /**
     * @notice Adds a new baseCurrency (a unit of account in which price is denominated, like USD or ETH) to the Main Registry.
     * @param baseCurrencyInformation A Struct with information about the BaseCurrency:
     * - baseCurrencyToUsdOracleUnit: The unit of the oracle, equal to 10^decimalsOracle.
     * - baseCurrencyUnitCorrection: The factor with which the baseCurrency should be multiplied to bring it to 18 decimals.
     * - assetAddress: The contract address of the baseCurrency.
     * - baseCurrencyToUsdOracle: The contract address of the pricing oracle for baseCurrency -> USD.
     * - baseCurrencyLabel: Human readable label.
     * @dev If the BaseCurrency has no native token (USD, EUR...), baseCurrencyDecimals is 0 and assetAddress the null address.
     * Tokens pegged to the native token do not count as native tokens.
     * - USDC is not a native token for USD as BaseCurrency.
     * - WETH is a native token for ETH as BaseCurrency.
     * @dev A baseCurrency cannot be added twice, as that would result in the ability to manipulate prices.
     */
    function addBaseCurrency(BaseCurrencyInformation calldata baseCurrencyInformation) external onlyOwner {
        require(!isBaseCurrency[baseCurrencyInformation.assetAddress], "MR_ABC: BaseCurrency exists");

        baseCurrencyToInformation[baseCurrencyCounter] = baseCurrencyInformation;
        assetToBaseCurrency[baseCurrencyInformation.assetAddress] = baseCurrencyCounter;
        isBaseCurrency[baseCurrencyInformation.assetAddress] = true;
        baseCurrencies.push(baseCurrencyInformation.assetAddress);

        unchecked {
            ++baseCurrencyCounter;
        }

        emit BaseCurrencyAdded(
            baseCurrencyInformation.assetAddress, uint8(baseCurrencyCounter), baseCurrencyInformation.baseCurrencyLabel
        );
    }

    /**
     * @notice Sets a new oracle for the rate baseCurrency-USD.
     * @param baseCurrency The identifier of the baseCurrency for which the new oracle is set.
     * @param newOracle The new oracle address.
     * @param baseCurrencyToUsdOracleUnit The new baseCurrencyToUsdOracleUnit.
     * @dev This function is part of an oracle failsafe mechanism.
     * New oracles can only be set if the current oracle is not performing as intended:
     * - A call to the oracle reverts.
     * - The oracle returns the minimum value.
     * - The oracle returns the maximum value.
     * - The oracle didn't update for over a week.
     * @dev This function could be called to set a new oracle address for the baseCurrency USD (since it is initiated with the zero address).
     * This oracle is however never used, hence would not cause any problems (except gas waste).
     */
    function setOracle(uint256 baseCurrency, address newOracle, uint64 baseCurrencyToUsdOracleUnit)
        external
        onlyOwner
    {
        require(baseCurrency < baseCurrencyCounter, "MR_SO: UNKNOWN_BASECURRENCY");

        bool oracleIsHealthy = true;
        address oldOracle = baseCurrencyToInformation[baseCurrency].baseCurrencyToUsdOracle;

        try IChainLinkData(oldOracle).latestRoundData() returns (
            uint80, int256 answer, uint256, uint256 updatedAt, uint80
        ) {
            if (answer <= IChainLinkData(IChainLinkData(oldOracle).aggregator()).minAnswer()) {
                oracleIsHealthy = false;
            } else if (answer >= IChainLinkData(IChainLinkData(oldOracle).aggregator()).maxAnswer()) {
                oracleIsHealthy = false;
            } else if (updatedAt <= block.timestamp - 1 weeks) {
                oracleIsHealthy = false;
            }
        } catch {
            oracleIsHealthy = false;
        }

        if (oracleIsHealthy) {
            revert("MR_SO: ORACLE_HEALTHY");
        } else {
            baseCurrencyToInformation[baseCurrency].baseCurrencyToUsdOracle = newOracle;
            baseCurrencyToInformation[baseCurrency].baseCurrencyToUsdOracleUnit = baseCurrencyToUsdOracleUnit;
        }
    }

    /* ///////////////////////////////////////////////////////////////
                        PRICE MODULE MANAGEMENT
    /////////////////////////////////////////////////////////////// */

    /**
     * @notice Adds a new Pricing Module to the Main Registry.
     * @param pricingModule The contract address of the Pricing Module.
     */
    function addPricingModule(address pricingModule) external onlyOwner {
        require(!isPricingModule[pricingModule], "MR_APM: PriceMod. not unique");
        isPricingModule[pricingModule] = true;
        pricingModules.push(pricingModule);

        emit PricingModuleAdded(pricingModule);
    }

    /* ///////////////////////////////////////////////////////////////
                        ASSET MANAGEMENT
    /////////////////////////////////////////////////////////////// */

    /**
     * @notice Adds a new asset to the Main Registry.
     * @param assetAddress The contract address of the asset.
     * @param assetType Identifier for the type of the asset:
     * 0 = ERC20.
     * 1 = ERC721.
     * 2 = ERC1155.
     * @dev Assets that are already in the mainRegistry cannot be overwritten,
     * as that would make it possible for devs to change the asset pricing.
     */
    function addAsset(address assetAddress, uint256 assetType) external onlyPricingModule {
        require(!inMainRegistry[assetAddress], "MR_AA: Asset already in mainreg");
        require(assetType <= type(uint96).max, "MR_AA: Invalid AssetType");

        inMainRegistry[assetAddress] = true;
        assetsInMainRegistry.push(assetAddress);
        assetToAssetInformation[assetAddress] =
            AssetInformation({ assetType: uint96(assetType), pricingModule: msg.sender });

        emit AssetAdded(assetAddress, msg.sender, uint8(assetType));
    }

    /**
     * @notice Batch deposit multiple assets.
     * @param assetAddresses Array of the contract addresses of the assets.
     * @param assetIds Array of the IDs of the assets.
     * @param amounts Array with the amounts of the assets.
     * @return assetTypes Array with the types of the assets.
     * 0 = ERC20.
     * 1 = ERC721.
     * 2 = ERC1155.
     * @dev processDeposit in the pricing module checks whether it's allowlisted and updates the exposure.
     */
    function batchProcessDeposit(
        address[] calldata assetAddresses,
        uint256[] calldata assetIds,
        uint256[] calldata amounts
    ) external whenDepositNotPaused onlyVault returns (uint256[] memory assetTypes) {
        uint256 addressesLength = assetAddresses.length;
        require(addressesLength == assetIds.length && addressesLength == amounts.length, "MR_BPD: LENGTH_MISMATCH");

        address assetAddress;
        assetTypes = new uint256[](addressesLength);
        for (uint256 i; i < addressesLength;) {
            assetAddress = assetAddresses[i];
            assetTypes[i] = assetToAssetInformation[assetAddress].assetType;

            IPricingModule(assetToAssetInformation[assetAddress].pricingModule).processDeposit(
                msg.sender, assetAddress, assetIds[i], amounts[i]
            );

            unchecked {
                ++i;
            }
        }
    }

    /**
     * @notice Batch withdraw multiple assets.
     * @param assetAddresses Array of the contract addresses of the assets.
     * @param assetIds Array of the IDs of the assets.
     * @param amounts Array with the amounts of the assets.
     * @return assetTypes Array with the types of the assets.
     * 0 = ERC20.
     * 1 = ERC721.
     * 2 = ERC1155.
     * @dev batchProcessWithdrawal in the pricing module updates the exposure.
     */
    function batchProcessWithdrawal(
        address[] calldata assetAddresses,
        uint256[] calldata assetIds,
        uint256[] calldata amounts
    ) external whenWithdrawNotPaused onlyVault returns (uint256[] memory assetTypes) {
        uint256 addressesLength = assetAddresses.length;
        require(addressesLength == assetIds.length && addressesLength == amounts.length, "MR_BPW: LENGTH_MISMATCH");

        address assetAddress;
        assetTypes = new uint256[](addressesLength);
        for (uint256 i; i < addressesLength;) {
            assetAddress = assetAddresses[i];
            assetTypes[i] = assetToAssetInformation[assetAddress].assetType;

            IPricingModule(assetToAssetInformation[assetAddress].pricingModule).processWithdrawal(
                msg.sender, assetAddress, assetIds[i], amounts[i]
            );

            unchecked {
                ++i;
            }
        }
    }

    /* ///////////////////////////////////////////////////////////////
                          PRICING LOGIC
    /////////////////////////////////////////////////////////////// */

    /**
     * @notice Calculates the value per asset, denominated in a given BaseCurrency.
     * @param assetAddresses Array of the contract addresses of the assets.
     * @param assetIds Array of the IDs of the assets.
     * @param assetAmounts Array with the amounts of the assets.
     * @param baseCurrency An identifier (uint256) of the BaseCurrency.
     * @return valuesAndRiskVarPerAsset The array of values per assets, denominated in BaseCurrency.
     * @dev For each token address, a corresponding id and amount at the same index should be present,
     * for tokens without Id (ERC20 for instance), the Id should be set to 0.
     * @dev No checks of input parameters necessary, all generated by the Vault.
     * Additionally, unknown assetAddresses cause IPricingModule(assetAddresses) to revert,
     * Unknown baseCurrency will cause IChainLinkData(baseCurrency) to revert.
     * Non-equal lists will or revert, or not take all assets into account -> lower value as actual.
     */
    function getListOfValuesPerAsset(
        address[] calldata assetAddresses,
        uint256[] calldata assetIds,
        uint256[] calldata assetAmounts,
        uint256 baseCurrency
    ) public view returns (RiskModule.AssetValueAndRiskVariables[] memory) {
        // Cache Output array.
        uint256 assetAddressesLength = assetAddresses.length;
        RiskModule.AssetValueAndRiskVariables[] memory valuesAndRiskVarPerAsset =
            new RiskModule.AssetValueAndRiskVariables[](assetAddressesLength);

        // Cache variables.
        IPricingModule.GetValueInput memory getValueInput;
        getValueInput.baseCurrency = baseCurrency;
        int256 rateBaseCurrencyToUsd;
        address assetAddress;
        uint256 valueInUsd;
        uint256 valueInBaseCurrency;

        // Get the BaseCurrency-USD rate if the BaseCurrency is different from USD.
        if (baseCurrency > 0) {
            (, rateBaseCurrencyToUsd,,,) =
                IChainLinkData(baseCurrencyToInformation[baseCurrency].baseCurrencyToUsdOracle).latestRoundData();
        }

        // Loop over all assets.
        for (uint256 i; i < assetAddressesLength;) {
            assetAddress = assetAddresses[i];

            // If the asset is identical to the base Currency, we do not need to get a rate.
            // We only need to fetch the risk variables from the PricingModule.
            if (assetAddress == baseCurrencyToInformation[baseCurrency].assetAddress) {
                valuesAndRiskVarPerAsset[i].valueInBaseCurrency = assetAmounts[i];
                (valuesAndRiskVarPerAsset[i].collateralFactor, valuesAndRiskVarPerAsset[i].liquidationFactor) =
                IPricingModule(assetToAssetInformation[assetAddress].pricingModule).getRiskVariables(
                    assetAddress, baseCurrency
                );

                // Else we need to fetch the value in the assets' PricingModule.
            } else {
                // Prepare input.
                getValueInput.asset = assetAddress;
                getValueInput.assetId = assetIds[i];
                getValueInput.assetAmount = assetAmounts[i];

                // Fetch the Value and the risk variables in the PricingModule.
                (
                    valueInUsd,
                    valueInBaseCurrency,
                    valuesAndRiskVarPerAsset[i].collateralFactor,
                    valuesAndRiskVarPerAsset[i].liquidationFactor
                ) = IPricingModule(assetToAssetInformation[assetAddress].pricingModule).getValue(getValueInput);

                // If the baseCurrency is USD (identifier 0), IPricingModule().getValue will always return the value in USD (valueInBaseCurrency = 0).
                if (baseCurrency == 0) {
                    //USD has hardcoded precision of 18 decimals (baseCurrencyUnitCorrection set to 1).
                    //Since internal precision of value calculations is also 18 decimals, no need for a unit correction.
                    valuesAndRiskVarPerAsset[i].valueInBaseCurrency = valueInUsd;
                } else {
                    //If the baseCurrency is different from USD, both valueInUsd and valueInBaseCurrency can be non-zero.
                    //Calculate the equivalent of valueInUsd denominated in BaseCurrency and add it to valueInBaseCurrency.
                    //And bring the final valueInBaseCurrency from internal 18 decimals to the actual number of decimals of baseCurrency.
                    unchecked {
                        valuesAndRiskVarPerAsset[i].valueInBaseCurrency = (
                            valueInUsd.mulDivDown(
                                baseCurrencyToInformation[baseCurrency].baseCurrencyToUsdOracleUnit,
                                uint256(rateBaseCurrencyToUsd)
                            ) + valueInBaseCurrency
                        ) / baseCurrencyToInformation[baseCurrency].baseCurrencyUnitCorrection;
                    }
                }
            }
            unchecked {
                ++i;
            }
        }
        return valuesAndRiskVarPerAsset;
    }

    /**
     * @notice Calculates the values per asset, denominated in a given BaseCurrency.
     * @param assetAddresses Array of the contract addresses of the assets.
     * @param assetIds Array of the IDs of the assets.
     * @param assetAmounts Array with the amounts of the assets.
     * @param baseCurrency The contract address of the BaseCurrency.
     * @return valuesAndRiskVarPerAsset The array of values per assets, denominated in BaseCurrency.
     * @dev No need to check equality of length of arrays, since they are generated by the Vault.
     */
    function getListOfValuesPerAsset(
        address[] calldata assetAddresses,
        uint256[] calldata assetIds,
        uint256[] calldata assetAmounts,
        address baseCurrency
    ) external view returns (RiskModule.AssetValueAndRiskVariables[] memory valuesAndRiskVarPerAsset) {
        require(isBaseCurrency[baseCurrency], "MR_GLVA: UNKNOWN_BASECURRENCY");
        valuesAndRiskVarPerAsset =
            getListOfValuesPerAsset(assetAddresses, assetIds, assetAmounts, assetToBaseCurrency[baseCurrency]);
    }

    /**
     * @notice Calculates the combined value of a combination of assets, denominated in a given BaseCurrency.
     * @param assetAddresses Array of the contract addresses of the assets.
     * @param assetIds Array of the IDs of the assets.
     * @param assetAmounts Array with the amounts of the assets.
     * @param baseCurrency The contract address of the BaseCurrency.
     * @return valueInBaseCurrency The combined value of the assets, denominated in BaseCurrency.
     * @dev No need to check equality of length of arrays, since they are generated by the Vault.
     */
    function getTotalValue(
        address[] calldata assetAddresses,
        uint256[] calldata assetIds,
        uint256[] calldata assetAmounts,
        address baseCurrency
    ) public view returns (uint256 valueInBaseCurrency) {
        require(isBaseCurrency[baseCurrency], "MR_GTV: UNKNOWN_BASECURRENCY");

        RiskModule.AssetValueAndRiskVariables[] memory valuesAndRiskVarPerAsset =
            getListOfValuesPerAsset(assetAddresses, assetIds, assetAmounts, assetToBaseCurrency[baseCurrency]);

        for (uint256 i = 0; i < valuesAndRiskVarPerAsset.length;) {
            valueInBaseCurrency += valuesAndRiskVarPerAsset[i].valueInBaseCurrency;
            unchecked {
                ++i;
            }
        }
    }

    /**
     * @notice Calculates the collateralValue of a combination of assets, denominated in a given BaseCurrency.
     * @param assetAddresses Array of the contract addresses of the assets.
     * @param assetIds Array of the IDs of the assets.
     * @param assetAmounts Array with the amounts of the assets.
     * @param baseCurrency The contract address of the BaseCurrency.
     * @return collateralValue The collateral value of the assets, denominated in BaseCurrency.
     * @dev No need to check equality of length of arrays, since they are generated by the Vault.
     * @dev The collateral value is equal to the spot value of the assets,
     * discounted by a haircut (the collateral factor).
     */
    function getCollateralValue(
        address[] calldata assetAddresses,
        uint256[] calldata assetIds,
        uint256[] calldata assetAmounts,
        address baseCurrency
    ) external view returns (uint256 collateralValue) {
        require(isBaseCurrency[baseCurrency], "MR_GCV: UNKNOWN_BASECURRENCY");

        RiskModule.AssetValueAndRiskVariables[] memory valuesAndRiskVarPerAsset =
            getListOfValuesPerAsset(assetAddresses, assetIds, assetAmounts, assetToBaseCurrency[baseCurrency]);

        collateralValue = RiskModule.calculateCollateralValue(valuesAndRiskVarPerAsset);
    }

    /**
     * @notice Calculates the getLiquidationValue of a combination of assets, denominated in a given BaseCurrency.
     * @param assetAddresses Array of the contract addresses of the assets.
     * @param assetIds Array of the IDs of the assets.
     * @param assetAmounts Array with the amounts of the assets.
     * @param baseCurrency The contract address of the BaseCurrency.
     * @return liquidationValue The liquidation value of the assets, denominated in BaseCurrency.
     * @dev No need to check equality of length of arrays, since they are generated by the Vault.
     * @dev The liquidation value is equal to the spot value of the assets,
     * discounted by a haircut (the liquidation factor).
     */
    function getLiquidationValue(
        address[] calldata assetAddresses,
        uint256[] calldata assetIds,
        uint256[] calldata assetAmounts,
        address baseCurrency
    ) external view returns (uint256 liquidationValue) {
        require(isBaseCurrency[baseCurrency], "MR_GLV: UNKNOWN_BASECURRENCY");

        RiskModule.AssetValueAndRiskVariables[] memory valuesAndRiskVarPerAsset =
            getListOfValuesPerAsset(assetAddresses, assetIds, assetAmounts, assetToBaseCurrency[baseCurrency]);

        liquidationValue = RiskModule.calculateLiquidationValue(valuesAndRiskVarPerAsset);
    }
}

File 1 of 11: BaseGuardian.sol
/**
 * Created by Pragma Labs
 * SPDX-License-Identifier: BUSL-1.1
 */

pragma solidity ^0.8.13;

import { Owned } from "Owned.sol";

/**
 * @title Guardian
 * @author Pragma Labs
 * @notice This module provides the base logic that allows authorized accounts to trigger an emergency stop.
 */
abstract contract BaseGuardian is Owned {
    /* //////////////////////////////////////////////////////////////
                                STORAGE
    ////////////////////////////////////////////////////////////// */

    // Address of the Guardian.
    address public guardian;
    // Last timestamp an emergency stop was triggered.
    uint256 public pauseTimestamp;

    /* //////////////////////////////////////////////////////////////
                                EVENTS
    ////////////////////////////////////////////////////////////// */

    event GuardianChanged(address indexed oldGuardian, address indexed newGuardian);

    /* //////////////////////////////////////////////////////////////
                                MODIFIERS
    ////////////////////////////////////////////////////////////// */

    /**
     * @dev Throws if called by any account other than the guardian.
     */
    modifier onlyGuardian() {
        require(msg.sender == guardian, "Guardian: Only guardian");
        _;
    }

    /* //////////////////////////////////////////////////////////////
                                CONSTRUCTOR
    ////////////////////////////////////////////////////////////// */

    constructor() Owned(msg.sender) { }

    /* //////////////////////////////////////////////////////////////
                            GUARDIAN LOGIC
    ////////////////////////////////////////////////////////////// */

    /**
     * @notice This function is used to set the guardian address
     * @param guardian_ The address of the new guardian.
     * @dev Allows onlyOwner to change the guardian address.
     */
    function changeGuardian(address guardian_) external onlyOwner {
        emit GuardianChanged(guardian, guardian_);
        guardian = guardian_;
    }

    /* //////////////////////////////////////////////////////////////
                            PAUSING LOGIC
    ////////////////////////////////////////////////////////////// */

    /**
     * @notice This function is used to pause all the flags of the contract.
     * @dev This function can be called by the guardian to pause all functionality in the event of an emergency.
     * This function pauses repay, withdraw, borrow, deposit and liquidation.
     * This function can only be called by the guardian.
     * The guardian can only pause the protocol again after 32 days have past since the last pause.
     * This is to prevent that a malicious guardian can take user-funds hostage for an indefinite time.
     * @dev After the guardian has paused the protocol, the owner has 30 days to find potential problems,
     * find a solution and unpause the protocol. If the protocol is not unpaused after 30 days,
     * an emergency procedure can be started by any user to unpause the protocol.
     * All users have now at least a two-day window to withdraw assets and close positions before
     * the protocol can again be paused (after 32 days).
     */
    function pause() external virtual onlyGuardian { }

    /**
     * @notice This function is used to unPause all flags.
     * @dev If the protocol is not unpaused after 30 days, any user can unpause the protocol.
     * This ensures that no rogue owner or guardian can lock user funds for an indefinite amount of time.
     * All users have now at least a two-day window to withdraw assets and close positions before
     * the protocol can again be paused (after 32 days).
     */
    function unPause() external virtual { }
}

File 2 of 11: FixedPointMathLib.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Arithmetic library with operations for fixed-point numbers.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/FixedPointMathLib.sol)
/// @author Inspired by USM (https://github.com/usmfum/USM/blob/master/contracts/WadMath.sol)
library FixedPointMathLib {
    /*//////////////////////////////////////////////////////////////
                    SIMPLIFIED FIXED POINT OPERATIONS
    //////////////////////////////////////////////////////////////*/

    uint256 internal constant MAX_UINT256 = 2**256 - 1;

    uint256 internal constant WAD = 1e18; // The scalar of ETH and most ERC20s.

    function mulWadDown(uint256 x, uint256 y) internal pure returns (uint256) {
        return mulDivDown(x, y, WAD); // Equivalent to (x * y) / WAD rounded down.
    }

    function mulWadUp(uint256 x, uint256 y) internal pure returns (uint256) {
        return mulDivUp(x, y, WAD); // Equivalent to (x * y) / WAD rounded up.
    }

    function divWadDown(uint256 x, uint256 y) internal pure returns (uint256) {
        return mulDivDown(x, WAD, y); // Equivalent to (x * WAD) / y rounded down.
    }

    function divWadUp(uint256 x, uint256 y) internal pure returns (uint256) {
        return mulDivUp(x, WAD, y); // Equivalent to (x * WAD) / y rounded up.
    }

    /*//////////////////////////////////////////////////////////////
                    LOW LEVEL FIXED POINT OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function mulDivDown(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 z) {
        /// @solidity memory-safe-assembly
        assembly {
            // Equivalent to require(denominator != 0 && (y == 0 || x <= type(uint256).max / y))
            if iszero(mul(denominator, iszero(mul(y, gt(x, div(MAX_UINT256, y)))))) {
                revert(0, 0)
            }

            // Divide x * y by the denominator.
            z := div(mul(x, y), denominator)
        }
    }

    function mulDivUp(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 z) {
        /// @solidity memory-safe-assembly
        assembly {
            // Equivalent to require(denominator != 0 && (y == 0 || x <= type(uint256).max / y))
            if iszero(mul(denominator, iszero(mul(y, gt(x, div(MAX_UINT256, y)))))) {
                revert(0, 0)
            }

            // If x * y modulo the denominator is strictly greater than 0,
            // 1 is added to round up the division of x * y by the denominator.
            z := add(gt(mod(mul(x, y), denominator), 0), div(mul(x, y), denominator))
        }
    }

    function rpow(
        uint256 x,
        uint256 n,
        uint256 scalar
    ) internal pure returns (uint256 z) {
        /// @solidity memory-safe-assembly
        assembly {
            switch x
            case 0 {
                switch n
                case 0 {
                    // 0 ** 0 = 1
                    z := scalar
                }
                default {
                    // 0 ** n = 0
                    z := 0
                }
            }
            default {
                switch mod(n, 2)
                case 0 {
                    // If n is even, store scalar in z for now.
                    z := scalar
                }
                default {
                    // If n is odd, store x in z for now.
                    z := x
                }

                // Shifting right by 1 is like dividing by 2.
                let half := shr(1, scalar)

                for {
                    // Shift n right by 1 before looping to halve it.
                    n := shr(1, n)
                } n {
                    // Shift n right by 1 each iteration to halve it.
                    n := shr(1, n)
                } {
                    // Revert immediately if x ** 2 would overflow.
                    // Equivalent to iszero(eq(div(xx, x), x)) here.
                    if shr(128, x) {
                        revert(0, 0)
                    }

                    // Store x squared.
                    let xx := mul(x, x)

                    // Round to the nearest number.
                    let xxRound := add(xx, half)

                    // Revert if xx + half overflowed.
                    if lt(xxRound, xx) {
                        revert(0, 0)
                    }

                    // Set x to scaled xxRound.
                    x := div(xxRound, scalar)

                    // If n is even:
                    if mod(n, 2) {
                        // Compute z * x.
                        let zx := mul(z, x)

                        // If z * x overflowed:
                        if iszero(eq(div(zx, x), z)) {
                            // Revert if x is non-zero.
                            if iszero(iszero(x)) {
                                revert(0, 0)
                            }
                        }

                        // Round to the nearest number.
                        let zxRound := add(zx, half)

                        // Revert if zx + half overflowed.
                        if lt(zxRound, zx) {
                            revert(0, 0)
                        }

                        // Return properly scaled zxRound.
                        z := div(zxRound, scalar)
                    }
                }
            }
        }
    }

    /*//////////////////////////////////////////////////////////////
                        GENERAL NUMBER UTILITIES
    //////////////////////////////////////////////////////////////*/

    function sqrt(uint256 x) internal pure returns (uint256 z) {
        /// @solidity memory-safe-assembly
        assembly {
            let y := x // We start y at x, which will help us make our initial estimate.

            z := 181 // The "correct" value is 1, but this saves a multiplication later.

            // This segment is to get a reasonable initial estimate for the Babylonian method. With a bad
            // start, the correct # of bits increases ~linearly each iteration instead of ~quadratically.

            // We check y >= 2^(k + 8) but shift right by k bits
            // each branch to ensure that if x >= 256, then y >= 256.
            if iszero(lt(y, 0x10000000000000000000000000000000000)) {
                y := shr(128, y)
                z := shl(64, z)
            }
            if iszero(lt(y, 0x1000000000000000000)) {
                y := shr(64, y)
                z := shl(32, z)
            }
            if iszero(lt(y, 0x10000000000)) {
                y := shr(32, y)
                z := shl(16, z)
            }
            if iszero(lt(y, 0x1000000)) {
                y := shr(16, y)
                z := shl(8, z)
            }

            // Goal was to get z*z*y within a small factor of x. More iterations could
            // get y in a tighter range. Currently, we will have y in [256, 256*2^16).
            // We ensured y >= 256 so that the relative difference between y and y+1 is small.
            // That's not possible if x < 256 but we can just verify those cases exhaustively.

            // Now, z*z*y <= x < z*z*(y+1), and y <= 2^(16+8), and either y >= 256, or x < 256.
            // Correctness can be checked exhaustively for x < 256, so we assume y >= 256.
            // Then z*sqrt(y) is within sqrt(257)/sqrt(256) of sqrt(x), or about 20bps.

            // For s in the range [1/256, 256], the estimate f(s) = (181/1024) * (s+1) is in the range
            // (1/2.84 * sqrt(s), 2.84 * sqrt(s)), with largest error when s = 1 and when s = 256 or 1/256.

            // Since y is in [256, 256*2^16), let a = y/65536, so that a is in [1/256, 256). Then we can estimate
            // sqrt(y) using sqrt(65536) * 181/1024 * (a + 1) = 181/4 * (y + 65536)/65536 = 181 * (y + 65536)/2^18.

            // There is no overflow risk here since y < 2^136 after the first branch above.
            z := shr(18, mul(z, add(y, 65536))) // A mul() is saved from starting z at 181.

            // Given the worst case multiplicative error of 2.84 above, 7 iterations should be enough.
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))

            // If x+1 is a perfect square, the Babylonian method cycles between
            // floor(sqrt(x)) and ceil(sqrt(x)). This statement ensures we return floor.
            // See: https://en.wikipedia.org/wiki/Integer_square_root#Using_only_integer_division
            // Since the ceil is rare, we save gas on the assignment and repeat division in the rare case.
            // If you don't care whether the floor or ceil square root is returned, you can remove this statement.
            z := sub(z, lt(div(x, z), z))
        }
    }

    function unsafeMod(uint256 x, uint256 y) internal pure returns (uint256 z) {
        /// @solidity memory-safe-assembly
        assembly {
            // Mod x by y. Note this will return
            // 0 instead of reverting if y is zero.
            z := mod(x, y)
        }
    }

    function unsafeDiv(uint256 x, uint256 y) internal pure returns (uint256 r) {
        /// @solidity memory-safe-assembly
        assembly {
            // Divide x by y. Note this will return
            // 0 instead of reverting if y is zero.
            r := div(x, y)
        }
    }

    function unsafeDivUp(uint256 x, uint256 y) internal pure returns (uint256 z) {
        /// @solidity memory-safe-assembly
        assembly {
            // Add 1 to x * y if x % y > 0. Note this will
            // return 0 instead of reverting if y is zero.
            z := add(gt(mod(x, y), 0), div(x, y))
        }
    }
}

File 3 of 11: IChainLinkData.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

// @notice Interface for ChainLink Data Feed, it is based on https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol
interface IChainLinkData {
    function decimals() external view returns (uint8);

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

    function version() external view returns (uint256);

    function getRoundData(uint80 _roundId)
        external
        view
        returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);

    function latestRoundData()
        external
        view
        returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);

    // @notice Returns the aggregator, added by arcadia.
    function aggregator() external view returns (address);

    // @notice Returns the minimum answer, added by arcadia.
    function minAnswer() external view returns (int192);

    // @notice Returns the minimum answer, added by arcadia.
    function maxAnswer() external view returns (int192);
}

File 4 of 11: IFactory.sol
/**
 * Created by Pragma Labs
 * SPDX-License-Identifier: MIT
 */
pragma solidity ^0.8.13;

interface IFactory {
    /**
     * @notice Checks if a contract is a Vault.
     * @param vault The contract address of the Vault.
     * @return bool indicating if the address is a vault or not.
     */
    function isVault(address vault) external view returns (bool);

    /**
     * @notice Function used to transfer a vault between users.
     * @param from The sender.
     * @param to The target.
     * @param vault The address of the vault that is transferred.
     */
    function safeTransferFrom(address from, address to, address vault) external;

    /**
     * @notice Function called by a Vault at the start of a liquidation to transfer ownership to the Liquidator contract.
     * @param liquidator The contract address of the liquidator.
     */
    function liquidate(address liquidator) external;
}

File 5 of 11: IMainRegistry.sol
/**
 * Created by Pragma Labs
 * SPDX-License-Identifier: MIT
 */
pragma solidity ^0.8.13;

interface IMainRegistry {
    /**
     * @notice Returns the number of baseCurrencies.
     * @return Counter for the number of baseCurrencies in use.
     */
    function baseCurrencyCounter() external view returns (uint256);

    /**
     * @notice Returns the Factory address.
     * @return factory The contract address of the Factory.
     */
    function factory() external view returns (address);

    /**
     * @notice Returns the contract address of a baseCurrency.
     * @param index The index of the baseCurrency in the array baseCurrencies.
     * @return baseCurrency The contract address of a baseCurrency.
     */
    function baseCurrencies(uint256 index) external view returns (address);

    /**
     * @notice Checks if a contract is a baseCurrency.
     * @param baseCurrency The contract address of the baseCurrency.
     * @return boolean.
     */
    function isBaseCurrency(address baseCurrency) external view returns (bool);

    /**
     * @notice Checks if an action is allowed.
     * @param action The contract address of the action.
     * @return boolean.
     */
    function isActionAllowed(address action) external view returns (bool);

    /**
     * @notice Batch deposit multiple assets.
     * @param assetAddresses Array of the contract addresses of the assets.
     * @param assetIds Array of the IDs of the assets.
     * @param amounts Array with the amounts of the assets.
     * @return assetTypes Array with the types of the assets.
     * 0 = ERC20.
     * 1 = ERC721.
     * 2 = ERC1155.
     */
    function batchProcessDeposit(
        address[] calldata assetAddresses,
        uint256[] calldata assetIds,
        uint256[] calldata amounts
    ) external returns (uint256[] memory);

    /**
     * @notice Batch withdraw multiple assets.
     * @param assetAddresses Array of the contract addresses of the assets.
     * @param assetIds Array of the IDs of the assets.
     * @param amounts Array with the amounts of the assets.
     * @return assetTypes Array with the types of the assets.
     * 0 = ERC20.
     * 1 = ERC721.
     * 2 = ERC1155.
     */
    function batchProcessWithdrawal(
        address[] calldata assetAddresses,
        uint256[] calldata assetIds,
        uint256[] calldata amounts
    ) external returns (uint256[] memory);

    /**
     * @notice Calculates the combined value of a combination of assets, denominated in a given BaseCurrency.
     * @param assetAddresses Array of the contract addresses of the assets.
     * @param assetIds Array of the IDs of the assets.
     * @param assetAmounts Array with the amounts of the assets.
     * @param baseCurrency The contract address of the BaseCurrency.
     * @return valueInBaseCurrency The combined value of the assets, denominated in BaseCurrency.
     */
    function getTotalValue(
        address[] calldata assetAddresses,
        uint256[] calldata assetIds,
        uint256[] calldata assetAmounts,
        address baseCurrency
    ) external view returns (uint256);

    /**
     * @notice Calculates the collateralValue of a combination of assets, denominated in a given BaseCurrency.
     * @param assetAddresses Array of the contract addresses of the assets.
     * @param assetIds Array of the IDs of the assets.
     * @param assetAmounts Array with the amounts of the assets.
     * @param baseCurrency The contract address of the BaseCurrency.
     * @return collateralValue The collateral value of the assets, denominated in BaseCurrency.
     */
    function getCollateralValue(
        address[] calldata assetAddresses,
        uint256[] calldata assetIds,
        uint256[] calldata assetAmounts,
        address baseCurrency
    ) external view returns (uint256);

    /**
     * @notice Calculates the getLiquidationValue of a combination of assets, denominated in a given BaseCurrency.
     * @param assetAddresses Array of the contract addresses of the assets.
     * @param assetIds Array of the IDs of the assets.
     * @param assetAmounts Array with the amounts of the assets.
     * @param baseCurrency The contract address of the BaseCurrency.
     * @return liquidationValue The liquidation value of the assets, denominated in BaseCurrency.
     */
    function getLiquidationValue(
        address[] calldata assetAddresses,
        uint256[] calldata assetIds,
        uint256[] calldata assetAmounts,
        address baseCurrency
    ) external view returns (uint256);
}

File 6 of 11: IPricingModule.sol
/**
 * Created by Pragma Labs
 * SPDX-License-Identifier: MIT
 */
pragma solidity ^0.8.13;

interface IPricingModule {
    // A Struct with the input variables for the function getValue() (avoid stack to deep).
    struct GetValueInput {
        address asset; // The contract address of the asset.
        uint256 assetId; // The Id of the asset.
        uint256 assetAmount; // The amount of assets.
        uint256 baseCurrency; // Identifier of the BaseCurrency in which the value is ideally denominated.
    }

    /**
     * @notice Returns the value of a certain asset, denominated in USD or in another BaseCurrency.
     * @param input A Struct with the input variables (avoid stack to deep).
     * @return valueInUsd The value of the asset denominated in USD, with 18 Decimals precision.
     * @return valueInBaseCurrency The value of the asset denominated in a BaseCurrency different from USD, with 18 Decimals precision.
     * @return collateralFactor The collateral factor of the asset for a given baseCurrency, with 2 decimals precision.
     * @return liquidationFactor liquidationFactor The liquidation factor of the asset for a given baseCurrency, with 2 decimals precision.
     */
    function getValue(GetValueInput memory input) external view returns (uint256, uint256, uint256, uint256);

    /**
     * @notice Returns the risk variables of an asset.
     * @param asset The contract address of the asset.
     * @param baseCurrency An identifier (uint256) of the BaseCurrency.
     * @return collateralFactor The collateral factor of the asset for a given baseCurrency, 2 decimals precision.
     * @return liquidationFactor The liquidation factor of the asset for a given baseCurrency, 2 decimals precision.
     */
    function getRiskVariables(address asset, uint256 baseCurrency) external view returns (uint16, uint16);

    /**
     * @notice Processes the deposit of an asset.
     * @param vault The contract address of the Vault where the asset is transferred to.
     * @param asset The contract address of the asset.
     * @param id The Id of the asset.
     * @param amount The amount of tokens.
     */
    function processDeposit(address vault, address asset, uint256 id, uint256 amount) external;

    /**
     * @notice Processes the withdrawal an asset.
     * @param vault The address of the vault where the asset is withdrawn from
     * @param asset The contract address of the asset.
     * @param id The Id of the asset.
     * @param amount The amount of tokens.
     */
    function processWithdrawal(address vault, address asset, uint256 id, uint256 amount) external;
}

File 8 of 11: MainRegistryGuardian.sol
/**
 * Created by Pragma Labs
 * SPDX-License-Identifier: BUSL-1.1
 */

pragma solidity ^0.8.13;

import { BaseGuardian } from "BaseGuardian.sol";

/**
 * @title Registry Guardian
 * @author Pragma Labs
 * @notice This module provides the logic for the MainRegistry that allows authorized accounts to trigger an emergency stop.
 */
abstract contract MainRegistryGuardian is BaseGuardian {
    /* //////////////////////////////////////////////////////////////
                                STORAGE
    ////////////////////////////////////////////////////////////// */

    // Flag indicating if the withdraw() function is paused.
    bool public withdrawPaused;
    // Flag indicating if the deposit() function is paused.
    bool public depositPaused;

    /* //////////////////////////////////////////////////////////////
                                EVENTS
    ////////////////////////////////////////////////////////////// */

    event PauseUpdate(bool withdrawPauseUpdate, bool depositPauseUpdate);

    /*
    //////////////////////////////////////////////////////////////
                            ERRORS
    //////////////////////////////////////////////////////////////
    */
    error FunctionIsPaused();

    /*
    //////////////////////////////////////////////////////////////
                            MODIFIERS
    //////////////////////////////////////////////////////////////
    */

    /**
     * @dev This modifier is used to restrict access to certain functions when the contract is paused for withdraw assets.
     * It throws if withdraw is paused.
     */
    modifier whenWithdrawNotPaused() {
        if (withdrawPaused) revert FunctionIsPaused();
        _;
    }

    /**
     * @dev This modifier is used to restrict access to certain functions when the contract is paused for deposit assets.
     * It throws if deposit assets is paused.
     */
    modifier whenDepositNotPaused() {
        if (depositPaused) revert FunctionIsPaused();
        _;
    }

    /* //////////////////////////////////////////////////////////////
                                CONSTRUCTOR
    ////////////////////////////////////////////////////////////// */

    constructor() { }

    /* //////////////////////////////////////////////////////////////
                            PAUSING LOGIC
    ////////////////////////////////////////////////////////////// */

    /**
     * @inheritdoc BaseGuardian
     */
    function pause() external override onlyGuardian {
        require(block.timestamp > pauseTimestamp + 32 days, "G_P: Cannot pause");
        withdrawPaused = true;
        depositPaused = true;
        pauseTimestamp = block.timestamp;

        emit PauseUpdate(true, true);
    }

    /**
     * @notice This function is used to unpause one or more flags.
     * @param withdrawPaused_ false when withdraw functionality should be unPaused.
     * @param depositPaused_ false when deposit functionality should be unPaused.
     * @dev This function can unPause repay, withdraw, borrow, and deposit individually.
     * @dev Can only update flags from paused (true) to unPaused (false), cannot be used the other way around
     * (to set unPaused flags to paused).
     */
    function unPause(bool withdrawPaused_, bool depositPaused_) external onlyOwner {
        withdrawPaused = withdrawPaused && withdrawPaused_;
        depositPaused = depositPaused && depositPaused_;

        emit PauseUpdate(withdrawPaused, depositPaused);
    }

    /**
     * @inheritdoc BaseGuardian
     */
    function unPause() external override {
        require(block.timestamp > pauseTimestamp + 30 days, "G_UP: Cannot unPause");
        if (withdrawPaused || depositPaused) {
            withdrawPaused = false;
            depositPaused = false;

            emit PauseUpdate(false, false);
        }
    }
}

File 9 of 11: Owned.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Simple single owner authorization mixin.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/auth/Owned.sol)
abstract contract Owned {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

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

    /*//////////////////////////////////////////////////////////////
                            OWNERSHIP STORAGE
    //////////////////////////////////////////////////////////////*/

    address public owner;

    modifier onlyOwner() virtual {
        require(msg.sender == owner, "UNAUTHORIZED");

        _;
    }

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(address _owner) {
        owner = _owner;

        emit OwnershipTransferred(address(0), _owner);
    }

    /*//////////////////////////////////////////////////////////////
                             OWNERSHIP LOGIC
    //////////////////////////////////////////////////////////////*/

    function transferOwnership(address newOwner) public virtual onlyOwner {
        owner = newOwner;

        emit OwnershipTransferred(msg.sender, newOwner);
    }
}

File 10 of 11: RiskConstants.sol
/**
 * Created by Pragma Labs
 * SPDX-License-Identifier: MIT
 */

pragma solidity ^0.8.13;

library RiskConstants {
    // Math
    uint16 public constant RISK_VARIABLES_UNIT = 100;

    uint16 public constant MIN_COLLATERAL_FACTOR = 0;
    uint16 public constant MIN_LIQUIDATION_FACTOR = 0;

    uint16 public constant MAX_COLLATERAL_FACTOR = 100;
    uint16 public constant MAX_LIQUIDATION_FACTOR = 100;

    uint16 public constant DEFAULT_COLLATERAL_FACTOR = 50;
    uint16 public constant DEFAULT_LIQUIDATION_FACTOR = 90;
}

File 11 of 11: RiskModule.sol
/**
 * Created by Pragma Labs
 * SPDX-License-Identifier: BUSL-1.1
 */
pragma solidity ^0.8.13;

import { RiskConstants } from "RiskConstants.sol";

/**
 * @title Risk Module
 * @author Pragma Labs
 * @notice The Risk Module is responsible for calculating the risk weighted values of combinations of assets.
 */
library RiskModule {
    // Struct with risk related information for a certain asset.
    struct AssetValueAndRiskVariables {
        uint256 valueInBaseCurrency; // The value of the asset, denominated in a certain baseCurrency.
        uint256 collateralFactor; // The collateral factor of the asset for the given baseCurrency.
        uint256 liquidationFactor; // The liquidation factor of the asset for the given baseCurrency.
    }

    /**
     * @notice Calculates the weighted collateral value given a combination of asset values and corresponding collateral factors.
     * @param valuesAndRiskVarPerAsset Array of asset values and corresponding collateral factors.
     * @return collateralValue The collateral value of the given assets.
     */
    function calculateCollateralValue(AssetValueAndRiskVariables[] memory valuesAndRiskVarPerAsset)
        public
        pure
        returns (uint256 collateralValue)
    {
        uint256 valuesAndRiskVarPerAssetLength = valuesAndRiskVarPerAsset.length;
        for (uint256 i; i < valuesAndRiskVarPerAssetLength;) {
            collateralValue +=
                valuesAndRiskVarPerAsset[i].valueInBaseCurrency * valuesAndRiskVarPerAsset[i].collateralFactor;
            unchecked {
                ++i;
            }
        }
        collateralValue = collateralValue / RiskConstants.RISK_VARIABLES_UNIT;
    }

    /**
     * @notice Calculates the weighted liquidation value given a combination of asset values and corresponding liquidation factors.
     * @param valuesAndRiskVarPerAsset List of asset values and corresponding liquidation factors.
     * @return liquidationValue The liquidation value of the given assets.
     */
    function calculateLiquidationValue(AssetValueAndRiskVariables[] memory valuesAndRiskVarPerAsset)
        public
        pure
        returns (uint256 liquidationValue)
    {
        uint256 valuesAndRiskVarPerAssetLength = valuesAndRiskVarPerAsset.length;
        for (uint256 i; i < valuesAndRiskVarPerAssetLength;) {
            liquidationValue +=
                valuesAndRiskVarPerAsset[i].valueInBaseCurrency * valuesAndRiskVarPerAsset[i].liquidationFactor;
            unchecked {
                ++i;
            }
        }
        liquidationValue = liquidationValue / RiskConstants.RISK_VARIABLES_UNIT;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"factory_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"FunctionIsPaused","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"action","type":"address"},{"indexed":false,"internalType":"bool","name":"allowed","type":"bool"}],"name":"AllowedActionSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"assetAddress","type":"address"},{"indexed":true,"internalType":"address","name":"pricingModule","type":"address"},{"indexed":false,"internalType":"uint8","name":"assetType","type":"uint8"}],"name":"AssetAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"assetAddress","type":"address"},{"indexed":true,"internalType":"uint8","name":"baseCurrencyId","type":"uint8"},{"indexed":false,"internalType":"bytes8","name":"label","type":"bytes8"}],"name":"BaseCurrencyAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldGuardian","type":"address"},{"indexed":true,"internalType":"address","name":"newGuardian","type":"address"}],"name":"GuardianChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"withdrawPauseUpdate","type":"bool"},{"indexed":false,"internalType":"bool","name":"depositPauseUpdate","type":"bool"}],"name":"PauseUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pricingModule","type":"address"}],"name":"PricingModuleAdded","type":"event"},{"inputs":[{"internalType":"address","name":"assetAddress","type":"address"},{"internalType":"uint256","name":"assetType","type":"uint256"}],"name":"addAsset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint64","name":"baseCurrencyUnitCorrection","type":"uint64"},{"internalType":"address","name":"assetAddress","type":"address"},{"internalType":"uint64","name":"baseCurrencyToUsdOracleUnit","type":"uint64"},{"internalType":"address","name":"baseCurrencyToUsdOracle","type":"address"},{"internalType":"bytes8","name":"baseCurrencyLabel","type":"bytes8"}],"internalType":"struct MainRegistry.BaseCurrencyInformation","name":"baseCurrencyInformation","type":"tuple"}],"name":"addBaseCurrency","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pricingModule","type":"address"}],"name":"addPricingModule","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"assetToAssetInformation","outputs":[{"internalType":"uint96","name":"assetType","type":"uint96"},{"internalType":"address","name":"pricingModule","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"assetToBaseCurrency","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"assetsInMainRegistry","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"baseCurrencies","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseCurrencyCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"baseCurrencyToInformation","outputs":[{"internalType":"uint64","name":"baseCurrencyUnitCorrection","type":"uint64"},{"internalType":"address","name":"assetAddress","type":"address"},{"internalType":"uint64","name":"baseCurrencyToUsdOracleUnit","type":"uint64"},{"internalType":"address","name":"baseCurrencyToUsdOracle","type":"address"},{"internalType":"bytes8","name":"baseCurrencyLabel","type":"bytes8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"assetAddresses","type":"address[]"},{"internalType":"uint256[]","name":"assetIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"batchProcessDeposit","outputs":[{"internalType":"uint256[]","name":"assetTypes","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"assetAddresses","type":"address[]"},{"internalType":"uint256[]","name":"assetIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"batchProcessWithdrawal","outputs":[{"internalType":"uint256[]","name":"assetTypes","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"guardian_","type":"address"}],"name":"changeGuardian","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"assetAddresses","type":"address[]"},{"internalType":"uint256[]","name":"assetIds","type":"uint256[]"},{"internalType":"uint256[]","name":"assetAmounts","type":"uint256[]"},{"internalType":"address","name":"baseCurrency","type":"address"}],"name":"getCollateralValue","outputs":[{"internalType":"uint256","name":"collateralValue","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"assetAddresses","type":"address[]"},{"internalType":"uint256[]","name":"assetIds","type":"uint256[]"},{"internalType":"uint256[]","name":"assetAmounts","type":"uint256[]"},{"internalType":"address","name":"baseCurrency","type":"address"}],"name":"getLiquidationValue","outputs":[{"internalType":"uint256","name":"liquidationValue","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"assetAddresses","type":"address[]"},{"internalType":"uint256[]","name":"assetIds","type":"uint256[]"},{"internalType":"uint256[]","name":"assetAmounts","type":"uint256[]"},{"internalType":"uint256","name":"baseCurrency","type":"uint256"}],"name":"getListOfValuesPerAsset","outputs":[{"components":[{"internalType":"uint256","name":"valueInBaseCurrency","type":"uint256"},{"internalType":"uint256","name":"collateralFactor","type":"uint256"},{"internalType":"uint256","name":"liquidationFactor","type":"uint256"}],"internalType":"struct RiskModule.AssetValueAndRiskVariables[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"assetAddresses","type":"address[]"},{"internalType":"uint256[]","name":"assetIds","type":"uint256[]"},{"internalType":"uint256[]","name":"assetAmounts","type":"uint256[]"},{"internalType":"address","name":"baseCurrency","type":"address"}],"name":"getListOfValuesPerAsset","outputs":[{"components":[{"internalType":"uint256","name":"valueInBaseCurrency","type":"uint256"},{"internalType":"uint256","name":"collateralFactor","type":"uint256"},{"internalType":"uint256","name":"liquidationFactor","type":"uint256"}],"internalType":"struct RiskModule.AssetValueAndRiskVariables[]","name":"valuesAndRiskVarPerAsset","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"assetAddresses","type":"address[]"},{"internalType":"uint256[]","name":"assetIds","type":"uint256[]"},{"internalType":"uint256[]","name":"assetAmounts","type":"uint256[]"},{"internalType":"address","name":"baseCurrency","type":"address"}],"name":"getTotalValue","outputs":[{"internalType":"uint256","name":"valueInBaseCurrency","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"guardian","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"inMainRegistry","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isActionAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isBaseCurrency","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isPricingModule","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pauseTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pricingModules","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"action","type":"address"},{"internalType":"bool","name":"allowed","type":"bool"}],"name":"setAllowedAction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"baseCurrency","type":"uint256"},{"internalType":"address","name":"newOracle","type":"address"},{"internalType":"uint64","name":"baseCurrencyToUsdOracleUnit","type":"uint64"}],"name":"setOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"withdrawPaused_","type":"bool"},{"internalType":"bool","name":"depositPaused_","type":"bool"}],"name":"unPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

60c06040523480156200001157600080fd5b5060405162002bae38038062002bae8339810160408190526200003491620001a6565b600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350306080526001600160a01b03811660a0527fe710864318d4a32f37d6ce54cb3fadbef648dd12d8dbdf53973564d56b7f881e80546001600160401b0319908116675553440000000000179091557fe710864318d4a32f37d6ce54cb3fadbef648dd12d8dbdf53973564d56b7f881c80549091166001908117909155600a60209081527f13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e3805460ff19168317905560078054808401825560009182527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b0319169055600492909255604051621554d160ea1b815282917f9716edaa6bc6d971e97730788fe6114cbb0550c1af523854511737343b4e939b910160405180910390a350620001d8565b600060208284031215620001b957600080fd5b81516001600160a01b0381168114620001d157600080fd5b9392505050565b60805160a05161299b62000213600039600081816105960152818161063501526109c20152600081816106f70152610a7f015261299b6000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c8063804d898e1161011a578063a4cf2f8c116100ad578063c45a01551161007c578063c45a015514610591578063d21728a9146105b8578063e5b7f93d146105cb578063f2fde38b146105de578063f7b188a5146105f157600080fd5b8063a4cf2f8c14610542578063a5a5296c14610555578063ac22f70414610575578063ad84f3411461058857600080fd5b806395092e50116100e957806395092e50146104875780639b8bf37d1461049a5780639ddde781146104bd5780639f56d8861461051f57600080fd5b8063804d898e146104365780638456cb59146104495780638da5cb5b146104515780638df80bd61461046457600080fd5b80632fcb4f041161019d578063540629df1161016c578063540629df1461034f5780635aea5299146103625780636498c1ba1461036b57806364e403231461037e57806366a6a4bd1461042357600080fd5b80632fcb4f04146103015780633d471e5c14610316578063452a93201461032957806347f0db871461033c57600080fd5b8063264ce718116101d9578063264ce71814610290578063286717b6146102b35780632a4e08f2146102e15780632f3ffb9f146102f457600080fd5b806302befd241461020b57806307093814146102325780630fcb1787146102525780632303480f1461027d575b600080fd5b60035461021d90610100900460ff1681565b60405190151581526020015b60405180910390f35b610245610240366004612216565b6105f9565b60405161022991906122af565b6102656102603660046122f3565b610957565b6040516001600160a01b039091168152602001610229565b61024561028b366004612216565b610981565b61021d61029e366004612324565b60086020526000908152604090205460ff1681565b6102d36102c1366004612324565b600c6020526000908152604090205481565b604051908152602001610229565b6102d36102ef366004612348565b610cd2565b60035461021d9060ff1681565b61031461030f366004612324565b610df8565b005b6103146103243660046123f5565b610e7e565b600154610265906001600160a01b031681565b61031461034a366004612422565b611085565b6102d361035d366004612348565b6113ed565b6102d360045481565b610314610379366004612472565b6114c5565b6103d761038c3660046122f3565b600e602052600090815260409020805460018201546002909201546001600160401b03808316936001600160a01b03600160401b948590048116949282169392909104169060c01b85565b604080516001600160401b0396871681526001600160a01b03958616602082015295909316928501929092529190911660608301526001600160c01b031916608082015260a001610229565b6103146104313660046124ab565b61154e565b610314610444366004612324565b61173a565b610314611869565b600054610265906001600160a01b031681565b61021d610472366004612324565b60096020526000908152604090205460ff1681565b6102656104953660046122f3565b611964565b61021d6104a8366004612324565b600a6020526000908152604090205460ff1681565b6104f86104cb366004612324565b600d602052600090815260409020546001600160601b03811690600160601b90046001600160a01b031682565b604080516001600160601b0390931683526001600160a01b03909116602083015201610229565b61021d61052d366004612324565b600b6020526000908152604090205460ff1681565b6102d3610550366004612348565b611974565b6105686105633660046124d7565b611a60565b6040516102299190612579565b6103146105833660046125cf565b611f02565b6102d360025481565b6102657f000000000000000000000000000000000000000000000000000000000000000081565b6105686105c6366004612348565b611fc8565b6102656105d93660046122f3565b612073565b6103146105ec366004612324565b612083565b6103146120f8565b60035460609060ff16156106205760405163bbc5234f60e01b815260040160405180910390fd5b60405163652b9b4160e01b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063652b9b4190602401602060405180830381865afa158015610684573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a891906125ed565b6106ec5760405162461bcd60e51b815260206004820152601060248201526f26a91d1027b7363c902b30bab63a399760811b60448201526064015b60405180910390fd5b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107575760405162461bcd60e51b815260206004820152601060248201526f26a91d102737903232b632b3b0ba329760811b60448201526064016106e3565b85848114801561076657508083145b6107b25760405162461bcd60e51b815260206004820152601760248201527f4d525f4250573a204c454e4754485f4d49534d4154434800000000000000000060448201526064016106e3565b6000816001600160401b038111156107cc576107cc61260a565b6040519080825280602002602001820160405280156107f5578160200160208202803683370190505b50925060005b8281101561094a5789898281811061081557610815612620565b905060200201602081019061082a9190612324565b6001600160a01b0381166000908152600d602052604090205485519193506001600160601b03169085908390811061086457610864612620565b6020908102919091018101919091526001600160a01b038084166000908152600d909252604090912054600160601b900416631d232f8433848b8b868181106108af576108af612620565b905060200201358a8a878181106108c8576108c8612620565b6040516001600160e01b031960e089901b1681526001600160a01b039687166004820152959094166024860152506044840191909152602090910201356064820152608401600060405180830381600087803b15801561092757600080fd5b505af115801561093b573d6000803e3d6000fd5b505050508060010190506107fb565b5050509695505050505050565b6006818154811061096757600080fd5b6000918252602090912001546001600160a01b0316905081565b600354606090610100900460ff16156109ad5760405163bbc5234f60e01b815260040160405180910390fd5b60405163652b9b4160e01b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063652b9b4190602401602060405180830381865afa158015610a11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3591906125ed565b610a745760405162461bcd60e51b815260206004820152601060248201526f26a91d1027b7363c902b30bab63a399760811b60448201526064016106e3565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610adf5760405162461bcd60e51b815260206004820152601060248201526f26a91d102737903232b632b3b0ba329760811b60448201526064016106e3565b858481148015610aee57508083145b610b3a5760405162461bcd60e51b815260206004820152601760248201527f4d525f4250443a204c454e4754485f4d49534d4154434800000000000000000060448201526064016106e3565b6000816001600160401b03811115610b5457610b5461260a565b604051908082528060200260200182016040528015610b7d578160200160208202803683370190505b50925060005b8281101561094a57898982818110610b9d57610b9d612620565b9050602002016020810190610bb29190612324565b6001600160a01b0381166000908152600d602052604090205485519193506001600160601b031690859083908110610bec57610bec612620565b6020908102919091018101919091526001600160a01b038084166000908152600d909252604090912054600160601b90041663c7cc256833848b8b86818110610c3757610c37612620565b905060200201358a8a87818110610c5057610c50612620565b6040516001600160e01b031960e089901b1681526001600160a01b039687166004820152959094166024860152506044840191909152602090910201356064820152608401600060405180830381600087803b158015610caf57600080fd5b505af1158015610cc3573d6000803e3d6000fd5b50505050806001019050610b83565b6001600160a01b0381166000908152600a602052604081205460ff16610d3a5760405162461bcd60e51b815260206004820152601c60248201527f4d525f4743563a20554e4b4e4f574e5f4241534543555252454e43590000000060448201526064016106e3565b6000610d70898989898989600c60008b6001600160a01b03166001600160a01b0316815260200190815260200160002054611a60565b604051631c663a0d60e11b8152909150734de5d906326c604e707ece3b9df1ec669c47cc61906338cc741a90610daa908490600401612636565b602060405180830381865af4158015610dc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610deb919061268c565b9998505050505050505050565b6000546001600160a01b03163314610e225760405162461bcd60e51b81526004016106e3906126a5565b6001546040516001600160a01b038084169216907fa14fc14d8620a708a896fd11392a235647d99385500a295f0d7da2a258b2e96790600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610ea85760405162461bcd60e51b81526004016106e3906126a5565b600a6000610ebc6040840160208501612324565b6001600160a01b0316815260208101919091526040016000205460ff1615610f265760405162461bcd60e51b815260206004820152601b60248201527f4d525f4142433a204261736543757272656e637920657869737473000000000060448201526064016106e3565b6004546000908152600e602052604090208190610f438282612714565b5050600454600c6000610f5c6040850160208601612324565b6001600160a01b03166001600160a01b03168152602001908152602001600020819055506001600a6000836020016020810190610f999190612324565b6001600160a01b031681526020808201929092526040908101600020805460ff191693151593909317909255600791610fd791908401908401612324565b815460018082018455600093845260209384902090910180546001600160a01b0319166001600160a01b039390931692909217909155600480549091019081905560ff169061102c9060408401908401612324565b6001600160a01b03167f9716edaa6bc6d971e97730788fe6114cbb0550c1af523854511737343b4e939b61106660a08501608086016127c6565b6040516001600160c01b0319909116815260200160405180910390a350565b6000546001600160a01b031633146110af5760405162461bcd60e51b81526004016106e3906126a5565b60045483106111005760405162461bcd60e51b815260206004820152601b60248201527f4d525f534f3a20554e4b4e4f574e5f4241534543555252454e4359000000000060448201526064016106e3565b6000838152600e6020526040908190206001908101548251633fabe5a360e21b815292519192600160401b9091046001600160a01b031691829163feaf968c9160048083019260a09291908290030181865afa925050508015611180575060408051601f3d908101601f1916820190925261117d91810190612802565b60015b61118d5760009150611355565b856001600160a01b031663245a7bfc6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ef9190612852565b6001600160a01b03166322adbc786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561122c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611250919061286f565b60170b8413611262576000965061134f565b856001600160a01b031663245a7bfc6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c49190612852565b6001600160a01b03166370da2f676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611301573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611325919061286f565b60170b8412611337576000965061134f565b61134462093a80426128a8565b821161134f57600096505b50505050505b811561139b5760405162461bcd60e51b81526020600482015260156024820152744d525f534f3a204f5241434c455f4845414c54485960581b60448201526064016106e3565b6000858152600e6020526040902060010180546001600160401b03851667ffffffffffffffff196001600160a01b038816600160401b02166001600160e01b0319909216919091171790555050505050565b6001600160a01b0381166000908152600a602052604081205460ff166114555760405162461bcd60e51b815260206004820152601c60248201527f4d525f474c563a20554e4b4e4f574e5f4241534543555252454e43590000000060448201526064016106e3565b600061148b898989898989600c60008b6001600160a01b03166001600160a01b0316815260200190815260200160002054611a60565b604051630b517fad60e11b8152909150734de5d906326c604e707ece3b9df1ec669c47cc61906316a2ff5a90610daa908490600401612636565b6000546001600160a01b031633146114ef5760405162461bcd60e51b81526004016106e3906126a5565b6001600160a01b0382166000818152600b6020908152604091829020805460ff191685151590811790915591519182527fede171a6f3acf8339fc34063842f3fe059587c8a32826db65e353ddb375e3351910160405180910390a25050565b3360009081526009602052604090205460ff166115a25760405162461bcd60e51b815260206004820152601260248201527126a91d1027b7363c90283934b1b2a6b7b21760711b60448201526064016106e3565b6001600160a01b03821660009081526008602052604090205460ff161561160b5760405162461bcd60e51b815260206004820152601f60248201527f4d525f41413a20417373657420616c726561647920696e206d61696e7265670060448201526064016106e3565b6001600160601b038111156116625760405162461bcd60e51b815260206004820152601860248201527f4d525f41413a20496e76616c696420417373657454797065000000000000000060448201526064016106e3565b6001600160a01b038281166000818152600860209081526040808320805460ff191660019081179091556006805491820190557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b03191685179055805180820182526001600160601b03878116825233828501818152878752600d86529584902092519551909716600160601b02941693909317909255905160ff851681527f10bcebb34f4ff10b57dae8c0fe3376f90961e58740b0d34ca1615093968dc6b8910160405180910390a35050565b6000546001600160a01b031633146117645760405162461bcd60e51b81526004016106e3906126a5565b6001600160a01b03811660009081526009602052604090205460ff16156117cd5760405162461bcd60e51b815260206004820152601c60248201527f4d525f41504d3a2050726963654d6f642e206e6f7420756e697175650000000060448201526064016106e3565b6001600160a01b0381166000818152600960209081526040808320805460ff191660019081179091556005805491820181559093527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db090920180546001600160a01b0319168417905590519182527fe9f466a37757710258b0626b457f5a5b8691275aa71ee5380d9310859b7f51db910160405180910390a150565b6001546001600160a01b031633146118c35760405162461bcd60e51b815260206004820152601760248201527f477561726469616e3a204f6e6c7920677561726469616e00000000000000000060448201526064016106e3565b6002546118d390622a30006128c1565b42116119155760405162461bcd60e51b8152602060048201526011602482015270475f503a2043616e6e6f7420706175736560781b60448201526064016106e3565b6003805461ffff19166101011790554260025560408051600180825260208201527fc8a7c9852a25d1b9f9102472f35fc9320c0faa559b66dfa8027a1f3fa28eee2f91015b60405180910390a1565b6007818154811061096757600080fd5b6001600160a01b0381166000908152600a602052604081205460ff166119dc5760405162461bcd60e51b815260206004820152601c60248201527f4d525f4754563a20554e4b4e4f574e5f4241534543555252454e43590000000060448201526064016106e3565b6000611a12898989898989600c60008b6001600160a01b03166001600160a01b0316815260200190815260200160002054611a60565b905060005b8151811015611a5357818181518110611a3257611a32612620565b60200260200101516000015183611a4991906128c1565b9250600101611a17565b5050979650505050505050565b6060866000816001600160401b03811115611a7d57611a7d61260a565b604051908082528060200260200182016040528015611ad257816020015b611abf60405180606001604052806000815260200160008152602001600081525090565b815260200190600190039081611a9b5790505b509050611b09604051806080016040528060006001600160a01b031681526020016000815260200160008152602001600081525090565b6060810185905260008080808815611bae57600e60008a815260200190815260200160002060010160089054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015611b82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ba69190612802565b509196505050505b60005b87811015611eee578f8f82818110611bcb57611bcb612620565b9050602002016020810190611be09190612324565b60008b8152600e60205260409020549094506001600160a01b03600160401b909104811690851603611d26578b8b82818110611c1e57611c1e612620565b90506020020135878281518110611c3757611c37612620565b602090810291909101810151919091526001600160a01b038581166000818152600d90935260409283902054925163fa3a3d1760e01b81526004810191909152602481018d9052600160601b909204169063fa3a3d17906044016040805180830381865afa158015611cad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cd191906128e6565b8161ffff1691508061ffff169050888381518110611cf157611cf1612620565b6020026020010151602001898481518110611d0e57611d0e612620565b60209081029190910101516040019190915252611ee6565b6001600160a01b03841686528d8d82818110611d4457611d44612620565b905060200201358660200181815250508b8b82818110611d6657611d66612620565b6020908102929092013560408981019182526001600160a01b038881166000908152600d865282902054915163052999cd60e21b81528b5182166004820152948b015160248601529151604485015260608a01516064850152600160601b900416916314a667349150608401608060405180830381865afa158015611def573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e139190612919565b8a8581518110611e2557611e25612620565b60200260200101516020018b8681518110611e4257611e42612620565b60209081029190910101516040019190915252909350915060008a9003611e875782878281518110611e7657611e76612620565b602090810291909101015152611ee6565b60008a8152600e6020526040902080546001909101546001600160401b03918216918491611eb891879116896121ad565b0181611ec657611ec661294f565b04878281518110611ed957611ed9612620565b6020908102919091010151525b600101611bb1565b50949e9d5050505050505050505050505050565b6000546001600160a01b03163314611f2c5760405162461bcd60e51b81526004016106e3906126a5565b60035460ff168015611f3b5750815b6003805460ff1916911515919091179081905560ff610100909104168015611f605750805b6003805461ff001981166101009315158402908117928390556040805160ff93841692841692909217151582529390920416151560208201527fc8a7c9852a25d1b9f9102472f35fc9320c0faa559b66dfa8027a1f3fa28eee2f910160405180910390a15050565b6001600160a01b0381166000908152600a602052604090205460609060ff166120335760405162461bcd60e51b815260206004820152601d60248201527f4d525f474c56413a20554e4b4e4f574e5f4241534543555252454e435900000060448201526064016106e3565b612067888888888888600c60008a6001600160a01b03166001600160a01b0316815260200190815260200160002054611a60565b98975050505050505050565b6005818154811061096757600080fd5b6000546001600160a01b031633146120ad5760405162461bcd60e51b81526004016106e3906126a5565b600080546001600160a01b0319166001600160a01b0383169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b6002546121089062278d006128c1565b421161214d5760405162461bcd60e51b8152602060048201526014602482015273475f55503a2043616e6e6f7420756e506175736560601b60448201526064016106e3565b60035460ff16806121655750600354610100900460ff165b156121ab576003805461ffff1916905560408051600080825260208201527fc8a7c9852a25d1b9f9102472f35fc9320c0faa559b66dfa8027a1f3fa28eee2f910161195a565b565b60008260001904841183021582026121c457600080fd5b5091020490565b60008083601f8401126121dd57600080fd5b5081356001600160401b038111156121f457600080fd5b6020830191508360208260051b850101111561220f57600080fd5b9250929050565b6000806000806000806060878903121561222f57600080fd5b86356001600160401b038082111561224657600080fd5b6122528a838b016121cb565b9098509650602089013591508082111561226b57600080fd5b6122778a838b016121cb565b9096509450604089013591508082111561229057600080fd5b5061229d89828a016121cb565b979a9699509497509295939492505050565b6020808252825182820181905260009190848201906040850190845b818110156122e7578351835292840192918401916001016122cb565b50909695505050505050565b60006020828403121561230557600080fd5b5035919050565b6001600160a01b038116811461232157600080fd5b50565b60006020828403121561233657600080fd5b81356123418161230c565b9392505050565b60008060008060008060006080888a03121561236357600080fd5b87356001600160401b038082111561237a57600080fd5b6123868b838c016121cb565b909950975060208a013591508082111561239f57600080fd5b6123ab8b838c016121cb565b909750955060408a01359150808211156123c457600080fd5b506123d18a828b016121cb565b90945092505060608801356123e58161230c565b8091505092959891949750929550565b600060a0828403121561240757600080fd5b50919050565b6001600160401b038116811461232157600080fd5b60008060006060848603121561243757600080fd5b8335925060208401356124498161230c565b915060408401356124598161240d565b809150509250925092565b801515811461232157600080fd5b6000806040838503121561248557600080fd5b82356124908161230c565b915060208301356124a081612464565b809150509250929050565b600080604083850312156124be57600080fd5b82356124c98161230c565b946020939093013593505050565b60008060008060008060006080888a0312156124f257600080fd5b87356001600160401b038082111561250957600080fd5b6125158b838c016121cb565b909950975060208a013591508082111561252e57600080fd5b61253a8b838c016121cb565b909750955060408a013591508082111561255357600080fd5b506125608a828b016121cb565b989b979a50959894979596606090950135949350505050565b6020808252825182820181905260009190848201906040850190845b818110156122e7576125bc8385518051825260208082015190830152604090810151910152565b9284019260609290920191600101612595565b600080604083850312156125e257600080fd5b823561249081612464565b6000602082840312156125ff57600080fd5b815161234181612464565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6020808252825182820181905260009190848201906040850190845b818110156122e7576126798385518051825260208082015190830152604090810151910152565b9284019260609290920191600101612652565b60006020828403121561269e57600080fd5b5051919050565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b805468010000000000000000600160e01b03191660409290921b68010000000000000000600160e01b0316919091179055565b6001600160c01b03198116811461232157600080fd5b813561271f8161240d565b815467ffffffffffffffff19166001600160401b0382161782555060208201356127488161230c565b61275281836126cb565b506001810160408301356127658161240d565b815467ffffffffffffffff19166001600160401b03821617825550606083013561278e8161230c565b61279881836126cb565b50506002810160808301356127ac816126fe565b815467ffffffffffffffff191660c09190911c1790555050565b6000602082840312156127d857600080fd5b8135612341816126fe565b805169ffffffffffffffffffff811681146127fd57600080fd5b919050565b600080600080600060a0868803121561281a57600080fd5b612823866127e3565b9450602086015193506040860151925060608601519150612846608087016127e3565b90509295509295909350565b60006020828403121561286457600080fd5b81516123418161230c565b60006020828403121561288157600080fd5b81518060170b811461234157600080fd5b634e487b7160e01b600052601160045260246000fd5b818103818111156128bb576128bb612892565b92915050565b808201808211156128bb576128bb612892565b805161ffff811681146127fd57600080fd5b600080604083850312156128f957600080fd5b612902836128d4565b9150612910602084016128d4565b90509250929050565b6000806000806080858703121561292f57600080fd5b505082516020840151604085015160609095015191969095509092509050565b634e487b7160e01b600052601260045260246000fdfea264697066735822122033c68865ac4252b5af0079a8ecab90f2a299e0c9263e959d501d7dcfb492ad7464736f6c6343000811003300000000000000000000000000cb53780ea58503d3059fc02ddd596d0be926cb

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102065760003560e01c8063804d898e1161011a578063a4cf2f8c116100ad578063c45a01551161007c578063c45a015514610591578063d21728a9146105b8578063e5b7f93d146105cb578063f2fde38b146105de578063f7b188a5146105f157600080fd5b8063a4cf2f8c14610542578063a5a5296c14610555578063ac22f70414610575578063ad84f3411461058857600080fd5b806395092e50116100e957806395092e50146104875780639b8bf37d1461049a5780639ddde781146104bd5780639f56d8861461051f57600080fd5b8063804d898e146104365780638456cb59146104495780638da5cb5b146104515780638df80bd61461046457600080fd5b80632fcb4f041161019d578063540629df1161016c578063540629df1461034f5780635aea5299146103625780636498c1ba1461036b57806364e403231461037e57806366a6a4bd1461042357600080fd5b80632fcb4f04146103015780633d471e5c14610316578063452a93201461032957806347f0db871461033c57600080fd5b8063264ce718116101d9578063264ce71814610290578063286717b6146102b35780632a4e08f2146102e15780632f3ffb9f146102f457600080fd5b806302befd241461020b57806307093814146102325780630fcb1787146102525780632303480f1461027d575b600080fd5b60035461021d90610100900460ff1681565b60405190151581526020015b60405180910390f35b610245610240366004612216565b6105f9565b60405161022991906122af565b6102656102603660046122f3565b610957565b6040516001600160a01b039091168152602001610229565b61024561028b366004612216565b610981565b61021d61029e366004612324565b60086020526000908152604090205460ff1681565b6102d36102c1366004612324565b600c6020526000908152604090205481565b604051908152602001610229565b6102d36102ef366004612348565b610cd2565b60035461021d9060ff1681565b61031461030f366004612324565b610df8565b005b6103146103243660046123f5565b610e7e565b600154610265906001600160a01b031681565b61031461034a366004612422565b611085565b6102d361035d366004612348565b6113ed565b6102d360045481565b610314610379366004612472565b6114c5565b6103d761038c3660046122f3565b600e602052600090815260409020805460018201546002909201546001600160401b03808316936001600160a01b03600160401b948590048116949282169392909104169060c01b85565b604080516001600160401b0396871681526001600160a01b03958616602082015295909316928501929092529190911660608301526001600160c01b031916608082015260a001610229565b6103146104313660046124ab565b61154e565b610314610444366004612324565b61173a565b610314611869565b600054610265906001600160a01b031681565b61021d610472366004612324565b60096020526000908152604090205460ff1681565b6102656104953660046122f3565b611964565b61021d6104a8366004612324565b600a6020526000908152604090205460ff1681565b6104f86104cb366004612324565b600d602052600090815260409020546001600160601b03811690600160601b90046001600160a01b031682565b604080516001600160601b0390931683526001600160a01b03909116602083015201610229565b61021d61052d366004612324565b600b6020526000908152604090205460ff1681565b6102d3610550366004612348565b611974565b6105686105633660046124d7565b611a60565b6040516102299190612579565b6103146105833660046125cf565b611f02565b6102d360025481565b6102657f00000000000000000000000000cb53780ea58503d3059fc02ddd596d0be926cb81565b6105686105c6366004612348565b611fc8565b6102656105d93660046122f3565b612073565b6103146105ec366004612324565b612083565b6103146120f8565b60035460609060ff16156106205760405163bbc5234f60e01b815260040160405180910390fd5b60405163652b9b4160e01b81523360048201527f00000000000000000000000000cb53780ea58503d3059fc02ddd596d0be926cb6001600160a01b03169063652b9b4190602401602060405180830381865afa158015610684573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a891906125ed565b6106ec5760405162461bcd60e51b815260206004820152601060248201526f26a91d1027b7363c902b30bab63a399760811b60448201526064015b60405180910390fd5b306001600160a01b037f000000000000000000000000046fc9f35eb7cb165a5e07915d37bf4022b8de3316146107575760405162461bcd60e51b815260206004820152601060248201526f26a91d102737903232b632b3b0ba329760811b60448201526064016106e3565b85848114801561076657508083145b6107b25760405162461bcd60e51b815260206004820152601760248201527f4d525f4250573a204c454e4754485f4d49534d4154434800000000000000000060448201526064016106e3565b6000816001600160401b038111156107cc576107cc61260a565b6040519080825280602002602001820160405280156107f5578160200160208202803683370190505b50925060005b8281101561094a5789898281811061081557610815612620565b905060200201602081019061082a9190612324565b6001600160a01b0381166000908152600d602052604090205485519193506001600160601b03169085908390811061086457610864612620565b6020908102919091018101919091526001600160a01b038084166000908152600d909252604090912054600160601b900416631d232f8433848b8b868181106108af576108af612620565b905060200201358a8a878181106108c8576108c8612620565b6040516001600160e01b031960e089901b1681526001600160a01b039687166004820152959094166024860152506044840191909152602090910201356064820152608401600060405180830381600087803b15801561092757600080fd5b505af115801561093b573d6000803e3d6000fd5b505050508060010190506107fb565b5050509695505050505050565b6006818154811061096757600080fd5b6000918252602090912001546001600160a01b0316905081565b600354606090610100900460ff16156109ad5760405163bbc5234f60e01b815260040160405180910390fd5b60405163652b9b4160e01b81523360048201527f00000000000000000000000000cb53780ea58503d3059fc02ddd596d0be926cb6001600160a01b03169063652b9b4190602401602060405180830381865afa158015610a11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3591906125ed565b610a745760405162461bcd60e51b815260206004820152601060248201526f26a91d1027b7363c902b30bab63a399760811b60448201526064016106e3565b306001600160a01b037f000000000000000000000000046fc9f35eb7cb165a5e07915d37bf4022b8de331614610adf5760405162461bcd60e51b815260206004820152601060248201526f26a91d102737903232b632b3b0ba329760811b60448201526064016106e3565b858481148015610aee57508083145b610b3a5760405162461bcd60e51b815260206004820152601760248201527f4d525f4250443a204c454e4754485f4d49534d4154434800000000000000000060448201526064016106e3565b6000816001600160401b03811115610b5457610b5461260a565b604051908082528060200260200182016040528015610b7d578160200160208202803683370190505b50925060005b8281101561094a57898982818110610b9d57610b9d612620565b9050602002016020810190610bb29190612324565b6001600160a01b0381166000908152600d602052604090205485519193506001600160601b031690859083908110610bec57610bec612620565b6020908102919091018101919091526001600160a01b038084166000908152600d909252604090912054600160601b90041663c7cc256833848b8b86818110610c3757610c37612620565b905060200201358a8a87818110610c5057610c50612620565b6040516001600160e01b031960e089901b1681526001600160a01b039687166004820152959094166024860152506044840191909152602090910201356064820152608401600060405180830381600087803b158015610caf57600080fd5b505af1158015610cc3573d6000803e3d6000fd5b50505050806001019050610b83565b6001600160a01b0381166000908152600a602052604081205460ff16610d3a5760405162461bcd60e51b815260206004820152601c60248201527f4d525f4743563a20554e4b4e4f574e5f4241534543555252454e43590000000060448201526064016106e3565b6000610d70898989898989600c60008b6001600160a01b03166001600160a01b0316815260200190815260200160002054611a60565b604051631c663a0d60e11b8152909150734de5d906326c604e707ece3b9df1ec669c47cc61906338cc741a90610daa908490600401612636565b602060405180830381865af4158015610dc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610deb919061268c565b9998505050505050505050565b6000546001600160a01b03163314610e225760405162461bcd60e51b81526004016106e3906126a5565b6001546040516001600160a01b038084169216907fa14fc14d8620a708a896fd11392a235647d99385500a295f0d7da2a258b2e96790600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610ea85760405162461bcd60e51b81526004016106e3906126a5565b600a6000610ebc6040840160208501612324565b6001600160a01b0316815260208101919091526040016000205460ff1615610f265760405162461bcd60e51b815260206004820152601b60248201527f4d525f4142433a204261736543757272656e637920657869737473000000000060448201526064016106e3565b6004546000908152600e602052604090208190610f438282612714565b5050600454600c6000610f5c6040850160208601612324565b6001600160a01b03166001600160a01b03168152602001908152602001600020819055506001600a6000836020016020810190610f999190612324565b6001600160a01b031681526020808201929092526040908101600020805460ff191693151593909317909255600791610fd791908401908401612324565b815460018082018455600093845260209384902090910180546001600160a01b0319166001600160a01b039390931692909217909155600480549091019081905560ff169061102c9060408401908401612324565b6001600160a01b03167f9716edaa6bc6d971e97730788fe6114cbb0550c1af523854511737343b4e939b61106660a08501608086016127c6565b6040516001600160c01b0319909116815260200160405180910390a350565b6000546001600160a01b031633146110af5760405162461bcd60e51b81526004016106e3906126a5565b60045483106111005760405162461bcd60e51b815260206004820152601b60248201527f4d525f534f3a20554e4b4e4f574e5f4241534543555252454e4359000000000060448201526064016106e3565b6000838152600e6020526040908190206001908101548251633fabe5a360e21b815292519192600160401b9091046001600160a01b031691829163feaf968c9160048083019260a09291908290030181865afa925050508015611180575060408051601f3d908101601f1916820190925261117d91810190612802565b60015b61118d5760009150611355565b856001600160a01b031663245a7bfc6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ef9190612852565b6001600160a01b03166322adbc786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561122c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611250919061286f565b60170b8413611262576000965061134f565b856001600160a01b031663245a7bfc6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c49190612852565b6001600160a01b03166370da2f676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611301573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611325919061286f565b60170b8412611337576000965061134f565b61134462093a80426128a8565b821161134f57600096505b50505050505b811561139b5760405162461bcd60e51b81526020600482015260156024820152744d525f534f3a204f5241434c455f4845414c54485960581b60448201526064016106e3565b6000858152600e6020526040902060010180546001600160401b03851667ffffffffffffffff196001600160a01b038816600160401b02166001600160e01b0319909216919091171790555050505050565b6001600160a01b0381166000908152600a602052604081205460ff166114555760405162461bcd60e51b815260206004820152601c60248201527f4d525f474c563a20554e4b4e4f574e5f4241534543555252454e43590000000060448201526064016106e3565b600061148b898989898989600c60008b6001600160a01b03166001600160a01b0316815260200190815260200160002054611a60565b604051630b517fad60e11b8152909150734de5d906326c604e707ece3b9df1ec669c47cc61906316a2ff5a90610daa908490600401612636565b6000546001600160a01b031633146114ef5760405162461bcd60e51b81526004016106e3906126a5565b6001600160a01b0382166000818152600b6020908152604091829020805460ff191685151590811790915591519182527fede171a6f3acf8339fc34063842f3fe059587c8a32826db65e353ddb375e3351910160405180910390a25050565b3360009081526009602052604090205460ff166115a25760405162461bcd60e51b815260206004820152601260248201527126a91d1027b7363c90283934b1b2a6b7b21760711b60448201526064016106e3565b6001600160a01b03821660009081526008602052604090205460ff161561160b5760405162461bcd60e51b815260206004820152601f60248201527f4d525f41413a20417373657420616c726561647920696e206d61696e7265670060448201526064016106e3565b6001600160601b038111156116625760405162461bcd60e51b815260206004820152601860248201527f4d525f41413a20496e76616c696420417373657454797065000000000000000060448201526064016106e3565b6001600160a01b038281166000818152600860209081526040808320805460ff191660019081179091556006805491820190557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b03191685179055805180820182526001600160601b03878116825233828501818152878752600d86529584902092519551909716600160601b02941693909317909255905160ff851681527f10bcebb34f4ff10b57dae8c0fe3376f90961e58740b0d34ca1615093968dc6b8910160405180910390a35050565b6000546001600160a01b031633146117645760405162461bcd60e51b81526004016106e3906126a5565b6001600160a01b03811660009081526009602052604090205460ff16156117cd5760405162461bcd60e51b815260206004820152601c60248201527f4d525f41504d3a2050726963654d6f642e206e6f7420756e697175650000000060448201526064016106e3565b6001600160a01b0381166000818152600960209081526040808320805460ff191660019081179091556005805491820181559093527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db090920180546001600160a01b0319168417905590519182527fe9f466a37757710258b0626b457f5a5b8691275aa71ee5380d9310859b7f51db910160405180910390a150565b6001546001600160a01b031633146118c35760405162461bcd60e51b815260206004820152601760248201527f477561726469616e3a204f6e6c7920677561726469616e00000000000000000060448201526064016106e3565b6002546118d390622a30006128c1565b42116119155760405162461bcd60e51b8152602060048201526011602482015270475f503a2043616e6e6f7420706175736560781b60448201526064016106e3565b6003805461ffff19166101011790554260025560408051600180825260208201527fc8a7c9852a25d1b9f9102472f35fc9320c0faa559b66dfa8027a1f3fa28eee2f91015b60405180910390a1565b6007818154811061096757600080fd5b6001600160a01b0381166000908152600a602052604081205460ff166119dc5760405162461bcd60e51b815260206004820152601c60248201527f4d525f4754563a20554e4b4e4f574e5f4241534543555252454e43590000000060448201526064016106e3565b6000611a12898989898989600c60008b6001600160a01b03166001600160a01b0316815260200190815260200160002054611a60565b905060005b8151811015611a5357818181518110611a3257611a32612620565b60200260200101516000015183611a4991906128c1565b9250600101611a17565b5050979650505050505050565b6060866000816001600160401b03811115611a7d57611a7d61260a565b604051908082528060200260200182016040528015611ad257816020015b611abf60405180606001604052806000815260200160008152602001600081525090565b815260200190600190039081611a9b5790505b509050611b09604051806080016040528060006001600160a01b031681526020016000815260200160008152602001600081525090565b6060810185905260008080808815611bae57600e60008a815260200190815260200160002060010160089054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015611b82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ba69190612802565b509196505050505b60005b87811015611eee578f8f82818110611bcb57611bcb612620565b9050602002016020810190611be09190612324565b60008b8152600e60205260409020549094506001600160a01b03600160401b909104811690851603611d26578b8b82818110611c1e57611c1e612620565b90506020020135878281518110611c3757611c37612620565b602090810291909101810151919091526001600160a01b038581166000818152600d90935260409283902054925163fa3a3d1760e01b81526004810191909152602481018d9052600160601b909204169063fa3a3d17906044016040805180830381865afa158015611cad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cd191906128e6565b8161ffff1691508061ffff169050888381518110611cf157611cf1612620565b6020026020010151602001898481518110611d0e57611d0e612620565b60209081029190910101516040019190915252611ee6565b6001600160a01b03841686528d8d82818110611d4457611d44612620565b905060200201358660200181815250508b8b82818110611d6657611d66612620565b6020908102929092013560408981019182526001600160a01b038881166000908152600d865282902054915163052999cd60e21b81528b5182166004820152948b015160248601529151604485015260608a01516064850152600160601b900416916314a667349150608401608060405180830381865afa158015611def573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e139190612919565b8a8581518110611e2557611e25612620565b60200260200101516020018b8681518110611e4257611e42612620565b60209081029190910101516040019190915252909350915060008a9003611e875782878281518110611e7657611e76612620565b602090810291909101015152611ee6565b60008a8152600e6020526040902080546001909101546001600160401b03918216918491611eb891879116896121ad565b0181611ec657611ec661294f565b04878281518110611ed957611ed9612620565b6020908102919091010151525b600101611bb1565b50949e9d5050505050505050505050505050565b6000546001600160a01b03163314611f2c5760405162461bcd60e51b81526004016106e3906126a5565b60035460ff168015611f3b5750815b6003805460ff1916911515919091179081905560ff610100909104168015611f605750805b6003805461ff001981166101009315158402908117928390556040805160ff93841692841692909217151582529390920416151560208201527fc8a7c9852a25d1b9f9102472f35fc9320c0faa559b66dfa8027a1f3fa28eee2f910160405180910390a15050565b6001600160a01b0381166000908152600a602052604090205460609060ff166120335760405162461bcd60e51b815260206004820152601d60248201527f4d525f474c56413a20554e4b4e4f574e5f4241534543555252454e435900000060448201526064016106e3565b612067888888888888600c60008a6001600160a01b03166001600160a01b0316815260200190815260200160002054611a60565b98975050505050505050565b6005818154811061096757600080fd5b6000546001600160a01b031633146120ad5760405162461bcd60e51b81526004016106e3906126a5565b600080546001600160a01b0319166001600160a01b0383169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b6002546121089062278d006128c1565b421161214d5760405162461bcd60e51b8152602060048201526014602482015273475f55503a2043616e6e6f7420756e506175736560601b60448201526064016106e3565b60035460ff16806121655750600354610100900460ff165b156121ab576003805461ffff1916905560408051600080825260208201527fc8a7c9852a25d1b9f9102472f35fc9320c0faa559b66dfa8027a1f3fa28eee2f910161195a565b565b60008260001904841183021582026121c457600080fd5b5091020490565b60008083601f8401126121dd57600080fd5b5081356001600160401b038111156121f457600080fd5b6020830191508360208260051b850101111561220f57600080fd5b9250929050565b6000806000806000806060878903121561222f57600080fd5b86356001600160401b038082111561224657600080fd5b6122528a838b016121cb565b9098509650602089013591508082111561226b57600080fd5b6122778a838b016121cb565b9096509450604089013591508082111561229057600080fd5b5061229d89828a016121cb565b979a9699509497509295939492505050565b6020808252825182820181905260009190848201906040850190845b818110156122e7578351835292840192918401916001016122cb565b50909695505050505050565b60006020828403121561230557600080fd5b5035919050565b6001600160a01b038116811461232157600080fd5b50565b60006020828403121561233657600080fd5b81356123418161230c565b9392505050565b60008060008060008060006080888a03121561236357600080fd5b87356001600160401b038082111561237a57600080fd5b6123868b838c016121cb565b909950975060208a013591508082111561239f57600080fd5b6123ab8b838c016121cb565b909750955060408a01359150808211156123c457600080fd5b506123d18a828b016121cb565b90945092505060608801356123e58161230c565b8091505092959891949750929550565b600060a0828403121561240757600080fd5b50919050565b6001600160401b038116811461232157600080fd5b60008060006060848603121561243757600080fd5b8335925060208401356124498161230c565b915060408401356124598161240d565b809150509250925092565b801515811461232157600080fd5b6000806040838503121561248557600080fd5b82356124908161230c565b915060208301356124a081612464565b809150509250929050565b600080604083850312156124be57600080fd5b82356124c98161230c565b946020939093013593505050565b60008060008060008060006080888a0312156124f257600080fd5b87356001600160401b038082111561250957600080fd5b6125158b838c016121cb565b909950975060208a013591508082111561252e57600080fd5b61253a8b838c016121cb565b909750955060408a013591508082111561255357600080fd5b506125608a828b016121cb565b989b979a50959894979596606090950135949350505050565b6020808252825182820181905260009190848201906040850190845b818110156122e7576125bc8385518051825260208082015190830152604090810151910152565b9284019260609290920191600101612595565b600080604083850312156125e257600080fd5b823561249081612464565b6000602082840312156125ff57600080fd5b815161234181612464565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6020808252825182820181905260009190848201906040850190845b818110156122e7576126798385518051825260208082015190830152604090810151910152565b9284019260609290920191600101612652565b60006020828403121561269e57600080fd5b5051919050565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b805468010000000000000000600160e01b03191660409290921b68010000000000000000600160e01b0316919091179055565b6001600160c01b03198116811461232157600080fd5b813561271f8161240d565b815467ffffffffffffffff19166001600160401b0382161782555060208201356127488161230c565b61275281836126cb565b506001810160408301356127658161240d565b815467ffffffffffffffff19166001600160401b03821617825550606083013561278e8161230c565b61279881836126cb565b50506002810160808301356127ac816126fe565b815467ffffffffffffffff191660c09190911c1790555050565b6000602082840312156127d857600080fd5b8135612341816126fe565b805169ffffffffffffffffffff811681146127fd57600080fd5b919050565b600080600080600060a0868803121561281a57600080fd5b612823866127e3565b9450602086015193506040860151925060608601519150612846608087016127e3565b90509295509295909350565b60006020828403121561286457600080fd5b81516123418161230c565b60006020828403121561288157600080fd5b81518060170b811461234157600080fd5b634e487b7160e01b600052601160045260246000fd5b818103818111156128bb576128bb612892565b92915050565b808201808211156128bb576128bb612892565b805161ffff811681146127fd57600080fd5b600080604083850312156128f957600080fd5b612902836128d4565b9150612910602084016128d4565b90509250929050565b6000806000806080858703121561292f57600080fd5b505082516020840151604085015160609095015191969095509092509050565b634e487b7160e01b600052601260045260246000fdfea264697066735822122033c68865ac4252b5af0079a8ecab90f2a299e0c9263e959d501d7dcfb492ad7464736f6c63430008110033

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

00000000000000000000000000cb53780ea58503d3059fc02ddd596d0be926cb

-----Decoded View---------------
Arg [0] : factory_ (address): 0x00CB53780Ea58503D3059FC02dDd596D0Be926cB

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000000cb53780ea58503d3059fc02ddd596d0be926cb


Deployed ByteCode Sourcemap

778:24991:6:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;727:25:7;;;;;;;;;;;;;;;179:14:11;;172:22;154:41;;142:2;127:18;727:25:7;;;;;;;;14473:920:6;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1559:37::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2657:32:11;;;2639:51;;2627:2;2612:18;1559:37:6;2493:203:11;13102:913:6;;;;;;:::i;:::-;;:::i;1737:46::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;2092:54;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;3235:25:11;;;3223:2;3208:18;2092:54:6;3089:177:11;23824:604:6;;;;;;:::i;:::-;;:::i;635:26:7:-;;;;;;;;;1931:150:0;;;;;;:::i;:::-;;:::i;:::-;;7908:750:6;;;;;;:::i;:::-;;:::i;552:23:0:-;;;;;-1:-1:-1;;;;;552:23:0;;;9544:1276:6;;;;;;:::i;:::-;;:::i;25159:608::-;;;;;;:::i;:::-;;:::i;1263:34::-;;;;;;6446:174;;;;;;:::i;:::-;;:::i;2325:76::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2325:76:6;;;;-1:-1:-1;;;;;;;;2325:76:6;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6125:15:11;;;6107:34;;-1:-1:-1;;;;;6215:15:11;;;6210:2;6195:18;;6188:43;6267:15;;;;6247:18;;;6240:43;;;;6319:15;;;;6314:2;6299:18;;6292:43;-1:-1:-1;;;;;;6372:41:11;6366:3;6351:19;;6344:70;6057:3;6042:19;2325:76:6;5817:603:11;12061:556:6;;;;;;:::i;:::-;;:::i;11168:297::-;;;;;;:::i;:::-;;:::i;2439:279:7:-;;;:::i;690:20:8:-;;;;;-1:-1:-1;;;;;690:20:8;;;1823:47:6;;;;;;:::i;:::-;;;;;;;;;;;;;;;;1666:31;;;;;;:::i;:::-;;:::i;1909:46::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;2190:67;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;2190:67:6;;;-1:-1:-1;;;2190:67:6;;-1:-1:-1;;;;;2190:67:6;;;;;;;-1:-1:-1;;;;;6935:39:11;;;6917:58;;-1:-1:-1;;;;;7011:32:11;;;7006:2;6991:18;;6984:60;6890:18;2190:67:6;6745:305:11;1988:47:6;;;;;;:::i;:::-;;;;;;;;;;;;;;;;22368:733;;;;;;:::i;:::-;;:::i;16585:4099::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3214:261:7:-;;;;;;:::i;:::-;;:::i;636:29:0:-;;;;;;1343:32:6;;;;;21255:520;;;;;;:::i;:::-;;:::i;1447:31::-;;;;;;:::i;:::-;;:::i;1312:161:8:-;;;;;;:::i;:::-;;:::i;3529:302:7:-;;;:::i;14473:920:6:-;1641:14:7;;14677:27:6;;1641:14:7;;1637:45;;;1664:18;;-1:-1:-1;;;1664:18:7;;;;;;;;;;;1637:45;4342:37:6::1;::::0;-1:-1:-1;;;4342:37:6;;4368:10:::1;4342:37;::::0;::::1;2639:51:11::0;4351:7:6::1;-1:-1:-1::0;;;;;4342:25:6::1;::::0;::::1;::::0;2612:18:11;;4342:37:6::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4334:66;;;::::0;-1:-1:-1;;;4334:66:6;;10043:2:11;4334:66:6::1;::::0;::::1;10025:21:11::0;10082:2;10062:18;;;10055:30;-1:-1:-1;;;10101:18:11;;;10094:46;10157:18;;4334:66:6::1;;;;;;;;;4426:4;-1:-1:-1::0;;;;;4435:5:6::1;4418:22;;4410:51;;;::::0;-1:-1:-1;;;4410:51:6;;10388:2:11;4410:51:6::1;::::0;::::1;10370:21:11::0;10427:2;10407:18;;;10400:30;-1:-1:-1;;;10446:18:11;;;10439:46;10502:18;;4410:51:6::1;10186:340:11::0;4410:51:6::1;14742:14:::0;14781:34;;::::2;:71:::0;::::2;;;-1:-1:-1::0;14819:33:6;;::::2;14781:71;14773:107;;;::::0;-1:-1:-1;;;14773:107:6;;10733:2:11;14773:107:6::2;::::0;::::2;10715:21:11::0;10772:2;10752:18;;;10745:30;10811:25;10791:18;;;10784:53;10854:18;;14773:107:6::2;10531:347:11::0;14773:107:6::2;14891:20;14948:15;-1:-1:-1::0;;;;;14934:30:6::2;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;14934:30:6::2;;14921:43;;14979:9;14974:413;14994:15;14990:1;:19;14974:413;;;15041:14;;15056:1;15041:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;15088:37:6;::::2;;::::0;;;:23:::2;:37;::::0;;;;:47;15072:13;;15026:32;;-1:-1:-1;;;;;;15088:47:6::2;::::0;15072:10;;15083:1;;15072:13;::::2;;;;;:::i;:::-;;::::0;;::::2;::::0;;;;;;:63;;;;-1:-1:-1;;;;;15165:37:6;;::::2;;::::0;;;:23:::2;:37:::0;;;;;;;:51;-1:-1:-1;;;15165:51:6;::::2;;15150:85;15253:10;15189:12:::0;15279:8;;15288:1;15279:11;;::::2;;;;;:::i;:::-;;;;;;;15292:7;;15300:1;15292:10;;;;;;;:::i;:::-;15150:166;::::0;-1:-1:-1;;;;;;15150:166:6::2;::::0;;;;;;-1:-1:-1;;;;;11434:15:11;;;15150:166:6::2;::::0;::::2;11416:34:11::0;11486:15;;;;11466:18;;;11459:43;-1:-1:-1;11518:18:11;;;11511:34;;;;15292:10:6::2;::::0;;::::2;;;11561:18:11::0;;;11554:34;11350:19;;15150:166:6::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;15359:3;;;;;14974:413;;;;14706:687;;14473:920:::0;;;;;;;;:::o;1559:37::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1559:37:6;;-1:-1:-1;1559:37:6;:::o;13102:913::-;1936:13:7;;13302:27:6;;1936:13:7;;;;;1932:44;;;1958:18;;-1:-1:-1;;;1958:18:7;;;;;;;;;;;1932:44;4342:37:6::1;::::0;-1:-1:-1;;;4342:37:6;;4368:10:::1;4342:37;::::0;::::1;2639:51:11::0;4351:7:6::1;-1:-1:-1::0;;;;;4342:25:6::1;::::0;::::1;::::0;2612:18:11;;4342:37:6::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4334:66;;;::::0;-1:-1:-1;;;4334:66:6;;10043:2:11;4334:66:6::1;::::0;::::1;10025:21:11::0;10082:2;10062:18;;;10055:30;-1:-1:-1;;;10101:18:11;;;10094:46;10157:18;;4334:66:6::1;9841:340:11::0;4334:66:6::1;4426:4;-1:-1:-1::0;;;;;4435:5:6::1;4418:22;;4410:51;;;::::0;-1:-1:-1;;;4410:51:6;;10388:2:11;4410:51:6::1;::::0;::::1;10370:21:11::0;10427:2;10407:18;;;10400:30;-1:-1:-1;;;10446:18:11;;;10439:46;10502:18;;4410:51:6::1;10186:340:11::0;4410:51:6::1;13367:14:::0;13406:34;;::::2;:71:::0;::::2;;;-1:-1:-1::0;13444:33:6;;::::2;13406:71;13398:107;;;::::0;-1:-1:-1;;;13398:107:6;;11801:2:11;13398:107:6::2;::::0;::::2;11783:21:11::0;11840:2;11820:18;;;11813:30;11879:25;11859:18;;;11852:53;11922:18;;13398:107:6::2;11599:347:11::0;13398:107:6::2;13516:20;13573:15;-1:-1:-1::0;;;;;13559:30:6::2;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;13559:30:6::2;;13546:43;;13604:9;13599:410;13619:15;13615:1;:19;13599:410;;;13666:14;;13681:1;13666:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;13713:37:6;::::2;;::::0;;;:23:::2;:37;::::0;;;;:47;13697:13;;13651:32;;-1:-1:-1;;;;;;13713:47:6::2;::::0;13697:10;;13708:1;;13697:13;::::2;;;;;:::i;:::-;;::::0;;::::2;::::0;;;;;;:63;;;;-1:-1:-1;;;;;13790:37:6;;::::2;;::::0;;;:23:::2;:37:::0;;;;;;;:51;-1:-1:-1;;;13790:51:6;::::2;;13775:82;13875:10;13814:12:::0;13901:8;;13910:1;13901:11;;::::2;;;;;:::i;:::-;;;;;;;13914:7;;13922:1;13914:10;;;;;;;:::i;:::-;13775:163;::::0;-1:-1:-1;;;;;;13775:163:6::2;::::0;;;;;;-1:-1:-1;;;;;11434:15:11;;;13775:163:6::2;::::0;::::2;11416:34:11::0;11486:15;;;;11466:18;;;11459:43;-1:-1:-1;11518:18:11;;;11511:34;;;;13914:10:6::2;::::0;;::::2;;;11561:18:11::0;;;11554:34;11350:19;;13775:163:6::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;13981:3;;;;;13599:410;;23824:604:::0;-1:-1:-1;;;;;24075:28:6;;24032:23;24075:28;;;:14;:28;;;;;;;;24067:69;;;;-1:-1:-1;;;24067:69:6;;12153:2:11;24067:69:6;;;12135:21:11;12192:2;12172:18;;;12165:30;12231;12211:18;;;12204:58;12279:18;;24067:69:6;11951:352:11;24067:69:6;24147:71;24233:98;24257:14;;24273:8;;24283:12;;24297:19;:33;24317:12;-1:-1:-1;;;;;24297:33:6;-1:-1:-1;;;;;24297:33:6;;;;;;;;;;;;;24233:23;:98::i;:::-;24360:61;;-1:-1:-1;;;24360:61:6;;24147:184;;-1:-1:-1;24360:10:6;;:35;;:61;;24147:184;;24360:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24342:79;23824:604;-1:-1:-1;;;;;;;;;23824:604:6:o;1931:150:0:-;778:5:8;;-1:-1:-1;;;;;778:5:8;764:10;:19;756:44;;;;-1:-1:-1;;;756:44:8;;;;;;;:::i;:::-;2024:8:0::1;::::0;2008:36:::1;::::0;-1:-1:-1;;;;;2008:36:0;;::::1;::::0;2024:8:::1;::::0;2008:36:::1;::::0;2024:8:::1;::::0;2008:36:::1;2054:8;:20:::0;;-1:-1:-1;;;;;;2054:20:0::1;-1:-1:-1::0;;;;;2054:20:0;;;::::1;::::0;;;::::1;::::0;;1931:150::o;7908:750:6:-;778:5:8;;-1:-1:-1;;;;;778:5:8;764:10;:19;756:44;;;;-1:-1:-1;;;756:44:8;;;;;;;:::i;:::-;8029:14:6::1;:52;8044:36;::::0;;;::::1;::::0;::::1;;:::i;:::-;-1:-1:-1::0;;;;;8029:52:6::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;8029:52:6;;::::1;;8028:53;8020:93;;;::::0;-1:-1:-1;;;8020:93:6;;13813:2:11;8020:93:6::1;::::0;::::1;13795:21:11::0;13852:2;13832:18;;;13825:30;13891:29;13871:18;;;13864:57;13938:18;;8020:93:6::1;13611:351:11::0;8020:93:6::1;8150:19;::::0;8124:46:::1;::::0;;;:25:::1;:46;::::0;;;;8173:23;;8124:72:::1;8173:23:::0;8124:46;:72:::1;:::i;:::-;-1:-1:-1::0;;8266:19:6::1;::::0;8206::::1;:57;8226:36;::::0;;;::::1;::::0;::::1;;:::i;:::-;-1:-1:-1::0;;;;;8206:57:6::1;-1:-1:-1::0;;;;;8206:57:6::1;;;;;;;;;;;;:79;;;;8350:4;8295:14;:52;8310:23;:36;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;8295:52:6::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;8295:52:6;:59;;-1:-1:-1;;8295:59:6::1;::::0;::::1;;::::0;;;::::1;::::0;;;8364:14:::1;::::0;8384:36:::1;::::0;;;;;;::::1;;:::i;:::-;8364:57:::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;8364:57:6;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;8364:57:6::1;-1:-1:-1::0;;;;;8364:57:6;;;::::1;::::0;;;::::1;::::0;;;8458:19:::1;8456:21:::0;;;;::::1;::::0;;;;8503:148:::1;;::::0;8534:36:::1;::::0;;;;;;::::1;;:::i;:::-;-1:-1:-1::0;;;;;8503:148:6::1;;8600:41;::::0;;;::::1;::::0;::::1;;:::i;:::-;8503:148;::::0;-1:-1:-1;;;;;;16068:41:11;;;16050:60;;16038:2;16023:18;8503:148:6::1;;;;;;;7908:750:::0;:::o;9544:1276::-;778:5:8;;-1:-1:-1;;;;;778:5:8;764:10;:19;756:44;;;;-1:-1:-1;;;756:44:8;;;;;;;:::i;:::-;9712:19:6::1;;9697:12;:34;9689:74;;;::::0;-1:-1:-1;;;9689:74:6;;16323:2:11;9689:74:6::1;::::0;::::1;16305:21:11::0;16362:2;16342:18;;;16335:30;16401:29;16381:18;;;16374:57;16448:18;;9689:74:6::1;16121:351:11::0;9689:74:6::1;9774:20;9831:39:::0;;;:25:::1;:39;::::0;;;;;;9797:4:::1;9831:63:::0;;::::1;::::0;9909:43;;-1:-1:-1;;;9909:43:6;;;;9797:4;;-1:-1:-1;;;9831:63:6;;::::1;-1:-1:-1::0;;;;;9831:63:6::1;::::0;;;9909:41:::1;::::0;:43:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;9831:63;9909:43:::1;;;;;;;;;;-1:-1:-1::0;9909:43:6::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;9909:43:6::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;9905:605;;10494:5;10476:23;;9905:605;;;10101:9;-1:-1:-1::0;;;;;10086:36:6::1;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;10071:64:6::1;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10061:76;;:6;:76;10057:388;;10175:5;10157:23;;10057:388;;;10245:9;-1:-1:-1::0;;;;;10230:36:6::1;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;10215:64:6::1;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10205:76;;:6;:76;10201:244;;10319:5;10301:23;;10201:244;;;10362:25;10380:7;10362:15;:25;:::i;:::-;10349:9;:38;10345:100;;10425:5;10407:23;;10345:100;9953:502;;;;;9905:605;10524:15;10520:294;;;10555:31;::::0;-1:-1:-1;;;10555:31:6;;18146:2:11;10555:31:6::1;::::0;::::1;18128:21:11::0;18185:2;18165:18;;;18158:30;-1:-1:-1;;;18204:18:11;;;18197:51;18265:18;;10555:31:6::1;17944:345:11::0;10520:294:6::1;10617:39;::::0;;;:25:::1;:39;::::0;;;;:63:::1;;:75:::0;;-1:-1:-1;;;;;10706:97:6;::::1;-1:-1:-1::0;;;;;;;10617:75:6;::::1;-1:-1:-1::0;;;10617:75:6::1;10706:97:::0;-1:-1:-1;;;;;;10706:97:6;;;;;;;::::1;::::0;;9679:1141:::1;;9544:1276:::0;;;:::o;25159:608::-;-1:-1:-1;;;;;25412:28:6;;25368:24;25412:28;;;:14;:28;;;;;;;;25404:69;;;;-1:-1:-1;;;25404:69:6;;18496:2:11;25404:69:6;;;18478:21:11;18535:2;18515:18;;;18508:30;18574;18554:18;;;18547:58;18622:18;;25404:69:6;18294:352:11;25404:69:6;25484:71;25570:98;25594:14;;25610:8;;25620:12;;25634:19;:33;25654:12;-1:-1:-1;;;;;25634:33:6;-1:-1:-1;;;;;25634:33:6;;;;;;;;;;;;;25570:23;:98::i;:::-;25698:62;;-1:-1:-1;;;25698:62:6;;25484:184;;-1:-1:-1;25698:10:6;;:36;;:62;;25484:184;;25698:62;;;:::i;6446:174::-;778:5:8;;-1:-1:-1;;;;;778:5:8;764:10;:19;756:44;;;;-1:-1:-1;;;756:44:8;;;;;;;:::i;:::-;-1:-1:-1;;;;;6531:23:6;::::1;;::::0;;;:15:::1;:23;::::0;;;;;;;;:33;;-1:-1:-1;;6531:33:6::1;::::0;::::1;;::::0;;::::1;::::0;;;6580;;154:41:11;;;6580:33:6::1;::::0;127:18:11;6580:33:6::1;;;;;;;6446:174:::0;;:::o;12061:556::-;4117:10;4101:27;;;;:15;:27;;;;;;;;4093:58;;;;-1:-1:-1;;;4093:58:6;;18853:2:11;4093:58:6;;;18835:21:11;18892:2;18872:18;;;18865:30;-1:-1:-1;;;18911:18:11;;;18904:48;18969:18;;4093:58:6;18651:342:11;4093:58:6;-1:-1:-1;;;;;12166:28:6;::::1;;::::0;;;:14:::1;:28;::::0;;;;;::::1;;12165:29;12157:73;;;::::0;-1:-1:-1;;;12157:73:6;;19200:2:11;12157:73:6::1;::::0;::::1;19182:21:11::0;19239:2;19219:18;;;19212:30;19278:33;19258:18;;;19251:61;19329:18;;12157:73:6::1;18998:355:11::0;12157:73:6::1;-1:-1:-1::0;;;;;12248:29:6;::::1;;12240:66;;;::::0;-1:-1:-1;;;12240:66:6;;19560:2:11;12240:66:6::1;::::0;::::1;19542:21:11::0;19599:2;19579:18;;;19572:30;19638:26;19618:18;;;19611:54;19682:18;;12240:66:6::1;19358:348:11::0;12240:66:6::1;-1:-1:-1::0;;;;;12317:28:6;;::::1;;::::0;;;:14:::1;:28;::::0;;;;;;;:35;;-1:-1:-1;;12317:35:6::1;12348:4;12317:35:::0;;::::1;::::0;;;12362:20:::1;:39:::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;;;;12362:39:6::1;::::0;::::1;::::0;;12463:77;;;;::::1;::::0;;-1:-1:-1;;;;;12463:77:6;;::::1;::::0;;12527:10:::1;12463:77:::0;;::::1;::::0;;;12411:37;;;:23:::1;:37:::0;;;;;;:129;;;;;;::::1;-1:-1:-1::0;;;12411:129:6::1;::::0;::::1;::::0;;;::::1;::::0;;;12556:54;;19883:4:11;19871:17;;19853:36;;12556:54:6::1;::::0;19826:18:11;12556:54:6::1;;;;;;;12061:556:::0;;:::o;11168:297::-;778:5:8;;-1:-1:-1;;;;;778:5:8;764:10;:19;756:44;;;;-1:-1:-1;;;756:44:8;;;;;;;:::i;:::-;-1:-1:-1;;;;;11255:30:6;::::1;;::::0;;;:15:::1;:30;::::0;;;;;::::1;;11254:31;11246:72;;;::::0;-1:-1:-1;;;11246:72:6;;20102:2:11;11246:72:6::1;::::0;::::1;20084:21:11::0;20141:2;20121:18;;;20114:30;20180;20160:18;;;20153:58;20228:18;;11246:72:6::1;19900:352:11::0;11246:72:6::1;-1:-1:-1::0;;;;;11328:30:6;::::1;;::::0;;;:15:::1;:30;::::0;;;;;;;:37;;-1:-1:-1;;11328:37:6::1;11361:4;11328:37:::0;;::::1;::::0;;;11375:14:::1;:34:::0;;;;::::1;::::0;;;;;;;;::::1;::::0;;-1:-1:-1;;;;;;11375:34:6::1;::::0;::::1;::::0;;11425:33;;2639:51:11;;;11425:33:6::1;::::0;2612:18:11;11425:33:6::1;;;;;;;11168:297:::0;:::o;2439:279:7:-;1262:8:0;;-1:-1:-1;;;;;1262:8:0;1248:10;:22;1240:58;;;;-1:-1:-1;;;1240:58:0;;20459:2:11;1240:58:0;;;20441:21:11;20498:2;20478:18;;;20471:30;20537:25;20517:18;;;20510:53;20580:18;;1240:58:0;20257:347:11;1240:58:0;2523:14:7::1;::::0;:24:::1;::::0;2540:7:::1;2523:24;:::i;:::-;2505:15;:42;2497:72;;;::::0;-1:-1:-1;;;2497:72:7;;20941:2:11;2497:72:7::1;::::0;::::1;20923:21:11::0;20980:2;20960:18;;;20953:30;-1:-1:-1;;;20999:18:11;;;20992:47;21056:18;;2497:72:7::1;20739:341:11::0;2497:72:7::1;2579:14;:21:::0;;-1:-1:-1;;2610:20:7;;;;;2657:15:::1;2640:14;:32:::0;2688:23:::1;::::0;;-1:-1:-1;21247:41:11;;;21319:2;21304:18;;21297:50;2688:23:7::1;::::0;21220:18:11;2688:23:7::1;;;;;;;;2439:279::o:0;1666:31:6:-;;;;;;;;;;;;22368:733;-1:-1:-1;;;;;22616:28:6;;22569:27;22616:28;;;:14;:28;;;;;;;;22608:69;;;;-1:-1:-1;;;22608:69:6;;21560:2:11;22608:69:6;;;21542:21:11;21599:2;21579:18;;;21572:30;21638;21618:18;;;21611:58;21686:18;;22608:69:6;21358:352:11;22608:69:6;22688:71;22774:98;22798:14;;22814:8;;22824:12;;22838:19;:33;22858:12;-1:-1:-1;;;;;22838:33:6;-1:-1:-1;;;;;22838:33:6;;;;;;;;;;;;;22774:23;:98::i;:::-;22688:184;;22888:9;22883:212;22907:24;:31;22903:1;:35;22883:212;;;22978:24;23003:1;22978:27;;;;;;;;:::i;:::-;;;;;;;:47;;;22955:70;;;;;:::i;:::-;;-1:-1:-1;23067:3:6;;22883:212;;;;22598:503;22368:733;;;;;;;;;:::o;16585:4099::-;16796:46;16916:14;16885:28;16916:14;-1:-1:-1;;;;;17033:65:6;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;17033:65:6;;;;;;;;;;;;;;;;;16947:151;;17137:49;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17137:49:6;17196:26;;;:41;;;17247:28;;;;17469:16;;17465:191;;17563:25;:39;17589:12;17563:39;;;;;;;;;;;:63;;;;;;;;;;-1:-1:-1;;;;;17563:63:6;-1:-1:-1;;;;;17548:95:6;;:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;17501:144:6;;-1:-1:-1;;;;17465:191:6;17704:9;17699:2938;17719:20;17715:1;:24;17699:2938;;;17771:14;;17786:1;17771:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;17996:39;;;;:25;:39;;;;;:52;17756:32;;-1:-1:-1;;;;;;;;;17996:52:6;;;;;17980:68;;;;17976:2592;;18118:12;;18131:1;18118:15;;;;;;;:::i;:::-;;;;;;;18068:24;18093:1;18068:27;;;;;;;;:::i;:::-;;;;;;;;;;;;:65;;;;-1:-1:-1;;;;;18278:37:6;;;18068:47;18278:37;;;:23;:37;;;;;;;;:51;18263:150;;-1:-1:-1;;;18263:150:6;;;;;21889:51:11;;;;21956:18;;;21949:34;;;-1:-1:-1;;;18278:51:6;;;;;18263:84;;21862:18:11;;18263:150:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18151:262;;;;;;;;;;18152:24;18177:1;18152:27;;;;;;;;:::i;:::-;;;;;;;:44;;18198:24;18223:1;18198:27;;;;;;;;:::i;:::-;;;;;;;;;;;:45;;18151:262;;;;;17976:2592;;;-1:-1:-1;;;;;18568:34:6;;;;18644:8;;18653:1;18644:11;;;;;;;:::i;:::-;;;;;;;18620:13;:21;;:35;;;;;18701:12;;18714:1;18701:15;;;;;;;:::i;:::-;;;;;;;;;;18673:25;;;;:43;;;-1:-1:-1;;;;;19057:37:6;;;;;;;:23;:37;;;;;:51;19042:91;;-1:-1:-1;;;19042:91:6;;22685:13:11;;22681:39;;19042:91:6;;;22663:58:11;22765:17;;;22759:24;22737:20;;;22730:54;22822:24;;22800:20;;;22793:54;22903:4;22891:17;;22885:24;22863:20;;;22856:54;-1:-1:-1;;;19057:51:6;;;;19042:76;;-1:-1:-1;22635:19:11;;19042:91:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18910:24;18935:1;18910:27;;;;;;;;:::i;:::-;;;;;;;:44;;18976:24;19001:1;18976:27;;;;;;;;:::i;:::-;;;;;;;;;;;:45;;18815:318;;;;;;;-1:-1:-1;18815:318:6;-1:-1:-1;19323:1:6;19307:17;;;19303:1251;;19623:10;19573:24;19598:1;19573:27;;;;;;;;:::i;:::-;;;;;;;;;;;:60;19303:1251;;;20447:39;;;;:25;:39;;;;;:66;;;20235:67;;;;-1:-1:-1;;;;;20447:66:6;;;;20399:19;;20180:216;;:10;;20235:67;20344:21;20180;:216::i;:::-;:238;20150:363;;;;;:::i;:::-;;20100:24;20125:1;20100:27;;;;;;;;:::i;:::-;;;;;;;;;;;:413;19303:1251;20609:3;;17699:2938;;;-1:-1:-1;20653:24:6;;16585:4099;-1:-1:-1;;;;;;;;;;;;;;16585:4099:6:o;3214:261:7:-;778:5:8;;-1:-1:-1;;;;;778:5:8;764:10;:19;756:44;;;;-1:-1:-1;;;756:44:8;;;;;;;:::i;:::-;3320:14:7::1;::::0;::::1;;:33:::0;::::1;;;;3338:15;3320:33;3303:14;:50:::0;;-1:-1:-1;;3303:50:7::1;::::0;::::1;;::::0;;;::::1;::::0;;;;::::1;;3379:13:::0;;::::1;;:31:::0;::::1;;;;3396:14;3379:31;3363:13;:47:::0;;-1:-1:-1;;3363:47:7;::::1;;::::0;::::1;;::::0;::::1;::::0;;::::1;::::0;;;;3426:42:::1;::::0;;3363:47:::1;3438:14:::0;;;;;;;;;;21272::11;21265:22;21247:41;;3454:13:7;;;::::1;;21331:14:11::0;21324:22;21319:2;21304:18;;21297:50;3426:42:7::1;::::0;21220:18:11;3426:42:7::1;;;;;;;3214:261:::0;;:::o;21255:520:6:-;-1:-1:-1;;;;;21559:28:6;;;;;;:14;:28;;;;;;21468:71;;21559:28;;21551:70;;;;-1:-1:-1;;;21551:70:6;;23628:2:11;21551:70:6;;;23610:21:11;23667:2;23647:18;;;23640:30;23706:31;23686:18;;;23679:59;23755:18;;21551:70:6;23426:353:11;21551:70:6;21670:98;21694:14;;21710:8;;21720:12;;21734:19;:33;21754:12;-1:-1:-1;;;;;21734:33:6;-1:-1:-1;;;;;21734:33:6;;;;;;;;;;;;;21670:23;:98::i;:::-;21631:137;21255:520;-1:-1:-1;;;;;;;;21255:520:6:o;1447:31::-;;;;;;;;;;;;1312:161:8;778:5;;-1:-1:-1;;;;;778:5:8;764:10;:19;756:44;;;;-1:-1:-1;;;756:44:8;;;;;;;:::i;:::-;1392:5:::1;:16:::0;;-1:-1:-1;;;;;;1392:16:8::1;-1:-1:-1::0;;;;;1392:16:8;::::1;::::0;;::::1;::::0;;1424:42:::1;::::0;1392:16;;1445:10:::1;::::0;1424:42:::1;::::0;1392:5;1424:42:::1;1312:161:::0;:::o;3529:302:7:-;3602:14;;:24;;3619:7;3602:24;:::i;:::-;3584:15;:42;3576:75;;;;-1:-1:-1;;;3576:75:7;;23986:2:11;3576:75:7;;;23968:21:11;24025:2;24005:18;;;23998:30;-1:-1:-1;;;24044:18:11;;;24037:50;24104:18;;3576:75:7;23784:344:11;3576:75:7;3665:14;;;;;:31;;-1:-1:-1;3683:13:7;;;;;;;3665:31;3661:164;;;3712:14;:22;;-1:-1:-1;;3748:21:7;;;3789:25;;;-1:-1:-1;21247:41:11;;;21319:2;21304:18;;21297:50;3789:25:7;;21220:18:11;3789:25:7;21085:268:11;3661:164:7;3529:302::o;1564:526:1:-;1680:9;1928:1;-1:-1:-1;;1911:19:1;1908:1;1905:26;1902:1;1898:34;1891:42;1878:11;1874:60;1864:116;;1964:1;1961;1954:12;1864:116;-1:-1:-1;2051:9:1;;2047:27;;1564:526::o;206:367:11:-;269:8;279:6;333:3;326:4;318:6;314:17;310:27;300:55;;351:1;348;341:12;300:55;-1:-1:-1;374:20:11;;-1:-1:-1;;;;;406:30:11;;403:50;;;449:1;446;439:12;403:50;486:4;478:6;474:17;462:29;;546:3;539:4;529:6;526:1;522:14;514:6;510:27;506:38;503:47;500:67;;;563:1;560;553:12;500:67;206:367;;;;;:::o;578:1088::-;736:6;744;752;760;768;776;829:2;817:9;808:7;804:23;800:32;797:52;;;845:1;842;835:12;797:52;885:9;872:23;-1:-1:-1;;;;;955:2:11;947:6;944:14;941:34;;;971:1;968;961:12;941:34;1010:70;1072:7;1063:6;1052:9;1048:22;1010:70;:::i;:::-;1099:8;;-1:-1:-1;984:96:11;-1:-1:-1;1187:2:11;1172:18;;1159:32;;-1:-1:-1;1203:16:11;;;1200:36;;;1232:1;1229;1222:12;1200:36;1271:72;1335:7;1324:8;1313:9;1309:24;1271:72;:::i;:::-;1362:8;;-1:-1:-1;1245:98:11;-1:-1:-1;1450:2:11;1435:18;;1422:32;;-1:-1:-1;1466:16:11;;;1463:36;;;1495:1;1492;1485:12;1463:36;;1534:72;1598:7;1587:8;1576:9;1572:24;1534:72;:::i;:::-;578:1088;;;;-1:-1:-1;578:1088:11;;-1:-1:-1;578:1088:11;;1625:8;;578:1088;-1:-1:-1;;;578:1088:11:o;1671:632::-;1842:2;1894:21;;;1964:13;;1867:18;;;1986:22;;;1813:4;;1842:2;2065:15;;;;2039:2;2024:18;;;1813:4;2108:169;2122:6;2119:1;2116:13;2108:169;;;2183:13;;2171:26;;2252:15;;;;2217:12;;;;2144:1;2137:9;2108:169;;;-1:-1:-1;2294:3:11;;1671:632;-1:-1:-1;;;;;;1671:632:11:o;2308:180::-;2367:6;2420:2;2408:9;2399:7;2395:23;2391:32;2388:52;;;2436:1;2433;2426:12;2388:52;-1:-1:-1;2459:23:11;;2308:180;-1:-1:-1;2308:180:11:o;2701:131::-;-1:-1:-1;;;;;2776:31:11;;2766:42;;2756:70;;2822:1;2819;2812:12;2756:70;2701:131;:::o;2837:247::-;2896:6;2949:2;2937:9;2928:7;2924:23;2920:32;2917:52;;;2965:1;2962;2955:12;2917:52;3004:9;2991:23;3023:31;3048:5;3023:31;:::i;:::-;3073:5;2837:247;-1:-1:-1;;;2837:247:11:o;3271:1224::-;3438:6;3446;3454;3462;3470;3478;3486;3539:3;3527:9;3518:7;3514:23;3510:33;3507:53;;;3556:1;3553;3546:12;3507:53;3596:9;3583:23;-1:-1:-1;;;;;3666:2:11;3658:6;3655:14;3652:34;;;3682:1;3679;3672:12;3652:34;3721:70;3783:7;3774:6;3763:9;3759:22;3721:70;:::i;:::-;3810:8;;-1:-1:-1;3695:96:11;-1:-1:-1;3898:2:11;3883:18;;3870:32;;-1:-1:-1;3914:16:11;;;3911:36;;;3943:1;3940;3933:12;3911:36;3982:72;4046:7;4035:8;4024:9;4020:24;3982:72;:::i;:::-;4073:8;;-1:-1:-1;3956:98:11;-1:-1:-1;4161:2:11;4146:18;;4133:32;;-1:-1:-1;4177:16:11;;;4174:36;;;4206:1;4203;4196:12;4174:36;;4245:72;4309:7;4298:8;4287:9;4283:24;4245:72;:::i;:::-;4336:8;;-1:-1:-1;4219:98:11;-1:-1:-1;;4421:2:11;4406:18;;4393:32;4434:31;4393:32;4434:31;:::i;:::-;4484:5;4474:15;;;3271:1224;;;;;;;;;;:::o;4500:209::-;4601:6;4654:3;4642:9;4633:7;4629:23;4625:33;4622:53;;;4671:1;4668;4661:12;4622:53;-1:-1:-1;4694:9:11;4500:209;-1:-1:-1;4500:209:11:o;4714:129::-;-1:-1:-1;;;;;4792:5:11;4788:30;4781:5;4778:41;4768:69;;4833:1;4830;4823:12;4848:454;4924:6;4932;4940;4993:2;4981:9;4972:7;4968:23;4964:32;4961:52;;;5009:1;5006;4999:12;4961:52;5045:9;5032:23;5022:33;;5105:2;5094:9;5090:18;5077:32;5118:31;5143:5;5118:31;:::i;:::-;5168:5;-1:-1:-1;5225:2:11;5210:18;;5197:32;5238;5197;5238;:::i;:::-;5289:7;5279:17;;;4848:454;;;;;:::o;5307:118::-;5393:5;5386:13;5379:21;5372:5;5369:32;5359:60;;5415:1;5412;5405:12;5430:382;5495:6;5503;5556:2;5544:9;5535:7;5531:23;5527:32;5524:52;;;5572:1;5569;5562:12;5524:52;5611:9;5598:23;5630:31;5655:5;5630:31;:::i;:::-;5680:5;-1:-1:-1;5737:2:11;5722:18;;5709:32;5750:30;5709:32;5750:30;:::i;:::-;5799:7;5789:17;;;5430:382;;;;;:::o;6425:315::-;6493:6;6501;6554:2;6542:9;6533:7;6529:23;6525:32;6522:52;;;6570:1;6567;6560:12;6522:52;6609:9;6596:23;6628:31;6653:5;6628:31;:::i;:::-;6678:5;6730:2;6715:18;;;;6702:32;;-1:-1:-1;;;6425:315:11:o;7055:1157::-;7222:6;7230;7238;7246;7254;7262;7270;7323:3;7311:9;7302:7;7298:23;7294:33;7291:53;;;7340:1;7337;7330:12;7291:53;7380:9;7367:23;-1:-1:-1;;;;;7450:2:11;7442:6;7439:14;7436:34;;;7466:1;7463;7456:12;7436:34;7505:70;7567:7;7558:6;7547:9;7543:22;7505:70;:::i;:::-;7594:8;;-1:-1:-1;7479:96:11;-1:-1:-1;7682:2:11;7667:18;;7654:32;;-1:-1:-1;7698:16:11;;;7695:36;;;7727:1;7724;7717:12;7695:36;7766:72;7830:7;7819:8;7808:9;7804:24;7766:72;:::i;:::-;7857:8;;-1:-1:-1;7740:98:11;-1:-1:-1;7945:2:11;7930:18;;7917:32;;-1:-1:-1;7961:16:11;;;7958:36;;;7990:1;7987;7980:12;7958:36;;8029:72;8093:7;8082:8;8071:9;8067:24;8029:72;:::i;:::-;7055:1157;;;;-1:-1:-1;7055:1157:11;;;;;;8202:2;8187:18;;;8174:32;;7055:1157;-1:-1:-1;;;;7055:1157:11:o;8445:760::-;8704:2;8756:21;;;8826:13;;8729:18;;;8848:22;;;8675:4;;8704:2;8927:15;;;;8901:2;8886:18;;;8675:4;8970:209;8984:6;8981:1;8978:13;8970:209;;;9033:64;9093:3;9084:6;9078:13;8309:12;;8297:25;;8371:4;8360:16;;;8354:23;8338:14;;;8331:47;8427:4;8416:16;;;8410:23;8394:14;;8387:47;8217:223;9033:64;9154:15;;;;9126:4;9117:14;;;;;9006:1;8999:9;8970:209;;9210:376;9272:6;9280;9333:2;9321:9;9312:7;9308:23;9304:32;9301:52;;;9349:1;9346;9339:12;9301:52;9388:9;9375:23;9407:28;9429:5;9407:28;:::i;9591:245::-;9658:6;9711:2;9699:9;9690:7;9686:23;9682:32;9679:52;;;9727:1;9724;9717:12;9679:52;9759:9;9753:16;9778:28;9800:5;9778:28;:::i;10883:127::-;10944:10;10939:3;10935:20;10932:1;10925:31;10975:4;10972:1;10965:15;10999:4;10996:1;10989:15;11015:127;11076:10;11071:3;11067:20;11064:1;11057:31;11107:4;11104:1;11097:15;11131:4;11128:1;11121:15;12308:768;12575:2;12627:21;;;12697:13;;12600:18;;;12719:22;;;12546:4;;12575:2;12798:15;;;;12772:2;12757:18;;;12546:4;12841:209;12855:6;12852:1;12849:13;12841:209;;;12904:64;12964:3;12955:6;12949:13;8309:12;;8297:25;;8371:4;8360:16;;;8354:23;8338:14;;;8331:47;8427:4;8416:16;;;8410:23;8394:14;;8387:47;8217:223;12904:64;13025:15;;;;12997:4;12988:14;;;;;12877:1;12870:9;12841:209;;13081:184;13151:6;13204:2;13192:9;13183:7;13179:23;13175:32;13172:52;;;13220:1;13217;13210:12;13172:52;-1:-1:-1;13243:16:11;;13081:184;-1:-1:-1;13081:184:11:o;13270:336::-;13472:2;13454:21;;;13511:2;13491:18;;;13484:30;-1:-1:-1;;;13545:2:11;13530:18;;13523:42;13597:2;13582:18;;13270:336::o;14151:253::-;14245:11;;-1:-1:-1;;;;;;14281:54:11;14345:2;14341:14;;;;-1:-1:-1;;;;;14337:59:11;14278:119;;;;14265:133;;14151:253::o;14409:139::-;-1:-1:-1;;;;;;14483:40:11;;14473:51;;14463:79;;14538:1;14535;14528:12;14553:1098;14748:5;14735:19;14763:32;14787:7;14763:32;:::i;:::-;14069:11;;-1:-1:-1;;14065:41:11;-1:-1:-1;;;;;14108:30:11;;14062:77;14049:91;;14804:60;14912:2;14905:5;14901:14;14888:28;14925:33;14950:7;14925:33;:::i;:::-;14967:62;15021:7;15015:4;14967:62;:::i;:::-;;15066:1;15060:4;15056:12;15116:2;15109:5;15105:14;15092:28;15129:32;15153:7;15129:32;:::i;:::-;14069:11;;-1:-1:-1;;14065:41:11;-1:-1:-1;;;;;14108:30:11;;14062:77;14049:91;;15170:66;15284:2;15277:5;15273:14;15260:28;15297:33;15322:7;15297:33;:::i;:::-;15339:68;15399:7;15387:10;15339:68;:::i;:::-;;;15446:1;15440:4;15436:12;15496:3;15489:5;15485:15;15472:29;15510:32;15534:7;15510:32;:::i;:::-;15579:19;;-1:-1:-1;;15575:49:11;15630:3;15626:17;;;;15572:72;15551:94;;-1:-1:-1;;14553:1098:11:o;15656:245::-;15714:6;15767:2;15755:9;15746:7;15742:23;15738:32;15735:52;;;15783:1;15780;15773:12;15735:52;15822:9;15809:23;15841:30;15865:5;15841:30;:::i;16477:179::-;16555:13;;16608:22;16597:34;;16587:45;;16577:73;;16646:1;16643;16636:12;16577:73;16477:179;;;:::o;16661:473::-;16764:6;16772;16780;16788;16796;16849:3;16837:9;16828:7;16824:23;16820:33;16817:53;;;16866:1;16863;16856:12;16817:53;16889:39;16918:9;16889:39;:::i;:::-;16879:49;;16968:2;16957:9;16953:18;16947:25;16937:35;;17012:2;17001:9;16997:18;16991:25;16981:35;;17056:2;17045:9;17041:18;17035:25;17025:35;;17079:49;17123:3;17112:9;17108:19;17079:49;:::i;:::-;17069:59;;16661:473;;;;;;;;:::o;17139:251::-;17209:6;17262:2;17250:9;17241:7;17237:23;17233:32;17230:52;;;17278:1;17275;17268:12;17230:52;17310:9;17304:16;17329:31;17354:5;17329:31;:::i;17395:279::-;17464:6;17517:2;17505:9;17496:7;17492:23;17488:32;17485:52;;;17533:1;17530;17523:12;17485:52;17565:9;17559:16;17619:5;17615:2;17604:21;17597:5;17594:32;17584:60;;17640:1;17637;17630:12;17679:127;17740:10;17735:3;17731:20;17728:1;17721:31;17771:4;17768:1;17761:15;17795:4;17792:1;17785:15;17811:128;17878:9;;;17899:11;;;17896:37;;;17913:18;;:::i;:::-;17811:128;;;;:::o;20609:125::-;20674:9;;;20695:10;;;20692:36;;;20708:18;;:::i;21994:163::-;22072:13;;22125:6;22114:18;;22104:29;;22094:57;;22147:1;22144;22137:12;22162:289;22239:6;22247;22300:2;22288:9;22279:7;22275:23;22271:32;22268:52;;;22316:1;22313;22306:12;22268:52;22339:39;22368:9;22339:39;:::i;:::-;22329:49;;22397:48;22441:2;22430:9;22426:18;22397:48;:::i;:::-;22387:58;;22162:289;;;;;:::o;22921:368::-;23018:6;23026;23034;23042;23095:3;23083:9;23074:7;23070:23;23066:33;23063:53;;;23112:1;23109;23102:12;23063:53;-1:-1:-1;;23135:16:11;;23191:2;23176:18;;23170:25;23235:2;23220:18;;23214:25;23279:2;23264:18;;;23258:25;23135:16;;23170:25;;-1:-1:-1;23258:25:11;;-1:-1:-1;22921:368:11;-1:-1:-1;22921:368:11:o;23294:127::-;23355:10;23350:3;23346:20;23343:1;23336:31;23386:4;23383:1;23376:15;23410:4;23407:1;23400:15

Swarm Source

ipfs://33c68865ac4252b5af0079a8ecab90f2a299e0c9263e959d501d7dcfb492ad74
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.