Contract 0x4E1a39978Bf7883837457caE89C3E5F5856950c7

Contract Overview

Balance:
0 AVAX
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x237c4abaa132954f2b5816671c21d9525892103d7527128f336eb7c380f12ff20xb710cc7c79775892022-03-30 19:17:4453 days 6 hrs ago0x209484169c126f69db7c83df8d7cd0cb3db22519 IN 0x4e1a39978bf7883837457cae89c3e5f5856950c70 AVAX0.00101437525
0xd26fe7c74e90fba04df6cd180ceab6e7fee44f93ee1a2813a641866cba929cebTransfer Governa...79773202022-03-30 19:08:3453 days 6 hrs ago0x827dfa07acd602f59e3b71b36ca0d158786b6471 IN 0x4e1a39978bf7883837457cae89c3e5f5856950c70 AVAX0.00079442 27.5
0x9127194b72c61095a3585e8a77998a29b531a1a6ced84c58a124d99ab4a9c5a2Transfer Governa...79772812022-03-30 19:07:1653 days 6 hrs ago0x827dfa07acd602f59e3b71b36ca0d158786b6471 IN 0x4e1a39978bf7883837457cae89c3e5f5856950c70 AVAX0.00071742 27.5
0x9411e519cb83ef058790d81ac1f67809128fc85b127a2ea03381bd823851346aTransfer Governa...79772512022-03-30 19:06:1653 days 6 hrs ago0x827dfa07acd602f59e3b71b36ca0d158786b6471 IN 0x4e1a39978bf7883837457cae89c3e5f5856950c70 AVAX0.00071742 27.5
0x0844fd14219cce04c08d77a37dd8f02a6d7dc46d1d2678b25222f3b1cb28bc12Transfer Governa...79772142022-03-30 19:05:0253 days 6 hrs ago0x827dfa07acd602f59e3b71b36ca0d158786b6471 IN 0x4e1a39978bf7883837457cae89c3e5f5856950c70 AVAX0.00071742 27.5
0xe1febb62e2afaaea5c6af1b32d3ddbc6ebcf68e60b0d782eba49264e535930dd0x60a0604069974182022-03-07 15:04:3776 days 10 hrs ago0x209484169c126f69db7c83df8d7cd0cb3db22519 IN  Create: Miner0 AVAX0.83080305225
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Miner

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at testnet.snowtrace.io on 2022-04-14
*/

// Miner.sol Flattened
// SPDX-License-Identifier: MIT
pragma experimental ABIEncoderV2;

/*
Avacash.Finance: Privacy-focused Investments in Avalanche
Visit https://avacash.finance
Check Audits in https://docs.avacash.finance/

V.1.1


█████╗ ██╗   ██╗ █████╗  ██████╗ █████╗ ███████╗██╗  ██╗
██╔══██╗██║   ██║██╔══██╗██╔════╝██╔══██╗██╔════╝██║  ██║
███████║██║   ██║███████║██║     ███████║███████╗███████║
██╔══██║╚██╗ ██╔╝██╔══██║██║     ██╔══██║╚════██║██╔══██║
██║  ██║ ╚████╔╝ ██║  ██║╚██████╗██║  ██║███████║██║  ██║
╚═╝  ╚═╝  ╚═══╝  ╚═╝  ╚═╝ ╚═════╝╚═╝  ╚═╝╚══════╝╚═╝  ╚═╝

███████╗██╗███╗   ██╗ █████╗ ███╗   ██╗ ██████╗███████╗
██╔════╝██║████╗  ██║██╔══██╗████╗  ██║██╔════╝██╔════╝
█████╗  ██║██╔██╗ ██║███████║██╔██╗ ██║██║     █████╗
██╔══╝  ██║██║╚██╗██║██╔══██║██║╚██╗██║██║     ██╔══╝
██║     ██║██║ ╚████║██║  ██║██║ ╚████║╚██████╗███████╗
╚═╝     ╚═╝╚═╝  ╚═══╝╚═╝  ╚═╝╚═╝  ╚═══╝ ╚═════╝╚══════╝

*/
// File: contracts/interfaces/IVerifier.sol


pragma solidity ^0.6.0;

interface IVerifier {
  function verifyProof(bytes calldata proof, uint256[4] calldata input) external view returns (bool);

  function verifyProof(bytes calldata proof, uint256[7] calldata input) external view returns (bool);

  function verifyProof(bytes calldata proof, uint256[12] calldata input) external view returns (bool);
}

// File: contracts/interfaces/IRewardSwap.sol



pragma solidity ^0.6.0;

interface IRewardSwap {
  function swap(address recipient, uint256 amount) external returns (uint256);

  function setPoolWeight(uint256 newWeight) external;
}

// File: tornado-trees/contracts/interfaces/ITornadoTreesV1.sol



pragma solidity ^0.6.0;

interface ITornadoTreesV1 {
  function lastProcessedDepositLeaf() external view returns (uint256);

  function lastProcessedWithdrawalLeaf() external view returns (uint256);

  function depositRoot() external view returns (bytes32);

  function withdrawalRoot() external view returns (bytes32);

  function deposits(uint256 i) external view returns (bytes32);

  function withdrawals(uint256 i) external view returns (bytes32);

  function registerDeposit(address instance, bytes32 commitment) external;

  function registerWithdrawal(address instance, bytes32 nullifier) external;
}

// File: tornado-trees/contracts/interfaces/IBatchTreeUpdateVerifier.sol



pragma solidity ^0.6.0;

interface IBatchTreeUpdateVerifier {
  function verifyProof(bytes calldata proof, uint256[1] calldata input) external view returns (bool);
}

// File: @openzeppelin/upgrades-core/contracts/Initializable.sol



pragma solidity >=0.4.24 <0.7.0;


/**
 * @title Initializable
 *
 * @dev Helper contract to support initializer functions. To use it, replace
 * the constructor with a function that has the `initializer` modifier.
 * WARNING: Unlike constructors, initializer functions must be manually
 * invoked. This applies both to deploying an Initializable contract, as well
 * as extending an Initializable contract via inheritance.
 * WARNING: When used with inheritance, manual care must be taken to not invoke
 * a parent initializer twice, or ensure that all initializers are idempotent,
 * because this is not dealt with automatically as with constructors.
 */
contract Initializable {

  /**
   * @dev Indicates that the contract has been initialized.
   */
  bool private initialized;

  /**
   * @dev Indicates that the contract is in the process of being initialized.
   */
  bool private initializing;

  /**
   * @dev Modifier to use in the initializer function of a contract.
   */
  modifier initializer() {
    require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized");

    bool isTopLevelCall = !initializing;
    if (isTopLevelCall) {
      initializing = true;
      initialized = true;
    }

    _;

    if (isTopLevelCall) {
      initializing = false;
    }
  }

  /// @dev Returns true if and only if the function is running in the constructor
  function isConstructor() private view returns (bool) {
    // extcodesize checks the size of the code stored in an address, and
    // address returns the current address. Since the code is still not
    // deployed when running a constructor, any checks on its code size will
    // yield zero, making it an effective way to detect if a contract is
    // under construction or not.
    address self = address(this);
    uint256 cs;
    assembly { cs := extcodesize(self) }
    return cs == 0;
  }

  // Reserved storage space to allow for layout changes in the future.
  uint256[50] private ______gap;
}

// File: tornado-trees/contracts/TornadoTrees.sol



pragma solidity ^0.6.0;




