ETH Price: $2,921.29 (+4.56%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Accept Admin163976702023-01-13 11:47:59664 days ago1673610479IN
0x93e0C035...e644f8f53
0 ETH0.0004354115.05261122
Transfer Admin122520842021-04-16 16:12:281301 days ago1618589548IN
0x93e0C035...e644f8f53
0 ETH0.01720476356
Withdraw Payment120867662021-03-22 5:41:561327 days ago1616391716IN
0x93e0C035...e644f8f53
0 ETH0.00492629130.9
Withdraw Payment120592082021-03-17 23:38:161331 days ago1616024296IN
0x93e0C035...e644f8f53
0 ETH0.00730099194
Withdraw Payment115328152020-12-27 1:14:311412 days ago1609031671IN
0x93e0C035...e644f8f53
0 ETH0.0031612584
Withdraw Payment115126572020-12-23 22:52:351415 days ago1608763955IN
0x93e0C035...e644f8f53
0 ETH0.0112902300
Withdraw Payment114997642020-12-21 23:34:541417 days ago1608593694IN
0x93e0C035...e644f8f53
0 ETH0.001881750
Withdraw Payment114703422020-12-17 11:24:301422 days ago1608204270IN
0x93e0C035...e644f8f53
0 ETH0.0075268200
Withdraw Payment114228122020-12-10 3:32:531429 days ago1607571173IN
0x93e0C035...e644f8f53
0 ETH0.0012419233
Withdraw Funds114132062020-12-08 16:28:561430 days ago1607444936IN
0x93e0C035...e644f8f53
0 ETH0.0018638168
Withdraw Payment113311082020-11-26 1:44:181443 days ago1606355058IN
0x93e0C035...e644f8f53
0 ETH0.0012419233
Withdraw Payment112782772020-11-17 22:57:571451 days ago1605653877IN
0x93e0C035...e644f8f53
0 ETH0.0012419233
Withdraw Payment111958102020-11-05 7:23:531464 days ago1604561033IN
0x93e0C035...e644f8f53
0 ETH0.0012419233
Withdraw Payment110179672020-10-09 0:01:081491 days ago1602201668IN
0x93e0C035...e644f8f53
0 ETH0.0016935345
Withdraw Payment109909502020-10-04 18:23:251495 days ago1601835805IN
0x93e0C035...e644f8f53
0 ETH0.00406447108
Withdraw Payment106318842020-08-10 11:23:241551 days ago1597058604IN
0x93e0C035...e644f8f53
0 ETH0.00628454115.30000148
Withdraw Payment106272292020-08-09 18:04:211551 days ago1596996261IN
0x93e0C035...e644f8f53
0 ETH0.00599698110
Withdraw Payment105682402020-07-31 15:42:181560 days ago1596210138IN
0x93e0C035...e644f8f53
0 ETH0.0052882497
Withdraw Payment105446302020-07-27 23:59:311564 days ago1595894371IN
0x93e0C035...e644f8f53
0 ETH0.0035436765
Withdraw Payment105431442020-07-27 18:31:361564 days ago1595874696IN
0x93e0C035...e644f8f53
0 ETH0.00763252140
Update Future Ro...105427672020-07-27 16:59:591564 days ago1595869199IN
0x93e0C035...e644f8f53
0 ETH0.00600628140
Submit105425092020-07-27 16:03:541564 days ago1595865834IN
0x93e0C035...e644f8f53
0 ETH0.01484119146
Submit105425082020-07-27 16:03:451564 days ago1595865825IN
0x93e0C035...e644f8f53
0 ETH0.0139942144
Submit105425082020-07-27 16:03:451564 days ago1595865825IN
0x93e0C035...e644f8f53
0 ETH0.01326083145
Submit105425082020-07-27 16:03:451564 days ago1595865825IN
0x93e0C035...e644f8f53
0 ETH0.01321965145
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
AccessControlledAggregator

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

pragma solidity 0.6.6;

interface AccessControllerInterface {
  function hasAccess(address user, bytes calldata data) external view returns (bool);
}


/**
 * @title The Owned contract
 * @notice A contract with helpers for basic contract ownership.
 */
contract Owned {

  address payable public owner;
  address private pendingOwner;

  event OwnershipTransferRequested(
    address indexed from,
    address indexed to
  );
  event OwnershipTransferred(
    address indexed from,
    address indexed to
  );

  constructor() public {
    owner = msg.sender;
  }

  /**
   * @dev Allows an owner to begin transferring ownership to a new address,
   * pending.
   */
  function transferOwnership(address _to)
    external
    onlyOwner()
  {
    pendingOwner = _to;

    emit OwnershipTransferRequested(owner, _to);
  }

  /**
   * @dev Allows an ownership transfer to be completed by the recipient.
   */
  function acceptOwnership()
    external
  {
    require(msg.sender == pendingOwner, "Must be proposed owner");

    address oldOwner = owner;
    owner = msg.sender;
    pendingOwner = address(0);

    emit OwnershipTransferred(oldOwner, msg.sender);
  }

  /**
   * @dev Reverts if called by anyone other than the contract owner.
   */
  modifier onlyOwner() {
    require(msg.sender == owner, "Only callable by owner");
    _;
  }

}


interface AggregatorV3Interface {
  function decimals() external view returns (uint8);
  function description() external view returns (string memory);
  function getRoundData(uint256 _roundId)
    external
    view
    returns (
      uint256 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint256 answeredInRound
    );
  function latestRoundData()
    external
    view
    returns (
      uint256 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint256 answeredInRound
    );
  function version() external view returns (uint256);
}


interface AggregatorInterface {
  function latestAnswer() external view returns (int256);
  function latestTimestamp() external view returns (uint256);
  function latestRound() external view returns (uint256);
  function getAnswer(uint256 roundId) external view returns (int256);
  function getTimestamp(uint256 roundId) external view returns (uint256);

  event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 timestamp);
  event NewRound(uint256 indexed roundId, address indexed startedBy, uint256 startedAt);
}


interface LinkTokenInterface {
  function allowance(address owner, address spender) external view returns (uint256 remaining);
  function approve(address spender, uint256 value) external returns (bool success);
  function balanceOf(address owner) external view returns (uint256 balance);
  function decimals() external view returns (uint8 decimalPlaces);
  function decreaseApproval(address spender, uint256 addedValue) external returns (bool success);
  function increaseApproval(address spender, uint256 subtractedValue) external;
  function name() external view returns (string memory tokenName);
  function symbol() external view returns (string memory tokenSymbol);
  function totalSupply() external view returns (uint256 totalTokensIssued);
  function transfer(address to, uint256 value) external returns (bool success);
  function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool success);
  function transferFrom(address from, address to, uint256 value) external returns (bool success);
}








/**
 * @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, 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");
    uint256 c = a - b;

    return c;
  }

  /**
    * @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) {
    // 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-solidity/pull/522
    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. Reverts 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) {
    // Solidity only automatically asserts when dividing by 0
    require(b > 0, "SafeMath: division by zero");
    uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold

    return c;
  }

  /**
    * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
    * Reverts 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;
  }
}



library SignedSafeMath {
  int256 constant private _INT256_MIN = -2**255;

  /**
   * @dev Multiplies two signed integers, reverts on overflow.
   */
  function mul(int256 a, int256 b) internal pure returns (int256) {
    // 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 0;
    }

    require(!(a == -1 && b == _INT256_MIN), "SignedSafeMath: multiplication overflow");

    int256 c = a * b;
    require(c / a == b, "SignedSafeMath: multiplication overflow");

    return c;
  }

  /**
   * @dev Integer division of two signed integers truncating the quotient, reverts on division by zero.
   */
  function div(int256 a, int256 b) internal pure returns (int256) {
    require(b != 0, "SignedSafeMath: division by zero");
    require(!(b == -1 && a == _INT256_MIN), "SignedSafeMath: division overflow");

    int256 c = a / b;

    return c;
  }

  /**
   * @dev Subtracts two signed integers, reverts on overflow.
   */
  function sub(int256 a, int256 b) internal pure returns (int256) {
    int256 c = a - b;
    require((b >= 0 && c <= a) || (b < 0 && c > a), "SignedSafeMath: subtraction overflow");

    return c;
  }

  /**
   * @dev Adds two signed integers, reverts on overflow.
   */
  function add(int256 a, int256 b) internal pure returns (int256) {
    int256 c = a + b;
    require((b >= 0 && c >= a) || (b < 0 && c < a), "SignedSafeMath: addition overflow");

    return c;
  }

  /**
   * @notice Computes average of two signed integers, ensuring that the computation
   * doesn't overflow.
   * @dev If the result is not an integer, it is rounded towards zero. For example,
   * avg(-3, -4) = -3
   */
  function avg(int256 _a, int256 _b)
    internal
    pure
    returns (int256)
  {
    if ((_a < 0 && _b > 0) || (_a > 0 && _b < 0)) {
      return add(_a, _b) / 2;
    }
    int256 remainder = (_a % 2 + _b % 2) / 2;
    return add(add(_a / 2, _b / 2), remainder);
  }
}


library Median {
  using SignedSafeMath for int256;

  int256 constant INT_MAX = 2**255-1;

  /**
   * @notice Returns the sorted middle, or the average of the two middle indexed items if the
   * array has an even number of elements.
   * @dev The list passed as an argument isn't modified.
   * @dev This algorithm has expected runtime O(n), but for adversarially chosen inputs
   * the runtime is O(n^2).
   * @param list The list of elements to compare
   */
  function calculate(int256[] memory list)
    internal
    pure
    returns (int256)
  {
    return calculateInplace(copy(list));
  }

  /**
   * @notice See documentation for function calculate.
   * @dev The list passed as an argument may be permuted.
   */
  function calculateInplace(int256[] memory list)
    internal
    pure
    returns (int256)
  {
    require(0 < list.length, "list must not be empty");
    uint256 len = list.length;
    uint256 middleIndex = len / 2;
    if (len % 2 == 0) {
      int256 median1;
      int256 median2;
      (median1, median2) = quickselectTwo(list, 0, len - 1, middleIndex - 1, middleIndex);
      return SignedSafeMath.avg(median1, median2);
    } else {
      return quickselect(list, 0, len - 1, middleIndex);
    }
  }

  /**
   * @notice Maximum length of list that shortSelectTwo can handle
   */
  uint256 constant SHORTSELECTTWO_MAX_LENGTH = 7;

  /**
   * @notice Select the k1-th and k2-th element from list of length at most 7
   * @dev Uses an optimal sorting network
   */
  function shortSelectTwo(
    int256[] memory list,
    uint256 lo,
    uint256 hi,
    uint256 k1,
    uint256 k2
  )
    private
    pure
    returns (int256 k1th, int256 k2th)
  {
    // Uses an optimal sorting network (https://en.wikipedia.org/wiki/Sorting_network)
    // for lists of length 7. Network layout is taken from
    // http://jgamble.ripco.net/cgi-bin/nw.cgi?inputs=7&algorithm=hibbard&output=svg

    uint256 len = hi + 1 - lo;
    int256 x0 = list[lo + 0];
    int256 x1 = 1 < len ? list[lo + 1] : INT_MAX;
    int256 x2 = 2 < len ? list[lo + 2] : INT_MAX;
    int256 x3 = 3 < len ? list[lo + 3] : INT_MAX;
    int256 x4 = 4 < len ? list[lo + 4] : INT_MAX;
    int256 x5 = 5 < len ? list[lo + 5] : INT_MAX;
    int256 x6 = 6 < len ? list[lo + 6] : INT_MAX;

    if (x0 > x1) {(x0, x1) = (x1, x0);}
    if (x2 > x3) {(x2, x3) = (x3, x2);}
    if (x4 > x5) {(x4, x5) = (x5, x4);}
    if (x0 > x2) {(x0, x2) = (x2, x0);}
    if (x1 > x3) {(x1, x3) = (x3, x1);}
    if (x4 > x6) {(x4, x6) = (x6, x4);}
    if (x1 > x2) {(x1, x2) = (x2, x1);}
    if (x5 > x6) {(x5, x6) = (x6, x5);}
    if (x0 > x4) {(x0, x4) = (x4, x0);}
    if (x1 > x5) {(x1, x5) = (x5, x1);}
    if (x2 > x6) {(x2, x6) = (x6, x2);}
    if (x1 > x4) {(x1, x4) = (x4, x1);}
    if (x3 > x6) {(x3, x6) = (x6, x3);}
    if (x2 > x4) {(x2, x4) = (x4, x2);}
    if (x3 > x5) {(x3, x5) = (x5, x3);}
    if (x3 > x4) {(x3, x4) = (x4, x3);}

    uint256 index1 = k1 - lo;
    if (index1 == 0) {k1th = x0;}
    else if (index1 == 1) {k1th = x1;}
    else if (index1 == 2) {k1th = x2;}
    else if (index1 == 3) {k1th = x3;}
    else if (index1 == 4) {k1th = x4;}
    else if (index1 == 5) {k1th = x5;}
    else if (index1 == 6) {k1th = x6;}
    else {revert("k1 out of bounds");}

    uint256 index2 = k2 - lo;
    if (k1 == k2) {return (k1th, k1th);}
    else if (index2 == 0) {return (k1th, x0);}
    else if (index2 == 1) {return (k1th, x1);}
    else if (index2 == 2) {return (k1th, x2);}
    else if (index2 == 3) {return (k1th, x3);}
    else if (index2 == 4) {return (k1th, x4);}
    else if (index2 == 5) {return (k1th, x5);}
    else if (index2 == 6) {return (k1th, x6);}
    else {revert("k2 out of bounds");}
  }

  /**
   * @notice Selects the k-th ranked element from list, looking only at indices between lo and hi
   * (inclusive). Modifies list in-place.
   */
  function quickselect(int256[] memory list, uint256 lo, uint256 hi, uint256 k)
    private
    pure
    returns (int256 kth)
  {
    require(lo <= k);
    require(k <= hi);
    while (lo < hi) {
      if (hi - lo < SHORTSELECTTWO_MAX_LENGTH) {
        int256 ignore;
        (kth, ignore) = shortSelectTwo(list, lo, hi, k, k);
        return kth;
      }
      uint256 pivotIndex = partition(list, lo, hi);
      if (k <= pivotIndex) {
        // since pivotIndex < (original hi passed to partition),
        // termination is guaranteed in this case
        hi = pivotIndex;
      } else {
        // since (original lo passed to partition) <= pivotIndex,
        // termination is guaranteed in this case
        lo = pivotIndex + 1;
      }
    }
    return list[lo];
  }

  /**
   * @notice Selects the k1-th and k2-th ranked elements from list, looking only at indices between
   * lo and hi (inclusive). Modifies list in-place.
   */
  function quickselectTwo(
    int256[] memory list,
    uint256 lo,
    uint256 hi,
    uint256 k1,
    uint256 k2
  )
    internal // for testing
    pure
    returns (int256 k1th, int256 k2th)
  {
    require(k1 < k2);
    require(lo <= k1 && k1 <= hi);
    require(lo <= k2 && k2 <= hi);

    while (true) {
      if (hi - lo < SHORTSELECTTWO_MAX_LENGTH) {
        return shortSelectTwo(list, lo, hi, k1, k2);
      }
      uint256 pivotIdx = partition(list, lo, hi);
      if (k2 <= pivotIdx) {
        hi = pivotIdx;
      } else if (pivotIdx < k1) {
        lo = pivotIdx + 1;
      } else {
        assert(k1 <= pivotIdx && pivotIdx < k2);
        k1th = quickselect(list, lo, pivotIdx, k1);
        k2th = quickselect(list, pivotIdx + 1, hi, k2);
        return (k1th, k2th);
      }
    }
  }

  /**
   * @notice Partitions list in-place using Hoare's partitioning scheme.
   * Only elements of list between indices lo and hi (inclusive) will be modified.
   * Returns an index i, such that:
   * - lo <= i < hi
   * - forall j in [lo, i]. list[j] <= list[i]
   * - forall j in [i, hi]. list[i] <= list[j]
   */
  function partition(int256[] memory list, uint256 lo, uint256 hi)
    private
    pure
    returns (uint256)
  {
    // We don't care about overflow of the addition, because it would require a list
    // larger than any feasible computer's memory.
    int256 pivot = list[(lo + hi) / 2];
    lo -= 1; // this can underflow. that's intentional.
    hi += 1;
    while (true) {
      do {
        lo += 1;
      } while (list[lo] < pivot);
      do {
        hi -= 1;
      } while (list[hi] > pivot);
      if (lo < hi) {
        (list[lo], list[hi]) = (list[hi], list[lo]);
      } else {
        // Let orig_lo and orig_hi be the original values of lo and hi passed to partition.
        // Then, hi < orig_hi, because hi decreases *strictly* monotonically
        // in each loop iteration and
        // - either list[orig_hi] > pivot, in which case the first loop iteration
        //   will achieve hi < orig_hi;
        // - or list[orig_hi] <= pivot, in which case at least two loop iterations are
        //   needed:
        //   - lo will have to stop at least once in the interval
        //     [orig_lo, (orig_lo + orig_hi)/2]
        //   - (orig_lo + orig_hi)/2 < orig_hi
        return hi;
      }
    }
  }

  /**
   * @notice Makes an in-memory copy of the array passed in
   * @param list Reference to the array to be copied
   */
  function copy(int256[] memory list)
    private
    pure
    returns(int256[] memory)
  {
    int256[] memory list2 = new int256[](list.length);
    for (uint256 i = 0; i < list.length; i++) {
      list2[i] = list[i];
    }
    return list2;
  }
}




/**
 * @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.
 *
 * This library is a version of Open Zeppelin's SafeMath, modified to support
 * unsigned 128 bit integers.
 */
library SafeMath128 {
  /**
    * @dev Returns the addition of two unsigned integers, reverting on
    * overflow.
    *
    * Counterpart to Solidity's `+` operator.
    *
    * Requirements:
    * - Addition cannot overflow.
    */
  function add(uint128 a, uint128 b) internal pure returns (uint128) {
    uint128 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(uint128 a, uint128 b) internal pure returns (uint128) {
    require(b <= a, "SafeMath: subtraction overflow");
    uint128 c = a - b;

    return c;
  }

  /**
    * @dev Returns the multiplication of two unsigned integers, reverting on
    * overflow.
    *
    * Counterpart to Solidity's `*` operator.
    *
    * Requirements:
    * - Multiplication cannot overflow.
    */
  function mul(uint128 a, uint128 b) internal pure returns (uint128) {
    // 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-solidity/pull/522
    if (a == 0) {
      return 0;
    }

    uint128 c = a * b;
    require(c / a == b, "SafeMath: multiplication overflow");

    return c;
  }

  /**
    * @dev Returns the integer division of two unsigned integers. Reverts 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(uint128 a, uint128 b) internal pure returns (uint128) {
    // Solidity only automatically asserts when dividing by 0
    require(b > 0, "SafeMath: division by zero");
    uint128 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold

    return c;
  }

  /**
    * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
    * Reverts 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(uint128 a, uint128 b) internal pure returns (uint128) {
    require(b != 0, "SafeMath: modulo by zero");
    return a % b;
  }
}



/**
 * @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.
 *
 * This library is a version of Open Zeppelin's SafeMath, modified to support
 * unsigned 64 bit integers.
 */
library SafeMath64 {
  /**
    * @dev Returns the addition of two unsigned integers, reverting on
    * overflow.
    *
    * Counterpart to Solidity's `+` operator.
    *
    * Requirements:
    * - Addition cannot overflow.
    */
  function add(uint64 a, uint64 b) internal pure returns (uint64) {
    uint64 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(uint64 a, uint64 b) internal pure returns (uint64) {
    require(b <= a, "SafeMath: subtraction overflow");
    uint64 c = a - b;

    return c;
  }

  /**
    * @dev Returns the multiplication of two unsigned integers, reverting on
    * overflow.
    *
    * Counterpart to Solidity's `*` operator.
    *
    * Requirements:
    * - Multiplication cannot overflow.
    */
  function mul(uint64 a, uint64 b) internal pure returns (uint64) {
    // 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-solidity/pull/522
    if (a == 0) {
      return 0;
    }

    uint64 c = a * b;
    require(c / a == b, "SafeMath: multiplication overflow");

    return c;
  }

  /**
    * @dev Returns the integer division of two unsigned integers. Reverts 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(uint64 a, uint64 b) internal pure returns (uint64) {
    // Solidity only automatically asserts when dividing by 0
    require(b > 0, "SafeMath: division by zero");
    uint64 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold

    return c;
  }

  /**
    * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
    * Reverts 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(uint64 a, uint64 b) internal pure returns (uint64) {
    require(b != 0, "SafeMath: modulo by zero");
    return a % b;
  }
}



/**
 * @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.
 *
 * This library is a version of Open Zeppelin's SafeMath, modified to support
 * unsigned 32 bit integers.
 */
library SafeMath32 {
  /**
    * @dev Returns the addition of two unsigned integers, reverting on
    * overflow.
    *
    * Counterpart to Solidity's `+` operator.
    *
    * Requirements:
    * - Addition cannot overflow.
    */
  function add(uint32 a, uint32 b) internal pure returns (uint32) {
    uint32 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(uint32 a, uint32 b) internal pure returns (uint32) {
    require(b <= a, "SafeMath: subtraction overflow");
    uint32 c = a - b;

    return c;
  }

  /**
    * @dev Returns the multiplication of two unsigned integers, reverting on
    * overflow.
    *
    * Counterpart to Solidity's `*` operator.
    *
    * Requirements:
    * - Multiplication cannot overflow.
    */
  function mul(uint32 a, uint32 b) internal pure returns (uint32) {
    // 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-solidity/pull/522
    if (a == 0) {
      return 0;
    }

    uint32 c = a * b;
    require(c / a == b, "SafeMath: multiplication overflow");

    return c;
  }

  /**
    * @dev Returns the integer division of two unsigned integers. Reverts 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(uint32 a, uint32 b) internal pure returns (uint32) {
    // Solidity only automatically asserts when dividing by 0
    require(b > 0, "SafeMath: division by zero");
    uint32 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold

    return c;
  }

  /**
    * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
    * Reverts 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(uint32 a, uint32 b) internal pure returns (uint32) {
    require(b != 0, "SafeMath: modulo by zero");
    return a % b;
  }
}






/**
 * @title The Prepaid Aggregator contract
 * @notice Node handles aggregating data pushed in from off-chain, and unlocks
 * payment for oracles as they report. Oracles' submissions are gathered in
 * rounds, with each round aggregating the submissions for each oracle into a
 * single answer. The latest aggregated answer is exposed as well as historical
 * answers and their updated at timestamp.
 */
contract FluxAggregator is AggregatorInterface, AggregatorV3Interface, Owned {
  using SafeMath for uint256;
  using SafeMath128 for uint128;
  using SafeMath64 for uint64;
  using SafeMath32 for uint32;

  struct Round {
    int256 answer;
    uint64 startedAt;
    uint64 updatedAt;
    uint32 answeredInRound;
    RoundDetails details;
  }

  struct RoundDetails {
    int256[] submissions;
    uint32 maxSubmissions;
    uint32 minSubmissions;
    uint32 timeout;
    uint128 paymentAmount;
  }

  struct OracleStatus {
    uint128 withdrawable;
    uint32 startingRound;
    uint32 endingRound;
    uint32 lastReportedRound;
    uint32 lastStartedRound;
    int256 latestSubmission;
    uint16 index;
    address admin;
    address pendingAdmin;
  }

  struct Requester {
    bool authorized;
    uint32 delay;
    uint32 lastStartedRound;
  }


  LinkTokenInterface public linkToken;
  uint128 public allocatedFunds;
  uint128 public availableFunds;

  // Round related params
  uint128 public paymentAmount;
  uint32 public maxSubmissionCount;
  uint32 public minSubmissionCount;
  uint32 public restartDelay;
  uint32 public timeout;
  uint8 public override decimals;
  string public override description;

  int256 immutable public minSubmissionValue;
  int256 immutable public maxSubmissionValue;

  uint256 constant public override version = 3;

  /**
   * @notice To ensure owner isn't withdrawing required funds as oracles are
   * submitting updates, we enforce that the contract maintains a minimum
   * reserve of RESERVE_ROUNDS * oracleCount() LINK earmarked for payment to
   * oracles. (Of course, this doesn't prevent the contract from running out of
   * funds without the owner's intervention.)
   */
  uint256 constant private RESERVE_ROUNDS = 2;
  uint256 constant private MAX_ORACLE_COUNT = 77;
  uint32 constant private ROUND_MAX = 2**32-1;

  uint32 private reportingRoundId;
  uint32 internal latestRoundId;
  mapping(address => OracleStatus) private oracles;
  mapping(uint32 => Round) internal rounds;
  mapping(address => Requester) internal requesters;
  address[] private oracleAddresses;

  event AvailableFundsUpdated(
    uint256 indexed amount
  );
  event RoundDetailsUpdated(
    uint128 indexed paymentAmount,
    uint32 indexed minSubmissionCount,
    uint32 indexed maxSubmissionCount,
    uint32 restartDelay,
    uint32 timeout // measured in seconds
  );
  event OraclePermissionsUpdated(
    address indexed oracle,
    bool indexed whitelisted
  );
  event OracleAdminUpdated(
    address indexed oracle,
    address indexed newAdmin
  );
  event OracleAdminUpdateRequested(
    address indexed oracle,
    address admin,
    address newAdmin
  );
  event SubmissionReceived(
    int256 indexed submission,
    uint32 indexed round,
    address indexed oracle
  );
  event RequesterPermissionsSet(
    address indexed requester,
    bool authorized,
    uint32 delay
  );

  /**
   * @notice Deploy with the address of the LINK token and initial payment amount
   * @dev Sets the LinkToken address and amount of LINK paid
   * @param _link The address of the LINK token
   * @param _paymentAmount The amount paid of LINK paid to each oracle per submission, in wei (units of 10⁻¹⁸ LINK)
   * @param _timeout is the number of seconds after the previous round that are
   * allowed to lapse before allowing an oracle to skip an unfinished round
   */
  constructor(
    address _link,
    uint128 _paymentAmount,
    uint32 _timeout,
    int256 _minSubmissionValue,
    int256 _maxSubmissionValue,
    uint8 _decimals,
    string memory _description
  ) public {
    linkToken = LinkTokenInterface(_link);
    paymentAmount = _paymentAmount;
    timeout = _timeout;
    minSubmissionValue = _minSubmissionValue;
    maxSubmissionValue = _maxSubmissionValue;
    decimals = _decimals;
    description = _description;
    rounds[0].updatedAt = uint64(block.timestamp.sub(uint256(_timeout)));
  }

  /**
   * @notice called by oracles when they have witnessed a need to update
   * @param _roundId is the ID of the round this submission pertains to
   * @param _submission is the updated data that the oracle is submitting
   */
  function submit(uint256 _roundId, int256 _submission)
    external
  {
    bytes memory error = validateOracleRound(msg.sender, uint32(_roundId));
    require(_submission >= minSubmissionValue, "value below minSubmissionValue");
    require(_submission <= maxSubmissionValue, "value above maxSubmissionValue");
    require(error.length == 0, string(error));

    oracleInitializeNewRound(uint32(_roundId));
    recordSubmission(_submission, uint32(_roundId));
    updateRoundAnswer(uint32(_roundId));
    payOracle(uint32(_roundId));
    deleteRoundDetails(uint32(_roundId));
  }

  /**
   * @notice called by the owner to add new Oracles and update the round
   * related parameters
   * @param _oracles is the list of addresses of the new Oracles being added
   * @param _admins is the admin addresses of the new respective _oracles list.
   * Only this address is allowed to access the respective oracle's funds.
   * @param _minSubmissions is the new minimum submission count for each round
   * @param _maxSubmissions is the new maximum submission count for each round
   * @param _restartDelay is the number of rounds an Oracle has to wait before
   * they can initiate a round
   */
  function addOracles(
    address[] calldata _oracles,
    address[] calldata _admins,
    uint32 _minSubmissions,
    uint32 _maxSubmissions,
    uint32 _restartDelay
  )
    external
    onlyOwner()
  {
    require(_oracles.length == _admins.length, "need same oracle and admin count");
    require(uint256(oracleCount()).add(_oracles.length) <= MAX_ORACLE_COUNT, "max oracles allowed");

    for (uint256 i = 0; i < _oracles.length; i++) {
      addOracle(_oracles[i], _admins[i]);
    }

    updateFutureRounds(paymentAmount, _minSubmissions, _maxSubmissions, _restartDelay, timeout);
  }

  /**
   * @notice called by the owner to remove Oracles and update the round
   * related parameters
   * @param _oracles is the address of the Oracles being removed
   * @param _minSubmissions is the new minimum submission count for each round
   * @param _maxSubmissions is the new maximum submission count for each round
   * @param _restartDelay is the number of rounds an Oracle has to wait before
   * they can initiate a round
   */
  function removeOracles(
    address[] calldata _oracles,
    uint32 _minSubmissions,
    uint32 _maxSubmissions,
    uint32 _restartDelay
  )
    external
    onlyOwner()
  {
    for (uint256 i = 0; i < _oracles.length; i++) {
      removeOracle(_oracles[i]);
    }

    updateFutureRounds(paymentAmount, _minSubmissions, _maxSubmissions, _restartDelay, timeout);
  }

  /**
   * @notice update the round and payment related parameters for subsequent
   * rounds
   * @param _paymentAmount is the payment amount for subsequent rounds
   * @param _minSubmissions is the new minimum submission count for each round
   * @param _maxSubmissions is the new maximum submission count for each round
   * @param _restartDelay is the number of rounds an Oracle has to wait before
   * they can initiate a round
   */
  function updateFutureRounds(
    uint128 _paymentAmount,
    uint32 _minSubmissions,
    uint32 _maxSubmissions,
    uint32 _restartDelay,
    uint32 _timeout
  )
    public
    onlyOwner()
  {
    uint32 oracleNum = oracleCount(); // Save on storage reads
    require(_maxSubmissions >= _minSubmissions, "max must equal/exceed min");
    require(oracleNum >= _maxSubmissions, "max cannot exceed total");
    require(oracleNum == 0 || oracleNum > _restartDelay, "delay cannot exceed total");
    require(availableFunds >= requiredReserve(_paymentAmount), "insufficient funds for payment");
    if (oracleCount() > 0) {
      require(_minSubmissions > 0, "min must be greater than 0");
    }

    paymentAmount = _paymentAmount;
    minSubmissionCount = _minSubmissions;
    maxSubmissionCount = _maxSubmissions;
    restartDelay = _restartDelay;
    timeout = _timeout;

    emit RoundDetailsUpdated(
      paymentAmount,
      _minSubmissions,
      _maxSubmissions,
      _restartDelay,
      _timeout
    );
  }

  /**
   * @notice recalculate the amount of LINK available for payouts
   */
  function updateAvailableFunds()
    public
  {
    uint128 pastAvailableFunds = availableFunds;

    uint256 available = linkToken.balanceOf(address(this)).sub(allocatedFunds);
    availableFunds = uint128(available);

    if (pastAvailableFunds != available) {
      emit AvailableFundsUpdated(available);
    }
  }

  /**
   * @notice returns the number of oracles
   */
  function oracleCount() public view returns (uint32) {
    return uint32(oracleAddresses.length);
  }

  /**
   * @notice returns an array of addresses containing the oracles on contract
   */
  function getOracles() external view returns (address[] memory) {
    return oracleAddresses;
  }

  /**
   * @notice get the most recently reported answer
   * @dev deprecated. Use latestRoundData instead.
   */
  function latestAnswer()
    public
    view
    virtual
    override
    returns (int256)
  {
    return rounds[latestRoundId].answer;
  }

  /**
   * @notice get the most recent updated at timestamp
   * @dev deprecated. Use latestRoundData instead.
   */
  function latestTimestamp()
    public
    view
    virtual
    override
    returns (uint256)
  {
    return rounds[latestRoundId].updatedAt;
  }

  /**
   * @notice get the ID of the last updated round
   * @dev deprecated. Use latestRoundData instead.
   */
  function latestRound()
    public
    view
    override
    returns (uint256)
  {
    return latestRoundId;
  }

  /**
   * @notice get the ID of the round most recently reported on
   */
  function reportingRound()
    external
    view
    returns (uint256)
  {
    return reportingRoundId;
  }

  /**
   * @notice get past rounds answers
   * @param _roundId the round number to retrieve the answer for
   * @dev deprecated. Use getRoundData instead.
   */
  function getAnswer(uint256 _roundId)
    public
    view
    virtual
    override
    returns (int256)
  {
    return rounds[uint32(_roundId)].answer;
  }

  /**
   * @notice get timestamp when an answer was last updated
   * @param _roundId the round number to retrieve the updated timestamp for
   * @dev deprecated. Use getRoundData instead.
   */
  function getTimestamp(uint256 _roundId)
    public
    view
    virtual
    override
    returns (uint256)
  {
    return rounds[uint32(_roundId)].updatedAt;
  }

  /**
   * @notice get data about a round. Consumers are encouraged to check
   * that they're receiving fresh data by inspecting the updatedAt and
   * answeredInRound return values.
   * @param _roundId the round ID to retrieve the round data for
   * @return roundId is the round ID for which data was retrieved
   * @return answer is the answer for the given round
   * @return startedAt is the timestamp when the round was started. This is 0
   * if the round hasn't been started yet.
   * @return updatedAt is the timestamp when the round last was updated (i.e.
   * answer was last computed)
   * @return answeredInRound is the round ID of the round in which the answer
   * was computed. answeredInRound may be smaller than roundId when the round
   * timed out. answerInRound is equal to roundId when the round didn't time out
   * and was completed regularly.
   * @dev Note that for in-progress rounds (i.e. rounds that haven't yet received
   * maxSubmissions) answer and updatedAt may change between queries.
   */
  function getRoundData(uint256 _roundId)
    public
    view
    virtual
    override
    returns (
      uint256 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint256 answeredInRound
    )
  {
    Round memory r = rounds[uint32(_roundId)];
    return (
      _roundId,
      r.answer,
      r.startedAt,
      r.updatedAt,
      r.answeredInRound
    );
  }

  /**
   * @notice get data about the latest round. Consumers are encouraged to check
   * that they're receiving fresh data by inspecting the updatedAt and
   * answeredInRound return values. Consumers are encouraged to
   * use this more fully featured method over the "legacy" getAnswer/
   * latestAnswer/getTimestamp/latestTimestamp functions.
   * @return roundId is the round ID for which data was retrieved
   * @return answer is the answer for the given round
   * @return startedAt is the timestamp when the round was started. This is 0
   * if the round hasn't been started yet.
   * @return updatedAt is the timestamp when the round last was updated (i.e.
   * answer was last computed)
   * @return answeredInRound is the round ID of the round in which the answer
   * was computed. answeredInRound may be smaller than roundId when the round
   * timed out. answerInRound is equal to roundId when the round didn't time out
   * and was completed regularly.
   * @dev Note that for in-progress rounds (i.e. rounds that haven't yet received
   * maxSubmissions) answer and updatedAt may change between queries.
   */
   function latestRoundData()
    public
    view
    virtual
    override
    returns (
      uint256 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint256 answeredInRound
    )
  {
    return getRoundData(latestRoundId);
  }


  /**
   * @notice query the available amount of LINK for an oracle to withdraw
   */
  function withdrawablePayment(address _oracle)
    external
    view
    returns (uint256)
  {
    return oracles[_oracle].withdrawable;
  }

  /**
   * @notice transfers the oracle's LINK to another address. Can only be called
   * by the oracle's admin.
   * @param _oracle is the oracle whose LINK is transferred
   * @param _recipient is the address to send the LINK to
   * @param _amount is the amount of LINK to send
   */
  function withdrawPayment(address _oracle, address _recipient, uint256 _amount)
    external
  {
    require(oracles[_oracle].admin == msg.sender, "only callable by admin");

    // Safe to downcast _amount because the total amount of LINK is less than 2^128.
    uint128 amount = uint128(_amount);
    uint128 available = oracles[_oracle].withdrawable;
    require(available >= amount, "insufficient withdrawable funds");

    oracles[_oracle].withdrawable = available.sub(amount);
    allocatedFunds = allocatedFunds.sub(amount);

    assert(linkToken.transfer(_recipient, uint256(amount)));
  }

  /**
   * @notice transfers the owner's LINK to another address
   * @param _recipient is the address to send the LINK to
   * @param _amount is the amount of LINK to send
   */
  function withdrawFunds(address _recipient, uint256 _amount)
    external
    onlyOwner()
  {
    require(uint256(availableFunds).sub(requiredReserve(paymentAmount)) >= _amount, "insufficient reserve funds");
    require(linkToken.transfer(_recipient, _amount), "token transfer failed");
    updateAvailableFunds();
  }

  /**
   * @notice get the latest submission for any oracle
   * @param _oracle is the address to lookup the latest submission for
   */
  function latestSubmission(address _oracle)
    external
    view
    returns (int256, uint256)
  {
    return (oracles[_oracle].latestSubmission, oracles[_oracle].lastReportedRound);
  }

  /**
   * @notice get the admin address of an oracle
   * @param _oracle is the address of the oracle whose admin is being queried
   */
  function getAdmin(address _oracle)
    external
    view
    returns (address)
  {
    return oracles[_oracle].admin;
  }

  /**
   * @notice transfer the admin address for an oracle
   * @param _oracle is the address of the oracle whose admin is being transfered
   * @param _newAdmin is the new admin address
   */
  function transferAdmin(address _oracle, address _newAdmin)
    external
  {
    require(oracles[_oracle].admin == msg.sender, "only callable by admin");
    oracles[_oracle].pendingAdmin = _newAdmin;

    emit OracleAdminUpdateRequested(_oracle, msg.sender, _newAdmin);
  }

  /**
   * @notice accept the admin address transfer for an oracle
   * @param _oracle is the address of the oracle whose admin is being transfered
   */
  function acceptAdmin(address _oracle)
    external
  {
    require(oracles[_oracle].pendingAdmin == msg.sender, "only callable by pending admin");
    oracles[_oracle].pendingAdmin = address(0);
    oracles[_oracle].admin = msg.sender;

    emit OracleAdminUpdated(_oracle, msg.sender);
  }

  /**
   * @notice allows non-oracles to request a new round
   */
  function requestNewRound()
    external
  {
    require(requesters[msg.sender].authorized, "not authorized requester");

    uint32 current = reportingRoundId;
    require(rounds[current].updatedAt > 0 || timedOut(current), "prev round must be supersedable");

    requesterInitializeNewRound(current.add(1));
  }

  /**
   * @notice allows the owner to specify new non-oracles to start new rounds
   * @param _requester is the address to set permissions for
   * @param _authorized is a boolean specifying whether they can start new rounds or not
   * @param _delay is the number of rounds the requester must wait before starting another round
   */
  function setRequesterPermissions(address _requester, bool _authorized, uint32 _delay)
    external
    onlyOwner()
  {
    if (requesters[_requester].authorized == _authorized) return;

    if (_authorized) {
      requesters[_requester].authorized = _authorized;
      requesters[_requester].delay = _delay;
    } else {
      delete requesters[_requester];
    }

    emit RequesterPermissionsSet(_requester, _authorized, _delay);
  }

  /**
   * @notice called through LINK's transferAndCall to update available funds
   * in the same transaction as the funds were transfered to the aggregator
   * @param _data is mostly ignored. It is checked for length, to be sure
   * nothing strange is passed in.
   */
  function onTokenTransfer(address, uint256, bytes calldata _data)
    external
  {
    require(_data.length == 0, "transfer doesn't accept calldata");
    updateAvailableFunds();
  }

  /**
   * @notice a method to provide all current info oracles need. Intended only
   * only to be callable by oracles. Not for use by contracts to read state.
   * @param _oracle the address to look up information for.
   */
  function oracleRoundState(address _oracle, uint32 _queriedRoundId)
    external
    view
    returns (
      bool _eligibleToSubmit,
      uint32 _roundId,
      int256 _latestSubmission,
      uint64 _startedAt,
      uint64 _timeout,
      uint128 _availableFunds,
      uint32 _oracleCount,
      uint128 _paymentAmount
    )
  {
    require(msg.sender == tx.origin, "off-chain reading only");

    if (_queriedRoundId > 0) {
      Round storage round = rounds[_queriedRoundId];
      return (
        eligibleForSpecificRound(_oracle, _queriedRoundId),
        _queriedRoundId,
        oracles[_oracle].latestSubmission,
        round.startedAt,
        round.details.timeout,
        availableFunds,
        oracleCount(),
        (round.startedAt > 0 ? round.details.paymentAmount : paymentAmount)
      );
    } else {
      return oracleRoundStateSuggestRound(_oracle);
    }
  }

  function eligibleForSpecificRound(address _oracle, uint32 _queriedRoundId)
    private
    view
    returns (bool _eligible)
  {
    if (rounds[_queriedRoundId].startedAt > 0) {
      return acceptingSubmissions(_queriedRoundId) && validateOracleRound(_oracle, _queriedRoundId).length == 0;
    } else {
      return delayed(_oracle, _queriedRoundId) && validateOracleRound(_oracle, _queriedRoundId).length == 0;
    }
  }

  function oracleRoundStateSuggestRound(address _oracle)
    private
    view
    returns (
      bool _eligibleToSubmit,
      uint32 _roundId,
      int256 _latestSubmission,
      uint64 _startedAt,
      uint64 _timeout,
      uint128 _availableFunds,
      uint32 _oracleCount,
      uint128 _paymentAmount
    )
  {
    Round storage round = rounds[0];
    OracleStatus storage oracle = oracles[_oracle];

    bool shouldSupersede = oracle.lastReportedRound == reportingRoundId || !acceptingSubmissions(reportingRoundId);
    // Instead of nudging oracles to submit to the next round, the inclusion of
    // the shouldSupersede bool in the if condition pushes them towards
    // submitting in a currently open round.
    if (supersedable(reportingRoundId) && shouldSupersede) {
      _roundId = reportingRoundId.add(1);
      round = rounds[_roundId];

      _paymentAmount = paymentAmount;
      _eligibleToSubmit = delayed(_oracle, _roundId);
    } else {
      _roundId = reportingRoundId;
      round = rounds[_roundId];

      _paymentAmount = round.details.paymentAmount;
      _eligibleToSubmit = acceptingSubmissions(_roundId);
    }

    if (validateOracleRound(_oracle, _roundId).length != 0) {
      _eligibleToSubmit = false;
    }

    return (
      _eligibleToSubmit,
      _roundId,
      oracle.latestSubmission,
      round.startedAt,
      round.details.timeout,
      availableFunds,
      oracleCount(),
      _paymentAmount
    );
  }


  /**
   * Private
   */

  function initializeNewRound(uint32 _roundId)
    private
  {
    updateTimedOutRoundInfo(_roundId.sub(1));

    reportingRoundId = _roundId;
    rounds[_roundId].details.maxSubmissions = maxSubmissionCount;
    rounds[_roundId].details.minSubmissions = minSubmissionCount;
    rounds[_roundId].details.paymentAmount = paymentAmount;
    rounds[_roundId].details.timeout = timeout;
    rounds[_roundId].startedAt = uint64(block.timestamp);

    emit NewRound(_roundId, msg.sender, rounds[_roundId].startedAt);
  }

  function oracleInitializeNewRound(uint32 _roundId)
    private
  {
    if (!newRound(_roundId)) return;
    uint256 lastStarted = oracles[msg.sender].lastStartedRound; // cache storage reads
    if (_roundId <= lastStarted + restartDelay && lastStarted != 0) return;

    initializeNewRound(_roundId);

    oracles[msg.sender].lastStartedRound = _roundId;
  }

  function requesterInitializeNewRound(uint32 _roundId)
    private
  {
    if (!newRound(_roundId)) return;
    uint256 lastStarted = requesters[msg.sender].lastStartedRound; // cache storage reads
    require(_roundId > lastStarted + requesters[msg.sender].delay || lastStarted == 0, "must delay requests");

    initializeNewRound(_roundId);

    requesters[msg.sender].lastStartedRound = _roundId;
  }

  function updateTimedOutRoundInfo(uint32 _roundId)
    private
  {
    if (!timedOut(_roundId)) return;

    uint32 prevId = _roundId.sub(1);
    rounds[_roundId].answer = rounds[prevId].answer;
    rounds[_roundId].answeredInRound = rounds[prevId].answeredInRound;
    rounds[_roundId].updatedAt = uint64(block.timestamp);

    delete rounds[_roundId].details;
  }

  function updateRoundAnswer(uint32 _roundId)
    private
  {
    if (rounds[_roundId].details.submissions.length < rounds[_roundId].details.minSubmissions) return;

    int256 newAnswer = Median.calculateInplace(rounds[_roundId].details.submissions);
    rounds[_roundId].answer = newAnswer;
    rounds[_roundId].updatedAt = uint64(block.timestamp);
    rounds[_roundId].answeredInRound = _roundId;
    latestRoundId = _roundId;

    emit AnswerUpdated(newAnswer, _roundId, now);
  }

  function payOracle(uint32 _roundId)
    private
  {
    uint128 payment = rounds[_roundId].details.paymentAmount;
    uint128 available = availableFunds.sub(payment);

    availableFunds = available;
    allocatedFunds = allocatedFunds.add(payment);
    oracles[msg.sender].withdrawable = oracles[msg.sender].withdrawable.add(payment);

    emit AvailableFundsUpdated(available);
  }

  function recordSubmission(int256 _submission, uint32 _roundId)
    private
  {
    require(acceptingSubmissions(_roundId), "round not accepting submissions");

    rounds[_roundId].details.submissions.push(_submission);
    oracles[msg.sender].lastReportedRound = _roundId;
    oracles[msg.sender].latestSubmission = _submission;

    emit SubmissionReceived(_submission, _roundId, msg.sender);
  }

  function deleteRoundDetails(uint32 _roundId)
    private
  {
    if (rounds[_roundId].details.submissions.length < rounds[_roundId].details.maxSubmissions) return;

    delete rounds[_roundId].details;
  }

  function timedOut(uint32 _roundId)
    private
    view
    returns (bool)
  {
    uint64 startedAt = rounds[_roundId].startedAt;
    uint32 roundTimeout = rounds[_roundId].details.timeout;
    return startedAt > 0 && roundTimeout > 0 && startedAt.add(roundTimeout) < block.timestamp;
  }

  function getStartingRound(address _oracle)
    private
    view
    returns (uint32)
  {
    uint32 currentRound = reportingRoundId;
    if (currentRound != 0 && currentRound == oracles[_oracle].endingRound) {
      return currentRound;
    }
    return currentRound.add(1);
  }

  function previousAndCurrentUnanswered(uint32 _roundId, uint32 _rrId)
    private
    view
    returns (bool)
  {
    return _roundId.add(1) == _rrId && rounds[_rrId].updatedAt == 0;
  }

  function requiredReserve(uint256 payment)
    private
    view
    returns (uint256)
  {
    return payment.mul(oracleCount()).mul(RESERVE_ROUNDS);
  }

  function addOracle(
    address _oracle,
    address _admin
  )
    private
  {
    require(!oracleEnabled(_oracle), "oracle already enabled");

    require(_admin != address(0), "cannot set admin to 0");
    require(oracles[_oracle].admin == address(0) || oracles[_oracle].admin == _admin, "owner cannot overwrite admin");

    oracles[_oracle].startingRound = getStartingRound(_oracle);
    oracles[_oracle].endingRound = ROUND_MAX;
    oracles[_oracle].index = uint16(oracleAddresses.length);
    oracleAddresses.push(_oracle);
    oracles[_oracle].admin = _admin;

    emit OraclePermissionsUpdated(_oracle, true);
    emit OracleAdminUpdated(_oracle, _admin);
  }

  function removeOracle(
    address _oracle
  )
    private
  {
    require(oracleEnabled(_oracle), "oracle not enabled");

    oracles[_oracle].endingRound = reportingRoundId.add(1);
    address tail = oracleAddresses[oracleCount().sub(1)];
    uint16 index = oracles[_oracle].index;
    oracles[tail].index = index;
    delete oracles[_oracle].index;
    oracleAddresses[index] = tail;
    oracleAddresses.pop();

    emit OraclePermissionsUpdated(_oracle, false);
  }

  function validateOracleRound(address _oracle, uint32 _roundId)
    private
    view
    returns (bytes memory)
  {
    // cache storage reads
    uint32 startingRound = oracles[_oracle].startingRound;
    uint32 rrId = reportingRoundId;

    if (startingRound == 0) return "not enabled oracle";
    if (startingRound > _roundId) return "not yet enabled oracle";
    if (oracles[_oracle].endingRound < _roundId) return "no longer allowed oracle";
    if (oracles[_oracle].lastReportedRound >= _roundId) return "cannot report on previous rounds";
    if (_roundId != rrId && _roundId != rrId.add(1) && !previousAndCurrentUnanswered(_roundId, rrId)) return "invalid round to report";
    if (_roundId != 1 && !supersedable(_roundId.sub(1))) return "previous round not supersedable";
  }

  function supersedable(uint32 _roundId)
    private
    view
    returns (bool)
  {
    return rounds[_roundId].updatedAt > 0 || timedOut(_roundId);
  }

  function oracleEnabled(address _oracle)
    private
    view
    returns (bool)
  {
    return oracles[_oracle].endingRound == ROUND_MAX;
  }

  function acceptingSubmissions(uint32 _roundId)
    private
    view
    returns (bool)
  {
    return rounds[_roundId].details.maxSubmissions != 0;
  }

  function delayed(address _oracle, uint32 _roundId)
    private
    view
    returns (bool)
  {
    uint256 lastStarted = oracles[_oracle].lastStartedRound;
    return _roundId > lastStarted + restartDelay || lastStarted == 0;
  }

  function newRound(uint32 _roundId)
    private
    view
    returns (bool)
  {
    return _roundId == reportingRoundId.add(1);
  }

}






/**
 * @title SimpleAccessControl
 * @notice Allows the owner to set access for addresses
 */
contract SimpleAccessControl is AccessControllerInterface, Owned {

  bool public checkEnabled;
  mapping(address => bool) internal accessList;

  event AddedAccess(address user);
  event RemovedAccess(address user);
  event CheckAccessEnabled();
  event CheckAccessDisabled();

  constructor()
    public
  {
    checkEnabled = true;
  }

  /**
   * @notice Returns the access of an address
   * @param _user The address to query
   */
  function hasAccess(
    address _user,
    bytes memory
  )
    public
    view
    override
    returns (bool)
  {
    return accessList[_user] || !checkEnabled || _user == tx.origin;
  }

  /**
   * @notice Adds an address to the access list
   * @param _user The address to add
   */
  function addAccess(address _user)
    external
    onlyOwner()
  {
    accessList[_user] = true;
    emit AddedAccess(_user);
  }

  /**
   * @notice Removes an address from the access list
   * @param _user The address to remove
   */
  function removeAccess(address _user)
    external
    onlyOwner()
  {
    delete accessList[_user];
    emit RemovedAccess(_user);
  }

  /**
   * @notice makes the access check enforced
   */
  function enableAccessCheck()
    external
    onlyOwner()
  {
    checkEnabled = true;

    emit CheckAccessEnabled();
  }

  /**
   * @notice makes the access check unenforced
   */
  function disableAccessCheck()
    external
    onlyOwner()
  {
    checkEnabled = false;

    emit CheckAccessDisabled();
  }

  /**
   * @dev reverts if the caller does not have access
   * @dev WARNING: This modifier should only be used on view methods
   */
  modifier checkAccess() {
    require(hasAccess(msg.sender, msg.data), "No access");
    _;
  }
}


/**
 * @title AccessControlled FluxAggregator contract
 * @notice This contract requires addresses to be added to a controller
 * in order to read the answers stored in the FluxAggregator contract
 */
contract AccessControlledAggregator is FluxAggregator, SimpleAccessControl {

  constructor(
    address _link,
    uint128 _paymentAmount,
    uint32 _timeout,
    int256 _minSubmissionValue,
    int256 _maxSubmissionValue,
    uint8 _decimals,
    string memory _description
  ) public FluxAggregator(
    _link,
    _paymentAmount,
    _timeout,
    _minSubmissionValue,
    _maxSubmissionValue,
    _decimals,
    _description
  ){}

  /**
   * @notice get the most recently reported answer
   * @dev overridden funcion to add the checkAccess() modifier
   * @dev deprecated. Use latestRoundData instead.
   */
  function latestAnswer()
    public
    view
    override
    checkAccess()
    returns (int256)
  {
    return super.latestAnswer();
  }

  /**
   * @notice get the most recent updated at timestamp
   * @dev overridden funcion to add the checkAccess() modifier
   * @dev deprecated. Use latestRoundData instead.
   */
  function latestTimestamp()
    public
    view
    override
    checkAccess()
    returns (uint256)
  {
    return super.latestTimestamp();
  }

  /**
   * @notice get past rounds answers
   * @dev overridden funcion to add the checkAccess() modifier
   * @param _roundId the round number to retrieve the answer for
   * @dev deprecated. Use getRoundData instead.
   */
  function getAnswer(uint256 _roundId)
    public
    view
    override
    checkAccess()
    returns (int256)
  {
    return super.getAnswer(_roundId);
  }

  /**
   * @notice get timestamp when an answer was last updated
   * @dev overridden funcion to add the checkAccess() modifier
   * @param _roundId the round number to retrieve the updated timestamp for
   * @dev deprecated. Use getRoundData instead.
   */
  function getTimestamp(uint256 _roundId)
    public
    view
    override
    checkAccess()
    returns (uint256)
  {
    return super.getTimestamp(_roundId);
  }

  /**
   * @notice get data about a round. Consumers are encouraged to check
   * that they're receiving fresh data by inspecting the updatedAt and
   * answeredInRound return values.
   * @param _roundId the round ID to retrieve the round data for
   * @return roundId is the round ID for which data was retrieved
   * @return answer is the answer for the given round
   * @return startedAt is the timestamp when the round was started. This is 0
   * if the round hasn't been started yet.
   * @return updatedAt is the timestamp when the round last was updated (i.e.
   * answer was last computed)
   * @return answeredInRound is the round ID of the round in which the answer
   * was computed. answeredInRound may be smaller than roundId when the round
   * timed out. answerInRound is equal to roundId when the round didn't time out
   * and was completed regularly.
   * @dev Note that for in-progress rounds (i.e. rounds that haven't yet received
   * maxSubmissions) answer and updatedAt may change between queries.
   */
  function getRoundData(uint256 _roundId)
    public
    view
    override
    checkAccess()
    returns (
      uint256 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint256 answeredInRound
    )
  {
    return super.getRoundData(_roundId);
  }

  /**
   * @notice get data about the latest round. Consumers are encouraged to check
   * that they're receiving fresh data by inspecting the updatedAt and
   * answeredInRound return values. Consumers are encouraged to
   * use this more fully featured method over the "legacy" getAnswer/
   * latestAnswer/getTimestamp/latestTimestamp functions. Consumers are
   * encouraged to check that they're receiving fresh data by inspecting the
   * updatedAt and answeredInRound return values.
   * @return roundId is the round ID for which data was retrieved
   * @return answer is the answer for the given round
   * @return startedAt is the timestamp when the round was started. This is 0
   * if the round hasn't been started yet.
   * @return updatedAt is the timestamp when the round last was updated (i.e.
   * answer was last computed)
   * @return answeredInRound is the round ID of the round in which the answer
   * was computed. answeredInRound may be smaller than roundId when the round
   * timed out. answerInRound is equal to roundId when the round didn't time out
   * and was completed regularly.
   * @dev Note that for in-progress rounds (i.e. rounds that haven't yet received
   * maxSubmissions) answer and updatedAt may change between queries.
   */
  function latestRoundData()
    public
    view
    override
    checkAccess()
    returns (
      uint256 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint256 answeredInRound
    )
  {
    return super.latestRoundData();
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_link","type":"address"},{"internalType":"uint128","name":"_paymentAmount","type":"uint128"},{"internalType":"uint32","name":"_timeout","type":"uint32"},{"internalType":"int256","name":"_minSubmissionValue","type":"int256"},{"internalType":"int256","name":"_maxSubmissionValue","type":"int256"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"string","name":"_description","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"}],"name":"AddedAccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int256","name":"current","type":"int256"},{"indexed":true,"internalType":"uint256","name":"roundId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"AnswerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AvailableFundsUpdated","type":"event"},{"anonymous":false,"inputs":[],"name":"CheckAccessDisabled","type":"event"},{"anonymous":false,"inputs":[],"name":"CheckAccessEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"roundId","type":"uint256"},{"indexed":true,"internalType":"address","name":"startedBy","type":"address"},{"indexed":false,"internalType":"uint256","name":"startedAt","type":"uint256"}],"name":"NewRound","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oracle","type":"address"},{"indexed":false,"internalType":"address","name":"admin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"OracleAdminUpdateRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oracle","type":"address"},{"indexed":true,"internalType":"address","name":"newAdmin","type":"address"}],"name":"OracleAdminUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oracle","type":"address"},{"indexed":true,"internalType":"bool","name":"whitelisted","type":"bool"}],"name":"OraclePermissionsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipTransferRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"}],"name":"RemovedAccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"requester","type":"address"},{"indexed":false,"internalType":"bool","name":"authorized","type":"bool"},{"indexed":false,"internalType":"uint32","name":"delay","type":"uint32"}],"name":"RequesterPermissionsSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint128","name":"paymentAmount","type":"uint128"},{"indexed":true,"internalType":"uint32","name":"minSubmissionCount","type":"uint32"},{"indexed":true,"internalType":"uint32","name":"maxSubmissionCount","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"restartDelay","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"timeout","type":"uint32"}],"name":"RoundDetailsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int256","name":"submission","type":"int256"},{"indexed":true,"internalType":"uint32","name":"round","type":"uint32"},{"indexed":true,"internalType":"address","name":"oracle","type":"address"}],"name":"SubmissionReceived","type":"event"},{"inputs":[{"internalType":"address","name":"_oracle","type":"address"}],"name":"acceptAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"addAccess","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_oracles","type":"address[]"},{"internalType":"address[]","name":"_admins","type":"address[]"},{"internalType":"uint32","name":"_minSubmissions","type":"uint32"},{"internalType":"uint32","name":"_maxSubmissions","type":"uint32"},{"internalType":"uint32","name":"_restartDelay","type":"uint32"}],"name":"addOracles","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"allocatedFunds","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"availableFunds","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"description","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableAccessCheck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableAccessCheck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oracle","type":"address"}],"name":"getAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_roundId","type":"uint256"}],"name":"getAnswer","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOracles","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_roundId","type":"uint256"}],"name":"getRoundData","outputs":[{"internalType":"uint256","name":"roundId","type":"uint256"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint256","name":"answeredInRound","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_roundId","type":"uint256"}],"name":"getTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"hasAccess","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestAnswer","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestRound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestRoundData","outputs":[{"internalType":"uint256","name":"roundId","type":"uint256"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint256","name":"answeredInRound","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_oracle","type":"address"}],"name":"latestSubmission","outputs":[{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"linkToken","outputs":[{"internalType":"contract LinkTokenInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSubmissionCount","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSubmissionValue","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minSubmissionCount","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minSubmissionValue","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"onTokenTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"oracleCount","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_oracle","type":"address"},{"internalType":"uint32","name":"_queriedRoundId","type":"uint32"}],"name":"oracleRoundState","outputs":[{"internalType":"bool","name":"_eligibleToSubmit","type":"bool"},{"internalType":"uint32","name":"_roundId","type":"uint32"},{"internalType":"int256","name":"_latestSubmission","type":"int256"},{"internalType":"uint64","name":"_startedAt","type":"uint64"},{"internalType":"uint64","name":"_timeout","type":"uint64"},{"internalType":"uint128","name":"_availableFunds","type":"uint128"},{"internalType":"uint32","name":"_oracleCount","type":"uint32"},{"internalType":"uint128","name":"_paymentAmount","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paymentAmount","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"removeAccess","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_oracles","type":"address[]"},{"internalType":"uint32","name":"_minSubmissions","type":"uint32"},{"internalType":"uint32","name":"_maxSubmissions","type":"uint32"},{"internalType":"uint32","name":"_restartDelay","type":"uint32"}],"name":"removeOracles","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reportingRound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"requestNewRound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"restartDelay","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_requester","type":"address"},{"internalType":"bool","name":"_authorized","type":"bool"},{"internalType":"uint32","name":"_delay","type":"uint32"}],"name":"setRequesterPermissions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_roundId","type":"uint256"},{"internalType":"int256","name":"_submission","type":"int256"}],"name":"submit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"timeout","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_oracle","type":"address"},{"internalType":"address","name":"_newAdmin","type":"address"}],"name":"transferAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateAvailableFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"_paymentAmount","type":"uint128"},{"internalType":"uint32","name":"_minSubmissions","type":"uint32"},{"internalType":"uint32","name":"_maxSubmissions","type":"uint32"},{"internalType":"uint32","name":"_restartDelay","type":"uint32"},{"internalType":"uint32","name":"_timeout","type":"uint32"}],"name":"updateFutureRounds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oracle","type":"address"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawPayment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oracle","type":"address"}],"name":"withdrawablePayment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60c06040523480156200001157600080fd5b5060405162004aa838038062004aa8833981810160405260e08110156200003757600080fd5b815160208301516040808501516060860151608087015160a088015160c089018051955197999698949793969295919483019291846401000000008211156200007f57600080fd5b9083019060208201858111156200009557600080fd5b8251640100000000811182820188101715620000b057600080fd5b82525081516020918201929091019080838360005b83811015620000df578181015183820152602001620000c5565b50505050905090810190601f1680156200010d5780820380516001836020036101000a031916815260200191505b50604052505060008054336001600160a01b031991821617909155600280549091166001600160a01b038a1617905550600480546001600160801b0319166001600160801b038816176001600160e01b0316600160e01b63ffffffff881602179055608084905260a08390526005805460ff191660ff841617905580518790879087908790879087908790620001ab906006906020840190620002a4565b50620001cc8563ffffffff16426200024660201b62002f791790919060201c565b6000805260096020527fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6c80546001600160401b03929092166801000000000000000002600160401b600160801b03199092169190911790555050600c805460ff1916600117905550620003499a5050505050505050505050565b6000828211156200029e576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002e757805160ff191683800117855562000317565b8280016001018555821562000317579182015b8281111562000317578251825591602001919060010190620002fa565b506200032592915062000329565b5090565b6200034691905b8082111562000325576000815560010162000330565b90565b60805160a0516147316200037760003980610c7e5280610ee8525080610c0952806119b752506147316000f3fe608060405234801561001057600080fd5b50600436106102a05760003560e01c806379ba509711610167578063bb07bacd116100ce578063dc7f012411610087578063dc7f0124146109c6578063e2e40317146109ce578063e9ee6eeb146109f4578063ebf8571c14610a22578063f2fde38b14610aa8578063feaf968c14610ace576102a0565b8063bb07bacd1461086d578063bbf0b7e9146108ac578063c107532914610982578063c35905c6146109ae578063c9374500146109b6578063d4cc54e4146109be576102a0565b80638da5cb5b116101205780638da5cb5b1461077a57806398e5b12a14610782578063a118f2491461078a578063a4c0ed36146107b0578063b5ab58dc14610833578063b633620c14610850576102a0565b806379ba50971461069e5780637c2b0b21146106a65780638038e4a1146106ae5780638205bf6a146106b65780638823da6c146106be57806388aa80e7146106e4576102a0565b806350d25bcd1161020b57806364efb22b116101c457806364efb22b1461051b578063668a0f02146105415780636b14daf8146105495780636fb4bb4e1461061157806370dea79a146106195780637284e41614610621576102a0565b806350d25bcd146104b157806354fd4d50146104b957806357970e93146104c157806358609e44146104e5578063613d8fcc146104ed578063628806ef146104f5576102a0565b8063357ebb021161025d578063357ebb021461038c57806338aa4c72146103ad5780633d3d7714146103f757806340884c521461042d57806346fcff4c146104855780634f8fc3b5146104a9576102a0565b80630720da52146102a55780630a756983146102ed578063202ee0ed146102f757806320ed02751461031a57806323ca290314610354578063313ce5671461036e575b600080fd5b6102c2600480360360208110156102bb57600080fd5b5035610ad6565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b6102f5610b77565b005b6102f56004803603604081101561030d57600080fd5b5080359060200135610bf9565b6102f56004803603606081101561033057600080fd5b5080356001600160a01b03169060208101351515906040013563ffffffff16610db2565b61035c610ee6565b60408051918252519081900360200190f35b610376610f0a565b6040805160ff9092168252519081900360200190f35b610394610f13565b6040805163ffffffff9092168252519081900360200190f35b6102f5600480360360a08110156103c357600080fd5b506001600160801b038135169063ffffffff6020820135811691604081013582169160608201358116916080013516610f26565b6102f56004803603606081101561040d57600080fd5b506001600160a01b038135811691602081013590911690604001356112d0565b6104356114c3565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610471578181015183820152602001610459565b505050509050019250505060405180910390f35b61048d611526565b604080516001600160801b039092168252519081900360200190f35b6102f561153c565b61035c611636565b61035c6116c3565b6104c96116c8565b604080516001600160a01b039092168252519081900360200190f35b6103946116d7565b6103946116ea565b6102f56004803603602081101561050b57600080fd5b50356001600160a01b03166116f0565b6104c96004803603602081101561053157600080fd5b50356001600160a01b03166117d6565b61035c611800565b6105fd6004803603604081101561055f57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561058957600080fd5b82018360208201111561059b57600080fd5b803590602001918460018302840111600160201b831117156105bc57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611813945050505050565b604080519115158252519081900360200190f35b61035c611859565b610394611865565b610629611878565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561066357818101518382015260200161064b565b50505050905090810190601f1680156106905780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102f5611906565b61035c6119b5565b6102f56119d9565b61035c611a5e565b6102f5600480360360208110156106d457600080fd5b50356001600160a01b0316611ae6565b610716600480360360408110156106fa57600080fd5b5080356001600160a01b0316906020013563ffffffff16611b8b565b60408051981515895263ffffffff97881660208a0152888101969096526001600160401b0394851660608901529290931660808701526001600160801b0390811660a08701529190931660c08501529190911660e083015251908190036101000190f35b6104c9611ce8565b6102f5611cf7565b6102f5600480360360208110156107a057600080fd5b50356001600160a01b0316611e08565b6102f5600480360360608110156107c657600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b8111156107f557600080fd5b82018360208201111561080757600080fd5b803590602001918460018302840111600160201b8311171561082857600080fd5b509092509050611eb0565b61035c6004803603602081101561084957600080fd5b5035611f11565b61035c6004803603602081101561086657600080fd5b5035611f9a565b6108936004803603602081101561088357600080fd5b50356001600160a01b0316612023565b6040805192835260208301919091528051918290030190f35b6102f5600480360360a08110156108c257600080fd5b810190602081018135600160201b8111156108dc57600080fd5b8201836020820111156108ee57600080fd5b803590602001918460208302840111600160201b8311171561090f57600080fd5b919390929091602081019035600160201b81111561092c57600080fd5b82018360208201111561093e57600080fd5b803590602001918460208302840111600160201b8311171561095f57600080fd5b919350915063ffffffff8135811691602081013582169160409091013516612054565b6102f56004803603604081101561099857600080fd5b506001600160a01b0381351690602001356121e7565b61048d61238e565b61039461239d565b61048d6123b0565b6105fd6123bf565b61035c600480360360208110156109e457600080fd5b50356001600160a01b03166123c8565b6102f560048036036040811015610a0a57600080fd5b506001600160a01b03813581169160200135166123ec565b6102f560048036036080811015610a3857600080fd5b810190602081018135600160201b811115610a5257600080fd5b820183602082011115610a6457600080fd5b803590602001918460208302840111600160201b83111715610a8557600080fd5b919350915063ffffffff81358116916020810135821691604090910135166124cf565b6102f560048036036020811015610abe57600080fd5b50356001600160a01b031661257e565b6102c261261c565b6000806000806000610b1f336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061181392505050565b610b5c576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b610b65866126bb565b939a9299509097509550909350915050565b6000546001600160a01b03163314610bc4576040805162461bcd60e51b815260206004820152601660248201526000805160206146dc833981519152604482015290519081900360640190fd5b600c805460ff191690556040517f3be8a977a014527b50ae38adda80b56911c267328965c98ddc385d248f53963890600090a1565b6060610c05338461280c565b90507f0000000000000000000000000000000000000000000000000000000000000000821215610c7c576040805162461bcd60e51b815260206004820152601e60248201527f76616c75652062656c6f77206d696e5375626d697373696f6e56616c75650000604482015290519081900360640190fd5b7f0000000000000000000000000000000000000000000000000000000000000000821315610cf1576040805162461bcd60e51b815260206004820152601e60248201527f76616c75652061626f7665206d61785375626d697373696f6e56616c75650000604482015290519081900360640190fd5b8051819015610d7e5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610d43578181015183820152602001610d2b565b50505050905090810190601f168015610d705780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50610d8883612aae565b610d928284612b43565b610d9b83612c1f565b610da483612d6e565b610dad83612e71565b505050565b6000546001600160a01b03163314610dff576040805162461bcd60e51b815260206004820152601660248201526000805160206146dc833981519152604482015290519081900360640190fd5b6001600160a01b0383166000908152600a602052604090205460ff1615158215151415610e2b57610dad565b8115610e6e576001600160a01b0383166000908152600a60205260409020805460ff19168315151764ffffffff00191661010063ffffffff841602179055610e97565b6001600160a01b0383166000908152600a60205260409020805468ffffffffffffffffff191690555b60408051831515815263ffffffff8316602082015281516001600160a01b038616927fc3df5a754e002718f2e10804b99e6605e7c701d95cec9552c7680ca2b6f2820a928290030190a2505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60055460ff1681565b600454600160c01b900463ffffffff1681565b6000546001600160a01b03163314610f73576040805162461bcd60e51b815260206004820152601660248201526000805160206146dc833981519152604482015290519081900360640190fd5b6000610f7d6116ea565b90508463ffffffff168463ffffffff161015610fe0576040805162461bcd60e51b815260206004820152601960248201527f6d6178206d75737420657175616c2f657863656564206d696e00000000000000604482015290519081900360640190fd5b8363ffffffff168163ffffffff161015611041576040805162461bcd60e51b815260206004820152601760248201527f6d61782063616e6e6f742065786365656420746f74616c000000000000000000604482015290519081900360640190fd5b63ffffffff8116158061105f57508263ffffffff168163ffffffff16115b6110b0576040805162461bcd60e51b815260206004820152601960248201527f64656c61792063616e6e6f742065786365656420746f74616c00000000000000604482015290519081900360640190fd5b6110c2866001600160801b0316612ed7565b600354600160801b90046001600160801b03161015611128576040805162461bcd60e51b815260206004820152601e60248201527f696e73756666696369656e742066756e647320666f72207061796d656e740000604482015290519081900360640190fd5b60006111326116ea565b63ffffffff1611156111995760008563ffffffff1611611199576040805162461bcd60e51b815260206004820152601a60248201527f6d696e206d7573742062652067726561746572207468616e2030000000000000604482015290519081900360640190fd5b85600460006101000a8154816001600160801b0302191690836001600160801b0316021790555084600460146101000a81548163ffffffff021916908363ffffffff16021790555083600460106101000a81548163ffffffff021916908363ffffffff16021790555082600460186101000a81548163ffffffff021916908363ffffffff160217905550816004601c6101000a81548163ffffffff021916908363ffffffff1602179055508363ffffffff168563ffffffff16600460009054906101000a90046001600160801b03166001600160801b03167f56800c9d1ed723511246614d15e58cfcde15b6a33c245b5c961b689c1890fd8f8686604051808363ffffffff1663ffffffff1681526020018263ffffffff1663ffffffff1681526020019250505060405180910390a4505050505050565b6001600160a01b03838116600090815260086020526040902060020154620100009004163314611340576040805162461bcd60e51b815260206004820152601660248201527537b7363c9031b0b63630b1363290313c9030b236b4b760511b604482015290519081900360640190fd5b6001600160a01b03831660009081526008602052604090205481906001600160801b039081169082168110156113bd576040805162461bcd60e51b815260206004820152601f60248201527f696e73756666696369656e7420776974686472617761626c652066756e647300604482015290519081900360640190fd5b6113d66001600160801b0382168363ffffffff612f0a16565b6001600160a01b038616600090815260086020526040902080546001600160801b0319166001600160801b03928316179055600354611416911683612f0a565b600380546001600160801b0319166001600160801b039283161790556002546040805163a9059cbb60e01b81526001600160a01b03888116600483015293861660248201529051929091169163a9059cbb916044808201926020929091908290030181600087803b15801561148a57600080fd5b505af115801561149e573d6000803e3d6000fd5b505050506040513d60208110156114b457600080fd5b50516114bc57fe5b5050505050565b6060600b80548060200260200160405190810160405280929190818152602001828054801561151b57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116114fd575b505050505090505b90565b600354600160801b90046001600160801b031681565b600354600254604080516370a0823160e01b815230600482015290516001600160801b03600160801b85048116946000946115df9492909116926001600160a01b03909116916370a08231916024808301926020929190829003018186803b1580156115a757600080fd5b505afa1580156115bb573d6000803e3d6000fd5b505050506040513d60208110156115d157600080fd5b50519063ffffffff612f7916565b600380546001600160801b03908116600160801b8483160217909155909150821681146116325760405181907ffe25c73e3b9089fac37d55c4c7efcba6f04af04cebd2fc4d6d7dbb07e1e5234f90600090a25b5050565b6000611679336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061181392505050565b6116b6576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b6116be612fd0565b905090565b600381565b6002546001600160a01b031681565b600454600160801b900463ffffffff1681565b600b5490565b6001600160a01b03818116600090815260086020526040902060030154163314611761576040805162461bcd60e51b815260206004820152601e60248201527f6f6e6c792063616c6c61626c652062792070656e64696e672061646d696e0000604482015290519081900360640190fd5b6001600160a01b0381166000818152600860205260408082206003810180546001600160a01b0319169055600201805462010000600160b01b031916336201000081029190911790915590519092917f0c5055390645c15a4be9a21b3f8d019153dcb4a0c125685da6eb84048e2fe90491a350565b6001600160a01b03808216600090815260086020526040902060020154620100009004165b919050565b600754600160201b900463ffffffff1690565b6001600160a01b0382166000908152600d602052604081205460ff168061183d5750600c5460ff16155b8061185057506001600160a01b03831632145b90505b92915050565b60075463ffffffff1690565b600454600160e01b900463ffffffff1681565b6006805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156118fe5780601f106118d3576101008083540402835291602001916118fe565b820191906000526020600020905b8154815290600101906020018083116118e157829003601f168201915b505050505081565b6001546001600160a01b0316331461195e576040805162461bcd60e51b815260206004820152601660248201527526bab9ba10313290383937b837b9b2b21037bbb732b960511b604482015290519081900360640190fd5b60008054336001600160a01b0319808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000546001600160a01b03163314611a26576040805162461bcd60e51b815260206004820152601660248201526000805160206146dc833981519152604482015290519081900360640190fd5b600c805460ff191660011790556040517faebf329500988c6488a0074e5a0a9ff304561fc5c6fc877aeb1d59c8282c348090600090a1565b6000611aa1336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061181392505050565b611ade576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b6116be612ff2565b6000546001600160a01b03163314611b33576040805162461bcd60e51b815260206004820152601660248201526000805160206146dc833981519152604482015290519081900360640190fd5b6001600160a01b0381166000818152600d6020908152604091829020805460ff19169055815192835290517f3d68a6fce901d20453d1a7aa06bf3950302a735948037deb182a8db66df2a0d19281900390910190a150565b600080808080808080333214611be1576040805162461bcd60e51b81526020600482015260166024820152756f66662d636861696e2072656164696e67206f6e6c7960501b604482015290519081900360640190fd5b63ffffffff891615611cc15763ffffffff89166000908152600960205260409020611c0c8b8b613027565b6001600160a01b038c1660009081526008602052604090206001908101549083015460038085015490548e93926001600160401b031691600160401b900463ffffffff1690600160801b90046001600160801b0316611c696116ea565b60018801546001600160401b0316611c8c576004546001600160801b0316611ca2565b6003880154600160601b90046001600160801b03165b8363ffffffff1693509850985098509850985098509850985050611cdb565b611cca8a61307c565b975097509750975097509750975097505b9295985092959890939650565b6000546001600160a01b031681565b336000908152600a602052604090205460ff16611d5b576040805162461bcd60e51b815260206004820152601860248201527f6e6f7420617574686f72697a6564207265717565737465720000000000000000604482015290519081900360640190fd5b60075463ffffffff16600081815260096020526040902060010154600160401b90046001600160401b0316151580611d975750611d9781613238565b611de8576040805162461bcd60e51b815260206004820152601f60248201527f7072657620726f756e64206d75737420626520737570657273656461626c6500604482015290519081900360640190fd5b611e05611e0063ffffffff808416906001906132bb16565b61330c565b50565b6000546001600160a01b03163314611e55576040805162461bcd60e51b815260206004820152601660248201526000805160206146dc833981519152604482015290519081900360640190fd5b6001600160a01b0381166000818152600d6020908152604091829020805460ff19166001179055815192835290517f87286ad1f399c8e82bf0c4ef4fcdc570ea2e1e92176e5c848b6413545b885db49281900390910190a150565b8015611f03576040805162461bcd60e51b815260206004820181905260248201527f7472616e7366657220646f65736e2774206163636570742063616c6c64617461604482015290519081900360640190fd5b611f0b61153c565b50505050565b6000611f54336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061181392505050565b611f91576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b611853826133da565b6000611fdd336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061181392505050565b61201a576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b611853826133f2565b6001600160a01b03166000908152600860205260409020600181015490549091600160c01b90910463ffffffff1690565b6000546001600160a01b031633146120a1576040805162461bcd60e51b815260206004820152601660248201526000805160206146dc833981519152604482015290519081900360640190fd5b8584146120f5576040805162461bcd60e51b815260206004820181905260248201527f6e6565642073616d65206f7261636c6520616e642061646d696e20636f756e74604482015290519081900360640190fd5b604d612117876121036116ea565b63ffffffff1661341d90919063ffffffff16565b1115612160576040805162461bcd60e51b81526020600482015260136024820152721b585e081bdc9858db195cc8185b1b1bddd959606a1b604482015290519081900360640190fd5b60005b868110156121b3576121ab88888381811061217a57fe5b905060200201356001600160a01b031687878481811061219657fe5b905060200201356001600160a01b0316613465565b600101612163565b506004546121de906001600160801b03811690859085908590600160e01b900463ffffffff16610f26565b50505050505050565b6000546001600160a01b03163314612234576040805162461bcd60e51b815260206004820152601660248201526000805160206146dc833981519152604482015290519081900360640190fd5b60045481906122689061224f906001600160801b0316612ed7565b600354600160801b90046001600160801b031690612f79565b10156122bb576040805162461bcd60e51b815260206004820152601a60248201527f696e73756666696369656e7420726573657276652066756e6473000000000000604482015290519081900360640190fd5b6002546040805163a9059cbb60e01b81526001600160a01b038581166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b15801561231157600080fd5b505af1158015612325573d6000803e3d6000fd5b505050506040513d602081101561233b57600080fd5b5051612386576040805162461bcd60e51b81526020600482015260156024820152741d1bdad95b881d1c985b9cd9995c8819985a5b1959605a1b604482015290519081900360640190fd5b61163261153c565b6004546001600160801b031681565b600454600160a01b900463ffffffff1681565b6003546001600160801b031681565b600c5460ff1681565b6001600160a01b03166000908152600860205260409020546001600160801b031690565b6001600160a01b0382811660009081526008602052604090206002015462010000900416331461245c576040805162461bcd60e51b815260206004820152601660248201527537b7363c9031b0b63630b1363290313c9030b236b4b760511b604482015290519081900360640190fd5b6001600160a01b0382811660008181526008602090815260409182902060030180546001600160a01b0319169486169485179055815133815290810193909352805191927fb79bf2e89c2d70dde91d2991fb1ea69b7e478061ad7c04ed5b02b96bc52b8104929081900390910190a25050565b6000546001600160a01b0316331461251c576040805162461bcd60e51b815260206004820152601660248201526000805160206146dc833981519152604482015290519081900360640190fd5b60005b848110156125535761254b86868381811061253657fe5b905060200201356001600160a01b03166136f5565b60010161251f565b506004546114bc906001600160801b03811690859085908590600160e01b900463ffffffff16610f26565b6000546001600160a01b031633146125cb576040805162461bcd60e51b815260206004820152601660248201526000805160206146dc833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000806000806000612665336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061181392505050565b6126a2576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b6126aa6138ce565b945094509450945094509091929394565b60008060008060006126cb6145c3565b63ffffffff808816600090815260096020908152604091829020825160a080820185528254825260018301546001600160401b0380821684870152600160401b82041683870152600160801b90049095166060820152835160028301805460c09581028301860190965295810185815291959294608087019491939284929091849184018282801561277c57602002820191906000526020600020905b815481526020019060010190808311612768575b50505091835250506001919091015463ffffffff808216602080850191909152600160201b83048216604080860191909152600160401b84048316606080870191909152600160601b9094046001600160801b031660809095019490945293909452855192860151918601519501519b9c919b6001600160401b039182169b509416985092169550909350505050565b6001600160a01b03821660009081526008602052604090205460075460609163ffffffff600160801b909104811691168161287557604051806040016040528060128152602001716e6f7420656e61626c6564206f7261636c6560701b81525092505050611853565b8363ffffffff168263ffffffff1611156128c157604051806040016040528060168152602001756e6f742079657420656e61626c6564206f7261636c6560501b81525092505050611853565b6001600160a01b03851660009081526008602052604090205463ffffffff808616600160a01b909204161015612930576040518060400160405280601881526020017f6e6f206c6f6e67657220616c6c6f776564206f7261636c65000000000000000081525092505050611853565b6001600160a01b03851660009081526008602052604090205463ffffffff808616600160c01b909204161061299e576040518060400160405280602081526020017f63616e6e6f74207265706f7274206f6e2070726576696f757320726f756e647381525092505050611853565b8063ffffffff168463ffffffff16141580156129da57506129ca63ffffffff808316906001906132bb16565b63ffffffff168463ffffffff1614155b80156129ed57506129eb84826138f7565b155b15612a31576040518060400160405280601781526020017f696e76616c696420726f756e6420746f207265706f727400000000000000000081525092505050611853565b8363ffffffff16600114158015612a625750612a60612a5b63ffffffff8087169060019061395716565b6139ba565b155b15612aa6576040518060400160405280601f81526020017f70726576696f757320726f756e64206e6f7420737570657273656461626c650081525092505050611853565b505092915050565b612ab7816139f4565b612ac057611e05565b3360009081526008602052604090205460045463ffffffff600160e01b909204821691600160c01b9091048116820190831611801590612aff57508015155b15612b0a5750611e05565b612b1382613a25565b50336000908152600860205260409020805463ffffffff8316600160e01b026001600160e01b0390911617905550565b612b4c81613b6a565b612b9d576040805162461bcd60e51b815260206004820152601f60248201527f726f756e64206e6f7420616363657074696e67207375626d697373696f6e7300604482015290519081900360640190fd5b63ffffffff8116600081815260096020908152604080832060020180546001808201835591855283852001879055338085526008909352818420805463ffffffff60c01b1916600160c01b8702178155018690555190929185917f92e98423f8adac6e64d0608e519fd1cefb861498385c6dee70d58fc926ddc68c9190a45050565b63ffffffff80821660009081526009602052604090206003810154600290910154600160201b9091049091161115612c5657611e05565b63ffffffff811660009081526009602090815260408083206002018054825181850281018501909352808352612cbf93830182828015612cb557602002820191906000526020600020905b815481526020019060010190808311612ca1575b5050505050613b8a565b63ffffffff8316600081815260096020908152604091829020848155600101805467ffffffffffffffff60401b1916600160401b426001600160401b038116919091029190911763ffffffff60801b1916600160801b8602179091556007805467ffffffff000000001916600160201b860217905582519081529151939450919284927f0559884fd3a460db3073b7fc896cc77986f16e378210ded43186175bf646fc5f928290030190a35050565b63ffffffff808216600090815260096020526040812060039081015490546001600160801b03600160601b909204821693612db792600160801b909204909116908490612f0a16565b600380546001600160801b03908116600160801b848316021791829055919250612de2911683613c33565b600380546001600160801b0319166001600160801b0392831617905533600090815260086020526040902054612e19911683613c33565b3360009081526008602052604080822080546001600160801b0319166001600160801b0394851617905551918316917ffe25c73e3b9089fac37d55c4c7efcba6f04af04cebd2fc4d6d7dbb07e1e5234f9190a2505050565b63ffffffff8082166000908152600960205260409020600381015460029091015491161115612e9f57611e05565b63ffffffff8116600090815260096020526040812060020190612ec2828261460f565b5060010180546001600160e01b031916905550565b60006118536002612efe612ee96116ea565b63ffffffff1685613c8790919063ffffffff16565b9063ffffffff613c8716565b6000826001600160801b0316826001600160801b03161115612f73576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082821115612f73576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b600754600160201b900463ffffffff1660009081526009602052604090205490565b600754600160201b900463ffffffff16600090815260096020526040902060010154600160401b90046001600160401b031690565b63ffffffff81166000908152600960205260408120600101546001600160401b0316156130725761305782613b6a565b801561306b5750613068838361280c565b51155b9050611853565b6130578383613ce0565b6001600160a01b0381166000908152600860205260408120600754815483928392839283928392839283927fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6b929091849163ffffffff908116600160c01b9092041614806130f957506007546130f79063ffffffff16613b6a565b155b60075490915061310e9063ffffffff166139ba565b80156131175750805b15613170576007546131359063ffffffff908116906001906132bb16565b63ffffffff81166000908152600960205260409020600454919b506001600160801b03909116945092506131698c8b613ce0565b9a506131b0565b60075463ffffffff1660008181526009602052604090206003810154919b50600160601b9091046001600160801b0316945092506131ad8a613b6a565b9a505b6131ba8c8b61280c565b51156131c55760009a505b6001828101549084015460038086015490548e938e9390926001600160401b0390911691600160401b90910463ffffffff1690600160801b90046001600160801b03166132106116ea565b8a8363ffffffff1693509a509a509a509a509a509a509a509a50505050919395975091939597565b63ffffffff8082166000908152600960205260408120600181015460039091015491926001600160401b0390911691600160401b9004168115801590613284575060008163ffffffff16115b80156132b35750426132a86001600160401b03841663ffffffff80851690613d2a16565b6001600160401b0316105b949350505050565b600082820163ffffffff8085169082161015611850576040805162461bcd60e51b815260206004820152601b602482015260008051602061469b833981519152604482015290519081900360640190fd5b613315816139f4565b61331e57611e05565b336000908152600a602052604090205463ffffffff6501000000000082048116916101009004811682019083161180613355575080155b61339c576040805162461bcd60e51b81526020600482015260136024820152726d7573742064656c617920726571756573747360681b604482015290519081900360640190fd5b6133a582613a25565b50336000908152600a60205260409020805463ffffffff8316650100000000000268ffffffff00000000001990911617905550565b63ffffffff1660009081526009602052604090205490565b63ffffffff16600090815260096020526040902060010154600160401b90046001600160401b031690565b600082820183811015611850576040805162461bcd60e51b815260206004820152601b602482015260008051602061469b833981519152604482015290519081900360640190fd5b61346e82613d7e565b156134b9576040805162461bcd60e51b81526020600482015260166024820152751bdc9858db1948185b1c9958591e48195b98589b195960521b604482015290519081900360640190fd5b6001600160a01b03811661350c576040805162461bcd60e51b8152602060048201526015602482015274063616e6e6f74207365742061646d696e20746f203605c1b604482015290519081900360640190fd5b6001600160a01b0382811660009081526008602052604090206002015462010000900416158061356157506001600160a01b038281166000908152600860205260409020600201546201000090048116908216145b6135b2576040805162461bcd60e51b815260206004820152601c60248201527f6f776e65722063616e6e6f74206f76657277726974652061646d696e00000000604482015290519081900360640190fd5b6135bb82613da9565b6001600160a01b03808416600081815260086020526040808220805463ffffffff60a01b1963ffffffff97909716600160801b0263ffffffff60801b19909116179590951663ffffffff60a01b178555600b80546002909601805461ffff90971661ffff19909716969096178655805460018181019092557f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b031916851790558383528554948716620100000262010000600160b01b0319909516949094179094559251919290917f18dd09695e4fbdae8d1a5edb11221eb04564269c29a089b9753a6535c54ba92e9190a3806001600160a01b0316826001600160a01b03167f0c5055390645c15a4be9a21b3f8d019153dcb4a0c125685da6eb84048e2fe90460405160405180910390a35050565b6136fe81613d7e565b613744576040805162461bcd60e51b81526020600482015260126024820152711bdc9858db19481b9bdd08195b98589b195960721b604482015290519081900360640190fd5b60075461375d9063ffffffff908116906001906132bb16565b6001600160a01b0382166000908152600860205260408120805463ffffffff93909316600160a01b0263ffffffff60a01b1990931692909217909155600b6137bc60016137a86116ea565b63ffffffff1661395790919063ffffffff16565b63ffffffff16815481106137cc57fe5b6000918252602080832091909101546001600160a01b0385811680855260089093526040808520600290810180549390941680875291862001805461ffff90931661ffff199384168117909155939094528154169055600b805492935090918391908390811061383857fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600b80548061387157fe5b600082815260208120820160001990810180546001600160a01b03191690559091019091556040516001600160a01b038516907f18dd09695e4fbdae8d1a5edb11221eb04564269c29a089b9753a6535c54ba92e908390a3505050565b60008060008060006126aa600760049054906101000a900463ffffffff1663ffffffff16610ad6565b60008163ffffffff1661391a60018563ffffffff166132bb90919063ffffffff16565b63ffffffff1614801561185057505063ffffffff16600090815260096020526040902060010154600160401b90046001600160401b031615919050565b60008263ffffffff168263ffffffff161115612f73576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b63ffffffff8116600090815260096020526040812060010154600160401b90046001600160401b0316151580611853575061185382613238565b600754600090613a109063ffffffff908116906001906132bb16565b63ffffffff168263ffffffff16149050919050565b613a42613a3d63ffffffff8084169060019061395716565b613e13565b6007805463ffffffff1990811663ffffffff84811691821790935560048054600083815260096020908152604091829020600381018054600160801b90950489169490971693909317808755845467ffffffff0000000019909116600160a01b9091048816600160201b021780875584546fffffffffffffffffffffffffffffffff60601b199091166001600160801b03909116600160601b021780875593546bffffffff000000000000000019909416600160e01b909404909616600160401b0292909217909355600192909201805467ffffffffffffffff1916426001600160401b0390811691909117918290558351911681529151339391927f0109fc6f55cf40689f02fbaad7af7fe7bbac8a3d2186600afc7d3e10cac6027192908290030190a350565b63ffffffff90811660009081526009602052604090206003015416151590565b60008151600010613bdb576040805162461bcd60e51b81526020600482015260166024820152756c697374206d757374206e6f7420626520656d70747960501b604482015290519081900360640190fd5b81516002810460018216613c1a57600080613c00866000600187036001870387613ed1565b9092509050613c0f8282613faf565b9450505050506117fb565b613c2a846000600185038461401d565b925050506117fb565b60008282016001600160801b038085169082161015611850576040805162461bcd60e51b815260206004820152601b602482015260008051602061469b833981519152604482015290519081900360640190fd5b600082613c9657506000611853565b82820282848281613ca357fe5b04146118505760405162461bcd60e51b81526004018080602001828103825260218152602001806146bb6021913960400191505060405180910390fd5b6001600160a01b03821660009081526008602052604081205460045463ffffffff600160e01b909204821691600160c01b9091048116820190841611806132b35750159392505050565b60008282016001600160401b038085169082161015611850576040805162461bcd60e51b815260206004820152601b602482015260008051602061469b833981519152604482015290519081900360640190fd5b6001600160a01b031660009081526008602052604090205463ffffffff600160a01b90910481161490565b60075460009063ffffffff168015801590613deb57506001600160a01b03831660009081526008602052604090205463ffffffff828116600160a01b90920416145b15613df75790506117fb565b613e0c63ffffffff808316906001906132bb16565b9392505050565b613e1c81613238565b613e2557611e05565b6000613e3c63ffffffff8084169060019061395716565b63ffffffff81811660009081526009602052604080822080548785168452918320918255600190810154908201805463ffffffff60801b1916600160801b928390049095169091029390931767ffffffffffffffff60401b1916600160401b426001600160401b0316021790925591925060020190613ebb828261460f565b5060010180546001600160e01b03191690555050565b600080828410613ee057600080fd5b838611158015613ef05750848411155b613ef957600080fd5b828611158015613f095750848311155b613f1257600080fd5b60078686031015613f3357613f2a87878787876140ae565b91509150613fa5565b6000613f40888888614481565b9050808411613f5157809550613f9f565b84811015613f6457806001019650613f9f565b808511158015613f7357508381105b613f7957fe5b613f858888838861401d565b9250613f968882600101888761401d565b9150613fa59050565b50613f12565b9550959350505050565b60008083128015613fc05750600082135b80613fd65750600083138015613fd65750600082125b15613ff6576002613fe7848461455e565b81613fee57fe5b059050611853565b60006002808507818507010590506132b3614017600286056002860561455e565b8261455e565b60008184111561402c57600080fd5b8282111561403957600080fd5b82841015614090576007848403101561406557600061405b86868686876140ae565b5091506132b39050565b6000614072868686614481565b90508083116140835780935061408a565b8060010194505b50614039565b84848151811061409c57fe5b60200260200101519050949350505050565b6000806000868660010103905060008888600001815181106140cc57fe5b602002602001015190506000826001106140ed576001600160ff1b03614105565b8989600101815181106140fc57fe5b60200260200101515b905060008360021061411e576001600160ff1b03614136565b8a8a6002018151811061412d57fe5b60200260200101515b905060008460031061414f576001600160ff1b03614167565b8b8b6003018151811061415e57fe5b60200260200101515b9050600085600410614180576001600160ff1b03614198565b8c8c6004018151811061418f57fe5b60200260200101515b90506000866005106141b1576001600160ff1b036141c9565b8d8d600501815181106141c057fe5b60200260200101515b90506000876006106141e2576001600160ff1b036141fa565b8e8e600601815181106141f157fe5b60200260200101515b905085871315614208579495945b83851315614214579293925b81831315614220579091905b8487131561422c579395935b83861315614238579294925b8083131561424257915b8486131561424e579394935b8082131561425857905b82871315614264579195915b81861315614270579094905b8085131561427a57935b82861315614286579194915b8084131561429057925b8285131561429c579193915b818413156142a8579092905b828413156142b4579192915b8d8c03806142c457879a5061436a565b80600114156142d557869a5061436a565b80600214156142e657859a5061436a565b80600314156142f757849a5061436a565b806004141561430857839a5061436a565b806005141561431957829a5061436a565b806006141561432a57819a5061436a565b6040805162461bcd60e51b815260206004820152601060248201526f6b31206f7574206f6620626f756e647360801b604482015290519081900360640190fd5b8e8c038d8d141561438857508a9950613fa598505050505050505050565b8061439f5750969850613fa5975050505050505050565b80600114156143ba5750959850613fa5975050505050505050565b80600214156143d55750949850613fa5975050505050505050565b80600314156143f05750939850613fa5975050505050505050565b806004141561440b5750929850613fa5975050505050505050565b80600514156144265750919850613fa5975050505050505050565b80600614156144415750909850613fa5975050505050505050565b6040805162461bcd60e51b815260206004820152601060248201526f6b32206f7574206f6620626f756e647360801b604482015290519081900360640190fd5b600080846002858501048151811061449557fe5b602002602001015190506001840393506001830192505b600184019350808585815181106144bf57fe5b6020026020010151126144ac575b600183039250808584815181106144e057fe5b6020026020010151136144cd57828410156145505784838151811061450157fe5b602002602001015185858151811061451557fe5b602002602001015186868151811061452957fe5b6020026020010187868151811061453c57fe5b602090810291909101019190915252614559565b82915050613e0c565b6144ac565b60008282018183128015906145735750838112155b80614588575060008312801561458857508381125b6118505760405162461bcd60e51b815260040180806020018281038252602181526020018061467a6021913960400191505060405180910390fd5b6040518060a001604052806000815260200160006001600160401b0316815260200160006001600160401b03168152602001600063ffffffff16815260200161460a61462d565b905290565b5080546000825590600052602060002090810190611e05919061465b565b6040805160a08101825260608082526000602083018190529282018390528101829052608081019190915290565b61152391905b808211156146755760008155600101614661565b509056fe5369676e6564536166654d6174683a206164646974696f6e206f766572666c6f77536166654d6174683a206164646974696f6e206f766572666c6f770000000000536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f6e6c792063616c6c61626c65206279206f776e657200000000000000000000a2646970667358221220fee95a6f210e458d4885d51dc069e62dac9ef4de46bcde85ea7ce9998f05608864736f6c63430006060033000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000258000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000005af3107a4000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000c224e323235202f204a5059220000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102a05760003560e01c806379ba509711610167578063bb07bacd116100ce578063dc7f012411610087578063dc7f0124146109c6578063e2e40317146109ce578063e9ee6eeb146109f4578063ebf8571c14610a22578063f2fde38b14610aa8578063feaf968c14610ace576102a0565b8063bb07bacd1461086d578063bbf0b7e9146108ac578063c107532914610982578063c35905c6146109ae578063c9374500146109b6578063d4cc54e4146109be576102a0565b80638da5cb5b116101205780638da5cb5b1461077a57806398e5b12a14610782578063a118f2491461078a578063a4c0ed36146107b0578063b5ab58dc14610833578063b633620c14610850576102a0565b806379ba50971461069e5780637c2b0b21146106a65780638038e4a1146106ae5780638205bf6a146106b65780638823da6c146106be57806388aa80e7146106e4576102a0565b806350d25bcd1161020b57806364efb22b116101c457806364efb22b1461051b578063668a0f02146105415780636b14daf8146105495780636fb4bb4e1461061157806370dea79a146106195780637284e41614610621576102a0565b806350d25bcd146104b157806354fd4d50146104b957806357970e93146104c157806358609e44146104e5578063613d8fcc146104ed578063628806ef146104f5576102a0565b8063357ebb021161025d578063357ebb021461038c57806338aa4c72146103ad5780633d3d7714146103f757806340884c521461042d57806346fcff4c146104855780634f8fc3b5146104a9576102a0565b80630720da52146102a55780630a756983146102ed578063202ee0ed146102f757806320ed02751461031a57806323ca290314610354578063313ce5671461036e575b600080fd5b6102c2600480360360208110156102bb57600080fd5b5035610ad6565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b6102f5610b77565b005b6102f56004803603604081101561030d57600080fd5b5080359060200135610bf9565b6102f56004803603606081101561033057600080fd5b5080356001600160a01b03169060208101351515906040013563ffffffff16610db2565b61035c610ee6565b60408051918252519081900360200190f35b610376610f0a565b6040805160ff9092168252519081900360200190f35b610394610f13565b6040805163ffffffff9092168252519081900360200190f35b6102f5600480360360a08110156103c357600080fd5b506001600160801b038135169063ffffffff6020820135811691604081013582169160608201358116916080013516610f26565b6102f56004803603606081101561040d57600080fd5b506001600160a01b038135811691602081013590911690604001356112d0565b6104356114c3565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610471578181015183820152602001610459565b505050509050019250505060405180910390f35b61048d611526565b604080516001600160801b039092168252519081900360200190f35b6102f561153c565b61035c611636565b61035c6116c3565b6104c96116c8565b604080516001600160a01b039092168252519081900360200190f35b6103946116d7565b6103946116ea565b6102f56004803603602081101561050b57600080fd5b50356001600160a01b03166116f0565b6104c96004803603602081101561053157600080fd5b50356001600160a01b03166117d6565b61035c611800565b6105fd6004803603604081101561055f57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561058957600080fd5b82018360208201111561059b57600080fd5b803590602001918460018302840111600160201b831117156105bc57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611813945050505050565b604080519115158252519081900360200190f35b61035c611859565b610394611865565b610629611878565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561066357818101518382015260200161064b565b50505050905090810190601f1680156106905780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102f5611906565b61035c6119b5565b6102f56119d9565b61035c611a5e565b6102f5600480360360208110156106d457600080fd5b50356001600160a01b0316611ae6565b610716600480360360408110156106fa57600080fd5b5080356001600160a01b0316906020013563ffffffff16611b8b565b60408051981515895263ffffffff97881660208a0152888101969096526001600160401b0394851660608901529290931660808701526001600160801b0390811660a08701529190931660c08501529190911660e083015251908190036101000190f35b6104c9611ce8565b6102f5611cf7565b6102f5600480360360208110156107a057600080fd5b50356001600160a01b0316611e08565b6102f5600480360360608110156107c657600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b8111156107f557600080fd5b82018360208201111561080757600080fd5b803590602001918460018302840111600160201b8311171561082857600080fd5b509092509050611eb0565b61035c6004803603602081101561084957600080fd5b5035611f11565b61035c6004803603602081101561086657600080fd5b5035611f9a565b6108936004803603602081101561088357600080fd5b50356001600160a01b0316612023565b6040805192835260208301919091528051918290030190f35b6102f5600480360360a08110156108c257600080fd5b810190602081018135600160201b8111156108dc57600080fd5b8201836020820111156108ee57600080fd5b803590602001918460208302840111600160201b8311171561090f57600080fd5b919390929091602081019035600160201b81111561092c57600080fd5b82018360208201111561093e57600080fd5b803590602001918460208302840111600160201b8311171561095f57600080fd5b919350915063ffffffff8135811691602081013582169160409091013516612054565b6102f56004803603604081101561099857600080fd5b506001600160a01b0381351690602001356121e7565b61048d61238e565b61039461239d565b61048d6123b0565b6105fd6123bf565b61035c600480360360208110156109e457600080fd5b50356001600160a01b03166123c8565b6102f560048036036040811015610a0a57600080fd5b506001600160a01b03813581169160200135166123ec565b6102f560048036036080811015610a3857600080fd5b810190602081018135600160201b811115610a5257600080fd5b820183602082011115610a6457600080fd5b803590602001918460208302840111600160201b83111715610a8557600080fd5b919350915063ffffffff81358116916020810135821691604090910135166124cf565b6102f560048036036020811015610abe57600080fd5b50356001600160a01b031661257e565b6102c261261c565b6000806000806000610b1f336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061181392505050565b610b5c576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b610b65866126bb565b939a9299509097509550909350915050565b6000546001600160a01b03163314610bc4576040805162461bcd60e51b815260206004820152601660248201526000805160206146dc833981519152604482015290519081900360640190fd5b600c805460ff191690556040517f3be8a977a014527b50ae38adda80b56911c267328965c98ddc385d248f53963890600090a1565b6060610c05338461280c565b90507f000000000000000000000000000000000000000000000000000000174876e800821215610c7c576040805162461bcd60e51b815260206004820152601e60248201527f76616c75652062656c6f77206d696e5375626d697373696f6e56616c75650000604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000005af3107a4000821315610cf1576040805162461bcd60e51b815260206004820152601e60248201527f76616c75652061626f7665206d61785375626d697373696f6e56616c75650000604482015290519081900360640190fd5b8051819015610d7e5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610d43578181015183820152602001610d2b565b50505050905090810190601f168015610d705780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50610d8883612aae565b610d928284612b43565b610d9b83612c1f565b610da483612d6e565b610dad83612e71565b505050565b6000546001600160a01b03163314610dff576040805162461bcd60e51b815260206004820152601660248201526000805160206146dc833981519152604482015290519081900360640190fd5b6001600160a01b0383166000908152600a602052604090205460ff1615158215151415610e2b57610dad565b8115610e6e576001600160a01b0383166000908152600a60205260409020805460ff19168315151764ffffffff00191661010063ffffffff841602179055610e97565b6001600160a01b0383166000908152600a60205260409020805468ffffffffffffffffff191690555b60408051831515815263ffffffff8316602082015281516001600160a01b038616927fc3df5a754e002718f2e10804b99e6605e7c701d95cec9552c7680ca2b6f2820a928290030190a2505050565b7f00000000000000000000000000000000000000000000000000005af3107a400081565b60055460ff1681565b600454600160c01b900463ffffffff1681565b6000546001600160a01b03163314610f73576040805162461bcd60e51b815260206004820152601660248201526000805160206146dc833981519152604482015290519081900360640190fd5b6000610f7d6116ea565b90508463ffffffff168463ffffffff161015610fe0576040805162461bcd60e51b815260206004820152601960248201527f6d6178206d75737420657175616c2f657863656564206d696e00000000000000604482015290519081900360640190fd5b8363ffffffff168163ffffffff161015611041576040805162461bcd60e51b815260206004820152601760248201527f6d61782063616e6e6f742065786365656420746f74616c000000000000000000604482015290519081900360640190fd5b63ffffffff8116158061105f57508263ffffffff168163ffffffff16115b6110b0576040805162461bcd60e51b815260206004820152601960248201527f64656c61792063616e6e6f742065786365656420746f74616c00000000000000604482015290519081900360640190fd5b6110c2866001600160801b0316612ed7565b600354600160801b90046001600160801b03161015611128576040805162461bcd60e51b815260206004820152601e60248201527f696e73756666696369656e742066756e647320666f72207061796d656e740000604482015290519081900360640190fd5b60006111326116ea565b63ffffffff1611156111995760008563ffffffff1611611199576040805162461bcd60e51b815260206004820152601a60248201527f6d696e206d7573742062652067726561746572207468616e2030000000000000604482015290519081900360640190fd5b85600460006101000a8154816001600160801b0302191690836001600160801b0316021790555084600460146101000a81548163ffffffff021916908363ffffffff16021790555083600460106101000a81548163ffffffff021916908363ffffffff16021790555082600460186101000a81548163ffffffff021916908363ffffffff160217905550816004601c6101000a81548163ffffffff021916908363ffffffff1602179055508363ffffffff168563ffffffff16600460009054906101000a90046001600160801b03166001600160801b03167f56800c9d1ed723511246614d15e58cfcde15b6a33c245b5c961b689c1890fd8f8686604051808363ffffffff1663ffffffff1681526020018263ffffffff1663ffffffff1681526020019250505060405180910390a4505050505050565b6001600160a01b03838116600090815260086020526040902060020154620100009004163314611340576040805162461bcd60e51b815260206004820152601660248201527537b7363c9031b0b63630b1363290313c9030b236b4b760511b604482015290519081900360640190fd5b6001600160a01b03831660009081526008602052604090205481906001600160801b039081169082168110156113bd576040805162461bcd60e51b815260206004820152601f60248201527f696e73756666696369656e7420776974686472617761626c652066756e647300604482015290519081900360640190fd5b6113d66001600160801b0382168363ffffffff612f0a16565b6001600160a01b038616600090815260086020526040902080546001600160801b0319166001600160801b03928316179055600354611416911683612f0a565b600380546001600160801b0319166001600160801b039283161790556002546040805163a9059cbb60e01b81526001600160a01b03888116600483015293861660248201529051929091169163a9059cbb916044808201926020929091908290030181600087803b15801561148a57600080fd5b505af115801561149e573d6000803e3d6000fd5b505050506040513d60208110156114b457600080fd5b50516114bc57fe5b5050505050565b6060600b80548060200260200160405190810160405280929190818152602001828054801561151b57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116114fd575b505050505090505b90565b600354600160801b90046001600160801b031681565b600354600254604080516370a0823160e01b815230600482015290516001600160801b03600160801b85048116946000946115df9492909116926001600160a01b03909116916370a08231916024808301926020929190829003018186803b1580156115a757600080fd5b505afa1580156115bb573d6000803e3d6000fd5b505050506040513d60208110156115d157600080fd5b50519063ffffffff612f7916565b600380546001600160801b03908116600160801b8483160217909155909150821681146116325760405181907ffe25c73e3b9089fac37d55c4c7efcba6f04af04cebd2fc4d6d7dbb07e1e5234f90600090a25b5050565b6000611679336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061181392505050565b6116b6576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b6116be612fd0565b905090565b600381565b6002546001600160a01b031681565b600454600160801b900463ffffffff1681565b600b5490565b6001600160a01b03818116600090815260086020526040902060030154163314611761576040805162461bcd60e51b815260206004820152601e60248201527f6f6e6c792063616c6c61626c652062792070656e64696e672061646d696e0000604482015290519081900360640190fd5b6001600160a01b0381166000818152600860205260408082206003810180546001600160a01b0319169055600201805462010000600160b01b031916336201000081029190911790915590519092917f0c5055390645c15a4be9a21b3f8d019153dcb4a0c125685da6eb84048e2fe90491a350565b6001600160a01b03808216600090815260086020526040902060020154620100009004165b919050565b600754600160201b900463ffffffff1690565b6001600160a01b0382166000908152600d602052604081205460ff168061183d5750600c5460ff16155b8061185057506001600160a01b03831632145b90505b92915050565b60075463ffffffff1690565b600454600160e01b900463ffffffff1681565b6006805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156118fe5780601f106118d3576101008083540402835291602001916118fe565b820191906000526020600020905b8154815290600101906020018083116118e157829003601f168201915b505050505081565b6001546001600160a01b0316331461195e576040805162461bcd60e51b815260206004820152601660248201527526bab9ba10313290383937b837b9b2b21037bbb732b960511b604482015290519081900360640190fd5b60008054336001600160a01b0319808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b7f000000000000000000000000000000000000000000000000000000174876e80081565b6000546001600160a01b03163314611a26576040805162461bcd60e51b815260206004820152601660248201526000805160206146dc833981519152604482015290519081900360640190fd5b600c805460ff191660011790556040517faebf329500988c6488a0074e5a0a9ff304561fc5c6fc877aeb1d59c8282c348090600090a1565b6000611aa1336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061181392505050565b611ade576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b6116be612ff2565b6000546001600160a01b03163314611b33576040805162461bcd60e51b815260206004820152601660248201526000805160206146dc833981519152604482015290519081900360640190fd5b6001600160a01b0381166000818152600d6020908152604091829020805460ff19169055815192835290517f3d68a6fce901d20453d1a7aa06bf3950302a735948037deb182a8db66df2a0d19281900390910190a150565b600080808080808080333214611be1576040805162461bcd60e51b81526020600482015260166024820152756f66662d636861696e2072656164696e67206f6e6c7960501b604482015290519081900360640190fd5b63ffffffff891615611cc15763ffffffff89166000908152600960205260409020611c0c8b8b613027565b6001600160a01b038c1660009081526008602052604090206001908101549083015460038085015490548e93926001600160401b031691600160401b900463ffffffff1690600160801b90046001600160801b0316611c696116ea565b60018801546001600160401b0316611c8c576004546001600160801b0316611ca2565b6003880154600160601b90046001600160801b03165b8363ffffffff1693509850985098509850985098509850985050611cdb565b611cca8a61307c565b975097509750975097509750975097505b9295985092959890939650565b6000546001600160a01b031681565b336000908152600a602052604090205460ff16611d5b576040805162461bcd60e51b815260206004820152601860248201527f6e6f7420617574686f72697a6564207265717565737465720000000000000000604482015290519081900360640190fd5b60075463ffffffff16600081815260096020526040902060010154600160401b90046001600160401b0316151580611d975750611d9781613238565b611de8576040805162461bcd60e51b815260206004820152601f60248201527f7072657620726f756e64206d75737420626520737570657273656461626c6500604482015290519081900360640190fd5b611e05611e0063ffffffff808416906001906132bb16565b61330c565b50565b6000546001600160a01b03163314611e55576040805162461bcd60e51b815260206004820152601660248201526000805160206146dc833981519152604482015290519081900360640190fd5b6001600160a01b0381166000818152600d6020908152604091829020805460ff19166001179055815192835290517f87286ad1f399c8e82bf0c4ef4fcdc570ea2e1e92176e5c848b6413545b885db49281900390910190a150565b8015611f03576040805162461bcd60e51b815260206004820181905260248201527f7472616e7366657220646f65736e2774206163636570742063616c6c64617461604482015290519081900360640190fd5b611f0b61153c565b50505050565b6000611f54336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061181392505050565b611f91576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b611853826133da565b6000611fdd336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061181392505050565b61201a576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b611853826133f2565b6001600160a01b03166000908152600860205260409020600181015490549091600160c01b90910463ffffffff1690565b6000546001600160a01b031633146120a1576040805162461bcd60e51b815260206004820152601660248201526000805160206146dc833981519152604482015290519081900360640190fd5b8584146120f5576040805162461bcd60e51b815260206004820181905260248201527f6e6565642073616d65206f7261636c6520616e642061646d696e20636f756e74604482015290519081900360640190fd5b604d612117876121036116ea565b63ffffffff1661341d90919063ffffffff16565b1115612160576040805162461bcd60e51b81526020600482015260136024820152721b585e081bdc9858db195cc8185b1b1bddd959606a1b604482015290519081900360640190fd5b60005b868110156121b3576121ab88888381811061217a57fe5b905060200201356001600160a01b031687878481811061219657fe5b905060200201356001600160a01b0316613465565b600101612163565b506004546121de906001600160801b03811690859085908590600160e01b900463ffffffff16610f26565b50505050505050565b6000546001600160a01b03163314612234576040805162461bcd60e51b815260206004820152601660248201526000805160206146dc833981519152604482015290519081900360640190fd5b60045481906122689061224f906001600160801b0316612ed7565b600354600160801b90046001600160801b031690612f79565b10156122bb576040805162461bcd60e51b815260206004820152601a60248201527f696e73756666696369656e7420726573657276652066756e6473000000000000604482015290519081900360640190fd5b6002546040805163a9059cbb60e01b81526001600160a01b038581166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b15801561231157600080fd5b505af1158015612325573d6000803e3d6000fd5b505050506040513d602081101561233b57600080fd5b5051612386576040805162461bcd60e51b81526020600482015260156024820152741d1bdad95b881d1c985b9cd9995c8819985a5b1959605a1b604482015290519081900360640190fd5b61163261153c565b6004546001600160801b031681565b600454600160a01b900463ffffffff1681565b6003546001600160801b031681565b600c5460ff1681565b6001600160a01b03166000908152600860205260409020546001600160801b031690565b6001600160a01b0382811660009081526008602052604090206002015462010000900416331461245c576040805162461bcd60e51b815260206004820152601660248201527537b7363c9031b0b63630b1363290313c9030b236b4b760511b604482015290519081900360640190fd5b6001600160a01b0382811660008181526008602090815260409182902060030180546001600160a01b0319169486169485179055815133815290810193909352805191927fb79bf2e89c2d70dde91d2991fb1ea69b7e478061ad7c04ed5b02b96bc52b8104929081900390910190a25050565b6000546001600160a01b0316331461251c576040805162461bcd60e51b815260206004820152601660248201526000805160206146dc833981519152604482015290519081900360640190fd5b60005b848110156125535761254b86868381811061253657fe5b905060200201356001600160a01b03166136f5565b60010161251f565b506004546114bc906001600160801b03811690859085908590600160e01b900463ffffffff16610f26565b6000546001600160a01b031633146125cb576040805162461bcd60e51b815260206004820152601660248201526000805160206146dc833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000806000806000612665336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061181392505050565b6126a2576040805162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b604482015290519081900360640190fd5b6126aa6138ce565b945094509450945094509091929394565b60008060008060006126cb6145c3565b63ffffffff808816600090815260096020908152604091829020825160a080820185528254825260018301546001600160401b0380821684870152600160401b82041683870152600160801b90049095166060820152835160028301805460c09581028301860190965295810185815291959294608087019491939284929091849184018282801561277c57602002820191906000526020600020905b815481526020019060010190808311612768575b50505091835250506001919091015463ffffffff808216602080850191909152600160201b83048216604080860191909152600160401b84048316606080870191909152600160601b9094046001600160801b031660809095019490945293909452855192860151918601519501519b9c919b6001600160401b039182169b509416985092169550909350505050565b6001600160a01b03821660009081526008602052604090205460075460609163ffffffff600160801b909104811691168161287557604051806040016040528060128152602001716e6f7420656e61626c6564206f7261636c6560701b81525092505050611853565b8363ffffffff168263ffffffff1611156128c157604051806040016040528060168152602001756e6f742079657420656e61626c6564206f7261636c6560501b81525092505050611853565b6001600160a01b03851660009081526008602052604090205463ffffffff808616600160a01b909204161015612930576040518060400160405280601881526020017f6e6f206c6f6e67657220616c6c6f776564206f7261636c65000000000000000081525092505050611853565b6001600160a01b03851660009081526008602052604090205463ffffffff808616600160c01b909204161061299e576040518060400160405280602081526020017f63616e6e6f74207265706f7274206f6e2070726576696f757320726f756e647381525092505050611853565b8063ffffffff168463ffffffff16141580156129da57506129ca63ffffffff808316906001906132bb16565b63ffffffff168463ffffffff1614155b80156129ed57506129eb84826138f7565b155b15612a31576040518060400160405280601781526020017f696e76616c696420726f756e6420746f207265706f727400000000000000000081525092505050611853565b8363ffffffff16600114158015612a625750612a60612a5b63ffffffff8087169060019061395716565b6139ba565b155b15612aa6576040518060400160405280601f81526020017f70726576696f757320726f756e64206e6f7420737570657273656461626c650081525092505050611853565b505092915050565b612ab7816139f4565b612ac057611e05565b3360009081526008602052604090205460045463ffffffff600160e01b909204821691600160c01b9091048116820190831611801590612aff57508015155b15612b0a5750611e05565b612b1382613a25565b50336000908152600860205260409020805463ffffffff8316600160e01b026001600160e01b0390911617905550565b612b4c81613b6a565b612b9d576040805162461bcd60e51b815260206004820152601f60248201527f726f756e64206e6f7420616363657074696e67207375626d697373696f6e7300604482015290519081900360640190fd5b63ffffffff8116600081815260096020908152604080832060020180546001808201835591855283852001879055338085526008909352818420805463ffffffff60c01b1916600160c01b8702178155018690555190929185917f92e98423f8adac6e64d0608e519fd1cefb861498385c6dee70d58fc926ddc68c9190a45050565b63ffffffff80821660009081526009602052604090206003810154600290910154600160201b9091049091161115612c5657611e05565b63ffffffff811660009081526009602090815260408083206002018054825181850281018501909352808352612cbf93830182828015612cb557602002820191906000526020600020905b815481526020019060010190808311612ca1575b5050505050613b8a565b63ffffffff8316600081815260096020908152604091829020848155600101805467ffffffffffffffff60401b1916600160401b426001600160401b038116919091029190911763ffffffff60801b1916600160801b8602179091556007805467ffffffff000000001916600160201b860217905582519081529151939450919284927f0559884fd3a460db3073b7fc896cc77986f16e378210ded43186175bf646fc5f928290030190a35050565b63ffffffff808216600090815260096020526040812060039081015490546001600160801b03600160601b909204821693612db792600160801b909204909116908490612f0a16565b600380546001600160801b03908116600160801b848316021791829055919250612de2911683613c33565b600380546001600160801b0319166001600160801b0392831617905533600090815260086020526040902054612e19911683613c33565b3360009081526008602052604080822080546001600160801b0319166001600160801b0394851617905551918316917ffe25c73e3b9089fac37d55c4c7efcba6f04af04cebd2fc4d6d7dbb07e1e5234f9190a2505050565b63ffffffff8082166000908152600960205260409020600381015460029091015491161115612e9f57611e05565b63ffffffff8116600090815260096020526040812060020190612ec2828261460f565b5060010180546001600160e01b031916905550565b60006118536002612efe612ee96116ea565b63ffffffff1685613c8790919063ffffffff16565b9063ffffffff613c8716565b6000826001600160801b0316826001600160801b03161115612f73576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082821115612f73576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b600754600160201b900463ffffffff1660009081526009602052604090205490565b600754600160201b900463ffffffff16600090815260096020526040902060010154600160401b90046001600160401b031690565b63ffffffff81166000908152600960205260408120600101546001600160401b0316156130725761305782613b6a565b801561306b5750613068838361280c565b51155b9050611853565b6130578383613ce0565b6001600160a01b0381166000908152600860205260408120600754815483928392839283928392839283927fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6b929091849163ffffffff908116600160c01b9092041614806130f957506007546130f79063ffffffff16613b6a565b155b60075490915061310e9063ffffffff166139ba565b80156131175750805b15613170576007546131359063ffffffff908116906001906132bb16565b63ffffffff81166000908152600960205260409020600454919b506001600160801b03909116945092506131698c8b613ce0565b9a506131b0565b60075463ffffffff1660008181526009602052604090206003810154919b50600160601b9091046001600160801b0316945092506131ad8a613b6a565b9a505b6131ba8c8b61280c565b51156131c55760009a505b6001828101549084015460038086015490548e938e9390926001600160401b0390911691600160401b90910463ffffffff1690600160801b90046001600160801b03166132106116ea565b8a8363ffffffff1693509a509a509a509a509a509a509a509a50505050919395975091939597565b63ffffffff8082166000908152600960205260408120600181015460039091015491926001600160401b0390911691600160401b9004168115801590613284575060008163ffffffff16115b80156132b35750426132a86001600160401b03841663ffffffff80851690613d2a16565b6001600160401b0316105b949350505050565b600082820163ffffffff8085169082161015611850576040805162461bcd60e51b815260206004820152601b602482015260008051602061469b833981519152604482015290519081900360640190fd5b613315816139f4565b61331e57611e05565b336000908152600a602052604090205463ffffffff6501000000000082048116916101009004811682019083161180613355575080155b61339c576040805162461bcd60e51b81526020600482015260136024820152726d7573742064656c617920726571756573747360681b604482015290519081900360640190fd5b6133a582613a25565b50336000908152600a60205260409020805463ffffffff8316650100000000000268ffffffff00000000001990911617905550565b63ffffffff1660009081526009602052604090205490565b63ffffffff16600090815260096020526040902060010154600160401b90046001600160401b031690565b600082820183811015611850576040805162461bcd60e51b815260206004820152601b602482015260008051602061469b833981519152604482015290519081900360640190fd5b61346e82613d7e565b156134b9576040805162461bcd60e51b81526020600482015260166024820152751bdc9858db1948185b1c9958591e48195b98589b195960521b604482015290519081900360640190fd5b6001600160a01b03811661350c576040805162461bcd60e51b8152602060048201526015602482015274063616e6e6f74207365742061646d696e20746f203605c1b604482015290519081900360640190fd5b6001600160a01b0382811660009081526008602052604090206002015462010000900416158061356157506001600160a01b038281166000908152600860205260409020600201546201000090048116908216145b6135b2576040805162461bcd60e51b815260206004820152601c60248201527f6f776e65722063616e6e6f74206f76657277726974652061646d696e00000000604482015290519081900360640190fd5b6135bb82613da9565b6001600160a01b03808416600081815260086020526040808220805463ffffffff60a01b1963ffffffff97909716600160801b0263ffffffff60801b19909116179590951663ffffffff60a01b178555600b80546002909601805461ffff90971661ffff19909716969096178655805460018181019092557f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b031916851790558383528554948716620100000262010000600160b01b0319909516949094179094559251919290917f18dd09695e4fbdae8d1a5edb11221eb04564269c29a089b9753a6535c54ba92e9190a3806001600160a01b0316826001600160a01b03167f0c5055390645c15a4be9a21b3f8d019153dcb4a0c125685da6eb84048e2fe90460405160405180910390a35050565b6136fe81613d7e565b613744576040805162461bcd60e51b81526020600482015260126024820152711bdc9858db19481b9bdd08195b98589b195960721b604482015290519081900360640190fd5b60075461375d9063ffffffff908116906001906132bb16565b6001600160a01b0382166000908152600860205260408120805463ffffffff93909316600160a01b0263ffffffff60a01b1990931692909217909155600b6137bc60016137a86116ea565b63ffffffff1661395790919063ffffffff16565b63ffffffff16815481106137cc57fe5b6000918252602080832091909101546001600160a01b0385811680855260089093526040808520600290810180549390941680875291862001805461ffff90931661ffff199384168117909155939094528154169055600b805492935090918391908390811061383857fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600b80548061387157fe5b600082815260208120820160001990810180546001600160a01b03191690559091019091556040516001600160a01b038516907f18dd09695e4fbdae8d1a5edb11221eb04564269c29a089b9753a6535c54ba92e908390a3505050565b60008060008060006126aa600760049054906101000a900463ffffffff1663ffffffff16610ad6565b60008163ffffffff1661391a60018563ffffffff166132bb90919063ffffffff16565b63ffffffff1614801561185057505063ffffffff16600090815260096020526040902060010154600160401b90046001600160401b031615919050565b60008263ffffffff168263ffffffff161115612f73576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b63ffffffff8116600090815260096020526040812060010154600160401b90046001600160401b0316151580611853575061185382613238565b600754600090613a109063ffffffff908116906001906132bb16565b63ffffffff168263ffffffff16149050919050565b613a42613a3d63ffffffff8084169060019061395716565b613e13565b6007805463ffffffff1990811663ffffffff84811691821790935560048054600083815260096020908152604091829020600381018054600160801b90950489169490971693909317808755845467ffffffff0000000019909116600160a01b9091048816600160201b021780875584546fffffffffffffffffffffffffffffffff60601b199091166001600160801b03909116600160601b021780875593546bffffffff000000000000000019909416600160e01b909404909616600160401b0292909217909355600192909201805467ffffffffffffffff1916426001600160401b0390811691909117918290558351911681529151339391927f0109fc6f55cf40689f02fbaad7af7fe7bbac8a3d2186600afc7d3e10cac6027192908290030190a350565b63ffffffff90811660009081526009602052604090206003015416151590565b60008151600010613bdb576040805162461bcd60e51b81526020600482015260166024820152756c697374206d757374206e6f7420626520656d70747960501b604482015290519081900360640190fd5b81516002810460018216613c1a57600080613c00866000600187036001870387613ed1565b9092509050613c0f8282613faf565b9450505050506117fb565b613c2a846000600185038461401d565b925050506117fb565b60008282016001600160801b038085169082161015611850576040805162461bcd60e51b815260206004820152601b602482015260008051602061469b833981519152604482015290519081900360640190fd5b600082613c9657506000611853565b82820282848281613ca357fe5b04146118505760405162461bcd60e51b81526004018080602001828103825260218152602001806146bb6021913960400191505060405180910390fd5b6001600160a01b03821660009081526008602052604081205460045463ffffffff600160e01b909204821691600160c01b9091048116820190841611806132b35750159392505050565b60008282016001600160401b038085169082161015611850576040805162461bcd60e51b815260206004820152601b602482015260008051602061469b833981519152604482015290519081900360640190fd5b6001600160a01b031660009081526008602052604090205463ffffffff600160a01b90910481161490565b60075460009063ffffffff168015801590613deb57506001600160a01b03831660009081526008602052604090205463ffffffff828116600160a01b90920416145b15613df75790506117fb565b613e0c63ffffffff808316906001906132bb16565b9392505050565b613e1c81613238565b613e2557611e05565b6000613e3c63ffffffff8084169060019061395716565b63ffffffff81811660009081526009602052604080822080548785168452918320918255600190810154908201805463ffffffff60801b1916600160801b928390049095169091029390931767ffffffffffffffff60401b1916600160401b426001600160401b0316021790925591925060020190613ebb828261460f565b5060010180546001600160e01b03191690555050565b600080828410613ee057600080fd5b838611158015613ef05750848411155b613ef957600080fd5b828611158015613f095750848311155b613f1257600080fd5b60078686031015613f3357613f2a87878787876140ae565b91509150613fa5565b6000613f40888888614481565b9050808411613f5157809550613f9f565b84811015613f6457806001019650613f9f565b808511158015613f7357508381105b613f7957fe5b613f858888838861401d565b9250613f968882600101888761401d565b9150613fa59050565b50613f12565b9550959350505050565b60008083128015613fc05750600082135b80613fd65750600083138015613fd65750600082125b15613ff6576002613fe7848461455e565b81613fee57fe5b059050611853565b60006002808507818507010590506132b3614017600286056002860561455e565b8261455e565b60008184111561402c57600080fd5b8282111561403957600080fd5b82841015614090576007848403101561406557600061405b86868686876140ae565b5091506132b39050565b6000614072868686614481565b90508083116140835780935061408a565b8060010194505b50614039565b84848151811061409c57fe5b60200260200101519050949350505050565b6000806000868660010103905060008888600001815181106140cc57fe5b602002602001015190506000826001106140ed576001600160ff1b03614105565b8989600101815181106140fc57fe5b60200260200101515b905060008360021061411e576001600160ff1b03614136565b8a8a6002018151811061412d57fe5b60200260200101515b905060008460031061414f576001600160ff1b03614167565b8b8b6003018151811061415e57fe5b60200260200101515b9050600085600410614180576001600160ff1b03614198565b8c8c6004018151811061418f57fe5b60200260200101515b90506000866005106141b1576001600160ff1b036141c9565b8d8d600501815181106141c057fe5b60200260200101515b90506000876006106141e2576001600160ff1b036141fa565b8e8e600601815181106141f157fe5b60200260200101515b905085871315614208579495945b83851315614214579293925b81831315614220579091905b8487131561422c579395935b83861315614238579294925b8083131561424257915b8486131561424e579394935b8082131561425857905b82871315614264579195915b81861315614270579094905b8085131561427a57935b82861315614286579194915b8084131561429057925b8285131561429c579193915b818413156142a8579092905b828413156142b4579192915b8d8c03806142c457879a5061436a565b80600114156142d557869a5061436a565b80600214156142e657859a5061436a565b80600314156142f757849a5061436a565b806004141561430857839a5061436a565b806005141561431957829a5061436a565b806006141561432a57819a5061436a565b6040805162461bcd60e51b815260206004820152601060248201526f6b31206f7574206f6620626f756e647360801b604482015290519081900360640190fd5b8e8c038d8d141561438857508a9950613fa598505050505050505050565b8061439f5750969850613fa5975050505050505050565b80600114156143ba5750959850613fa5975050505050505050565b80600214156143d55750949850613fa5975050505050505050565b80600314156143f05750939850613fa5975050505050505050565b806004141561440b5750929850613fa5975050505050505050565b80600514156144265750919850613fa5975050505050505050565b80600614156144415750909850613fa5975050505050505050565b6040805162461bcd60e51b815260206004820152601060248201526f6b32206f7574206f6620626f756e647360801b604482015290519081900360640190fd5b600080846002858501048151811061449557fe5b602002602001015190506001840393506001830192505b600184019350808585815181106144bf57fe5b6020026020010151126144ac575b600183039250808584815181106144e057fe5b6020026020010151136144cd57828410156145505784838151811061450157fe5b602002602001015185858151811061451557fe5b602002602001015186868151811061452957fe5b6020026020010187868151811061453c57fe5b602090810291909101019190915252614559565b82915050613e0c565b6144ac565b60008282018183128015906145735750838112155b80614588575060008312801561458857508381125b6118505760405162461bcd60e51b815260040180806020018281038252602181526020018061467a6021913960400191505060405180910390fd5b6040518060a001604052806000815260200160006001600160401b0316815260200160006001600160401b03168152602001600063ffffffff16815260200161460a61462d565b905290565b5080546000825590600052602060002090810190611e05919061465b565b6040805160a08101825260608082526000602083018190529282018390528101829052608081019190915290565b61152391905b808211156146755760008155600101614661565b509056fe5369676e6564536166654d6174683a206164646974696f6e206f766572666c6f77536166654d6174683a206164646974696f6e206f766572666c6f770000000000536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f6e6c792063616c6c61626c65206279206f776e657200000000000000000000a2646970667358221220fee95a6f210e458d4885d51dc069e62dac9ef4de46bcde85ea7ce9998f05608864736f6c63430006060033

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

000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000258000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000005af3107a4000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000c224e323235202f204a5059220000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _link (address): 0x514910771AF9Ca656af840dff83E8264EcF986CA
Arg [1] : _paymentAmount (uint128): 0
Arg [2] : _timeout (uint32): 600
Arg [3] : _minSubmissionValue (int256): 100000000000
Arg [4] : _maxSubmissionValue (int256): 100000000000000
Arg [5] : _decimals (uint8): 8
Arg [6] : _description (string): "N225 / JPY"

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000258
Arg [3] : 000000000000000000000000000000000000000000000000000000174876e800
Arg [4] : 00000000000000000000000000000000000000000000000000005af3107a4000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [6] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [7] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [8] : 224e323235202f204a5059220000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

59180:4893:0:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;59180:4893:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;62198:297:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;62198:297:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58592:132;;;:::i;:::-;;32435:592;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;32435:592:0;;;;;;;:::i;45949:450::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;45949:450:0;;-1:-1:-1;;;;;45949:450:0;;;;;;;;;;;;;;;:::i;29433:42::-;;;:::i;:::-;;;;;;;;;;;;;;;;29310:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29253:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35553:1046;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;35553:1046:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;42517:610::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;42517:610:0;;;;;;;;;;;;;;;;;:::i;37278:98::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;37278:98:0;;;;;;;;;;;;;;;;;29083:29;;;:::i;:::-;;;;-1:-1:-1;;;;;29083:29:0;;;;;;;;;;;;;;36686:327;;;:::i;59822:144::-;;;:::i;29482:44::-;;;:::i;29009:35::-;;;:::i;:::-;;;;-1:-1:-1;;;;;29009:35:0;;;;;;;;;;;;;;29179:32;;;:::i;37077:102::-;;;:::i;44905:298::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;44905:298:0;-1:-1:-1;;;;;44905:298:0;;:::i;44129:127::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;44129:127:0;-1:-1:-1;;;;;44129:127:0;;:::i;38049:118::-;;;:::i;57634:198::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;57634:198:0;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;57634:198:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;57634:198:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;57634:198:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;57634:198:0;;-1:-1:-1;57634:198:0;;-1:-1:-1;;;;;57634:198:0:i;:::-;;;;;;;;;;;;;;;;;;38251:112;;;:::i;29284:21::-;;;:::i;29345:34::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;29345:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;954:264;;;:::i;29386:42::-;;;:::i;58395:129::-;;;:::i;60157:151::-;;;:::i;58189:140::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;58189:140:0;-1:-1:-1;;;;;58189:140:0;;:::i;47109:918::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;47109:918:0;;-1:-1:-1;;;;;47109:918:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47109:918:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;47109:918:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;287:28;;;:::i;45279:322::-;;;:::i;57939:135::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;57939:135:0;-1:-1:-1;;;;;57939:135:0;;:::i;46685:186::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;46685:186:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;46685:186:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;46685:186:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;46685:186:0;;-1:-1:-1;46685:186:0;-1:-1:-1;46685:186:0;:::i;60545:162::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;60545:162:0;;:::i;60977:169::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;60977:169:0;;:::i;43789:192::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;43789:192:0;-1:-1:-1;;;;;43789:192:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;33653:609;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;33653:609:0;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;33653:609:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;33653:609:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;33653:609:0;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;33653:609:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;33653:609:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;33653:609:0;;-1:-1:-1;33653:609:0;-1:-1:-1;33653:609:0;;;;;;;;;;;;;;;;;;;;:::i;43317:325::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;43317:325:0;;;;;;;;:::i;29146:28::-;;;:::i;29216:32::-;;;:::i;29049:29::-;;;:::i;57247:24::-;;;:::i;42071:145::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;42071:145:0;-1:-1:-1;;;;;42071:145:0;;:::i;44461:280::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;44461:280:0;;;;;;;;;;:::i;34718:381::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;34718:381:0;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;34718:381:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;34718:381:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;34718:381:0;;-1:-1:-1;34718:381:0;-1:-1:-1;34718:381:0;;;;;;;;;;;;;;;;;;;;:::i;703:157::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;703:157:0;-1:-1:-1;;;;;703:157:0;;:::i;63791:279::-;;;:::i;62198:297::-;62315:15;62339:13;62361:17;62387;62413:23;58906:31;58916:10;58928:8;;58906:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;58906:9:0;;-1:-1:-1;;;58906:31:0:i;:::-;58898:53;;;;;-1:-1:-1;;;58898:53:0;;;;;;;;;;;;-1:-1:-1;;;58898:53:0;;;;;;;;;;;;;;;62461:28:::1;62480:8;62461:18;:28::i;:::-;62454:35:::0;;;;-1:-1:-1;62454:35:0;;-1:-1:-1;62454:35:0;-1:-1:-1;62454:35:0;;-1:-1:-1;62198:297:0;-1:-1:-1;;62198:297:0:o;58592:132::-;1358:5;;-1:-1:-1;;;;;1358:5:0;1344:10;:19;1336:54;;;;;-1:-1:-1;;;1336:54:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1336:54:0;;;;;;;;;;;;;;;58663:12:::1;:20:::0;;-1:-1:-1;;58663:20:0::1;::::0;;58697:21:::1;::::0;::::1;::::0;58678:5:::1;::::0;58697:21:::1;58592:132::o:0;32435:592::-;32513:18;32534:49;32554:10;32573:8;32534:19;:49::i;:::-;32513:70;;32613:18;32598:11;:33;;32590:76;;;;;-1:-1:-1;;;32590:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;32696:18;32681:11;:33;;32673:76;;;;;-1:-1:-1;;;32673:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;32764:12;;:5;;:17;32756:41;;;;-1:-1:-1;;;32756:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;32756:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32806:42;32838:8;32806:24;:42::i;:::-;32855:47;32872:11;32892:8;32855:16;:47::i;:::-;32909:35;32934:8;32909:17;:35::i;:::-;32951:27;32968:8;32951:9;:27::i;:::-;32985:36;33011:8;32985:18;:36::i;:::-;32435:592;;;:::o;45949:450::-;1358:5;;-1:-1:-1;;;;;1358:5:0;1344:10;:19;1336:54;;;;;-1:-1:-1;;;1336:54:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1336:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;46080:22:0;::::1;;::::0;;;:10:::1;:22;::::0;;;;:33;::::1;;:48;;::::0;::::1;;;46076:61;;;46130:7;;46076:61;46149:11;46145:179;;;-1:-1:-1::0;;;;;46171:22:0;::::1;;::::0;;;:10:::1;:22;::::0;;;;:47;;-1:-1:-1;;46171:47:0::1;::::0;::::1;;;-1:-1:-1::0;;46227:37:0::1;46171:47;46227:37;::::0;::::1;;;::::0;;46145:179:::1;;;-1:-1:-1::0;;;;;46294:22:0;::::1;;::::0;;;:10:::1;:22;::::0;;;;46287:29;;-1:-1:-1;;46287:29:0;;;46145:179:::1;46337:56;::::0;;;::::1;;::::0;;::::1;::::0;::::1;;::::0;::::1;::::0;;;-1:-1:-1;;;;;46337:56:0;::::1;::::0;::::1;::::0;;;;;;::::1;45949:450:::0;;;:::o;29433:42::-;;;:::o;29310:30::-;;;;;;:::o;29253:26::-;;;-1:-1:-1;;;29253:26:0;;;;;:::o;35553:1046::-;1358:5;;-1:-1:-1;;;;;1358:5:0;1344:10;:19;1336:54;;;;;-1:-1:-1;;;1336:54:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1336:54:0;;;;;;;;;;;;;;;35761:16:::1;35780:13;:11;:13::i;:::-;35761:32;;35852:15;35833:34;;:15;:34;;;;35825:72;;;::::0;;-1:-1:-1;;;35825:72:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;35925:15;35912:28;;:9;:28;;;;35904:64;;;::::0;;-1:-1:-1;;;35904:64:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;35983:14;::::0;::::1;::::0;;:43:::1;;;36013:13;36001:25;;:9;:25;;;35983:43;35975:81;;;::::0;;-1:-1:-1;;;35975:81:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;36089:31;36105:14;-1:-1:-1::0;;;;;36089:31:0::1;:15;:31::i;:::-;36071:14;::::0;-1:-1:-1;;;36071:14:0;::::1;-1:-1:-1::0;;;;;36071:14:0::1;:49;;36063:92;;;::::0;;-1:-1:-1;;;36063:92:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;36182:1;36166:13;:11;:13::i;:::-;:17;;;36162:98;;;36220:1;36202:15;:19;;;36194:58;;;::::0;;-1:-1:-1;;;36194:58:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;36284:14;36268:13;;:30;;;;;-1:-1:-1::0;;;;;36268:30:0::1;;;;;-1:-1:-1::0;;;;;36268:30:0::1;;;;;;36326:15;36305:18;;:36;;;;;;;;;;;;;;;;;;36369:15;36348:18;;:36;;;;;;;;;;;;;;;;;;36406:13;36391:12;;:28;;;;;;;;;;;;;;;;;;36436:8;36426:7;;:18;;;;;;;;;;;;;;;;;;36532:15;36458:135;;36508:15;36458:135;;36486:13;;;;;;;;;-1:-1:-1::0;;;;;36486:13:0::1;-1:-1:-1::0;;;;;36458:135:0::1;;36556:13;36578:8;36458:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1397:1;35553:1046:::0;;;;;:::o;42517:610::-;-1:-1:-1;;;;;42628:16:0;;;;;;;:7;:16;;;;;:22;;;;;;;42654:10;42628:36;42620:71;;;;;-1:-1:-1;;;42620:71:0;;;;;;;;;;;;-1:-1:-1;;;42620:71:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;42846:16:0;;42786:14;42846:16;;;:7;:16;;;;;:29;42811:7;;-1:-1:-1;;;;;42846:29:0;;;;42890:19;;;;;42882:63;;;;;-1:-1:-1;;;42882:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;42986:21;-1:-1:-1;;;;;42986:13:0;;43000:6;42986:21;:13;:21;:::i;:::-;-1:-1:-1;;;;;42954:16:0;;;;;;:7;:16;;;;;:53;;-1:-1:-1;;;;;;42954:53:0;-1:-1:-1;;;;;42954:53:0;;;;;;43031:14;;:26;;:14;43050:6;43031:18;:26::i;:::-;43014:14;:43;;-1:-1:-1;;;;;;43014:43:0;-1:-1:-1;;;;;43014:43:0;;;;;;43073:9;;:47;;;-1:-1:-1;;;43073:47:0;;-1:-1:-1;;;;;43073:47:0;;;;;;;43104:15;;;43073:47;;;;;;:9;;;;;:18;;:47;;;;;;;;;;;;;;;-1:-1:-1;43073:9:0;:47;;;2:2:-1;;;;27:1;24;17:12;2:2;43073:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43073:47:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;43073:47:0;43066:55;;;;42517:610;;;;;:::o;37278:98::-;37323:16;37355:15;37348:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37348:22:0;;;;;;;;;;;;;;;;;;;;;;;37278:98;;:::o;29083:29::-;;;-1:-1:-1;;;29083:29:0;;-1:-1:-1;;;;;29083:29:0;;:::o;36686:327::-;36769:14;;36812:9;;:34;;;-1:-1:-1;;;36812:34:0;;36840:4;36812:34;;;;;;-1:-1:-1;;;;;;;;36769:14:0;;;;;36740:26;;36812:54;;36851:14;;;;;-1:-1:-1;;;;;36812:9:0;;;;:19;;:34;;;;;;;;;;;;;;:9;:34;;;2:2:-1;;;;27:1;24;17:12;2:2;36812:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36812:34:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;36812:34:0;;:54;:38;:54;:::i;:::-;36873:14;:35;;-1:-1:-1;;;;;36873:35:0;;;-1:-1:-1;;;36873:35:0;;;;;;;;;;-1:-1:-1;36921:31:0;;;;36917:91;;36968:32;;36990:9;;36968:32;;;;;36917:91;36686:327;;:::o;59822:144::-;59915:6;58906:31;58916:10;58928:8;;58906:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;58906:9:0;;-1:-1:-1;;;58906:31:0:i;:::-;58898:53;;;;;-1:-1:-1;;;58898:53:0;;;;;;;;;;;;-1:-1:-1;;;58898:53:0;;;;;;;;;;;;;;;59940:20:::1;:18;:20::i;:::-;59933:27;;59822:144:::0;:::o;29482:44::-;29525:1;29482:44;:::o;29009:35::-;;;-1:-1:-1;;;;;29009:35:0;;:::o;29179:32::-;;;-1:-1:-1;;;29179:32:0;;;;;:::o;37077:102::-;37150:15;:22;37077:102;:::o;44905:298::-;-1:-1:-1;;;;;44975:16:0;;;;;;;:7;:16;;;;;:29;;;;45008:10;44975:43;44967:86;;;;;-1:-1:-1;;;44967:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;45060:16:0;;45100:1;45060:16;;;:7;:16;;;;;;:29;;;:42;;-1:-1:-1;;;;;;45060:42:0;;;45109:22;;:35;;-1:-1:-1;;;;;;45109:35:0;45134:10;45109:35;;;;;;;;;;45158:39;;45134:10;;45060:16;45158:39;;;44905:298;:::o;44129:127::-;-1:-1:-1;;;;;44228:16:0;;;44202:7;44228:16;;;:7;:16;;;;;:22;;;;;;;44129:127;;;;:::o;38049:118::-;38148:13;;-1:-1:-1;;;38148:13:0;;;;;38049:118::o;57634:198::-;-1:-1:-1;;;;;57770:17:0;;57747:4;57770:17;;;:10;:17;;;;;;;;;:34;;-1:-1:-1;57792:12:0;;;;57791:13;57770:34;:56;;;-1:-1:-1;;;;;;57808:18:0;;57817:9;57808:18;57770:56;57763:63;;57634:198;;;;;:::o;38251:112::-;38341:16;;;;38251:112;:::o;29284:21::-;;;-1:-1:-1;;;29284:21:0;;;;;:::o;29345:34::-;;;;;;;;;;;;;;;-1:-1:-1;;29345:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;954:264::-;1027:12;;-1:-1:-1;;;;;1027:12:0;1013:10;:26;1005:61;;;;;-1:-1:-1;;;1005:61:0;;;;;;;;;;;;-1:-1:-1;;;1005:61:0;;;;;;;;;;;;;;;1075:16;1094:5;;1114:10;-1:-1:-1;;;;;;1106:18:0;;;;;;;-1:-1:-1;1131:25:0;;;;;;;1170:42;;-1:-1:-1;;;;;1094:5:0;;;;1114:10;;1094:5;;1170:42;;;954:264;:::o;29386:42::-;;;:::o;58395:129::-;1358:5;;-1:-1:-1;;;;;1358:5:0;1344:10;:19;1336:54;;;;;-1:-1:-1;;;1336:54:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1336:54:0;;;;;;;;;;;;;;;58465:12:::1;:19:::0;;-1:-1:-1;;58465:19:0::1;58480:4;58465:19;::::0;;58498:20:::1;::::0;::::1;::::0;58465:12:::1;::::0;58498:20:::1;58395:129::o:0;60157:151::-;60253:7;58906:31;58916:10;58928:8;;58906:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;58906:9:0;;-1:-1:-1;;;58906:31:0:i;:::-;58898:53;;;;;-1:-1:-1;;;58898:53:0;;;;;;;;;;;;-1:-1:-1;;;58898:53:0;;;;;;;;;;;;;;;60279:23:::1;:21;:23::i;58189:140::-:0;1358:5;;-1:-1:-1;;;;;1358:5:0;1344:10;:19;1336:54;;;;;-1:-1:-1;;;1336:54:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1336:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;58274:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;;;;;58267:24;;-1:-1:-1;;58267:24:0::1;::::0;;58303:20;;;;;;;::::1;::::0;;;;;;;;::::1;58189:140:::0;:::o;47109:918::-;47222:22;;;;;;;;47468:10;47482:9;47468:23;47460:58;;;;;-1:-1:-1;;;47460:58:0;;;;;;;;;;;;-1:-1:-1;;;47460:58:0;;;;;;;;;;;;;;;47531:19;;;;47527:495;;47583:23;;;47561:19;47583:23;;;:6;:23;;;;;47633:50;47658:7;47590:15;47633:24;:50::i;:::-;-1:-1:-1;;;;;47720:16:0;;;;;;:7;:16;;;;;:33;;;;;47764:15;;;;47790:21;;;;;47822:14;;47694:15;;47720:33;-1:-1:-1;;;;;47764:15:0;;-1:-1:-1;;;47790:21:0;;;;;-1:-1:-1;;;47822:14:0;;-1:-1:-1;;;;;47822:14:0;47847:13;:11;:13::i;:::-;47872:15;;;;-1:-1:-1;;;;;47872:15:0;:65;;47924:13;;-1:-1:-1;;;;;47924:13:0;47872:65;;;47894:27;;;;-1:-1:-1;;;47894:27:0;;-1:-1:-1;;;;;47894:27:0;47872:65;47615:332;;;;;;;;;;;;;;;;;;;;;;;;47527:495;47977:37;48006:7;47977:28;:37::i;:::-;47970:44;;;;;;;;;;;;;;;;47527:495;47109:918;;;;;;;;;;;:::o;287:28::-;;;-1:-1:-1;;;;;287:28:0;;:::o;45279:322::-;45349:10;45338:22;;;;:10;:22;;;;;:33;;;45330:70;;;;;-1:-1:-1;;;45330:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;45426:16;;;;45409:14;45457:15;;;:6;:15;;;;;45426:16;45457:25;;-1:-1:-1;;;45457:25:0;;-1:-1:-1;;;;;45457:25:0;:29;;;:50;;;45490:17;45499:7;45490:8;:17::i;:::-;45449:94;;;;;-1:-1:-1;;;45449:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;45552:43;45580:14;:11;;;;;45592:1;;45580:11;:14;:::i;:::-;45552:27;:43::i;:::-;45279:322;:::o;57939:135::-;1358:5;;-1:-1:-1;;;;;1358:5:0;1344:10;:19;1336:54;;;;;-1:-1:-1;;;1336:54:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1336:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;58014:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;;;;;:24;;-1:-1:-1;;58014:24:0::1;58034:4;58014:24;::::0;;58050:18;;;;;;;::::1;::::0;;;;;;;;::::1;57939:135:::0;:::o;46685:186::-;46782:17;;46774:62;;;;;-1:-1:-1;;;46774:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46843:22;:20;:22::i;:::-;46685:186;;;;:::o;60545:162::-;60651:6;58906:31;58916:10;58928:8;;58906:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;58906:9:0;;-1:-1:-1;;;58906:31:0:i;:::-;58898:53;;;;;-1:-1:-1;;;58898:53:0;;;;;;;;;;;;-1:-1:-1;;;58898:53:0;;;;;;;;;;;;;;;60676:25:::1;60692:8;60676:15;:25::i;60977:169::-:0;61086:7;58906:31;58916:10;58928:8;;58906:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;58906:9:0;;-1:-1:-1;;;58906:31:0:i;:::-;58898:53;;;;;-1:-1:-1;;;58898:53:0;;;;;;;;;;;;-1:-1:-1;;;58898:53:0;;;;;;;;;;;;;;;61112:28:::1;61131:8;61112:18;:28::i;43789:192::-:0;-1:-1:-1;;;;;43905:16:0;43870:6;43905:16;;;:7;:16;;;;;:33;;;;43940:34;;43905:33;;-1:-1:-1;;;43940:34:0;;;;;;43789:192::o;33653:609::-;1358:5;;-1:-1:-1;;;;;1358:5:0;1344:10;:19;1336:54;;;;;-1:-1:-1;;;1336:54:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1336:54:0;;;;;;;;;;;;;;;33879:33;;::::1;33871:78;;;::::0;;-1:-1:-1;;;33871:78:0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;29998:2;33964:43;33991:8:::0;33972:13:::1;:11;:13::i;:::-;33964:22;;:26;;:43;;;;:::i;:::-;:63;;33956:95;;;::::0;;-1:-1:-1;;;33956:95:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;33956:95:0;;;;;;;;;;;;;::::1;;34065:9;34060:97;34080:19:::0;;::::1;34060:97;;;34115:34;34125:8;;34134:1;34125:11;;;;;;;;;;;;;-1:-1:-1::0;;;;;34125:11:0::1;34138:7;;34146:1;34138:10;;;;;;;;;;;;;-1:-1:-1::0;;;;;34138:10:0::1;34115:9;:34::i;:::-;34101:3;;34060:97;;;-1:-1:-1::0;34184:13:0::1;::::0;34165:91:::1;::::0;-1:-1:-1;;;;;34184:13:0;::::1;::::0;34199:15;;34216;;34233:13;;-1:-1:-1;;;34248:7:0;::::1;;;34165:18;:91::i;:::-;33653:609:::0;;;;;;;:::o;43317:325::-;1358:5;;-1:-1:-1;;;;;1358:5:0;1344:10;:19;1336:54;;;;;-1:-1:-1;;;1336:54:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1336:54:0;;;;;;;;;;;;;;;43470:13:::1;::::0;43489:7;;43426:59:::1;::::0;43454:30:::1;::::0;-1:-1:-1;;;;;43470:13:0::1;43454:15;:30::i;:::-;43434:14;::::0;-1:-1:-1;;;43434:14:0;::::1;-1:-1:-1::0;;;;;43434:14:0::1;::::0;43426:27:::1;:59::i;:::-;:70;;43418:109;;;::::0;;-1:-1:-1;;;43418:109:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;43542:9;::::0;:39:::1;::::0;;-1:-1:-1;;;43542:39:0;;-1:-1:-1;;;;;43542:39:0;;::::1;;::::0;::::1;::::0;;;;;;;;;:9;;;::::1;::::0;:18:::1;::::0;:39;;;;;::::1;::::0;;;;;;;;:9:::1;::::0;:39;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;43542:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;43542:39:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;43542:39:0;43534:73:::1;;;::::0;;-1:-1:-1;;;43534:73:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;43534:73:0;;;;;;;;;;;;;::::1;;43614:22;:20;:22::i;29146:28::-:0;;;-1:-1:-1;;;;;29146:28:0;;:::o;29216:32::-;;;-1:-1:-1;;;29216:32:0;;;;;:::o;29049:29::-;;;-1:-1:-1;;;;;29049:29:0;;:::o;57247:24::-;;;;;;:::o;42071:145::-;-1:-1:-1;;;;;42181:16:0;42155:7;42181:16;;;:7;:16;;;;;:29;-1:-1:-1;;;;;42181:29:0;;42071:145::o;44461:280::-;-1:-1:-1;;;;;44552:16:0;;;;;;;:7;:16;;;;;:22;;;;;;;44578:10;44552:36;44544:71;;;;;-1:-1:-1;;;44544:71:0;;;;;;;;;;;;-1:-1:-1;;;44544:71:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;44622:16:0;;;;;;;:7;:16;;;;;;;;;:29;;:41;;-1:-1:-1;;;;;;44622:41:0;;;;;;;;;44677:58;;44713:10;44677:58;;;;;;;;;;;44622:16;;44677:58;;;;;;;;;;;44461:280;;:::o;34718:381::-;1358:5;;-1:-1:-1;;;;;1358:5:0;1344:10;:19;1336:54;;;;;-1:-1:-1;;;1336:54:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1336:54:0;;;;;;;;;;;;;;;34911:9:::1;34906:88;34926:19:::0;;::::1;34906:88;;;34961:25;34974:8;;34983:1;34974:11;;;;;;;;;;;;;-1:-1:-1::0;;;;;34974:11:0::1;34961:12;:25::i;:::-;34947:3;;34906:88;;;-1:-1:-1::0;35021:13:0::1;::::0;35002:91:::1;::::0;-1:-1:-1;;;;;35021:13:0;::::1;::::0;35036:15;;35053;;35070:13;;-1:-1:-1;;;35085:7:0;::::1;;;35002:18;:91::i;703:157::-:0;1358:5;;-1:-1:-1;;;;;1358:5:0;1344:10;:19;1336:54;;;;;-1:-1:-1;;;1336:54:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1336:54:0;;;;;;;;;;;;;;;784:12:::1;:18:::0;;-1:-1:-1;;;;;;784:18:0::1;-1:-1:-1::0;;;;;784:18:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;843:5:0;;816:38:::1;::::0;784:18;;843:5:::1;::::0;816:38:::1;::::0;-1:-1:-1;816:38:0::1;703:157:::0;:::o;63791:279::-;63895:15;63919:13;63941:17;63967;63993:23;58906:31;58916:10;58928:8;;58906:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;58906:9:0;;-1:-1:-1;;;58906:31:0:i;:::-;58898:53;;;;;-1:-1:-1;;;58898:53:0;;;;;;;;;;;;-1:-1:-1;;;58898:53:0;;;;;;;;;;;;;;;64041:23:::1;:21;:23::i;:::-;64034:30;;;;;;;;;;63791:279:::0;;;;;:::o;40125:418::-;40236:15;40260:13;40282:17;40308;40334:23;40375:14;;:::i;:::-;40392:24;;;;;;;;:6;:24;;;;;;;;;40375:41;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40375:41:0;;;;;;;-1:-1:-1;;;40375:41:0;;;;;;;-1:-1:-1;;;40375:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40392:24;;40375:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;40375:41:0;;;-1:-1:-1;;40375:41:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;40375:41:0;;;;;;;;;;;;-1:-1:-1;;;40375:41:0;;;;;;;;;;;;-1:-1:-1;;;40375:41:0;;;-1:-1:-1;;;;;40375:41:0;;;;;;;;;;;;;40456:8;;40473:11;;;;40493;;;;40513:17;;;40439:8;;40456;;-1:-1:-1;;;;;40423:114:0;;;;-1:-1:-1;40423:114:0;;;-1:-1:-1;40423:114:0;;;-1:-1:-1;40125:418:0;;-1:-1:-1;;;;40125:418:0:o;55397:798::-;-1:-1:-1;;;;;55572:16:0;;55549:20;55572:16;;;:7;:16;;;;;:30;55623:16;;55497:12;;55572:30;-1:-1:-1;;;55572:30:0;;;;;;55623:16;55652:18;55648:51;;55672:27;;;;;;;;;;;;;-1:-1:-1;;;55672:27:0;;;;;;;;;55648:51;55726:8;55710:24;;:13;:24;;;55706:61;;;55736:31;;;;;;;;;;;;;-1:-1:-1;;;55736:31:0;;;;;;;;;55706:61;-1:-1:-1;;;;;55778:16:0;;;;;;:7;:16;;;;;:28;:39;;;;-1:-1:-1;;;55778:28:0;;;;:39;55774:78;;;55819:33;;;;;;;;;;;;;;;;;;;;;;;55774:78;-1:-1:-1;;;;;55863:16:0;;;;;;:7;:16;;;;;:34;:46;;;;-1:-1:-1;;;55863:34:0;;;;:46;55859:93;;55911:41;;;;;;;;;;;;;;;;;;;;;;;55859:93;55975:4;55963:16;;:8;:16;;;;:43;;;;-1:-1:-1;55995:11:0;:8;;;;;56004:1;;55995:8;:11;:::i;:::-;55983:23;;:8;:23;;;;55963:43;:92;;;;;56011:44;56040:8;56050:4;56011:28;:44::i;:::-;56010:45;55963:92;55959:130;;;56057:32;;;;;;;;;;;;;;;;;;;;;;;55959:130;56100:8;:13;;56112:1;56100:13;;:47;;;;-1:-1:-1;56118:29:0;56131:15;:12;;;;;56144:1;;56131:12;:15;:::i;:::-;56118:12;:29::i;:::-;56117:30;56100:47;56096:93;;;56149:40;;;;;;;;;;;;;;;;;;;;;;;56096:93;55397:798;;;;;;:::o;50551:369::-;50630:18;50639:8;50630;:18::i;:::-;50625:32;;50650:7;;50625:32;50693:10;50663:19;50685;;;:7;:19;;;;;:36;50781:12;;50685:36;-1:-1:-1;;;50685:36:0;;;;;;-1:-1:-1;;;50781:12:0;;;;;50767:26;;50755:38;;;;;;;:58;;-1:-1:-1;50797:16:0;;;50755:58;50751:71;;;50815:7;;;50751:71;50830:28;50849:8;50830:18;:28::i;:::-;-1:-1:-1;50875:10:0;50867:19;;;;:7;:19;;;;;:47;;;;;-1:-1:-1;;;50867:47:0;-1:-1:-1;;;;;50867:47:0;;;;;;50551:369;:::o;52626:408::-;52720:30;52741:8;52720:20;:30::i;:::-;52712:74;;;;;-1:-1:-1;;;52712:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;52795:16;;;;;;;:6;:16;;;;;;;;:24;;27:10:-1;;39:1;23:18;;;45:23;;52795:54:0;;;;;;;;;;52864:10;52856:19;;;:7;:19;;;;;;:48;;-1:-1:-1;;;;52856:48:0;-1:-1:-1;;;52856:48:0;;;;;52911:36;:50;;;52975:53;52864:10;;52795:16;:54;;52975:53;;52795:16;52975:53;52626:408;;:::o;51726:494::-;51843:16;;;;;;;;:6;:16;;;;;:39;;;;:24;;;;51797:43;-1:-1:-1;;;51843:39:0;;;;;;-1:-1:-1;51793:98:0;;;51884:7;;51793:98;51942:16;;;51899;51942;;;:6;:16;;;;;;;;:24;;51918:61;;;;;;;;;;;;;;;;;;;;;51942:24;51918:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:23;:61::i;:::-;51986:16;;;;;;;:6;:16;;;;;;;;;:35;;;52028:26;;:52;;-1:-1:-1;;;;52028:52:0;-1:-1:-1;;;52064:15:0;-1:-1:-1;;;;;52028:52:0;;;;;;;;;;-1:-1:-1;;;;52087:43:0;-1:-1:-1;;;52087:43:0;;;;;;52137:13;:24;;-1:-1:-1;;52137:24:0;-1:-1:-1;;;52137:24:0;;;;;52175:39;;;;;;;51986:35;;-1:-1:-1;51986:16:0;;:35;;52175:39;;;;;;;;51726:494;;:::o;52226:394::-;52303:16;;;;52285:15;52303:16;;;:6;:16;;;;;:38;;;;;52368:14;;-1:-1:-1;;;;;;;;52303:38:0;;;;;;52368:27;;-1:-1:-1;;;52368:14:0;;;;;;;52303:38;;52368:18;:27;:::i;:::-;52404:14;:26;;-1:-1:-1;;;;;52404:26:0;;;-1:-1:-1;;;52404:26:0;;;;;;;;;;;-1:-1:-1;52454:27:0;;:14;52473:7;52454:18;:27::i;:::-;52437:14;:44;;-1:-1:-1;;;;;;52437:44:0;-1:-1:-1;;;;;52437:44:0;;;;;;52531:10;-1:-1:-1;52523:19:0;;;:7;:19;;;;;:32;:45;;:32;52560:7;52523:36;:45::i;:::-;52496:10;52488:19;;;;:7;:19;;;;;;:80;;-1:-1:-1;;;;;;52488:80:0;-1:-1:-1;;;;;52488:80:0;;;;;;52582:32;;;;;;;52488:19;52582:32;52226:394;;;:::o;53040:211::-;53158:16;;;;;;;;:6;:16;;;;;:39;;;;:24;;;;53112:43;53158:39;;-1:-1:-1;53108:98:0;;;53199:7;;53108:98;53221:16;;;;;;;:6;:16;;;;;:24;;;53214:31;53221:24;:16;53214:31;:::i;:::-;-1:-1:-1;53214:31:0;;;;-1:-1:-1;;;;;;53214:31:0;;;53040:211;:::o;54050:157::-;54129:7;54155:46;29948:1;54155:26;54167:13;:11;:13::i;:::-;54155:26;;:7;:11;;:26;;;;:::i;:::-;:30;:46;:30;:46;:::i;18403:170::-;18461:7;18490:1;-1:-1:-1;;;;;18485:6:0;:1;-1:-1:-1;;;;;18485:6:0;;;18477:49;;;;;-1:-1:-1;;;18477:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18545:5:0;;;18403:170::o;4922:::-;4980:7;5009:1;5004;:6;;4996:49;;;;;-1:-1:-1;;;4996:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;37500:146;37619:13;;-1:-1:-1;;;37619:13:0;;;;37587:6;37612:21;;;:6;:21;;;;;:28;;37500:146::o;37773:153::-;37896:13;;-1:-1:-1;;;37896:13:0;;;;37863:7;37889:21;;;:6;:21;;;;;:31;;;-1:-1:-1;;;37889:31:0;;-1:-1:-1;;;;;37889:31:0;;37773:153::o;48033:432::-;48175:23;;;48145:14;48175:23;;;:6;:23;;;;;:33;;;-1:-1:-1;;;;;48175:33:0;:37;48171:289;;48230:37;48251:15;48230:20;:37::i;:::-;:98;;;;;48271:45;48291:7;48300:15;48271:19;:45::i;:::-;:52;:57;48230:98;48223:105;;;;48171:289;48358:33;48366:7;48375:15;48358:7;:33::i;48471:1511::-;-1:-1:-1;;;;;48877:16:0;;48571:22;48877:16;;;:7;48831:9;48877:16;48831:9;48877:16;;48953;;48925:24;;48571:22;;;;;;;;;;;;;;48831:9;;48877:16;;48571:22;;48831:9;48953:16;;;-1:-1:-1;;;48925:24:0;;;;:44;;:87;;-1:-1:-1;48995:16:0;;48974:38;;48995:16;;48974:20;:38::i;:::-;48973:39;48925:87;49236:16;;48902:110;;-1:-1:-1;49223:30:0;;49236:16;;49223:12;:30::i;:::-;:49;;;;;49257:15;49223:49;49219:432;;;49294:16;;:23;;:16;;;;;49315:1;;49294:20;:23;:::i;:::-;49334:16;;;;;;;:6;:16;;;;;49378:13;;49283:34;;-1:-1:-1;;;;;;49378:13:0;;;;-1:-1:-1;49334:16:0;-1:-1:-1;49420:26:0;49428:7;49283:34;49420:7;:26::i;:::-;49400:46;;49219:432;;;49480:16;;;;;49513;;;:6;:16;;;;;49557:27;;;;49480:16;;-1:-1:-1;;;;49557:27:0;;;-1:-1:-1;;;;;49557:27:0;;-1:-1:-1;49513:16:0;-1:-1:-1;49613:30:0;49480:16;49613:20;:30::i;:::-;49593:50;;49219:432;49663:38;49683:7;49692:8;49663:19;:38::i;:::-;:45;:50;49659:98;;49744:5;49724:25;;49659:98;49824:23;;;;;49856:15;;;;49880:21;;;;;49910:14;;49781:17;;49807:8;;49824:23;;-1:-1:-1;;;;;49856:15:0;;;;-1:-1:-1;;;49880:21:0;;;;;;-1:-1:-1;;;49910:14:0;;-1:-1:-1;;;;;49910:14:0;49933:13;:11;:13::i;:::-;49955:14;49765:211;;;;;;;;;;;;;;;;;;;;;;;;48471:1511;;;;;;;;;:::o;53257:296::-;53364:16;;;;53329:4;53364:16;;;:6;:16;;;;;:26;;;;53419:32;;;;;53329:4;;-1:-1:-1;;;;;53364:26:0;;;;-1:-1:-1;;;53419:32:0;;;53465:13;;;;;:33;;;53497:1;53482:12;:16;;;53465:33;:82;;;;-1:-1:-1;53532:15:0;53502:27;-1:-1:-1;;;;;53502:13:0;;:27;;;;;:13;:27;:::i;:::-;-1:-1:-1;;;;;53502:45:0;;53465:82;53458:89;53257:296;-1:-1:-1;;;;53257:296:0:o;25084:163::-;25140:6;25166:5;;;25186:6;;;;;;;;;25178:46;;;;;-1:-1:-1;;;25178:46:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25178:46:0;;;;;;;;;;;;;;50926:413;51008:18;51017:8;51008;:18::i;:::-;51003:32;;51028:7;;51003:32;51074:10;51041:19;51063:22;;;:10;:22;;;;;:39;;;;;;;;;51165:28;;;;51151:42;;51140:53;;;;;:73;;-1:-1:-1;51197:16:0;;51140:73;51132:105;;;;;-1:-1:-1;;;51132:105:0;;;;;;;;;;;;-1:-1:-1;;;51132:105:0;;;;;;;;;;;;;;;51246:28;51265:8;51246:18;:28::i;:::-;-1:-1:-1;51294:10:0;51283:22;;;;:10;:22;;;;;:50;;;;;;;-1:-1:-1;;51283:50:0;;;;;;50926:413;:::o;38536:162::-;38661:24;;38636:6;38661:24;;;:6;:24;;;;;:31;;38536:162::o;38904:169::-;39033:24;;39007:7;39033:24;;;:6;:24;;;;;:34;;;-1:-1:-1;;;39033:34:0;;-1:-1:-1;;;;;39033:34:0;;38904:169::o;4492:167::-;4550:7;4578:5;;;4598:6;;;;4590:46;;;;;-1:-1:-1;;;4590:46:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4590:46:0;;;;;;;;;;;;;;54213:687;54312:22;54326:7;54312:13;:22::i;:::-;54311:23;54303:58;;;;;-1:-1:-1;;;54303:58:0;;;;;;;;;;;;-1:-1:-1;;;54303:58:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;54378:20:0;;54370:54;;;;;-1:-1:-1;;;54370:54:0;;;;;;;;;;;;-1:-1:-1;;;54370:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;54439:16:0;;;54473:1;54439:16;;;:7;:16;;;;;:22;;;;;;;:36;;:72;;-1:-1:-1;;;;;;54479:16:0;;;;;;;:7;:16;;;;;:22;;;;;;;;:32;;;;54439:72;54431:113;;;;;-1:-1:-1;;;54431:113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;54586:25;54603:7;54586:16;:25::i;:::-;-1:-1:-1;;;;;54553:16:0;;;;;;;:7;:16;;;;;;:58;;-1:-1:-1;;;;54553:58:0;;;;;-1:-1:-1;;;54553:58:0;-1:-1:-1;;;;54553:58:0;;;;54618:40;;;;-1:-1:-1;;;54618:40:0;;;54697:15;:22;;54665;;;;:55;;;;;;-1:-1:-1;;54665:55:0;;;;;;;;;27:10:-1;;-1:-1;23:18;;;45:23;;;54727:29:0;;;;-1:-1:-1;;;;;;54727:29:0;;;;;54763:16;;;:31;;;;;;;-1:-1:-1;;;;;;54763:31:0;;;;;;;;;;54808:39;;-1:-1:-1;;54553:16:0;;54808:39;;54553:16;54808:39;54887:6;-1:-1:-1;;;;;54859:35:0;54878:7;-1:-1:-1;;;;;54859:35:0;;;;;;;;;;;54213:687;;:::o;54906:485::-;54986:22;55000:7;54986:13;:22::i;:::-;54978:53;;;;;-1:-1:-1;;;54978:53:0;;;;;;;;;;;;-1:-1:-1;;;54978:53:0;;;;;;;;;;;;;;;55071:16;;:23;;:16;;;;;55092:1;;55071:20;:23;:::i;:::-;-1:-1:-1;;;;;55040:16:0;;;;;;:7;:16;;;;;:54;;;;;;;-1:-1:-1;;;55040:54:0;-1:-1:-1;;;;55040:54:0;;;;;;;;;;55116:15;55132:20;-1:-1:-1;55132:13:0;:11;:13::i;:::-;:17;;;;:20;;;;:::i;:::-;55116:37;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;55175:16:0;;;;;;:7;:16;;;;;;;:22;;;;;;55116:37;;;;55204:13;;;;;;:19;:27;;55175:22;;;;-1:-1:-1;;55204:27:0;;;;;;;;55245:16;;;;55238:29;;;;;55274:15;:22;;55116:37;;-1:-1:-1;55175:22:0;;55116:37;;55274:15;55175:22;;55274;;;;;;;;;;;;;;:29;;;;;-1:-1:-1;;;;;55274:29:0;;;;;-1:-1:-1;;;;;55274:29:0;;;;;;55310:15;:21;;;;;;;;;;;;;;;;-1:-1:-1;;55310:21:0;;;;;-1:-1:-1;;;;;;55310:21:0;;;;;;;;;55345:40;;-1:-1:-1;;;;;55345:40:0;;;;;55310:21;;55345:40;54906:485;;;:::o;41697:277::-;41795:15;41819:13;41841:17;41867;41893:23;41941:27;41954:13;;;;;;;;;;;41941:27;;:12;:27::i;53853:191::-;53959:4;54001:5;53982:24;;:15;53995:1;53982:8;:12;;;;:15;;;;:::i;:::-;:24;;;:56;;;;-1:-1:-1;;54010:13:0;;;;;;:6;:13;;;;;:23;;;-1:-1:-1;;;54010:23:0;;-1:-1:-1;;;;;54010:23:0;:28;;53853:191;-1:-1:-1;53853:191:0:o;25510:166::-;25566:6;25594:1;25589:6;;:1;:6;;;;25581:49;;;;;-1:-1:-1;;;25581:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;56201:157;56300:16;;;56277:4;56300:16;;;:6;:16;;;;;:26;;;-1:-1:-1;;;56300:26:0;;-1:-1:-1;;;;;56300:26:0;:30;;;:52;;;56334:18;56343:8;56334;:18::i;56922:136::-;57029:16;;56994:4;;57029:23;;:16;;;;;57050:1;;57029:20;:23;:::i;:::-;57017:35;;:8;:35;;;57010:42;;56922:136;;;:::o;50020:525::-;50088:40;50112:15;:12;;;;;50125:1;;50112:12;:15;:::i;:::-;50088:23;:40::i;:::-;50137:16;:27;;-1:-1:-1;;50137:27:0;;;;;;;;;;;;;50213:18;;;-1:-1:-1;50171:16:0;;;:6;:16;;;;;;;;;:39;;;:60;;-1:-1:-1;;;50213:18:0;;;;;50171:60;;;;;;;;;;;50280:18;;-1:-1:-1;;50238:60:0;;;-1:-1:-1;;;50280:18:0;;;;;-1:-1:-1;;;50238:60:0;;;;;50346:13;;-1:-1:-1;;;;50305:54:0;;;-1:-1:-1;;;;;50346:13:0;;;-1:-1:-1;;;50305:54:0;;;;;50401:7;;-1:-1:-1;;50366:42:0;;;-1:-1:-1;;;50401:7:0;;;;;;-1:-1:-1;;;50366:42:0;;;;;;;;-1:-1:-1;50415:26:0;;;;:52;;-1:-1:-1;;50415:52:0;50451:15;-1:-1:-1;;;;;50415:52:0;;;;;;;;;;;50481:58;;50512:26;;50481:58;;;;50500:10;;50137:27;;50481:58;;;;;;;;;50020:525;:::o;56517:157::-;56624:16;;;;56601:4;56624:16;;;:6;:16;;;;;:39;;;;:44;;;56517:157::o;10022:522::-;10108:6;10138:4;:11;10134:1;:15;10126:50;;;;;-1:-1:-1;;;10126:50:0;;;;;;;;;;;;-1:-1:-1;;;10126:50:0;;;;;;;;;;;;;;;10197:11;;10243:1;10237:7;;10255;;;10251:288;;10278:14;10301;10345:62;10360:4;10366:1;10375;10369:3;:7;10392:1;10378:11;:15;10395:11;10345:14;:62::i;:::-;10324:83;;-1:-1:-1;10324:83:0;-1:-1:-1;10423:36:0;10324:83;;10423:18;:36::i;:::-;10416:43;;;;;;;;10251:288;10489:42;10501:4;10507:1;10516;10510:3;:7;10519:11;10489;:42::i;:::-;10482:49;;;;;;17973:167;18031:7;18059:5;;;-1:-1:-1;;;;;18079:6:0;;;;;;;;18071:46;;;;;-1:-1:-1;;;18071:46:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;18071:46:0;;;;;;;;;;;;;;5331:430;5389:7;5617:6;5613:37;;-1:-1:-1;5641:1:0;5634:8;;5613:37;5670:5;;;5674:1;5670;:5;:1;5690:5;;;;;:10;5682:56;;;;-1:-1:-1;;;5682:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56680:236;-1:-1:-1;;;;;56806:16:0;;56768:4;56806:16;;;:7;:16;;;;;:33;56878:12;;56806:33;-1:-1:-1;;;56806:33:0;;;;;;-1:-1:-1;;;56878:12:0;;;;;56864:26;;56853:37;;;;;:57;;-1:-1:-1;56894:16:0;;56846:64;-1:-1:-1;;;56680:236:0:o;21538:163::-;21594:6;21620:5;;;-1:-1:-1;;;;;21640:6:0;;;;;;;;21632:46;;;;;-1:-1:-1;;;21632:46:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21632:46:0;;;;;;;;;;;;;;56364:147;-1:-1:-1;;;;;56464:16:0;56441:4;56464:16;;;:7;:16;;;;;:28;30041:7;-1:-1:-1;;;56464:28:0;;;;;:41;;56364:147::o;53559:288::-;53679:16;;53639:6;;53679:16;;53706:17;;;;;:65;;-1:-1:-1;;;;;;53743:16:0;;;;;;:7;:16;;;;;:28;;53727:44;;;-1:-1:-1;;;53743:28:0;;;;53727:44;53706:65;53702:107;;;53789:12;-1:-1:-1;53782:19:0;;53702:107;53822:19;:16;;;;;53839:1;;53822:16;:19;:::i;:::-;53815:26;53559:288;-1:-1:-1;;;53559:288:0:o;51345:375::-;51423:18;51432:8;51423;:18::i;:::-;51418:32;;51443:7;;51418:32;51458:13;51474:15;:12;;;;;51487:1;;51474:12;:15;:::i;:::-;51522:14;;;;;;;;:6;:14;;;;;;:21;;51496:16;;;;;;;;:47;;;51585:30;;;;;51550:32;;;:65;;-1:-1:-1;;;;51550:65:0;-1:-1:-1;;;51585:30:0;;;;;;;51550:65;;;;;;;-1:-1:-1;;;;51622:52:0;-1:-1:-1;;;51658:15:0;-1:-1:-1;;;;;51622:52:0;;;;;;51522:14;;-1:-1:-1;51690:24:0;;;51683:31;51690:24;51522:14;51683:31;:::i;:::-;-1:-1:-1;51683:31:0;;;;-1:-1:-1;;;;;;51683:31:0;;;-1:-1:-1;51345:375:0;:::o;14213:831::-;14390:11;14403;14439:2;14434;:7;14426:16;;12:1:-1;9;2:12;14426:16:0;14463:2;14457;:8;;:20;;;;;14475:2;14469;:8;;14457:20;14449:29;;12:1:-1;9;2:12;14449:29:0;14499:2;14493;:8;;:20;;;;;14511:2;14505;:8;;14493:20;14485:29;;12:1:-1;9;2:12;14485:29:0;10677:1;14554:2;14549;:7;:35;14545:105;;;14604:36;14619:4;14625:2;14629;14633;14637;14604:14;:36::i;:::-;14597:43;;;;;;14545:105;14658:16;14677:23;14687:4;14693:2;14697;14677:9;:23::i;:::-;14658:42;;14719:8;14713:2;:14;14709:323;;14745:8;14740:13;;14709:323;;;14784:2;14773:8;:13;14769:263;;;14804:8;14815:1;14804:12;14799:17;;14769:263;;;14856:8;14850:2;:14;;:31;;;;;14879:2;14868:8;:13;14850:31;14843:39;;;;14900:35;14912:4;14918:2;14922:8;14932:2;14900:11;:35::i;:::-;14893:42;;14953:39;14965:4;14971:8;14982:1;14971:12;14985:2;14989;14953:11;:39::i;:::-;14946:46;-1:-1:-1;15003:19:0;;-1:-1:-1;15003:19:0;14769:263;14523:516;;;;14213:831;;;;;;;;:::o;8985:277::-;9058:6;9086:1;9081:2;:6;:16;;;;;9096:1;9091:2;:6;9081:16;9080:40;;;;9108:1;9103:2;:6;:16;;;;;9118:1;9113:2;:6;9103:16;9076:85;;;9152:1;9138:11;9142:2;9146;9138:3;:11::i;:::-;:15;;;;;;9131:22;;;;9076:85;9167:16;9206:1;9187:6;;;9196;;;9187:15;9186:21;;-1:-1:-1;9221:35:0;9225:19;9234:1;9229:2;:6;9242:1;9237:2;:6;9225:3;:19::i;:::-;9246:9;9221:3;:35::i;13241:798::-;13356:10;13392:1;13386:2;:7;;13378:16;;12:1:-1;9;2:12;13378:16:0;13414:2;13409:1;:7;;13401:16;;12:1:-1;9;2:12;13401:16:0;13436:2;13431;:7;13424:588;;;10677:1;13458:2;13453;:7;:35;13449:157;;;13501:13;13541:34;13556:4;13562:2;13566;13570:1;13573;13541:14;:34::i;:::-;-1:-1:-1;13525:50:0;-1:-1:-1;13586:10:0;;-1:-1:-1;13586:10:0;13449:157;13614:18;13635:23;13645:4;13651:2;13655;13635:9;:23::i;:::-;13614:44;;13676:10;13671:1;:15;13667:338;;13821:10;13816:15;;13667:338;;;13981:10;13994:1;13981:14;13976:19;;13667:338;13424:588;;;;14025:4;14030:2;14025:8;;;;;;;;;;;;;;14018:15;;13241:798;;;;;;:::o;10821:2258::-;10982:11;10995;11254;11277:2;11268;11273:1;11268:6;:11;11254:25;;11286:9;11298:4;11303:2;11308:1;11303:6;11298:12;;;;;;;;;;;;;;11286:24;;11317:9;11333:3;11329:1;:7;:32;;-1:-1:-1;;;;;11329:32:0;;;11339:4;11344:2;11349:1;11344:6;11339:12;;;;;;;;;;;;;;11329:32;11317:44;;11368:9;11384:3;11380:1;:7;:32;;-1:-1:-1;;;;;11380:32:0;;;11390:4;11395:2;11400:1;11395:6;11390:12;;;;;;;;;;;;;;11380:32;11368:44;;11419:9;11435:3;11431:1;:7;:32;;-1:-1:-1;;;;;11431:32:0;;;11441:4;11446:2;11451:1;11446:6;11441:12;;;;;;;;;;;;;;11431:32;11419:44;;11470:9;11486:3;11482:1;:7;:32;;-1:-1:-1;;;;;11482:32:0;;;11492:4;11497:2;11502:1;11497:6;11492:12;;;;;;;;;;;;;;11482:32;11470:44;;11521:9;11537:3;11533:1;:7;:32;;-1:-1:-1;;;;;11533:32:0;;;11543:4;11548:2;11553:1;11548:6;11543:12;;;;;;;;;;;;;;11533:32;11521:44;;11572:9;11588:3;11584:1;:7;:32;;-1:-1:-1;;;;;11584:32:0;;;11594:4;11599:2;11604:1;11599:6;11594:12;;;;;;;;;;;;;;11584:32;11572:44;;11634:2;11629;:7;11625:35;;;11651:2;;11655;11625:35;11675:2;11670;:7;11666:35;;;11692:2;;11696;11666:35;11716:2;11711;:7;11707:35;;;11733:2;;11737;11707:35;11757:2;11752;:7;11748:35;;;11774:2;;11778;11748:35;11798:2;11793;:7;11789:35;;;11815:2;;11819;11789:35;11839:2;11834;:7;11830:35;;;11856:2;11830:35;11880:2;11875;:7;11871:35;;;11897:2;;11901;11871:35;11921:2;11916;:7;11912:35;;;11938:2;11912:35;11962:2;11957;:7;11953:35;;;11979:2;;11983;11953:35;12003:2;11998;:7;11994:35;;;12020:2;;12024;11994:35;12044:2;12039;:7;12035:35;;;12061:2;12035:35;12085:2;12080;:7;12076:35;;;12102:2;;12106;12076:35;12126:2;12121;:7;12117:35;;;12143:2;12117:35;12167:2;12162;:7;12158:35;;;12184:2;;12188;12158:35;12208:2;12203;:7;12199:35;;;12225:2;;12229;12199:35;12249:2;12244;:7;12240:35;;;12266:2;;12270;12240:35;12300:7;;;12318:11;12314:309;;12339:2;12332:9;;12314:309;;;12358:6;12368:1;12358:11;12354:269;;;12379:2;12372:9;;12354:269;;;12398:6;12408:1;12398:11;12394:229;;;12419:2;12412:9;;12394:229;;;12438:6;12448:1;12438:11;12434:189;;;12459:2;12452:9;;12434:189;;;12478:6;12488:1;12478:11;12474:149;;;12499:2;12492:9;;12474:149;;;12518:6;12528:1;12518:11;12514:109;;;12539:2;12532:9;;12514:109;;;12558:6;12568:1;12558:11;12554:69;;;12579:2;12572:9;;12554:69;;;12595:26;;;-1:-1:-1;;;12595:26:0;;;;;;;;;;;;-1:-1:-1;;;12595:26:0;;;;;;;;;;;;;;12554:69;12648:7;;;12666:8;;;12662:412;;;-1:-1:-1;12685:4:0;;-1:-1:-1;12677:19:0;;-1:-1:-1;;;;;;;;;12677:19:0;12662:412;12713:11;12709:365;;-1:-1:-1;12741:2:0;;-1:-1:-1;12727:17:0;;-1:-1:-1;;;;;;;;12727:17:0;12709:365;12761:6;12771:1;12761:11;12757:317;;;-1:-1:-1;12789:2:0;;-1:-1:-1;12775:17:0;;-1:-1:-1;;;;;;;;12775:17:0;12757:317;12809:6;12819:1;12809:11;12805:269;;;-1:-1:-1;12837:2:0;;-1:-1:-1;12823:17:0;;-1:-1:-1;;;;;;;;12823:17:0;12805:269;12857:6;12867:1;12857:11;12853:221;;;-1:-1:-1;12885:2:0;;-1:-1:-1;12871:17:0;;-1:-1:-1;;;;;;;;12871:17:0;12853:221;12905:6;12915:1;12905:11;12901:173;;;-1:-1:-1;12933:2:0;;-1:-1:-1;12919:17:0;;-1:-1:-1;;;;;;;;12919:17:0;12901:173;12953:6;12963:1;12953:11;12949:125;;;-1:-1:-1;12981:2:0;;-1:-1:-1;12967:17:0;;-1:-1:-1;;;;;;;;12967:17:0;12949:125;13001:6;13011:1;13001:11;12997:77;;;-1:-1:-1;13029:2:0;;-1:-1:-1;13015:17:0;;-1:-1:-1;;;;;;;;13015:17:0;12997:77;13046:26;;;-1:-1:-1;;;13046:26:0;;;;;;;;;;;;-1:-1:-1;;;13046:26:0;;;;;;;;;;;;;;15376:1256;15478:7;;15650:4;15667:1;15656:7;;;15655:13;15650:19;;;;;;;;;;;;;;15635:34;;15682:1;15676:7;;;;15739:1;15733:7;;;;15747:880;15789:1;15783:7;;;;15819:5;15808:4;15813:2;15808:8;;;;;;;;;;;;;;:16;15769:57;;15834;15854:1;15848:7;;;;15884:5;15873:4;15878:2;15873:8;;;;;;;;;;;;;;:16;15834:57;;15908:2;15903;:7;15899:721;;;15947:4;15952:2;15947:8;;;;;;;;;;;;;;15957:4;15962:2;15957:8;;;;;;;;;;;;;;15924:4;15929:2;15924:8;;;;;;;;;;;;;15934:4;15939:2;15934:8;;;;;;;;;;;;;;;;;15923:43;;;;;15899:721;;;16608:2;16601:9;;;;;15899:721;15747:880;;8547:201;8603:6;8629:5;;;8650:6;;;;;;:16;;;8665:1;8660;:6;;8650:16;8649:38;;;;8676:1;8672;:5;:14;;;;;8685:1;8681;:5;8672:14;8641:84;;;;-1:-1:-1;;;8641:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59180:4893;;;;;;;;;;;;;;;-1:-1:-1;;;;;59180:4893:0;;;;;;-1:-1:-1;;;;;59180:4893:0;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;59180:4893:0;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;

Swarm Source

ipfs://fee95a6f210e458d4885d51dc069e62dac9ef4de46bcde85ea7ce9998f056088

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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