/// @dev This contract holds a merkle tree of all tornado cash deposit and withdrawal events
contract TornadoTrees is Initializable {
  address public immutable governance;
  bytes32 public depositRoot;
  bytes32 public previousDepositRoot;
  bytes32 public withdrawalRoot;
  bytes32 public previousWithdrawalRoot;
  address public tornadoProxy;
  IBatchTreeUpdateVerifier public treeUpdateVerifier;
  ITornadoTreesV1 public immutable tornadoTreesV1;

  uint256 public constant CHUNK_TREE_HEIGHT = 8;
  uint256 public constant CHUNK_SIZE = 2**CHUNK_TREE_HEIGHT;
  uint256 public constant ITEM_SIZE = 32 + 20 + 4;
  uint256 public constant BYTES_SIZE = 32 + 32 + 4 + CHUNK_SIZE * ITEM_SIZE;
  uint256 public constant SNARK_FIELD = 21888242871839275222246405745257275088548364400416034343698204186575808495617;

  mapping(uint256 => bytes32) public deposits;
  uint256 public depositsLength;
  uint256 public lastProcessedDepositLeaf;
  uint256 public immutable depositsV1Length;

  mapping(uint256 => bytes32) public withdrawals;
  uint256 public withdrawalsLength;
  uint256 public lastProcessedWithdrawalLeaf;
  uint256 public immutable withdrawalsV1Length;

  event DepositData(address instance, bytes32 indexed hash, uint256 block, uint256 index);
  event WithdrawalData(address instance, bytes32 indexed hash, uint256 block, uint256 index);
  event VerifierUpdated(address newVerifier);
  event ProxyUpdated(address newProxy);

  struct TreeLeaf {
    bytes32 hash;
    address instance;
    uint32 block;
  }

  modifier onlyTornadoProxy {
    require(msg.sender == tornadoProxy, "Not authorized");
    _;
  }

  modifier onlyGovernance() {
    require(msg.sender == governance, "Only governance can perform this action");
    _;
  }

  struct SearchParams {
    uint256 depositsFrom;
    uint256 depositsStep;
    uint256 withdrawalsFrom;
    uint256 withdrawalsStep;
  }

  constructor(
    address _governance,
    ITornadoTreesV1 _tornadoTreesV1,
    SearchParams memory _searchParams
  ) public {
    governance = _governance;
    tornadoTreesV1 = _tornadoTreesV1;

    depositsV1Length = findArrayLength(
      _tornadoTreesV1,
      "deposits(uint256)",
      _searchParams.depositsFrom,
      _searchParams.depositsStep
    );

    withdrawalsV1Length = findArrayLength(
      _tornadoTreesV1,
      "withdrawals(uint256)",
      _searchParams.withdrawalsFrom,
      _searchParams.withdrawalsStep
    );
  }

  function initialize(address _tornadoProxy, IBatchTreeUpdateVerifier _treeUpdateVerifier) public initializer onlyGovernance {
    tornadoProxy = _tornadoProxy;
    treeUpdateVerifier = _treeUpdateVerifier;

    depositRoot = tornadoTreesV1.depositRoot();
    uint256 lastDepositLeaf = tornadoTreesV1.lastProcessedDepositLeaf();
    require(lastDepositLeaf % CHUNK_SIZE == 0, "Incorrect TornadoTrees state");
    lastProcessedDepositLeaf = lastDepositLeaf;
    depositsLength = depositsV1Length;

    withdrawalRoot = tornadoTreesV1.withdrawalRoot();
    uint256 lastWithdrawalLeaf = tornadoTreesV1.lastProcessedWithdrawalLeaf();
    require(lastWithdrawalLeaf % CHUNK_SIZE == 0, "Incorrect TornadoTrees state");
    lastProcessedWithdrawalLeaf = lastWithdrawalLeaf;
    withdrawalsLength = withdrawalsV1Length;
  }

  /// @dev Queue a new deposit data to be inserted into a merkle tree
  function registerDeposit(address _instance, bytes32 _commitment) public onlyTornadoProxy {
    uint256 _depositsLength = depositsLength;
    deposits[_depositsLength] = keccak256(abi.encode(_instance, _commitment, blockNumber()));
    emit DepositData(_instance, _commitment, blockNumber(), _depositsLength);
    depositsLength = _depositsLength + 1;
  }

  /// @dev Queue a new withdrawal data to be inserted into a merkle tree
  function registerWithdrawal(address _instance, bytes32 _nullifierHash) public onlyTornadoProxy {
    uint256 _withdrawalsLength = withdrawalsLength;
    withdrawals[_withdrawalsLength] = keccak256(abi.encode(_instance, _nullifierHash, blockNumber()));
    emit WithdrawalData(_instance, _nullifierHash, blockNumber(), _withdrawalsLength);
    withdrawalsLength = _withdrawalsLength + 1;
  }

  /// @dev Insert a full batch of queued deposits into a merkle tree
  /// @param _proof A snark proof that elements were inserted correctly
  /// @param _argsHash A hash of snark inputs
  /// @param _argsHash Current merkle tree root
  /// @param _newRoot Updated merkle tree root
  /// @param _pathIndices Merkle path to inserted batch
  /// @param _events A batch of inserted events (leaves)
  function updateDepositTree(
    bytes calldata _proof,
    bytes32 _argsHash,
    bytes32 _currentRoot,
    bytes32 _newRoot,
    uint32 _pathIndices,
    TreeLeaf[CHUNK_SIZE] calldata _events
  ) public {
    uint256 offset = lastProcessedDepositLeaf;
    require(_currentRoot == depositRoot, "Proposed deposit root is invalid");
    require(_pathIndices == offset >> CHUNK_TREE_HEIGHT, "Incorrect deposit insert index");

    bytes memory data = new bytes(BYTES_SIZE);
    assembly {
      mstore(add(data, 0x44), _pathIndices)
      mstore(add(data, 0x40), _newRoot)
      mstore(add(data, 0x20), _currentRoot)
    }
    for (uint256 i = 0; i < CHUNK_SIZE; i++) {
      (bytes32 hash, address instance, uint32 blockNumber) = (_events[i].hash, _events[i].instance, _events[i].block);
      bytes32 leafHash = keccak256(abi.encode(instance, hash, blockNumber));
      bytes32 deposit = offset + i >= depositsV1Length ? deposits[offset + i] : tornadoTreesV1.deposits(offset + i);
      require(leafHash == deposit, "Incorrect deposit");
      assembly {
        let itemOffset := add(data, mul(ITEM_SIZE, i))
        mstore(add(itemOffset, 0x7c), blockNumber)
        mstore(add(itemOffset, 0x78), instance)
        mstore(add(itemOffset, 0x64), hash)
      }
      if (offset + i >= depositsV1Length) {
        delete deposits[offset + i];
      } else {
        emit DepositData(instance, hash, blockNumber, offset + i);
      }
    }

    uint256 argsHash = uint256(sha256(data)) % SNARK_FIELD;
    require(argsHash == uint256(_argsHash), "Invalid args hash");
    require(treeUpdateVerifier.verifyProof(_proof, [argsHash]), "Invalid deposit tree update proof");

    previousDepositRoot = _currentRoot;
    depositRoot = _newRoot;
    lastProcessedDepositLeaf = offset + CHUNK_SIZE;
  }

  /// @dev Insert a full batch of queued withdrawals into a merkle tree
  /// @param _proof A snark proof that elements were inserted correctly
  /// @param _argsHash A hash of snark inputs
  /// @param _argsHash Current merkle tree root
  /// @param _newRoot Updated merkle tree root
  /// @param _pathIndices Merkle path to inserted batch
  /// @param _events A batch of inserted events (leaves)
  function updateWithdrawalTree(
    bytes calldata _proof,
    bytes32 _argsHash,
    bytes32 _currentRoot,
    bytes32 _newRoot,
    uint32 _pathIndices,
    TreeLeaf[CHUNK_SIZE] calldata _events
  ) public {
    uint256 offset = lastProcessedWithdrawalLeaf;
    require(_currentRoot == withdrawalRoot, "Proposed withdrawal root is invalid");
    require(_pathIndices == offset >> CHUNK_TREE_HEIGHT, "Incorrect withdrawal insert index");

    bytes memory data = new bytes(BYTES_SIZE);
    assembly {
      mstore(add(data, 0x44), _pathIndices)
      mstore(add(data, 0x40), _newRoot)
      mstore(add(data, 0x20), _currentRoot)
    }
    for (uint256 i = 0; i < CHUNK_SIZE; i++) {
      (bytes32 hash, address instance, uint32 blockNumber) = (_events[i].hash, _events[i].instance, _events[i].block);
      bytes32 leafHash = keccak256(abi.encode(instance, hash, blockNumber));
      bytes32 withdrawal = offset + i >= withdrawalsV1Length ? withdrawals[offset + i] : tornadoTreesV1.withdrawals(offset + i);
      require(leafHash == withdrawal, "Incorrect withdrawal");
      assembly {
        let itemOffset := add(data, mul(ITEM_SIZE, i))
        mstore(add(itemOffset, 0x7c), blockNumber)
        mstore(add(itemOffset, 0x78), instance)
        mstore(add(itemOffset, 0x64), hash)
      }
      if (offset + i >= withdrawalsV1Length) {
        delete withdrawals[offset + i];
      } else {
        emit WithdrawalData(instance, hash, blockNumber, offset + i);
      }
    }

    uint256 argsHash = uint256(sha256(data)) % SNARK_FIELD;
    require(argsHash == uint256(_argsHash), "Invalid args hash");
    require(treeUpdateVerifier.verifyProof(_proof, [argsHash]), "Invalid withdrawal tree update proof");

    previousWithdrawalRoot = _currentRoot;
    withdrawalRoot = _newRoot;
    lastProcessedWithdrawalLeaf = offset + CHUNK_SIZE;
  }

  function validateRoots(bytes32 _depositRoot, bytes32 _withdrawalRoot) public view {
    require(_depositRoot == depositRoot || _depositRoot == previousDepositRoot, "Incorrect deposit tree root");
    require(_withdrawalRoot == withdrawalRoot || _withdrawalRoot == previousWithdrawalRoot, "Incorrect withdrawal tree root");
  }

  /// @dev There is no array length getter for deposit and withdrawal arrays
  /// in the previous contract, so we have to find them length manually.
  /// Used only during deployment
  function findArrayLength(
    ITornadoTreesV1 _tornadoTreesV1,
    string memory _type,
    uint256 _from, // most likely array length after the proposal has passed
    uint256 _step // optimal step size to find first match, approximately equals dispersion
  ) internal view virtual returns (uint256) {
    // Find the segment with correct array length
    bool direction = elementExists(_tornadoTreesV1, _type, _from);
    do {
      _from = direction ? _from + _step : _from - _step;
    } while (direction == elementExists(_tornadoTreesV1, _type, _from));
    uint256 high = direction ? _from : _from + _step;
    uint256 low = direction ? _from - _step : _from;
    uint256 mid = (high + low) / 2;

    // Perform a binary search in this segment
    while (low < mid) {
      if (elementExists(_tornadoTreesV1, _type, mid)) {
        low = mid;
      } else {
        high = mid;
      }
      mid = (low + high) / 2;
    }
    return mid + 1;
  }

  function elementExists(
    ITornadoTreesV1 _tornadoTreesV1,
    string memory _type,
    uint256 index
  ) public view returns (bool success) {
    // Try to get the element. If it succeeds the array length is higher, it it reverts the length is equal or lower
    (success, ) = address(_tornadoTreesV1).staticcall{ gas: 2500 }(abi.encodeWithSignature(_type, index));
  }

  function setTornadoProxyContract(address _tornadoProxy) external onlyGovernance {
    tornadoProxy = _tornadoProxy;
    emit ProxyUpdated(_tornadoProxy);
  }

  function setVerifierContract(IBatchTreeUpdateVerifier _treeUpdateVerifier) external onlyGovernance {
    treeUpdateVerifier = _treeUpdateVerifier;
    emit VerifierUpdated(address(_treeUpdateVerifier));
  }

  function blockNumber() public view virtual returns (uint256) {
    return block.number;
  }
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol



pragma solidity >=0.6.0 <0.8.0;

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/math/SafeMath.sol



pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: modulo by zero");
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

// File: @openzeppelin/contracts/utils/Context.sol



pragma solidity >=0.6.0 <0.8.0;

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

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

// File: @openzeppelin/contracts/access/Ownable.sol



pragma solidity >=0.6.0 <0.8.0;

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

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

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

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

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

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

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

// File: contracts/Miner.sol



pragma solidity ^0.6.0;






//import "torn-token/contracts/ENS.sol";

contract Miner is Ownable{
  using SafeMath for uint256;

  IVerifier public rewardVerifier;
  IVerifier public withdrawVerifier;
  IVerifier public treeUpdateVerifier;
  IRewardSwap public immutable rewardSwap; // OK
  address public governance;
  TornadoTrees public avacashTrees;

  mapping(bytes32 => bool) public accountNullifiers;
  mapping(bytes32 => bool) public rewardNullifiers;
  mapping(address => uint256) public rates;

  uint256 public accountCount;
  uint256 public constant ACCOUNT_ROOT_HISTORY_SIZE = 100;
  bytes32[ACCOUNT_ROOT_HISTORY_SIZE] public accountRoots;

  event NewAccount(bytes32 commitment, bytes32 nullifier, bytes encryptedAccount, uint256 index);
  event RateChanged(address instance, uint256 value);
  event VerifiersUpdated(address reward, address withdraw, address treeUpdate);
  event GovernanceTransferred(address indexed previousGovernance, address indexed newGovernance);

  struct TreeUpdateArgs {
    bytes32 oldRoot;
    bytes32 newRoot;
    bytes32 leaf;
    uint256 pathIndices;
  }

  struct AccountUpdate {
    bytes32 inputRoot;
    bytes32 inputNullifierHash;
    bytes32 outputRoot;
    uint256 outputPathIndices;
    bytes32 outputCommitment;
  }

  struct RewardExtData {
    address relayer;
    bytes encryptedAccount;
  }

  struct RewardArgs {
    uint256 rate;
    uint256 fee;
    address instance;
    bytes32 rewardNullifier;
    bytes32 extDataHash;
    bytes32 depositRoot;
    bytes32 withdrawalRoot;
    RewardExtData extData;
    AccountUpdate account;
  }

  struct WithdrawExtData {
    uint256 fee;
    address recipient;
    address relayer;
    bytes encryptedAccount;
  }

  struct WithdrawArgs {
    uint256 amount;
    bytes32 extDataHash;
    WithdrawExtData extData;
    AccountUpdate account;
  }

  struct Rate {
    address instance;
    uint256 value;
  }

  modifier onlyGovernance() {
    require(msg.sender == governance, "Only governance can perform this action");
    _;
  }

  constructor(
    address _rewardSwap,
    address _governance,
    address _avacashTrees,
    address[3] memory _verifiers,
    bytes32 _accountRoot, //29f9a0a07a22ab214d00aaa0190f54509e853f3119009baecb0035347606b0a9
    Rate[] memory _rates
  ) public {
    rewardSwap = IRewardSwap(_rewardSwap);
    governance = _governance;
    avacashTrees = TornadoTrees(_avacashTrees);

    // insert empty tree root without incrementing accountCount counter
    accountRoots[0] = _accountRoot;

    _setRates(_rates);
    // prettier-ignore
    _setVerifiers([
      IVerifier(_verifiers[0]),
      IVerifier(_verifiers[1]),
      IVerifier(_verifiers[2])
    ]);
  }

  /**
   * @dev Transfers governance of the contract to a new account (`newGovernance`).
   * Can only be called by the current governance.
   */
  function transferGovernance(address newGovernance) public virtual onlyGovernance {
      require(newGovernance != address(0), "CASH: new governance is the zero address");
      emit GovernanceTransferred(governance, newGovernance);
      governance = newGovernance;
  }

  function reward(bytes memory _proof, RewardArgs memory _args) public {
    reward(_proof, _args, new bytes(0), TreeUpdateArgs(0, 0, 0, 0));
  }

  function batchReward(bytes[] calldata _rewardArgs) external {
    for (uint256 i = 0; i < _rewardArgs.length; i++) {
      (bytes memory proof, RewardArgs memory args) = abi.decode(_rewardArgs[i], (bytes, RewardArgs));
      reward(proof, args);
    }
  }

  function reward(
    bytes memory _proof,
    RewardArgs memory _args,
    bytes memory _treeUpdateProof,
    TreeUpdateArgs memory _treeUpdateArgs
  ) public {
    validateAccountUpdate(_args.account, _treeUpdateProof, _treeUpdateArgs);
    avacashTrees.validateRoots(_args.depositRoot, _args.withdrawalRoot);
    require(_args.extDataHash == keccak248(abi.encode(_args.extData)), "Incorrect external data hash");
    require(_args.fee < 2**248, "Fee value out of range");
    require(_args.rate == rates[_args.instance] && _args.rate > 0, "Invalid reward rate");
    require(!rewardNullifiers[_args.rewardNullifier], "Reward has been already spent");
    require(
      rewardVerifier.verifyProof(
        _proof,
        [
          uint256(_args.rate),
          uint256(_args.fee),
          uint256(_args.instance),
          uint256(_args.rewardNullifier),
          uint256(_args.extDataHash),
          uint256(_args.account.inputRoot),
          uint256(_args.account.inputNullifierHash),
          uint256(_args.account.outputRoot),
          uint256(_args.account.outputPathIndices),
          uint256(_args.account.outputCommitment),
          uint256(_args.depositRoot),
          uint256(_args.withdrawalRoot)
        ]
      ),
      "Invalid reward proof"
    );

    accountNullifiers[_args.account.inputNullifierHash] = true;
    rewardNullifiers[_args.rewardNullifier] = true;
    insertAccountRoot(_args.account.inputRoot == getLastAccountRoot() ? _args.account.outputRoot : _treeUpdateArgs.newRoot);
    if (_args.fee > 0) {
      rewardSwap.swap(_args.extData.relayer, _args.fee);
    }

    emit NewAccount(
      _args.account.outputCommitment,
      _args.account.inputNullifierHash,
      _args.extData.encryptedAccount,
      accountCount - 1
    );
  }

  function withdraw(bytes memory _proof, WithdrawArgs memory _args) public {
    withdraw(_proof, _args, new bytes(0), TreeUpdateArgs(0, 0, 0, 0));
  }

  function withdraw(
    bytes memory _proof,
    WithdrawArgs memory _args,
    bytes memory _treeUpdateProof,
    TreeUpdateArgs memory _treeUpdateArgs
  ) public {
    validateAccountUpdate(_args.account, _treeUpdateProof, _treeUpdateArgs);
    require(_args.extDataHash == keccak248(abi.encode(_args.extData)), "Incorrect external data hash");
    require(_args.amount < 2**248, "Amount value out of range");
    require(
      withdrawVerifier.verifyProof(
        _proof,
        [
          uint256(_args.amount),
          uint256(_args.extDataHash),
          uint256(_args.account.inputRoot),
          uint256(_args.account.inputNullifierHash),
          uint256(_args.account.outputRoot),
          uint256(_args.account.outputPathIndices),
          uint256(_args.account.outputCommitment)
        ]
      ),
      "Invalid withdrawal proof"
    );

    insertAccountRoot(_args.account.inputRoot == getLastAccountRoot() ? _args.account.outputRoot : _treeUpdateArgs.newRoot);
    accountNullifiers[_args.account.inputNullifierHash] = true;
    // allow submitting noop withdrawals (amount == 0)
    uint256 amount = _args.amount.sub(_args.extData.fee, "Amount should be greater than fee");
    if (amount > 0) {
      rewardSwap.swap(_args.extData.recipient, amount);
    }
    // Note. The relayer swap rate always will be worse than estimated
    if (_args.extData.fee > 0) {
      rewardSwap.swap(_args.extData.relayer, _args.extData.fee);
    }

    emit NewAccount(
      _args.account.outputCommitment,
      _args.account.inputNullifierHash,
      _args.extData.encryptedAccount,
      accountCount - 1
    );
  }

  function setRates(Rate[] memory _rates) external onlyGovernance {
    _setRates(_rates);
  }

  function setVerifiers(IVerifier[3] calldata _verifiers) external onlyGovernance {
    _setVerifiers(_verifiers);
  }

  function setTornadoTreesContract(TornadoTrees _avacashTrees) external onlyGovernance {
    avacashTrees = _avacashTrees;
  }

  function setPoolWeight(uint256 _newWeight) external onlyGovernance {
    rewardSwap.setPoolWeight(_newWeight);
  }

  // ------VIEW-------

  /**
    @dev Whether the root is present in the root history
    */
  function isKnownAccountRoot(bytes32 _root, uint256 _index) public view returns (bool) {
    return _root != 0 && accountRoots[_index % ACCOUNT_ROOT_HISTORY_SIZE] == _root;
  }

  /**
    @dev Returns the last root
    */
  function getLastAccountRoot() public view returns (bytes32) {
    return accountRoots[accountCount % ACCOUNT_ROOT_HISTORY_SIZE];
  }

  // -----INTERNAL-------

  function keccak248(bytes memory _data) internal pure returns (bytes32) {
    return keccak256(_data) & 0x00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff;
  }

  function validateTreeUpdate(
    bytes memory _proof,
    TreeUpdateArgs memory _args,
    bytes32 _commitment
  ) internal view {
    require(_proof.length > 0, "Outdated account merkle root");
    require(_args.oldRoot == getLastAccountRoot(), "Outdated tree update merkle root");
    require(_args.leaf == _commitment, "Incorrect commitment inserted");
    require(_args.pathIndices == accountCount, "Incorrect account insert index");
    require(
      treeUpdateVerifier.verifyProof(
        _proof,
        [uint256(_args.oldRoot), uint256(_args.newRoot), uint256(_args.leaf), uint256(_args.pathIndices)]
      ),
      "Invalid tree update proof"
    );
  }

  function validateAccountUpdate(
    AccountUpdate memory _account,
    bytes memory _treeUpdateProof,
    TreeUpdateArgs memory _treeUpdateArgs
  ) internal view {
    require(!accountNullifiers[_account.inputNullifierHash], "Outdated account state");
    if (_account.inputRoot != getLastAccountRoot()) {
      // _account.outputPathIndices (= last tree leaf index) is always equal to root index in the history mapping
      // because we always generate a new root for each new leaf
      require(isKnownAccountRoot(_account.inputRoot, _account.outputPathIndices), "Invalid account root");
      validateTreeUpdate(_treeUpdateProof, _treeUpdateArgs, _account.outputCommitment);
    } else {
      require(_account.outputPathIndices == accountCount, "Incorrect account insert index");
    }
  }

  function insertAccountRoot(bytes32 _root) internal {
    accountRoots[++accountCount % ACCOUNT_ROOT_HISTORY_SIZE] = _root;
  }

  function _setRates(Rate[] memory _rates) internal {
    for (uint256 i = 0; i < _rates.length; i++) {
      require(_rates[i].value < 2**128, "Incorrect rate");
      address instance = _rates[i].instance;
      rates[instance] = _rates[i].value;
      emit RateChanged(instance, _rates[i].value);
    }
  }

  function _setVerifiers(IVerifier[3] memory _verifiers) internal {
    rewardVerifier = _verifiers[0];
    withdrawVerifier = _verifiers[1];
    treeUpdateVerifier = _verifiers[2];
    emit VerifiersUpdated(address(_verifiers[0]), address(_verifiers[1]), address(_verifiers[2]));
  }
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_rewardSwap","type":"address"},{"internalType":"address","name":"_governance","type":"address"},{"internalType":"address","name":"_avacashTrees","type":"address"},{"internalType":"address[3]","name":"_verifiers","type":"address[3]"},{"internalType":"bytes32","name":"_accountRoot","type":"bytes32"},{"components":[{"internalType":"address","name":"instance","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct Miner.Rate[]","name":"_rates","type":"tuple[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousGovernance","type":"address"},{"indexed":true,"internalType":"address","name":"newGovernance","type":"address"}],"name":"GovernanceTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"commitment","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"nullifier","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"encryptedAccount","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"}],"name":"NewAccount","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"instance","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"RateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"reward","type":"address"},{"indexed":false,"internalType":"address","name":"withdraw","type":"address"},{"indexed":false,"internalType":"address","name":"treeUpdate","type":"address"}],"name":"VerifiersUpdated","type":"event"},{"inputs":[],"name":"ACCOUNT_ROOT_HISTORY_SIZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accountCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"accountNullifiers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"accountRoots","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"avacashTrees","outputs":[{"internalType":"contract TornadoTrees","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"_rewardArgs","type":"bytes[]"}],"name":"batchReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getLastAccountRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"isKnownAccountRoot","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rates","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_proof","type":"bytes"},{"components":[{"internalType":"uint256","name":"rate","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"address","name":"instance","type":"address"},{"internalType":"bytes32","name":"rewardNullifier","type":"bytes32"},{"internalType":"bytes32","name":"extDataHash","type":"bytes32"},{"internalType":"bytes32","name":"depositRoot","type":"bytes32"},{"internalType":"bytes32","name":"withdrawalRoot","type":"bytes32"},{"components":[{"internalType":"address","name":"relayer","type":"address"},{"internalType":"bytes","name":"encryptedAccount","type":"bytes"}],"internalType":"struct Miner.RewardExtData","name":"extData","type":"tuple"},{"components":[{"internalType":"bytes32","name":"inputRoot","type":"bytes32"},{"internalType":"bytes32","name":"inputNullifierHash","type":"bytes32"},{"internalType":"bytes32","name":"outputRoot","type":"bytes32"},{"internalType":"uint256","name":"outputPathIndices","type":"uint256"},{"internalType":"bytes32","name":"outputCommitment","type":"bytes32"}],"internalType":"struct Miner.AccountUpdate","name":"account","type":"tuple"}],"internalType":"struct Miner.RewardArgs","name":"_args","type":"tuple"},{"internalType":"bytes","name":"_treeUpdateProof","type":"bytes"},{"components":[{"internalType":"bytes32","name":"oldRoot","type":"bytes32"},{"internalType":"bytes32","name":"newRoot","type":"bytes32"},{"internalType":"bytes32","name":"leaf","type":"bytes32"},{"internalType":"uint256","name":"pathIndices","type":"uint256"}],"internalType":"struct Miner.TreeUpdateArgs","name":"_treeUpdateArgs","type":"tuple"}],"name":"reward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_proof","type":"bytes"},{"components":[{"internalType":"uint256","name":"rate","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"address","name":"instance","type":"address"},{"internalType":"bytes32","name":"rewardNullifier","type":"bytes32"},{"internalType":"bytes32","name":"extDataHash","type":"bytes32"},{"internalType":"bytes32","name":"depositRoot","type":"bytes32"},{"internalType":"bytes32","name":"withdrawalRoot","type":"bytes32"},{"components":[{"internalType":"address","name":"relayer","type":"address"},{"internalType":"bytes","name":"encryptedAccount","type":"bytes"}],"internalType":"struct Miner.RewardExtData","name":"extData","type":"tuple"},{"components":[{"internalType":"bytes32","name":"inputRoot","type":"bytes32"},{"internalType":"bytes32","name":"inputNullifierHash","type":"bytes32"},{"internalType":"bytes32","name":"outputRoot","type":"bytes32"},{"internalType":"uint256","name":"outputPathIndices","type":"uint256"},{"internalType":"bytes32","name":"outputCommitment","type":"bytes32"}],"internalType":"struct Miner.AccountUpdate","name":"account","type":"tuple"}],"internalType":"struct Miner.RewardArgs","name":"_args","type":"tuple"}],"name":"reward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"rewardNullifiers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardSwap","outputs":[{"internalType":"contract IRewardSwap","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardVerifier","outputs":[{"internalType":"contract IVerifier","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newWeight","type":"uint256"}],"name":"setPoolWeight","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"instance","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct Miner.Rate[]","name":"_rates","type":"tuple[]"}],"name":"setRates","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract TornadoTrees","name":"_avacashTrees","type":"address"}],"name":"setTornadoTreesContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IVerifier[3]","name":"_verifiers","type":"address[3]"}],"name":"setVerifiers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newGovernance","type":"address"}],"name":"transferGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treeUpdateVerifier","outputs":[{"internalType":"contract IVerifier","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_proof","type":"bytes"},{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"extDataHash","type":"bytes32"},{"components":[{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"address","name":"relayer","type":"address"},{"internalType":"bytes","name":"encryptedAccount","type":"bytes"}],"internalType":"struct Miner.WithdrawExtData","name":"extData","type":"tuple"},{"components":[{"internalType":"bytes32","name":"inputRoot","type":"bytes32"},{"internalType":"bytes32","name":"inputNullifierHash","type":"bytes32"},{"internalType":"bytes32","name":"outputRoot","type":"bytes32"},{"internalType":"uint256","name":"outputPathIndices","type":"uint256"},{"internalType":"bytes32","name":"outputCommitment","type":"bytes32"}],"internalType":"struct Miner.AccountUpdate","name":"account","type":"tuple"}],"internalType":"struct Miner.WithdrawArgs","name":"_args","type":"tuple"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_proof","type":"bytes"},{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"extDataHash","type":"bytes32"},{"components":[{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"address","name":"relayer","type":"address"},{"internalType":"bytes","name":"encryptedAccount","type":"bytes"}],"internalType":"struct Miner.WithdrawExtData","name":"extData","type":"tuple"},{"components":[{"internalType":"bytes32","name":"inputRoot","type":"bytes32"},{"internalType":"bytes32","name":"inputNullifierHash","type":"bytes32"},{"internalType":"bytes32","name":"outputRoot","type":"bytes32"},{"internalType":"uint256","name":"outputPathIndices","type":"uint256"},{"internalType":"bytes32","name":"outputCommitment","type":"bytes32"}],"internalType":"struct Miner.AccountUpdate","name":"account","type":"tuple"}],"internalType":"struct Miner.WithdrawArgs","name":"_args","type":"tuple"},{"internalType":"bytes","name":"_treeUpdateProof","type":"bytes"},{"components":[{"internalType":"bytes32","name":"oldRoot","type":"bytes32"},{"internalType":"bytes32","name":"newRoot","type":"bytes32"},{"internalType":"bytes32","name":"leaf","type":"bytes32"},{"internalType":"uint256","name":"pathIndices","type":"uint256"}],"internalType":"struct Miner.TreeUpdateArgs","name":"_treeUpdateArgs","type":"tuple"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawVerifier","outputs":[{"internalType":"contract IVerifier","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60a06040523480156200001157600080fd5b50604051620047303803806200473083398181016040528101906200003791906200072b565b600062000049620002b760201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3508573ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b8152505084600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600a600060648110620001b057fe5b0181905550620001c681620002bf60201b60201c565b620002ab604051806060016040528085600060038110620001e357fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001856001600381106200022757fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001856002600381106200026b57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152506200041960201b60201c565b505050505050620009ec565b600033905090565b60005b81518110156200041557700100000000000000000000000000000000828281518110620002eb57fe5b602002602001015160200151106200033a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200033190620008a9565b60405180910390fd5b60008282815181106200034957fe5b60200260200101516000015190508282815181106200036457fe5b602002602001015160200151600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f14eccc240e5ba9a72e0ca955584fe1b0dca7104fce4dcb1296edbba8eea2da0481848481518110620003e257fe5b602002602001015160200151604051620003fe9291906200087c565b60405180910390a1508080600101915050620002c2565b5050565b806000600381106200042757fe5b6020020151600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806001600381106200047a57fe5b6020020151600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260038110620004cd57fe5b6020020151600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fcdb44c0a599b75813fe4a4593f032c7cfd38aa9e6461ba99a31aba3540b50210816000600381106200054157fe5b6020020151826001600381106200055457fe5b6020020151836002600381106200056757fe5b60200201516040516200057d939291906200083f565b60405180910390a150565b60008151905062000599816200099e565b92915050565b600082601f830112620005b157600080fd5b6003620005c8620005c282620008f9565b620008cb565b91508183856020840282011115620005df57600080fd5b60005b83811015620006135781620005f8888262000588565b845260208401935060208301925050600181019050620005e2565b5050505092915050565b600082601f8301126200062f57600080fd5b81516200064662000640826200091c565b620008cb565b915081818352602084019350602081019050838560408402820111156200066c57600080fd5b60005b83811015620006a05781620006858882620006c1565b8452602084019350604083019250506001810190506200066f565b5050505092915050565b600081519050620006bb81620009b8565b92915050565b600060408284031215620006d457600080fd5b620006e06040620008cb565b90506000620006f28482850162000588565b6000830152506020620007088482850162000714565b60208301525092915050565b6000815190506200072581620009d2565b92915050565b60008060008060008061010087890312156200074657600080fd5b60006200075689828a0162000588565b96505060206200076989828a0162000588565b95505060406200077c89828a0162000588565b94505060606200078f89828a016200059f565b93505060c0620007a289828a01620006aa565b92505060e087015167ffffffffffffffff811115620007c057600080fd5b620007ce89828a016200061d565b9150509295509295509295565b620007e68162000956565b82525050565b6000620007fb600e8362000945565b91507f496e636f727265637420726174650000000000000000000000000000000000006000830152602082019050919050565b620008398162000994565b82525050565b6000606082019050620008566000830186620007db565b620008656020830185620007db565b620008746040830184620007db565b949350505050565b6000604082019050620008936000830185620007db565b620008a260208301846200082e565b9392505050565b60006020820190508181036000830152620008c481620007ec565b9050919050565b6000604051905081810181811067ffffffffffffffff82111715620008ef57600080fd5b8060405250919050565b600067ffffffffffffffff8211156200091157600080fd5b602082029050919050565b600067ffffffffffffffff8211156200093457600080fd5b602082029050602081019050919050565b600082825260208201905092915050565b6000620009638262000974565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b620009a98162000956565b8114620009b557600080fd5b50565b620009c3816200096a565b8114620009cf57600080fd5b50565b620009dd8162000994565b8114620009e957600080fd5b50565b60805160601c613d1262000a1e60003980610a915280610bae528061133552806113fd528061185f5250613d126000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c80638da5cb5b116100f9578063d38bfff411610097578063e53c4cab11610071578063e53c4cab14610496578063f2fde38b146104b2578063f9406cf3146104ce578063f945a17e146104ec576101a9565b8063d38bfff414610440578063e2658c9c1461045c578063e4af29fc14610478576101a9565b8063a8734f0b116100d3578063a8734f0b146103a8578063b710cc7c146103d8578063c2c26775146103f4578063c6a4b05314610410576101a9565b80638da5cb5b1461033c57806397f098d71461035a5780639df59ccd1461038a576101a9565b8063637c09631161016657806377c55be51161014057806377c55be5146102ca5780637d9af914146102e657806380bc50cc14610302578063864eb1641461031e576101a9565b8063637c09631461028657806366e6e60d146102a2578063715018a6146102c0576101a9565b80631311b6e8146101ae57806334239b95146101cc57806342a660b0146101fc5780634a20de581461022c57806352ef8e961461024a5780635aa6e67514610268575b600080fd5b6101b6610508565b6040516101c39190613529565b60405180910390f35b6101e660048036038101906101e19190612964565b61052a565b6040516101f3919061350e565b60405180910390f35b61021660048036038101906102119190612964565b61054a565b604051610223919061350e565b60405180910390f35b61023461056a565b6040516102419190613666565b60405180910390f35b610252610590565b60405161025f9190613962565b60405180910390f35b610270610595565b60405161027d9190613493565b60405180910390f35b6102a0600480360381019061029b9190612a35565b6105bb565b005b6102aa610bac565b6040516102b7919061364b565b60405180910390f35b6102c8610bd0565b005b6102e460048036038101906102df91906128d1565b610d0a565b005b61030060048036038101906102fb9190612ae0565b610ddd565b005b61031c600480360381019061031791906129c9565b610e62565b005b610326610ee7565b6040516103339190613666565b60405180910390f35b610344610f0d565b6040516103519190613493565b60405180910390f35b610374600480360381019061036f919061298d565b610f36565b604051610381919061350e565b60405180910390f35b610392610f6a565b60405161039f9190613681565b60405180910390f35b6103c260048036038101906103bd9190612863565b610f90565b6040516103cf9190613962565b60405180910390f35b6103f260048036038101906103ed91906128fa565b610fa8565b005b61040e60048036038101906104099190612b4c565b611044565b005b61042a60048036038101906104259190612c20565b61151b565b6040516104379190613529565b60405180910390f35b61045a60048036038101906104559190612863565b611533565b005b61047660048036038101906104719190612bf7565b6116f3565b005b6104806117c7565b60405161048d9190613962565b60405180910390f35b6104b060048036038101906104ab9190612c20565b6117cd565b005b6104cc60048036038101906104c79190612863565b6118eb565b005b6104d6611a94565b6040516104e39190613666565b60405180910390f35b6105066004803603810190610501919061288c565b611aba565b005b6000600a60646009548161051857fe5b066064811061052357fe5b0154905090565b60076020528060005260406000206000915054906101000a900460ff1681565b60066020528060005260406000206000915054906101000a900460ff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606481565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6105cb8361010001518383611b1f565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c11b96818460a001518560c001516040518363ffffffff1660e01b8152600401610630929190613544565b60006040518083038186803b15801561064857600080fd5b505afa15801561065c573d6000803e3d6000fd5b5050505061068c8360e00151604051602001610678919061391e565b604051602081830303815290604052611c49565b8360800151146106d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106c89061377e565b60405180910390fd5b7f0100000000000000000000000000000000000000000000000000000000000000836020015110610737576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072e906137be565b60405180910390fd5b60086000846040015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548360000151148015610791575060008360000151115b6107d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c7906136be565b60405180910390fd5b600760008460600151815260200190815260200160002060009054906101000a900460ff1615610835576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082c906138de565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166372774f72856040518061018001604052808760000151815260200187602001518152602001876040015173ffffffffffffffffffffffffffffffffffffffff168152602001876060015160001c8152602001876080015160001c81526020018761010001516000015160001c81526020018761010001516020015160001c81526020018761010001516040015160001c81526020018761010001516060015181526020018761010001516080015160001c81526020018760a0015160001c81526020018760c0015160001c8152506040518363ffffffff1660e01b815260040161095a9291906135b9565b60206040518083038186803b15801561097257600080fd5b505afa158015610986573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109aa919061293b565b6109e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e09061371e565b60405180910390fd5b60016006600085610100015160200151815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600760008560600151815260200190815260200160002060006101000a81548160ff021916908315150217905550610a82610a59610508565b8461010001516000015114610a72578160200151610a7d565b836101000151604001515b611c7e565b600083602001511115610b4a577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d004f0f78460e001516000015185602001516040518363ffffffff1660e01b8152600401610af69291906134e5565b602060405180830381600087803b158015610b1057600080fd5b505af1158015610b24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b489190612c49565b505b7fbd4a5ca11c6f082fd6d00dc9d1dced6ab22490039bc36154bfa748bf2bf7435583610100015160800151846101000151602001518560e0015160200151600160095403604051610b9e949392919061356d565b60405180910390a150505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b610bd8611cac565b73ffffffffffffffffffffffffffffffffffffffff16610bf6610f0d565b73ffffffffffffffffffffffffffffffffffffffff1614610c4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c439061387e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d91906137de565b60405180910390fd5b610dda816003806020026040519081016040528092919082600360200280828437600081840152601f19601f820116905080830192505050505050611cb4565b50565b610e5e8282600067ffffffffffffffff81118015610dfa57600080fd5b506040519080825280601f01601f191660200182016040528015610e2d5781602001600182028036833780820191505090505b5060405180608001604052806000801b81526020016000801b81526020016000801b81526020016000815250611044565b5050565b610ee38282600067ffffffffffffffff81118015610e7f57600080fd5b506040519080825280601f01601f191660200182016040528015610eb25781602001600182028036833780820191505090505b5060405180608001604052806000801b81526020016000801b81526020016000801b815260200160008152506105bb565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060001b8314158015610f62575082600a60648481610f5357fe5b0660648110610f5e57fe5b0154145b905092915050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60086020528060005260406000206000915090505481565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611038576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102f906137de565b60405180910390fd5b61104181611e1b565b50565b61105383606001518383611b1f565b61107f836040015160405160200161106b9190613940565b604051602081830303815290604052611c49565b8360200151146110c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bb9061377e565b60405180910390fd5b7f010000000000000000000000000000000000000000000000000000000000000083600001511061112a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611121906138fe565b60405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663598da1d1856040518060e0016040528087600001518152602001876020015160001c815260200187606001516000015160001c815260200187606001516020015160001c815260200187606001516040015160001c8152602001876060015160600151815260200187606001516080015160001c8152506040518363ffffffff1660e01b81526004016111f892919061361a565b60206040518083038186803b15801561121057600080fd5b505afa158015611224573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611248919061293b565b611287576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127e9061385e565b60405180910390fd5b6112b9611292610508565b846060015160000151146112aa5781602001516112b4565b8360600151604001515b611c7e565b600160066000856060015160200151815260200190815260200160002060006101000a81548160ff0219169083151502179055506000611328846040015160000151604051806060016040528060218152602001613cbc602191398660000151611f6a9092919063ffffffff16565b905060008111156113ea577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d004f0f7856040015160200151836040518363ffffffff1660e01b81526004016113969291906134e5565b602060405180830381600087803b1580156113b057600080fd5b505af11580156113c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e89190612c49565b505b600084604001516000015111156114ba577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d004f0f78560400151604001518660400151600001516040518363ffffffff1660e01b81526004016114669291906134e5565b602060405180830381600087803b15801561148057600080fd5b505af1158015611494573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b89190612c49565b505b7fbd4a5ca11c6f082fd6d00dc9d1dced6ab22490039bc36154bfa748bf2bf7435584606001516080015185606001516020015186604001516060015160016009540360405161150c949392919061356d565b60405180910390a15050505050565b600a816064811061152857fe5b016000915090505481565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ba906137de565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611633576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162a9061373e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f5f56bee8cffbe9a78652a74a60705edede02af10b0bbb888ca44b79a0d42ce8060405160405180910390a380600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611783576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177a906137de565b60405180910390fd5b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60095481565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461185d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611854906137de565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663e53c4cab826040518263ffffffff1660e01b81526004016118b69190613962565b600060405180830381600087803b1580156118d057600080fd5b505af11580156118e4573d6000803e3d6000fd5b5050505050565b6118f3611cac565b73ffffffffffffffffffffffffffffffffffffffff16611911610f0d565b73ffffffffffffffffffffffffffffffffffffffff1614611967576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195e9061387e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ce906136de565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60005b82829050811015611b1a576060611ad2612208565b848484818110611ade57fe5b9050602002810190611af0919061397d565b810190611afd91906129c9565b91509150611b0b8282610e62565b50508080600101915050611abd565b505050565b600660008460200151815260200190815260200160002060009054906101000a900460ff1615611b84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7b9061389e565b60405180910390fd5b611b8c610508565b836000015114611bfb57611ba883600001518460600151610f36565b611be7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bde906136fe565b60405180910390fd5b611bf682828560800151611fbf565b611c44565b600954836060015114611c43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3a9061379e565b60405180910390fd5b5b505050565b60007effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b8280519060200120169050919050565b80600a606460096000815460010191905081905581611c9957fe5b0660648110611ca457fe5b018190555050565b600033905090565b80600060038110611cc157fe5b6020020151600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600160038110611d1357fe5b6020020151600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260038110611d6557fe5b6020020151600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fcdb44c0a599b75813fe4a4593f032c7cfd38aa9e6461ba99a31aba3540b5021081600060038110611dd857fe5b602002015182600160038110611dea57fe5b602002015183600260038110611dfc57fe5b6020020151604051611e10939291906134ae565b60405180910390a150565b60005b8151811015611f6657700100000000000000000000000000000000828281518110611e4557fe5b60200260200101516020015110611e91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e88906138be565b60405180910390fd5b6000828281518110611e9f57fe5b6020026020010151600001519050828281518110611eb957fe5b602002602001015160200151600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f14eccc240e5ba9a72e0ca955584fe1b0dca7104fce4dcb1296edbba8eea2da0481848481518110611f3657fe5b602002602001015160200151604051611f509291906134e5565b60405180910390a1508080600101915050611e1e565b5050565b6000838311158290611fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa9919061369c565b60405180910390fd5b5082840390509392505050565b6000835111612003576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffa906137fe565b60405180910390fd5b61200b610508565b826000015114612050576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120479061375e565b60405180910390fd5b80826040015114612096576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208d9061381e565b60405180910390fd5b6009548260600151146120de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d59061379e565b60405180910390fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636bf062b2846040518060800160405280866000015160001c8152602001866020015160001c8152602001866040015160001c815260200186606001518152506040518363ffffffff1660e01b81526004016121749291906135ea565b60206040518083038186803b15801561218c57600080fd5b505afa1580156121a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121c4919061293b565b612203576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fa9061383e565b60405180910390fd5b505050565b6040518061012001604052806000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000801916815260200160008019168152602001600080191681526020016000801916815260200161226f612282565b815260200161227c6122b2565b81525090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b6040518060a0016040528060008019168152602001600080191681526020016000801916815260200160008152602001600080191681525090565b6000813590506122fc81613c48565b92915050565b60008083601f84011261231457600080fd5b8235905067ffffffffffffffff81111561232d57600080fd5b60208301915083602082028301111561234557600080fd5b9250929050565b60008190508260206003028201111561236457600080fd5b92915050565b600082601f83011261237b57600080fd5b813561238e61238982613a01565b6139d4565b915081818352602084019350602081019050838560408402820111156123b357600080fd5b60005b838110156123e357816123c98882612508565b8452602084019350604083019250506001810190506123b6565b5050505092915050565b6000815190506123fc81613c5f565b92915050565b60008135905061241181613c76565b92915050565b600082601f83011261242857600080fd5b813561243b61243682613a29565b6139d4565b9150808252602083016020830185838301111561245757600080fd5b612462838284613bf5565b50505092915050565b60008135905061247a81613c8d565b92915050565b600060a0828403121561249257600080fd5b61249c60a06139d4565b905060006124ac84828501612402565b60008301525060206124c084828501612402565b60208301525060406124d484828501612402565b60408301525060606124e884828501612839565b60608301525060806124fc84828501612402565b60808301525092915050565b60006040828403121561251a57600080fd5b61252460406139d4565b90506000612534848285016122ed565b600083015250602061254884828501612839565b60208301525092915050565b60006101a0828403121561256757600080fd5b6125726101206139d4565b9050600061258284828501612839565b600083015250602061259684828501612839565b60208301525060406125aa848285016122ed565b60408301525060606125be84828501612402565b60608301525060806125d284828501612402565b60808301525060a06125e684828501612402565b60a08301525060c06125fa84828501612402565b60c08301525060e082013567ffffffffffffffff81111561261a57600080fd5b61262684828501612648565b60e08301525061010061263b84828501612480565b6101008301525092915050565b60006040828403121561265a57600080fd5b61266460406139d4565b90506000612674848285016122ed565b600083015250602082013567ffffffffffffffff81111561269457600080fd5b6126a084828501612417565b60208301525092915050565b6000608082840312156126be57600080fd5b6126c860806139d4565b905060006126d884828501612402565b60008301525060206126ec84828501612402565b602083015250604061270084828501612402565b604083015250606061271484828501612839565b60608301525092915050565b6000610100828403121561273357600080fd5b61273d60806139d4565b9050600061274d84828501612839565b600083015250602061276184828501612402565b602083015250604082013567ffffffffffffffff81111561278157600080fd5b61278d848285016127ad565b60408301525060606127a184828501612480565b60608301525092915050565b6000608082840312156127bf57600080fd5b6127c960806139d4565b905060006127d984828501612839565b60008301525060206127ed848285016122ed565b6020830152506040612801848285016122ed565b604083015250606082013567ffffffffffffffff81111561282157600080fd5b61282d84828501612417565b60608301525092915050565b60008135905061284881613ca4565b92915050565b60008151905061285d81613ca4565b92915050565b60006020828403121561287557600080fd5b6000612883848285016122ed565b91505092915050565b6000806020838503121561289f57600080fd5b600083013567ffffffffffffffff8111156128b957600080fd5b6128c585828601612302565b92509250509250929050565b6000606082840312156128e357600080fd5b60006128f18482850161234c565b91505092915050565b60006020828403121561290c57600080fd5b600082013567ffffffffffffffff81111561292657600080fd5b6129328482850161236a565b91505092915050565b60006020828403121561294d57600080fd5b600061295b848285016123ed565b91505092915050565b60006020828403121561297657600080fd5b600061298484828501612402565b91505092915050565b600080604083850312156129a057600080fd5b60006129ae85828601612402565b92505060206129bf85828601612839565b9150509250929050565b600080604083850312156129dc57600080fd5b600083013567ffffffffffffffff8111156129f657600080fd5b612a0285828601612417565b925050602083013567ffffffffffffffff811115612a1f57600080fd5b612a2b85828601612554565b9150509250929050565b60008060008060e08587031215612a4b57600080fd5b600085013567ffffffffffffffff811115612a6557600080fd5b612a7187828801612417565b945050602085013567ffffffffffffffff811115612a8e57600080fd5b612a9a87828801612554565b935050604085013567ffffffffffffffff811115612ab757600080fd5b612ac387828801612417565b9250506060612ad4878288016126ac565b91505092959194509250565b60008060408385031215612af357600080fd5b600083013567ffffffffffffffff811115612b0d57600080fd5b612b1985828601612417565b925050602083013567ffffffffffffffff811115612b3657600080fd5b612b4285828601612720565b9150509250929050565b60008060008060e08587031215612b6257600080fd5b600085013567ffffffffffffffff811115612b7c57600080fd5b612b8887828801612417565b945050602085013567ffffffffffffffff811115612ba557600080fd5b612bb187828801612720565b935050604085013567ffffffffffffffff811115612bce57600080fd5b612bda87828801612417565b9250506060612beb878288016126ac565b91505092959194509250565b600060208284031215612c0957600080fd5b6000612c178482850161246b565b91505092915050565b600060208284031215612c3257600080fd5b6000612c4084828501612839565b91505092915050565b600060208284031215612c5b57600080fd5b6000612c698482850161284e565b91505092915050565b6000612c7e8383613475565b60208301905092915050565b612c9381613b25565b82525050565b612ca281613b25565b82525050565b612cb181613a73565b612cbb8184613ad1565b9250612cc682613a55565b8060005b83811015612cf7578151612cde8782612c72565b9650612ce983613aaa565b925050600181019050612cca565b505050505050565b612d0881613a7e565b612d128184613adc565b9250612d1d82613a5f565b8060005b83811015612d4e578151612d358782612c72565b9650612d4083613ab7565b925050600181019050612d21565b505050505050565b612d5f81613a89565b612d698184613ae7565b9250612d7482613a69565b8060005b83811015612da5578151612d8c8782612c72565b9650612d9783613ac4565b925050600181019050612d78565b505050505050565b612db681613b37565b82525050565b612dc581613b43565b82525050565b6000612dd682613a94565b612de08185613af2565b9350612df0818560208601613c04565b612df981613c37565b840191505092915050565b6000612e0f82613a94565b612e198185613b03565b9350612e29818560208601613c04565b612e3281613c37565b840191505092915050565b612e4681613b89565b82525050565b612e5581613bad565b82525050565b612e6481613bd1565b82525050565b6000612e7582613a9f565b612e7f8185613b14565b9350612e8f818560208601613c04565b612e9881613c37565b840191505092915050565b6000612eb0601383613b14565b91507f496e76616c6964207265776172642072617465000000000000000000000000006000830152602082019050919050565b6000612ef0602683613b14565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612f56601483613b14565b91507f496e76616c6964206163636f756e7420726f6f740000000000000000000000006000830152602082019050919050565b6000612f96601483613b14565b91507f496e76616c6964207265776172642070726f6f660000000000000000000000006000830152602082019050919050565b6000612fd6602883613b14565b91507f434153483a206e657720676f7665726e616e636520697320746865207a65726f60008301527f20616464726573730000000000000000000000000000000000000000000000006020830152604082019050919050565b600061303c602083613b14565b91507f4f75746461746564207472656520757064617465206d65726b6c6520726f6f746000830152602082019050919050565b600061307c601c83613b14565b91507f496e636f72726563742065787465726e616c20646174612068617368000000006000830152602082019050919050565b60006130bc601e83613b14565b91507f496e636f7272656374206163636f756e7420696e7365727420696e64657800006000830152602082019050919050565b60006130fc601683613b14565b91507f4665652076616c7565206f7574206f662072616e6765000000000000000000006000830152602082019050919050565b600061313c602783613b14565b91507f4f6e6c7920676f7665726e616e63652063616e20706572666f726d207468697360008301527f20616374696f6e000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006131a2601c83613b14565b91507f4f75746461746564206163636f756e74206d65726b6c6520726f6f74000000006000830152602082019050919050565b60006131e2601d83613b14565b91507f496e636f727265637420636f6d6d69746d656e7420696e7365727465640000006000830152602082019050919050565b6000613222601983613b14565b91507f496e76616c69642074726565207570646174652070726f6f66000000000000006000830152602082019050919050565b6000613262601883613b14565b91507f496e76616c6964207769746864726177616c2070726f6f6600000000000000006000830152602082019050919050565b60006132a2602083613b14565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006132e2601683613b14565b91507f4f75746461746564206163636f756e74207374617465000000000000000000006000830152602082019050919050565b6000613322600e83613b14565b91507f496e636f727265637420726174650000000000000000000000000000000000006000830152602082019050919050565b6000613362601d83613b14565b91507f52657761726420686173206265656e20616c7265616479207370656e740000006000830152602082019050919050565b60006133a2601983613b14565b91507f416d6f756e742076616c7565206f7574206f662072616e6765000000000000006000830152602082019050919050565b60006040830160008301516133ed6000860182612c8a565b50602083015184820360208601526134058282612dcb565b9150508091505092915050565b600060808301600083015161342a6000860182613475565b50602083015161343d6020860182612c8a565b5060408301516134506040860182612c8a565b50606083015184820360608601526134688282612dcb565b9150508091505092915050565b61347e81613b7f565b82525050565b61348d81613b7f565b82525050565b60006020820190506134a86000830184612c99565b92915050565b60006060820190506134c36000830186612c99565b6134d06020830185612c99565b6134dd6040830184612c99565b949350505050565b60006040820190506134fa6000830185612c99565b6135076020830184613484565b9392505050565b60006020820190506135236000830184612dad565b92915050565b600060208201905061353e6000830184612dbc565b92915050565b60006040820190506135596000830185612dbc565b6135666020830184612dbc565b9392505050565b60006080820190506135826000830187612dbc565b61358f6020830186612dbc565b81810360408301526135a18185612e04565b90506135b06060830184613484565b95945050505050565b60006101a08201905081810360008301526135d48185612e04565b90506135e36020830184612ca8565b9392505050565b600060a08201905081810360008301526136048185612e04565b90506136136020830184612cff565b9392505050565b60006101008201905081810360008301526136358185612e04565b90506136446020830184612d56565b9392505050565b60006020820190506136606000830184612e3d565b92915050565b600060208201905061367b6000830184612e4c565b92915050565b60006020820190506136966000830184612e5b565b92915050565b600060208201905081810360008301526136b68184612e6a565b905092915050565b600060208201905081810360008301526136d781612ea3565b9050919050565b600060208201905081810360008301526136f781612ee3565b9050919050565b6000602082019050818103600083015261371781612f49565b9050919050565b6000602082019050818103600083015261373781612f89565b9050919050565b6000602082019050818103600083015261375781612fc9565b9050919050565b600060208201905081810360008301526137778161302f565b9050919050565b600060208201905081810360008301526137978161306f565b9050919050565b600060208201905081810360008301526137b7816130af565b9050919050565b600060208201905081810360008301526137d7816130ef565b9050919050565b600060208201905081810360008301526137f78161312f565b9050919050565b6000602082019050818103600083015261381781613195565b9050919050565b60006020820190508181036000830152613837816131d5565b9050919050565b6000602082019050818103600083015261385781613215565b9050919050565b6000602082019050818103600083015261387781613255565b9050919050565b6000602082019050818103600083015261389781613295565b9050919050565b600060208201905081810360008301526138b7816132d5565b9050919050565b600060208201905081810360008301526138d781613315565b9050919050565b600060208201905081810360008301526138f781613355565b9050919050565b6000602082019050818103600083015261391781613395565b9050919050565b6000602082019050818103600083015261393881846133d5565b905092915050565b6000602082019050818103600083015261395a8184613412565b905092915050565b60006020820190506139776000830184613484565b92915050565b6000808335600160200384360303811261399657600080fd5b80840192508235915067ffffffffffffffff8211156139b457600080fd5b6020830192506001820236038313156139cc57600080fd5b509250929050565b6000604051905081810181811067ffffffffffffffff821117156139f757600080fd5b8060405250919050565b600067ffffffffffffffff821115613a1857600080fd5b602082029050602081019050919050565b600067ffffffffffffffff821115613a4057600080fd5b601f19601f8301169050602081019050919050565b6000819050919050565b6000819050919050565b6000819050919050565b6000600c9050919050565b600060049050919050565b600060079050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600081905092915050565b600081905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b6000613b3082613b5f565b9050919050565b60008115159050919050565b6000819050919050565b6000613b5882613b25565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000613b9482613b9b565b9050919050565b6000613ba682613b5f565b9050919050565b6000613bb882613bbf565b9050919050565b6000613bca82613b5f565b9050919050565b6000613bdc82613be3565b9050919050565b6000613bee82613b5f565b9050919050565b82818337600083830152505050565b60005b83811015613c22578082015181840152602081019050613c07565b83811115613c31576000848401525b50505050565b6000601f19601f8301169050919050565b613c5181613b25565b8114613c5c57600080fd5b50565b613c6881613b37565b8114613c7357600080fd5b50565b613c7f81613b43565b8114613c8a57600080fd5b50565b613c9681613b4d565b8114613ca157600080fd5b50565b613cad81613b7f565b8114613cb857600080fd5b5056fe416d6f756e742073686f756c642062652067726561746572207468616e20666565a26469706673582212203c1cfdc9132898b675dfb8b779ea642b14590df14f19edc5d3e4aa346d1e23e664736f6c634300060c00330000000000000000000000007ded2a4088eb233576c5a54e3e390aad4fb2fd6a000000000000000000000000827dfa07acd602f59e3b71b36ca0d158786b6471000000000000000000000000438f5071e2f7b90599aab4d82f4d24d0ecfde106000000000000000000000000e4ce9135a078a53a7190eb6dd6e23d321ca24790000000000000000000000000fac43e2b4c351decaa82b115662445352caeb73b0000000000000000000000007c7e25ac63e220075624575d7dc09333f47df4df29f9a0a07a22ab214d00aaa0190f54509e853f3119009baecb0035347606b0a900000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000c4633dab621356f1b7432a9f0a166e359b8911d4000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000078359f9d6dbc24221a5027f9b6a89931922a0c0c000000000000000000000000000000000000000000000000000000000000001400000000000000000000000057a5f89999ab9ffcb7bb0133f49b28505a8f62b20000000000000000000000000000000000000000000000000000000000000032

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

0000000000000000000000007ded2a4088eb233576c5a54e3e390aad4fb2fd6a000000000000000000000000827dfa07acd602f59e3b71b36ca0d158786b6471000000000000000000000000438f5071e2f7b90599aab4d82f4d24d0ecfde106000000000000000000000000e4ce9135a078a53a7190eb6dd6e23d321ca24790000000000000000000000000fac43e2b4c351decaa82b115662445352caeb73b0000000000000000000000007c7e25ac63e220075624575d7dc09333f47df4df29f9a0a07a22ab214d00aaa0190f54509e853f3119009baecb0035347606b0a900000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000c4633dab621356f1b7432a9f0a166e359b8911d4000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000078359f9d6dbc24221a5027f9b6a89931922a0c0c000000000000000000000000000000000000000000000000000000000000001400000000000000000000000057a5f89999ab9ffcb7bb0133f49b28505a8f62b20000000000000000000000000000000000000000000000000000000000000032

-----Decoded View---------------
Arg [0] : _rewardSwap (address): 0x7ded2a4088eb233576c5a54e3e390aad4fb2fd6a
Arg [1] : _governance (address): 0x827dfa07acd602f59e3b71b36ca0d158786b6471
Arg [2] : _avacashTrees (address): 0x438f5071e2f7b90599aab4d82f4d24d0ecfde106
Arg [3] : _verifiers (address[3]): 0xe4ce9135a078a53a7190eb6dd6e23d321ca24790,0xfac43e2b4c351decaa82b115662445352caeb73b,0x7c7e25ac63e220075624575d7dc09333f47df4df
Arg [4] : _accountRoot (bytes32): 0x29f9a0a07a22ab214d00aaa0190f54509e853f3119009baecb0035347606b0a9
Arg [5] : _rates (tuple[]): System.Object,System.Object,System.Object

-----Encoded View---------------
15 Constructor Arguments found :
Arg [0] : 0000000000000000000000007ded2a4088eb233576c5a54e3e390aad4fb2fd6a
Arg [1] : 000000000000000000000000827dfa07acd602f59e3b71b36ca0d158786b6471
Arg [2] : 000000000000000000000000438f5071e2f7b90599aab4d82f4d24d0ecfde106
Arg [3] : 000000000000000000000000e4ce9135a078a53a7190eb6dd6e23d321ca24790
Arg [4] : 000000000000000000000000fac43e2b4c351decaa82b115662445352caeb73b
Arg [5] : 0000000000000000000000007c7e25ac63e220075624575d7dc09333f47df4df
Arg [6] : 29f9a0a07a22ab214d00aaa0190f54509e853f3119009baecb0035347606b0a9
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [9] : 000000000000000000000000c4633dab621356f1b7432a9f0a166e359b8911d4
Arg [10] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [11] : 00000000000000000000000078359f9d6dbc24221a5027f9b6a89931922a0c0c
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [13] : 00000000000000000000000057a5f89999ab9ffcb7bb0133f49b28505a8f62b2
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000032


Deployed ByteCode Sourcemap

30789:10646:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38839:134;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31139:48;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31085:49;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30926:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31271:55;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31016:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34363:1827;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30966:39;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30118:148;;;:::i;:::-;;38132:118;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36196:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33946:145;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30888:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29467:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38609:177;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31046:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31192:40;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38032:94;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36353:1673;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31331:54;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33667:273;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38256:126;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31239:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38388:116;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30421:244;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30852:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34097:260;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38839:134;38890:7;38913:12;31323:3;38926:12;;:40;;;;;;38913:54;;;;;;;;;38906:61;;38839:134;:::o;31139:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;31085:49::-;;;;;;;;;;;;;;;;;;;;;;:::o;30926:35::-;;;;;;;;;;;;;:::o;31271:55::-;31323:3;31271:55;:::o;31016:25::-;;;;;;;;;;;;;:::o;34363:1827::-;34534:71;34556:5;:13;;;34571:16;34589:15;34534:21;:71::i;:::-;34612:12;;;;;;;;;;;:26;;;34639:5;:17;;;34658:5;:20;;;34612:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34715:36;34736:5;:13;;;34725:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;34715:9;:36::i;:::-;34694:5;:17;;;:57;34686:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;34811:6;34799:5;:9;;;:18;34791:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;34873:5;:21;34879:5;:14;;;34873:21;;;;;;;;;;;;;;;;34859:5;:10;;;:35;:53;;;;;34911:1;34898:5;:10;;;:14;34859:53;34851:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;34952:16;:39;34969:5;:21;;;34952:39;;;;;;;;;;;;;;;;;;;;;34951:40;34943:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;35048:14;;;;;;;;;;;:26;;;35085:6;35048:586;;;;;;;;35123:5;:10;;;35048:586;;;;35155:5;:9;;;35048:586;;;;35186:5;:14;;;35178:23;;35048:586;;;;35222:5;:21;;;35214:30;;35048:586;;;;35265:5;:17;;;35257:26;;35048:586;;;;35304:5;:13;;;:23;;;35296:32;;35048:586;;;;35349:5;:13;;;:32;;;35341:41;;35048:586;;;;35403:5;:13;;;:24;;;35395:33;;35048:586;;;;35449:5;:13;;;:31;;;35048:586;;;;35502:5;:13;;;:30;;;35494:39;;35048:586;;;;35554:5;:17;;;35546:26;;35048:586;;;;35593:5;:20;;;35585:29;;35048:586;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35032:640;;;;;;;;;;;;:::i;:::-;;;;;;;;;35735:4;35681:17;:51;35699:5;:13;;;:32;;;35681:51;;;;;;;;;;;;:58;;;;;;;;;;;;;;;;;;35788:4;35746:16;:39;35763:5;:21;;;35746:39;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;35799:119;35844:20;:18;:20::i;:::-;35817:5;:13;;;:23;;;:47;:100;;35894:15;:23;;;35817:100;;;35867:5;:13;;;:24;;;35817:100;35799:17;:119::i;:::-;35941:1;35929:5;:9;;;:13;35925:85;;;35953:10;:15;;;35969:5;:13;;;:21;;;35992:5;:9;;;35953:49;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;35925:85;36023:161;36042:5;:13;;;:30;;;36081:5;:13;;;:32;;;36122:5;:13;;;:30;;;36176:1;36161:12;;:16;36023:161;;;;;;;;;:::i;:::-;;;;;;;;34363:1827;;;;:::o;30966:39::-;;;:::o;30118:148::-;29698:12;:10;:12::i;:::-;29687:23;;:7;:5;:7::i;:::-;:23;;;29679:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30225:1:::1;30188:40;;30209:6;::::0;::::1;;;;;;;;30188:40;;;;;;;;;;;;30256:1;30239:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;30118:148::o:0;38132:118::-;32757:10;;;;;;;;;;;32743:24;;:10;:24;;;32735:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;38219:25:::1;38233:10;38219:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:13;:25::i;:::-;38132:118:::0;:::o;36196:151::-;36276:65;36285:6;36293:5;36310:1;36300:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36314:26;;;;;;;;36329:1;36314:26;;;;;;36332:1;36314:26;;;;;;36335:1;36314:26;;;;;;36338:1;36314:26;;;36276:8;:65::i;:::-;36196:151;;:::o;33946:145::-;34022:63;34029:6;34037:5;34054:1;34044:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34058:26;;;;;;;;34073:1;34058:26;;;;;;34076:1;34058:26;;;;;;34079:1;34058:26;;;;;;34082:1;34058:26;;;34022:6;:63::i;:::-;33946:145;;:::o;30888:33::-;;;;;;;;;;;;;:::o;29467:87::-;29513:7;29540:6;;;;;;;;;;;29533:13;;29467:87;:::o;38609:177::-;38689:4;38718:1;38709:10;;:5;:10;;:71;;;;;38775:5;38723:12;31323:3;38736:6;:34;;;;;;38723:48;;;;;;;;;:57;38709:71;38702:78;;38609:177;;;;:::o;31046:32::-;;;;;;;;;;;;;:::o;31192:40::-;;;;;;;;;;;;;;;;;:::o;38032:94::-;32757:10;;;;;;;;;;;32743:24;;:10;:24;;;32735:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;38103:17:::1;38113:6;38103:9;:17::i;:::-;38032:94:::0;:::o;36353:1673::-;36528:71;36550:5;:13;;;36565:16;36583:15;36528:21;:71::i;:::-;36635:36;36656:5;:13;;;36645:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;36635:9;:36::i;:::-;36614:5;:17;;;:57;36606:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;36734:6;36719:5;:12;;;:21;36711:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;36793:16;;;;;;;;;;;:28;;;36832:6;36793:399;;;;;;;;36870:5;:12;;;36793:399;;;;36904:5;:17;;;36896:26;;36793:399;;;;36943:5;:13;;;:23;;;36935:32;;36793:399;;;;36988:5;:13;;;:32;;;36980:41;;36793:399;;;;37042:5;:13;;;:24;;;37034:33;;36793:399;;;;37088:5;:13;;;:31;;;36793:399;;;;37141:5;:13;;;:30;;;37133:39;;36793:399;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36777:457;;;;;;;;;;;;:::i;:::-;;;;;;;;;37243:119;37288:20;:18;:20::i;:::-;37261:5;:13;;;:23;;;:47;:100;;37338:15;:23;;;37261:100;;;37311:5;:13;;;:24;;;37261:100;37243:17;:119::i;:::-;37423:4;37369:17;:51;37387:5;:13;;;:32;;;37369:51;;;;;;;;;;;;:58;;;;;;;;;;;;;;;;;;37490:14;37507:72;37524:5;:13;;;:17;;;37507:72;;;;;;;;;;;;;;;;;:5;:12;;;:16;;:72;;;;;:::i;:::-;37490:89;;37599:1;37590:6;:10;37586:81;;;37611:10;:15;;;37627:5;:13;;;:23;;;37652:6;37611:48;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;37586:81;37769:1;37749:5;:13;;;:17;;;:21;37745:101;;;37781:10;:15;;;37797:5;:13;;;:21;;;37820:5;:13;;;:17;;;37781:57;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;37745:101;37859:161;37878:5;:13;;;:30;;;37917:5;:13;;;:32;;;37958:5;:13;;;:30;;;38012:1;37997:12;;:16;37859:161;;;;;;;;;:::i;:::-;;;;;;;;36353:1673;;;;;:::o;31331:54::-;;;;;;;;;;;;;;;;;;:::o;33667:273::-;32757:10;;;;;;;;;;;32743:24;;:10;:24;;;32735:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;33790:1:::1;33765:27;;:13;:27;;;;33757:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;33885:13;33851:48;;33873:10;;;;;;;;;;;33851:48;;;;;;;;;;;;33921:13;33908:10;;:26;;;;;;;;;;;;;;;;;;33667:273:::0;:::o;38256:126::-;32757:10;;;;;;;;;;;32743:24;;:10;:24;;;32735:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;38363:13:::1;38348:12;;:28;;;;;;;;;;;;;;;;;;38256:126:::0;:::o;31239:27::-;;;;:::o;38388:116::-;32757:10;;;;;;;;;;;32743:24;;:10;:24;;;32735:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;38462:10:::1;:24;;;38487:10;38462:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;38388:116:::0;:::o;30421:244::-;29698:12;:10;:12::i;:::-;29687:23;;:7;:5;:7::i;:::-;:23;;;29679:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30530:1:::1;30510:22;;:8;:22;;;;30502:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30620:8;30591:38;;30612:6;::::0;::::1;;;;;;;;30591:38;;;;;;;;;;;;30649:8;30640:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;30421:244:::0;:::o;30852:31::-;;;;;;;;;;;;;:::o;34097:260::-;34169:9;34164:188;34188:11;;:18;;34184:1;:22;34164:188;;;34223:18;34243:22;;:::i;:::-;34280:11;;34292:1;34280:14;;;;;;;;;;;;;;;;;;:::i;:::-;34269:47;;;;;;;:::i;:::-;34222:94;;;;34325:19;34332:5;34339:4;34325:6;:19::i;:::-;34164:188;;34208:3;;;;;;;34164:188;;;;34097:260;;:::o;39876:809::-;40058:17;:46;40076:8;:27;;;40058:46;;;;;;;;;;;;;;;;;;;;;40057:47;40049:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;40164:20;:18;:20::i;:::-;40142:8;:18;;;:42;40138:542;;40384:66;40403:8;:18;;;40423:8;:26;;;40384:18;:66::i;:::-;40376:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;40484:80;40503:16;40521:15;40538:8;:25;;;40484:18;:80::i;:::-;40138:542;;;40625:12;;40595:8;:26;;;:42;40587:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;40138:542;39876:809;;;:::o;39008:176::-;39070:7;39112:66;39093:85;;39103:5;39093:16;;;;;;:85;39086:92;;39008:176;;;:::o;40691:128::-;40808:5;40749:12;31323:3;40764:12;;40762:14;;;;;;;;;;:42;;;;;;40749:56;;;;;;;;:64;;;;40691:128;:::o;28002:106::-;28055:15;28090:10;28083:17;;28002:106;:::o;41145:287::-;41233:10;41244:1;41233:13;;;;;;;;;;;41216:14;;:30;;;;;;;;;;;;;;;;;;41272:10;41283:1;41272:13;;;;;;;;;;;41253:16;;:32;;;;;;;;;;;;;;;;;;41313:10;41324:1;41313:13;;;;;;;;;;;41292:18;;:34;;;;;;;;;;;;;;;;;;41338:88;41363:10;41374:1;41363:13;;;;;;;;;;;41387:10;41398:1;41387:13;;;;;;;;;;;41411:10;41422:1;41411:13;;;;;;;;;;;41338:88;;;;;;;;:::i;:::-;;;;;;;;41145:287;:::o;40825:314::-;40887:9;40882:252;40906:6;:13;40902:1;:17;40882:252;;;40961:6;40943;40950:1;40943:9;;;;;;;;;;;;;;:15;;;:24;40935:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;40995:16;41014:6;41021:1;41014:9;;;;;;;;;;;;;;:18;;;40995:37;;41059:6;41066:1;41059:9;;;;;;;;;;;;;;:15;;;41041:5;:15;41047:8;41041:15;;;;;;;;;;;;;;;:33;;;;41088:38;41100:8;41110:6;41117:1;41110:9;;;;;;;;;;;;;;:15;;;41088:38;;;;;;;:::i;:::-;;;;;;;;40882:252;40921:3;;;;;;;40882:252;;;;40825:314;:::o;25526:166::-;25612:7;25645:1;25640;:6;;25648:12;25632:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;25683:1;25679;:5;25672:12;;25526:166;;;;;:::o;39190:680::-;39354:1;39338:6;:13;:17;39330:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;39420:20;:18;:20::i;:::-;39403:5;:13;;;:37;39395:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;39506:11;39492:5;:10;;;:25;39484:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;39587:12;;39566:5;:17;;;:33;39558:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;39657:18;;;;;;;;;;;:30;;;39698:6;39657:164;;;;;;;;39724:5;:13;;;39716:22;;39657:164;;;;39748:5;:13;;;39740:22;;39657:164;;;;39772:5;:10;;;39764:19;;39657:164;;;;39793:5;:17;;;39657:164;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39641:223;;;;;;;;;;;;:::i;:::-;;;;;;;;;39190:680;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:130::-;;85:6;72:20;63:29;;97:33;124:5;97:33;:::i;:::-;57:78;;;;:::o;158:363::-;;;299:3;292:4;284:6;280:17;276:27;266:2;;317:1;314;307:12;266:2;350:6;337:20;327:30;;377:18;369:6;366:30;363:2;;;409:1;406;399:12;363:2;443:4;435:6;431:17;419:29;;494:3;486:4;478:6;474:17;464:8;460:32;457:41;454:2;;;511:1;508;501:12;454:2;259:262;;;;;:::o;559:192::-;;674:6;662:18;;724:3;716:4;710;706:15;696:8;692:30;689:39;686:2;;;741:1;738;731:12;686:2;655:96;;;;:::o;787:773::-;;926:3;919:4;911:6;907:17;903:27;893:2;;944:1;941;934:12;893:2;981:6;968:20;1003:102;1018:86;1097:6;1018:86;:::i;:::-;1003:102;:::i;:::-;994:111;;1122:5;1147:6;1140:5;1133:21;1177:4;1169:6;1165:17;1155:27;;1199:4;1194:3;1190:14;1183:21;;1252:6;1299:3;1291:4;1283:6;1279:17;1274:3;1270:27;1267:36;1264:2;;;1316:1;1313;1306:12;1264:2;1341:1;1326:228;1351:6;1348:1;1345:13;1326:228;;;1409:3;1431:59;1486:3;1474:10;1431:59;:::i;:::-;1426:3;1419:72;1514:4;1509:3;1505:14;1498:21;;1542:4;1537:3;1533:14;1526:21;;1383:171;1373:1;1370;1366:9;1361:14;;1326:228;;;1330:14;886:674;;;;;;;:::o;1568:128::-;;1649:6;1643:13;1634:22;;1661:30;1685:5;1661:30;:::i;:::-;1628:68;;;;:::o;1703:130::-;;1783:6;1770:20;1761:29;;1795:33;1822:5;1795:33;:::i;:::-;1755:78;;;;:::o;1841:440::-;;1942:3;1935:4;1927:6;1923:17;1919:27;1909:2;;1960:1;1957;1950:12;1909:2;1997:6;1984:20;2019:64;2034:48;2075:6;2034:48;:::i;:::-;2019:64;:::i;:::-;2010:73;;2103:6;2096:5;2089:21;2139:4;2131:6;2127:17;2172:4;2165:5;2161:16;2207:3;2198:6;2193:3;2189:16;2186:25;2183:2;;;2224:1;2221;2214:12;2183:2;2234:41;2268:6;2263:3;2258;2234:41;:::i;:::-;1902:379;;;;;;;:::o;2289:172::-;;2390:6;2377:20;2368:29;;2402:54;2450:5;2402:54;:::i;:::-;2362:99;;;;:::o;2501:956::-;;2621:4;2609:9;2604:3;2600:19;2596:30;2593:2;;;2639:1;2636;2629:12;2593:2;2657:20;2672:4;2657:20;:::i;:::-;2648:29;;2732:1;2764:49;2809:3;2800:6;2789:9;2785:22;2764:49;:::i;:::-;2757:4;2750:5;2746:16;2739:75;2687:138;2889:2;2922:49;2967:3;2958:6;2947:9;2943:22;2922:49;:::i;:::-;2915:4;2908:5;2904:16;2897:75;2835:148;3039:2;3072:49;3117:3;3108:6;3097:9;3093:22;3072:49;:::i;:::-;3065:4;3058:5;3054:16;3047:75;2993:140;3196:2;3229:49;3274:3;3265:6;3254:9;3250:22;3229:49;:::i;:::-;3222:4;3215:5;3211:16;3204:75;3143:147;3352:3;3386:49;3431:3;3422:6;3411:9;3407:22;3386:49;:::i;:::-;3379:4;3372:5;3368:16;3361:75;3300:147;2587:870;;;;:::o;3488:469::-;;3599:4;3587:9;3582:3;3578:19;3574:30;3571:2;;;3617:1;3614;3607:12;3571:2;3635:20;3650:4;3635:20;:::i;:::-;3626:29;;3709:1;3741:49;3786:3;3777:6;3766:9;3762:22;3741:49;:::i;:::-;3734:4;3727:5;3723:16;3716:75;3665:137;3853:2;3886:49;3931:3;3922:6;3911:9;3907:22;3886:49;:::i;:::-;3879:4;3872:5;3868:16;3861:75;3812:135;3565:392;;;;:::o;3994:1681::-;;4111:6;4099:9;4094:3;4090:19;4086:32;4083:2;;;4131:1;4128;4121:12;4083:2;4149:22;4164:6;4149:22;:::i;:::-;4140:31;;4221:1;4253:49;4298:3;4289:6;4278:9;4274:22;4253:49;:::i;:::-;4246:4;4239:5;4235:16;4228:75;4181:133;4363:2;4396:49;4441:3;4432:6;4421:9;4417:22;4396:49;:::i;:::-;4389:4;4382:5;4378:16;4371:75;4324:133;4511:2;4544:49;4589:3;4580:6;4569:9;4565:22;4544:49;:::i;:::-;4537:4;4530:5;4526:16;4519:75;4467:138;4666:2;4699:49;4744:3;4735:6;4724:9;4720:22;4699:49;:::i;:::-;4692:4;4685:5;4681:16;4674:75;4615:145;4817:3;4851:49;4896:3;4887:6;4876:9;4872:22;4851:49;:::i;:::-;4844:4;4837:5;4833:16;4826:75;4770:142;4969:3;5003:49;5048:3;5039:6;5028:9;5024:22;5003:49;:::i;:::-;4996:4;4989:5;4985:16;4978:75;4922:142;5124:3;5158:49;5203:3;5194:6;5183:9;5179:22;5158:49;:::i;:::-;5151:4;5144:5;5140:16;5133:75;5074:145;5300:3;5289:9;5285:19;5272:33;5325:18;5317:6;5314:30;5311:2;;;5357:1;5354;5347:12;5311:2;5392:80;5468:3;5459:6;5448:9;5444:22;5392:80;:::i;:::-;5385:4;5378:5;5374:16;5367:106;5229:255;5537:3;5573:80;5649:3;5640:6;5629:9;5625:22;5573:80;:::i;:::-;5564:6;5557:5;5553:18;5546:108;5494:171;4077:1598;;;;:::o;5715:583::-;;5835:4;5823:9;5818:3;5814:19;5810:30;5807:2;;;5853:1;5850;5843:12;5807:2;5871:20;5886:4;5871:20;:::i;:::-;5862:29;;5944:1;5976:49;6021:3;6012:6;6001:9;5997:22;5976:49;:::i;:::-;5969:4;5962:5;5958:16;5951:75;5901:136;6127:2;6116:9;6112:18;6099:32;6151:18;6143:6;6140:30;6137:2;;;6183:1;6180;6173:12;6137:2;6218:58;6272:3;6263:6;6252:9;6248:22;6218:58;:::i;:::-;6211:4;6204:5;6200:16;6193:84;6047:241;5801:497;;;;:::o;6339:775::-;;6460:4;6448:9;6443:3;6439:19;6435:30;6432:2;;;6478:1;6475;6468:12;6432:2;6496:20;6511:4;6496:20;:::i;:::-;6487:29;;6569:1;6601:49;6646:3;6637:6;6626:9;6622:22;6601:49;:::i;:::-;6594:4;6587:5;6583:16;6576:75;6526:136;6715:2;6748:49;6793:3;6784:6;6773:9;6769:22;6748:49;:::i;:::-;6741:4;6734:5;6730:16;6723:75;6672:137;6859:2;6892:49;6937:3;6928:6;6917:9;6913:22;6892:49;:::i;:::-;6885:4;6878:5;6874:16;6867:75;6819:134;7010:2;7043:49;7088:3;7079:6;7068:9;7064:22;7043:49;:::i;:::-;7036:4;7029:5;7025:16;7018:75;6963:141;6426:688;;;;:::o;7153:927::-;;7272:6;7260:9;7255:3;7251:19;7247:32;7244:2;;;7292:1;7289;7282:12;7244:2;7310:20;7325:4;7310:20;:::i;:::-;7301:29;;7382:1;7414:49;7459:3;7450:6;7439:9;7435:22;7414:49;:::i;:::-;7407:4;7400:5;7396:16;7389:75;7340:135;7532:2;7565:49;7610:3;7601:6;7590:9;7586:22;7565:49;:::i;:::-;7558:4;7551:5;7547:16;7540:75;7485:141;7707:2;7696:9;7692:18;7679:32;7731:18;7723:6;7720:30;7717:2;;;7763:1;7760;7753:12;7717:2;7798:82;7876:3;7867:6;7856:9;7852:22;7798:82;:::i;:::-;7791:4;7784:5;7780:16;7773:108;7636:256;7945:2;7978:80;8054:3;8045:6;8034:9;8030:22;7978:80;:::i;:::-;7971:4;7964:5;7960:16;7953:106;7902:168;7238:842;;;;:::o;8122:877::-;;8244:4;8232:9;8227:3;8223:19;8219:30;8216:2;;;8262:1;8259;8252:12;8216:2;8280:20;8295:4;8280:20;:::i;:::-;8271:29;;8349:1;8381:49;8426:3;8417:6;8406:9;8402:22;8381:49;:::i;:::-;8374:4;8367:5;8363:16;8356:75;8310:132;8497:2;8530:49;8575:3;8566:6;8555:9;8551:22;8530:49;:::i;:::-;8523:4;8516:5;8512:16;8505:75;8452:139;8644:2;8677:49;8722:3;8713:6;8702:9;8698:22;8677:49;:::i;:::-;8670:4;8663:5;8659:16;8652:75;8601:137;8828:2;8817:9;8813:18;8800:32;8852:18;8844:6;8841:30;8838:2;;;8884:1;8881;8874:12;8838:2;8919:58;8973:3;8964:6;8953:9;8949:22;8919:58;:::i;:::-;8912:4;8905:5;8901:16;8894:84;8748:241;8210:789;;;;:::o;9006:130::-;;9086:6;9073:20;9064:29;;9098:33;9125:5;9098:33;:::i;:::-;9058:78;;;;:::o;9143:134::-;;9227:6;9221:13;9212:22;;9239:33;9266:5;9239:33;:::i;:::-;9206:71;;;;:::o;9284:241::-;;9388:2;9376:9;9367:7;9363:23;9359:32;9356:2;;;9404:1;9401;9394:12;9356:2;9439:1;9456:53;9501:7;9492:6;9481:9;9477:22;9456:53;:::i;:::-;9446:63;;9418:97;9350:175;;;;:::o;9532:419::-;;;9682:2;9670:9;9661:7;9657:23;9653:32;9650:2;;;9698:1;9695;9688:12;9650:2;9761:1;9750:9;9746:17;9733:31;9784:18;9776:6;9773:30;9770:2;;;9816:1;9813;9806:12;9770:2;9844:91;9927:7;9918:6;9907:9;9903:22;9844:91;:::i;:::-;9826:109;;;;9712:229;9644:307;;;;;:::o;9958:323::-;;10103:2;10091:9;10082:7;10078:23;10074:32;10071:2;;;10119:1;10116;10109:12;10071:2;10154:1;10171:94;10257:7;10248:6;10237:9;10233:22;10171:94;:::i;:::-;10161:104;;10133:138;10065:216;;;;:::o;10288:421::-;;10439:2;10427:9;10418:7;10414:23;10410:32;10407:2;;;10455:1;10452;10445:12;10407:2;10518:1;10507:9;10503:17;10490:31;10541:18;10533:6;10530:30;10527:2;;;10573:1;10570;10563:12;10527:2;10593:100;10685:7;10676:6;10665:9;10661:22;10593:100;:::i;:::-;10583:110;;10469:230;10401:308;;;;:::o;10716:257::-;;10828:2;10816:9;10807:7;10803:23;10799:32;10796:2;;;10844:1;10841;10834:12;10796:2;10879:1;10896:61;10949:7;10940:6;10929:9;10925:22;10896:61;:::i;:::-;10886:71;;10858:105;10790:183;;;;:::o;10980:241::-;;11084:2;11072:9;11063:7;11059:23;11055:32;11052:2;;;11100:1;11097;11090:12;11052:2;11135:1;11152:53;11197:7;11188:6;11177:9;11173:22;11152:53;:::i;:::-;11142:63;;11114:97;11046:175;;;;:::o;11228:366::-;;;11349:2;11337:9;11328:7;11324:23;11320:32;11317:2;;;11365:1;11362;11355:12;11317:2;11400:1;11417:53;11462:7;11453:6;11442:9;11438:22;11417:53;:::i;:::-;11407:63;;11379:97;11507:2;11525:53;11570:7;11561:6;11550:9;11546:22;11525:53;:::i;:::-;11515:63;;11486:98;11311:283;;;;;:::o;11601:612::-;;;11759:2;11747:9;11738:7;11734:23;11730:32;11727:2;;;11775:1;11772;11765:12;11727:2;11838:1;11827:9;11823:17;11810:31;11861:18;11853:6;11850:30;11847:2;;;11893:1;11890;11883:12;11847:2;11913:62;11967:7;11958:6;11947:9;11943:22;11913:62;:::i;:::-;11903:72;;11789:192;12040:2;12029:9;12025:18;12012:32;12064:18;12056:6;12053:30;12050:2;;;12096:1;12093;12086:12;12050:2;12116:81;12189:7;12180:6;12169:9;12165:22;12116:81;:::i;:::-;12106:91;;11991:212;11721:492;;;;;:::o;12220:1031::-;;;;;12453:3;12441:9;12432:7;12428:23;12424:33;12421:2;;;12470:1;12467;12460:12;12421:2;12533:1;12522:9;12518:17;12505:31;12556:18;12548:6;12545:30;12542:2;;;12588:1;12585;12578:12;12542:2;12608:62;12662:7;12653:6;12642:9;12638:22;12608:62;:::i;:::-;12598:72;;12484:192;12735:2;12724:9;12720:18;12707:32;12759:18;12751:6;12748:30;12745:2;;;12791:1;12788;12781:12;12745:2;12811:81;12884:7;12875:6;12864:9;12860:22;12811:81;:::i;:::-;12801:91;;12686:212;12957:2;12946:9;12942:18;12929:32;12981:18;12973:6;12970:30;12967:2;;;13013:1;13010;13003:12;12967:2;13033:62;13087:7;13078:6;13067:9;13063:22;13033:62;:::i;:::-;13023:72;;12908:193;13132:2;13150:85;13227:7;13218:6;13207:9;13203:22;13150:85;:::i;:::-;13140:95;;13111:130;12415:836;;;;;;;:::o;13258:616::-;;;13418:2;13406:9;13397:7;13393:23;13389:32;13386:2;;;13434:1;13431;13424:12;13386:2;13497:1;13486:9;13482:17;13469:31;13520:18;13512:6;13509:30;13506:2;;;13552:1;13549;13542:12;13506:2;13572:62;13626:7;13617:6;13606:9;13602:22;13572:62;:::i;:::-;13562:72;;13448:192;13699:2;13688:9;13684:18;13671:32;13723:18;13715:6;13712:30;13709:2;;;13755:1;13752;13745:12;13709:2;13775:83;13850:7;13841:6;13830:9;13826:22;13775:83;:::i;:::-;13765:93;;13650:214;13380:494;;;;;:::o;13881:1035::-;;;;;14116:3;14104:9;14095:7;14091:23;14087:33;14084:2;;;14133:1;14130;14123:12;14084:2;14196:1;14185:9;14181:17;14168:31;14219:18;14211:6;14208:30;14205:2;;;14251:1;14248;14241:12;14205:2;14271:62;14325:7;14316:6;14305:9;14301:22;14271:62;:::i;:::-;14261:72;;14147:192;14398:2;14387:9;14383:18;14370:32;14422:18;14414:6;14411:30;14408:2;;;14454:1;14451;14444:12;14408:2;14474:83;14549:7;14540:6;14529:9;14525:22;14474:83;:::i;:::-;14464:93;;14349:214;14622:2;14611:9;14607:18;14594:32;14646:18;14638:6;14635:30;14632:2;;;14678:1;14675;14668:12;14632:2;14698:62;14752:7;14743:6;14732:9;14728:22;14698:62;:::i;:::-;14688:72;;14573:193;14797:2;14815:85;14892:7;14883:6;14872:9;14868:22;14815:85;:::i;:::-;14805:95;;14776:130;14078:838;;;;;;;:::o;14923:283::-;;15048:2;15036:9;15027:7;15023:23;15019:32;15016:2;;;15064:1;15061;15054:12;15016:2;15099:1;15116:74;15182:7;15173:6;15162:9;15158:22;15116:74;:::i;:::-;15106:84;;15078:118;15010:196;;;;:::o;15213:241::-;;15317:2;15305:9;15296:7;15292:23;15288:32;15285:2;;;15333:1;15330;15323:12;15285:2;15368:1;15385:53;15430:7;15421:6;15410:9;15406:22;15385:53;:::i;:::-;15375:63;;15347:97;15279:175;;;;:::o;15461:263::-;;15576:2;15564:9;15555:7;15551:23;15547:32;15544:2;;;15592:1;15589;15582:12;15544:2;15627:1;15644:64;15700:7;15691:6;15680:9;15676:22;15644:64;:::i;:::-;15634:74;;15606:108;15538:186;;;;:::o;15732:173::-;;15819:46;15861:3;15853:6;15819:46;:::i;:::-;15894:4;15889:3;15885:14;15871:28;;15812:93;;;;:::o;15913:103::-;15986:24;16004:5;15986:24;:::i;:::-;15981:3;15974:37;15968:48;;:::o;16023:113::-;16106:24;16124:5;16106:24;:::i;:::-;16101:3;16094:37;16088:48;;:::o;16178:666::-;16313:53;16360:5;16313:53;:::i;:::-;16379:85;16457:6;16452:3;16379:85;:::i;:::-;16372:92;;16485:55;16534:5;16485:55;:::i;:::-;16560:7;16588:1;16573:259;16598:6;16595:1;16592:13;16573:259;;;16665:6;16659:13;16686:63;16745:3;16730:13;16686:63;:::i;:::-;16679:70;;16766:59;16818:6;16766:59;:::i;:::-;16756:69;;16630:202;16620:1;16617;16613:9;16608:14;;16573:259;;;16577:14;16292:552;;;;;:::o;16885:660::-;17018:52;17064:5;17018:52;:::i;:::-;17083:84;17160:6;17155:3;17083:84;:::i;:::-;17076:91;;17188:54;17236:5;17188:54;:::i;:::-;17262:7;17290:1;17275:258;17300:6;17297:1;17294:13;17275:258;;;17367:6;17361:13;17388:63;17447:3;17432:13;17388:63;:::i;:::-;17381:70;;17468:58;17519:6;17468:58;:::i;:::-;17458:68;;17332:201;17322:1;17319;17315:9;17310:14;;17275:258;;;17279:14;16997:548;;;;;:::o;17586:660::-;17719:52;17765:5;17719:52;:::i;:::-;17784:84;17861:6;17856:3;17784:84;:::i;:::-;17777:91;;17889:54;17937:5;17889:54;:::i;:::-;17963:7;17991:1;17976:258;18001:6;17998:1;17995:13;17976:258;;;18068:6;18062:13;18089:63;18148:3;18133:13;18089:63;:::i;:::-;18082:70;;18169:58;18220:6;18169:58;:::i;:::-;18159:68;;18033:201;18023:1;18020;18016:9;18011:14;;17976:258;;;17980:14;17698:548;;;;;:::o;18254:104::-;18331:21;18346:5;18331:21;:::i;:::-;18326:3;18319:34;18313:45;;:::o;18365:113::-;18448:24;18466:5;18448:24;:::i;:::-;18443:3;18436:37;18430:48;;:::o;18485:323::-;;18585:38;18617:5;18585:38;:::i;:::-;18635:60;18688:6;18683:3;18635:60;:::i;:::-;18628:67;;18700:52;18745:6;18740:3;18733:4;18726:5;18722:16;18700:52;:::i;:::-;18773:29;18795:6;18773:29;:::i;:::-;18768:3;18764:39;18757:46;;18565:243;;;;;:::o;18815:343::-;;18925:38;18957:5;18925:38;:::i;:::-;18975:70;19038:6;19033:3;18975:70;:::i;:::-;18968:77;;19050:52;19095:6;19090:3;19083:4;19076:5;19072:16;19050:52;:::i;:::-;19123:29;19145:6;19123:29;:::i;:::-;19118:3;19114:39;19107:46;;18905:253;;;;;:::o;19165:162::-;19266:55;19315:5;19266:55;:::i;:::-;19261:3;19254:68;19248:79;;:::o;19334:158::-;19433:53;19480:5;19433:53;:::i;:::-;19428:3;19421:66;19415:77;;:::o;19499:168::-;19603:58;19655:5;19603:58;:::i;:::-;19598:3;19591:71;19585:82;;:::o;19674:347::-;;19786:39;19819:5;19786:39;:::i;:::-;19837:71;19901:6;19896:3;19837:71;:::i;:::-;19830:78;;19913:52;19958:6;19953:3;19946:4;19939:5;19935:16;19913:52;:::i;:::-;19986:29;20008:6;19986:29;:::i;:::-;19981:3;19977:39;19970:46;;19766:255;;;;;:::o;20029:319::-;;20189:67;20253:2;20248:3;20189:67;:::i;:::-;20182:74;;20289:21;20285:1;20280:3;20276:11;20269:42;20339:2;20334:3;20330:12;20323:19;;20175:173;;;:::o;20357:375::-;;20517:67;20581:2;20576:3;20517:67;:::i;:::-;20510:74;;20617:34;20613:1;20608:3;20604:11;20597:55;20686:8;20681:2;20676:3;20672:12;20665:30;20723:2;20718:3;20714:12;20707:19;;20503:229;;;:::o;20741:320::-;;20901:67;20965:2;20960:3;20901:67;:::i;:::-;20894:74;;21001:22;20997:1;20992:3;20988:11;20981:43;21052:2;21047:3;21043:12;21036:19;;20887:174;;;:::o;21070:320::-;;21230:67;21294:2;21289:3;21230:67;:::i;:::-;21223:74;;21330:22;21326:1;21321:3;21317:11;21310:43;21381:2;21376:3;21372:12;21365:19;;21216:174;;;:::o;21399:377::-;;21559:67;21623:2;21618:3;21559:67;:::i;:::-;21552:74;;21659:34;21655:1;21650:3;21646:11;21639:55;21728:10;21723:2;21718:3;21714:12;21707:32;21767:2;21762:3;21758:12;21751:19;;21545:231;;;:::o;21785:332::-;;21945:67;22009:2;22004:3;21945:67;:::i;:::-;21938:74;;22045:34;22041:1;22036:3;22032:11;22025:55;22108:2;22103:3;22099:12;22092:19;;21931:186;;;:::o;22126:328::-;;22286:67;22350:2;22345:3;22286:67;:::i;:::-;22279:74;;22386:30;22382:1;22377:3;22373:11;22366:51;22445:2;22440:3;22436:12;22429:19;;22272:182;;;:::o;22463:330::-;;22623:67;22687:2;22682:3;22623:67;:::i;:::-;22616:74;;22723:32;22719:1;22714:3;22710:11;22703:53;22784:2;22779:3;22775:12;22768:19;;22609:184;;;:::o;22802:322::-;;22962:67;23026:2;23021:3;22962:67;:::i;:::-;22955:74;;23062:24;23058:1;23053:3;23049:11;23042:45;23115:2;23110:3;23106:12;23099:19;;22948:176;;;:::o;23133:376::-;;23293:67;23357:2;23352:3;23293:67;:::i;:::-;23286:74;;23393:34;23389:1;23384:3;23380:11;23373:55;23462:9;23457:2;23452:3;23448:12;23441:31;23500:2;23495:3;23491:12;23484:19;;23279:230;;;:::o;23518:328::-;;23678:67;23742:2;23737:3;23678:67;:::i;:::-;23671:74;;23778:30;23774:1;23769:3;23765:11;23758:51;23837:2;23832:3;23828:12;23821:19;;23664:182;;;:::o;23855:329::-;;24015:67;24079:2;24074:3;24015:67;:::i;:::-;24008:74;;24115:31;24111:1;24106:3;24102:11;24095:52;24175:2;24170:3;24166:12;24159:19;;24001:183;;;:::o;24193:325::-;;24353:67;24417:2;24412:3;24353:67;:::i;:::-;24346:74;;24453:27;24449:1;24444:3;24440:11;24433:48;24509:2;24504:3;24500:12;24493:19;;24339:179;;;:::o;24527:324::-;;24687:67;24751:2;24746:3;24687:67;:::i;:::-;24680:74;;24787:26;24783:1;24778:3;24774:11;24767:47;24842:2;24837:3;24833:12;24826:19;;24673:178;;;:::o;24860:332::-;;25020:67;25084:2;25079:3;25020:67;:::i;:::-;25013:74;;25120:34;25116:1;25111:3;25107:11;25100:55;25183:2;25178:3;25174:12;25167:19;;25006:186;;;:::o;25201:322::-;;25361:67;25425:2;25420:3;25361:67;:::i;:::-;25354:74;;25461:24;25457:1;25452:3;25448:11;25441:45;25514:2;25509:3;25505:12;25498:19;;25347:176;;;:::o;25532:314::-;;25692:67;25756:2;25751:3;25692:67;:::i;:::-;25685:74;;25792:16;25788:1;25783:3;25779:11;25772:37;25837:2;25832:3;25828:12;25821:19;;25678:168;;;:::o;25855:329::-;;26015:67;26079:2;26074:3;26015:67;:::i;:::-;26008:74;;26115:31;26111:1;26106:3;26102:11;26095:52;26175:2;26170:3;26166:12;26159:19;;26001:183;;;:::o;26193:325::-;;26353:67;26417:2;26412:3;26353:67;:::i;:::-;26346:74;;26453:27;26449:1;26444:3;26440:11;26433:48;26509:2;26504:3;26500:12;26493:19;;26339:179;;;:::o;26589:596::-;;26752:4;26747:3;26743:14;26838:4;26831:5;26827:16;26821:23;26850:63;26907:4;26902:3;26898:14;26884:12;26850:63;:::i;:::-;26772:147;27004:4;26997:5;26993:16;26987:23;27056:3;27050:4;27046:14;27039:4;27034:3;27030:14;27023:38;27076:71;27142:4;27128:12;27076:71;:::i;:::-;27068:79;;26929:230;27176:4;27169:11;;26725:460;;;;;:::o;27259:912::-;;27426:4;27421:3;27417:14;27508:4;27501:5;27497:16;27491:23;27520:63;27577:4;27572:3;27568:14;27554:12;27520:63;:::i;:::-;27446:143;27667:4;27660:5;27656:16;27650:23;27679:63;27736:4;27731:3;27727:14;27713:12;27679:63;:::i;:::-;27599:149;27824:4;27817:5;27813:16;27807:23;27836:63;27893:4;27888:3;27884:14;27870:12;27836:63;:::i;:::-;27758:147;27990:4;27983:5;27979:16;27973:23;28042:3;28036:4;28032:14;28025:4;28020:3;28016:14;28009:38;28062:71;28128:4;28114:12;28062:71;:::i;:::-;28054:79;;27915:230;28162:4;28155:11;;27399:772;;;;;:::o;28178:103::-;28251:24;28269:5;28251:24;:::i;:::-;28246:3;28239:37;28233:48;;:::o;28288:113::-;28371:24;28389:5;28371:24;:::i;:::-;28366:3;28359:37;28353:48;;:::o;28408:222::-;;28535:2;28524:9;28520:18;28512:26;;28549:71;28617:1;28606:9;28602:17;28593:6;28549:71;:::i;:::-;28506:124;;;;:::o;28637:444::-;;28820:2;28809:9;28805:18;28797:26;;28834:71;28902:1;28891:9;28887:17;28878:6;28834:71;:::i;:::-;28916:72;28984:2;28973:9;28969:18;28960:6;28916:72;:::i;:::-;28999;29067:2;29056:9;29052:18;29043:6;28999:72;:::i;:::-;28791:290;;;;;;:::o;29088:333::-;;29243:2;29232:9;29228:18;29220:26;;29257:71;29325:1;29314:9;29310:17;29301:6;29257:71;:::i;:::-;29339:72;29407:2;29396:9;29392:18;29383:6;29339:72;:::i;:::-;29214:207;;;;;:::o;29428:210::-;;29549:2;29538:9;29534:18;29526:26;;29563:65;29625:1;29614:9;29610:17;29601:6;29563:65;:::i;:::-;29520:118;;;;:::o;29645:222::-;;29772:2;29761:9;29757:18;29749:26;;29786:71;29854:1;29843:9;29839:17;29830:6;29786:71;:::i;:::-;29743:124;;;;:::o;29874:333::-;;30029:2;30018:9;30014:18;30006:26;;30043:71;30111:1;30100:9;30096:17;30087:6;30043:71;:::i;:::-;30125:72;30193:2;30182:9;30178:18;30169:6;30125:72;:::i;:::-;30000:207;;;;;:::o;30214:640::-;;30443:3;30432:9;30428:19;30420:27;;30458:71;30526:1;30515:9;30511:17;30502:6;30458:71;:::i;:::-;30540:72;30608:2;30597:9;30593:18;30584:6;30540:72;:::i;:::-;30660:9;30654:4;30650:20;30645:2;30634:9;30630:18;30623:48;30685:76;30756:4;30747:6;30685:76;:::i;:::-;30677:84;;30772:72;30840:2;30829:9;30825:18;30816:6;30772:72;:::i;:::-;30414:440;;;;;;;:::o;30861:514::-;;31082:3;31071:9;31067:19;31059:27;;31133:9;31127:4;31123:20;31119:1;31108:9;31104:17;31097:47;31158:76;31229:4;31220:6;31158:76;:::i;:::-;31150:84;;31245:120;31361:2;31350:9;31346:18;31337:6;31245:120;:::i;:::-;31053:322;;;;;:::o;31382:510::-;;31601:3;31590:9;31586:19;31578:27;;31652:9;31646:4;31642:20;31638:1;31627:9;31623:17;31616:47;31677:76;31748:4;31739:6;31677:76;:::i;:::-;31669:84;;31764:118;31878:2;31867:9;31863:18;31854:6;31764:118;:::i;:::-;31572:320;;;;;:::o;31899:510::-;;32118:3;32107:9;32103:19;32095:27;;32169:9;32163:4;32159:20;32155:1;32144:9;32140:17;32133:47;32194:76;32265:4;32256:6;32194:76;:::i;:::-;32186:84;;32281:118;32395:2;32384:9;32380:18;32371:6;32281:118;:::i;:::-;32089:320;;;;;:::o;32416:258::-;;32561:2;32550:9;32546:18;32538:26;;32575:89;32661:1;32650:9;32646:17;32637:6;32575:89;:::i;:::-;32532:142;;;;:::o;32681:254::-;;32824:2;32813:9;32809:18;32801:26;;32838:87;32922:1;32911:9;32907:17;32898:6;32838:87;:::i;:::-;32795:140;;;;:::o;32942:264::-;;33090:2;33079:9;33075:18;33067:26;;33104:92;33193:1;33182:9;33178:17;33169:6;33104:92;:::i;:::-;33061:145;;;;:::o;33213:310::-;;33360:2;33349:9;33345:18;33337:26;;33410:9;33404:4;33400:20;33396:1;33385:9;33381:17;33374:47;33435:78;33508:4;33499:6;33435:78;:::i;:::-;33427:86;;33331:192;;;;:::o;33530:416::-;;33730:2;33719:9;33715:18;33707:26;;33780:9;33774:4;33770:20;33766:1;33755:9;33751:17;33744:47;33805:131;33931:4;33805:131;:::i;:::-;33797:139;;33701:245;;;:::o;33953:416::-;;34153:2;34142:9;34138:18;34130:26;;34203:9;34197:4;34193:20;34189:1;34178:9;34174:17;34167:47;34228:131;34354:4;34228:131;:::i;:::-;34220:139;;34124:245;;;:::o;34376:416::-;;34576:2;34565:9;34561:18;34553:26;;34626:9;34620:4;34616:20;34612:1;34601:9;34597:17;34590:47;34651:131;34777:4;34651:131;:::i;:::-;34643:139;;34547:245;;;:::o;34799:416::-;;34999:2;34988:9;34984:18;34976:26;;35049:9;35043:4;35039:20;35035:1;35024:9;35020:17;35013:47;35074:131;35200:4;35074:131;:::i;:::-;35066:139;;34970:245;;;:::o;35222:416::-;;35422:2;35411:9;35407:18;35399:26;;35472:9;35466:4;35462:20;35458:1;35447:9;35443:17;35436:47;35497:131;35623:4;35497:131;:::i;:::-;35489:139;;35393:245;;;:::o;35645:416::-;;35845:2;35834:9;35830:18;35822:26;;35895:9;35889:4;35885:20;35881:1;35870:9;35866:17;35859:47;35920:131;36046:4;35920:131;:::i;:::-;35912:139;;35816:245;;;:::o;36068:416::-;;36268:2;36257:9;36253:18;36245:26;;36318:9;36312:4;36308:20;36304:1;36293:9;36289:17;36282:47;36343:131;36469:4;36343:131;:::i;:::-;36335:139;;36239:245;;;:::o;36491:416::-;;36691:2;36680:9;36676:18;36668:26;;36741:9;36735:4;36731:20;36727:1;36716:9;36712:17;36705:47;36766:131;36892:4;36766:131;:::i;:::-;36758:139;;36662:245;;;:::o;36914:416::-;;37114:2;37103:9;37099:18;37091:26;;37164:9;37158:4;37154:20;37150:1;37139:9;37135:17;37128:47;37189:131;37315:4;37189:131;:::i;:::-;37181:139;;37085:245;;;:::o;37337:416::-;;37537:2;37526:9;37522:18;37514:26;;37587:9;37581:4;37577:20;37573:1;37562:9;37558:17;37551:47;37612:131;37738:4;37612:131;:::i;:::-;37604:139;;37508:245;;;:::o;37760:416::-;;37960:2;37949:9;37945:18;37937:26;;38010:9;38004:4;38000:20;37996:1;37985:9;37981:17;37974:47;38035:131;38161:4;38035:131;:::i;:::-;38027:139;;37931:245;;;:::o;38183:416::-;;38383:2;38372:9;38368:18;38360:26;;38433:9;38427:4;38423:20;38419:1;38408:9;38404:17;38397:47;38458:131;38584:4;38458:131;:::i;:::-;38450:139;;38354:245;;;:::o;38606:416::-;;38806:2;38795:9;38791:18;38783:26;;38856:9;38850:4;38846:20;38842:1;38831:9;38827:17;38820:47;38881:131;39007:4;38881:131;:::i;:::-;38873:139;;38777:245;;;:::o;39029:416::-;;39229:2;39218:9;39214:18;39206:26;;39279:9;39273:4;39269:20;39265:1;39254:9;39250:17;39243:47;39304:131;39430:4;39304:131;:::i;:::-;39296:139;;39200:245;;;:::o;39452:416::-;;39652:2;39641:9;39637:18;39629:26;;39702:9;39696:4;39692:20;39688:1;39677:9;39673:17;39666:47;39727:131;39853:4;39727:131;:::i;:::-;39719:139;;39623:245;;;:::o;39875:416::-;;40075:2;40064:9;40060:18;40052:26;;40125:9;40119:4;40115:20;40111:1;40100:9;40096:17;40089:47;40150:131;40276:4;40150:131;:::i;:::-;40142:139;;40046:245;;;:::o;40298:416::-;;40498:2;40487:9;40483:18;40475:26;;40548:9;40542:4;40538:20;40534:1;40523:9;40519:17;40512:47;40573:131;40699:4;40573:131;:::i;:::-;40565:139;;40469:245;;;:::o;40721:416::-;;40921:2;40910:9;40906:18;40898:26;;40971:9;40965:4;40961:20;40957:1;40946:9;40942:17;40935:47;40996:131;41122:4;40996:131;:::i;:::-;40988:139;;40892:245;;;:::o;41144:416::-;;41344:2;41333:9;41329:18;41321:26;;41394:9;41388:4;41384:20;41380:1;41369:9;41365:17;41358:47;41419:131;41545:4;41419:131;:::i;:::-;41411:139;;41315:245;;;:::o;41567:394::-;;41756:2;41745:9;41741:18;41733:26;;41806:9;41800:4;41796:20;41792:1;41781:9;41777:17;41770:47;41831:120;41946:4;41937:6;41831:120;:::i;:::-;41823:128;;41727:234;;;;:::o;41968:402::-;;42161:2;42150:9;42146:18;42138:26;;42211:9;42205:4;42201:20;42197:1;42186:9;42182:17;42175:47;42236:124;42355:4;42346:6;42236:124;:::i;:::-;42228:132;;42132:238;;;;:::o;42377:222::-;;42504:2;42493:9;42489:18;42481:26;;42518:71;42586:1;42575:9;42571:17;42562:6;42518:71;:::i;:::-;42475:124;;;;:::o;42606:506::-;;;42741:11;42728:25;42837:1;42831:4;42827:12;42816:8;42800:14;42796:29;42792:48;42772:18;42768:73;42758:2;;42855:1;42852;42845:12;42758:2;42886:18;42876:8;42872:33;42864:41;;42939:4;42926:18;42916:28;;42964:18;42956:6;42953:30;42950:2;;;42996:1;42993;42986:12;42950:2;43024;43018:4;43014:13;43006:21;;43078:4;43070:6;43066:17;43050:14;43046:38;43040:4;43036:49;43033:2;;;43098:1;43095;43088:12;43033:2;42696:416;;;;;;:::o;43119:256::-;;43181:2;43175:9;43165:19;;43219:4;43211:6;43207:17;43318:6;43306:10;43303:22;43282:18;43270:10;43267:34;43264:62;43261:2;;;43339:1;43336;43329:12;43261:2;43359:10;43355:2;43348:22;43159:216;;;;:::o;43382:326::-;;43563:18;43555:6;43552:30;43549:2;;;43595:1;43592;43585:12;43549:2;43630:4;43622:6;43618:17;43610:25;;43693:4;43687;43683:15;43675:23;;43486:222;;;:::o;43715:321::-;;43858:18;43850:6;43847:30;43844:2;;;43890:1;43887;43880:12;43844:2;43957:4;43953:9;43946:4;43938:6;43934:17;43930:33;43922:41;;44021:4;44015;44011:15;44003:23;;43781:255;;;:::o;44043:98::-;;44128:3;44120:11;;44114:27;;;:::o;44148:97::-;;44232:3;44224:11;;44218:27;;;:::o;44252:97::-;;44336:3;44328:11;;44322:27;;;:::o;44356:109::-;;44451:4;44441:14;;44429:36;;;:::o;44472:108::-;;44566:4;44556:14;;44544:36;;;:::o;44587:108::-;;44681:4;44671:14;;44659:36;;;:::o;44702:121::-;;44795:5;44789:12;44779:22;;44760:63;;;:::o;44830:122::-;;44924:5;44918:12;44908:22;;44889:63;;;:::o;44959:107::-;;45056:4;45051:3;45047:14;45039:22;;45033:33;;;:::o;45073:106::-;;45169:4;45164:3;45160:14;45152:22;;45146:33;;;:::o;45186:106::-;;45282:4;45277:3;45273:14;45265:22;;45259:33;;;:::o;45300:141::-;;45432:3;45417:18;;45410:31;;;;:::o;45450:140::-;;45581:3;45566:18;;45559:31;;;;:::o;45599:140::-;;45730:3;45715:18;;45708:31;;;;:::o;45748:152::-;;45852:6;45847:3;45840:19;45889:4;45884:3;45880:14;45865:29;;45833:67;;;;:::o;45909:162::-;;46023:6;46018:3;46011:19;46060:4;46055:3;46051:14;46036:29;;46004:67;;;;:::o;46080:163::-;;46195:6;46190:3;46183:19;46232:4;46227:3;46223:14;46208:29;;46176:67;;;;:::o;46251:91::-;;46313:24;46331:5;46313:24;:::i;:::-;46302:35;;46296:46;;;:::o;46349:85::-;;46422:5;46415:13;46408:21;46397:32;;46391:43;;;:::o;46441:72::-;;46503:5;46492:16;;46486:27;;;:::o;46520:112::-;;46603:24;46621:5;46603:24;:::i;:::-;46592:35;;46586:46;;;:::o;46639:121::-;;46712:42;46705:5;46701:54;46690:65;;46684:76;;;:::o;46767:72::-;;46829:5;46818:16;;46812:27;;;:::o;46846:157::-;;46943:55;46992:5;46943:55;:::i;:::-;46930:68;;46924:79;;;:::o;47010:126::-;;47107:24;47125:5;47107:24;:::i;:::-;47094:37;;47088:48;;;:::o;47143:153::-;;47238:53;47285:5;47238:53;:::i;:::-;47225:66;;47219:77;;;:::o;47303:124::-;;47398:24;47416:5;47398:24;:::i;:::-;47385:37;;47379:48;;;:::o;47434:163::-;;47534:58;47586:5;47534:58;:::i;:::-;47521:71;;47515:82;;;:::o;47604:129::-;;47704:24;47722:5;47704:24;:::i;:::-;47691:37;;47685:48;;;:::o;47741:145::-;47822:6;47817:3;47812;47799:30;47878:1;47869:6;47864:3;47860:16;47853:27;47792:94;;;:::o;47895:268::-;47960:1;47967:101;47981:6;47978:1;47975:13;47967:101;;;48057:1;48052:3;48048:11;48042:18;48038:1;48033:3;48029:11;48022:39;48003:2;48000:1;47996:10;47991:15;;47967:101;;;48083:6;48080:1;48077:13;48074:2;;;48148:1;48139:6;48134:3;48130:16;48123:27;48074:2;47944:219;;;;:::o;48171:97::-;;48259:2;48255:7;48250:2;48243:5;48239:14;48235:28;48225:38;;48219:49;;;:::o;48276:117::-;48345:24;48363:5;48345:24;:::i;:::-;48338:5;48335:35;48325:2;;48384:1;48381;48374:12;48325:2;48319:74;:::o;48400:111::-;48466:21;48481:5;48466:21;:::i;:::-;48459:5;48456:32;48446:2;;48502:1;48499;48492:12;48446:2;48440:71;:::o;48518:117::-;48587:24;48605:5;48587:24;:::i;:::-;48580:5;48577:35;48567:2;;48626:1;48623;48616:12;48567:2;48561:74;:::o;48642:159::-;48732:45;48771:5;48732:45;:::i;:::-;48725:5;48722:56;48712:2;;48792:1;48789;48782:12;48712:2;48706:95;:::o;48808:117::-;48877:24;48895:5;48877:24;:::i;:::-;48870:5;48867:35;48857:2;;48916:1;48913;48906:12;48857:2;48851:74;:::o

Swarm Source

ipfs://3c1cfdc9132898b675dfb8b779ea642b14590df14f19edc5d3e4aa346d1e23e6
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading