Contract 0x7b9e962dd8aed0db9a1d8a2d7a962ad8b871ce4f 1

 

Contract Overview

Mummy Finance: Reward Router
Balance:
0 FTM

FTM Value:
$0.00

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x566aeeeea730d3820238eb066ea2c9990ba99daba822e686b7055664a98fcbd8Unstake Gmx551292772023-02-05 10:35:221 min ago0x8cc1226540eb7da70bd230bb4bfaeebd3ff053cb IN  Mummy Finance: Reward Router0 FTM0.038954277733
0xe89634fd4bf07dc9ed2bf650b87d430507d007586a274cad0503ee849e7e405dStake Gmx551291882023-02-05 10:33:483 mins ago0x5583bbda575f142993c10a335daf29dc7510e8f2 IN  Mummy Finance: Reward Router0 FTM0.031843876245
0x48edc894179fe5dd46c28146b7130988517ea05a1221b108a9025da31c8ceeb2Stake Gmx551291392023-02-05 10:33:033 mins ago0x26384bac62582eca0062cef1028a1610ae500620 IN  Mummy Finance: Reward Router0 FTM0.031614740071
0x2aa87ff657cc61e84bbae57c19d54d2767cbac2b7e9f9f2040ba138ad5218c4eHandle Rewards551291282023-02-05 10:32:534 mins ago0x5583bbda575f142993c10a335daf29dc7510e8f2 IN  Mummy Finance: Reward Router0 FTM0.037251490571
0xffdffecd79fe6071671a64ea58a817b2b83fc72ba42dc587c26103e7c722577eHandle Rewards551290802023-02-05 10:31:555 mins ago0xb9543b7819483ba1fbff8294bdbac4984a2aab4c IN  Mummy Finance: Reward Router0 FTM0.056430502492
0x6f1774a6915310f7c0c9947a44ceb823e7b7764b857385f774b316b124bc5f19Handle Rewards551290502023-02-05 10:31:185 mins ago0x2223c48525716a100ec1324658fd7e6bf18f97d7 IN  Mummy Finance: Reward Router0 FTM0.056568215897
0x30e2285fa5b0b99215ae4a2d6df308f921f39acb72993866f8bf4c895accffefHandle Rewards551290442023-02-05 10:31:135 mins ago0xb3891f9743f200d9728e6c6aea8b4375ecc2f566 IN  Mummy Finance: Reward Router0 FTM0.051863545189
0xa6b73fdc46fda95063cb9e3d1f7224589d1f0e975ad930ad968ae4ee5eef5ebfHandle Rewards551289952023-02-05 10:30:236 mins ago0x73cbdf131364a3b8dc6110a6037aba1f868167ee IN  Mummy Finance: Reward Router0 FTM0.052017851555
0x38af1dc5a7003511ead5c0fcb11825399be8a513b746885e1bccb2bbfbc61a99Handle Rewards551289752023-02-05 10:30:036 mins ago0x26384bac62582eca0062cef1028a1610ae500620 IN  Mummy Finance: Reward Router0 FTM0.027632924086
0x9a10009f7f780eafd90e24bfbe3a02dc5c128360e2fdc56b1794edacc4cfb94bHandle Rewards551289612023-02-05 10:29:507 mins ago0x4abddbc37ddcd2d8a5736efa157274690c7bd923 IN  Mummy Finance: Reward Router0 FTM0.056432950972
0xfc9dd2f79d6917a10eb2b0aca642d136b5c35ea9b8c3d0e5c3d77449fe946ed4Handle Rewards551289492023-02-05 10:29:377 mins ago0x0e04cab2146752790f9d4a7d68806d0531f967ca IN  Mummy Finance: Reward Router0 FTM0.077369256
0x70081388a037c12c4f8f9cdf81400191c100dfef551102a2a7d88a5378f48351Unstake Gmx551288072023-02-05 10:27:219 mins ago0xb7077d09d5969037f716659d4e96c336bf0d8654 IN  Mummy Finance: Reward Router0 FTM0.044746593458
0x73744e874fa42d896905697e8dae6cb9c141d4f827c22ea29af1f6ab81fc0046Handle Rewards551287162023-02-05 10:25:5311 mins ago0xc967ad1761a29ae81fa6065577b6abe3357287b0 IN  Mummy Finance: Reward Router0 FTM0.060197680597
0x7619424aecc43d43c3692966ef5a0a7cf079179c066abc662b2c7a52ee85b042Mint And Stake G...551286892023-02-05 10:25:2611 mins ago0xc084508124a8b76e44a07418a92a868394153771 IN  Mummy Finance: Reward Router68,330 FTM0.118526053459
0x53272fc8125f67aa49773ff5a61a89efdda0b90c8494098a7bf970e8407be4feHandle Rewards551284642023-02-05 10:21:0315 mins ago0x08048f6d9db401d2716dcbb1979513231e5e3c81 IN  Mummy Finance: Reward Router0 FTM0.068114132473
0x8372f57ee1e80822597e9f536a641de4ee812aafaf9788e7acde980f898c58b5Handle Rewards551284432023-02-05 10:20:4116 mins ago0x79269c79e84ad6d9ed1b913e1fb30b26c8384629 IN  Mummy Finance: Reward Router0 FTM0.066123464346
0xd47fde6a363cc64561ba042314ae08ee0e223ff3d8693a87b21a315abdad277cHandle Rewards551282902023-02-05 10:17:3319 mins ago0xbd987fa25aaffbe68c048d7528aa115824090b62 IN  Mummy Finance: Reward Router0 FTM0.06521587114
0xe2ece56f192ee4a4be78e15405bad17f408197d31aee82cc93a825e65b303547Handle Rewards551282702023-02-05 10:17:0119 mins ago0x9e9bf7495369e73e76e0f41c00481b16a270711c IN  Mummy Finance: Reward Router0 FTM0.041773511306
0x77a9f2a420c48a74074e1d452be2affbe1297851b42560eb00414879dfc7178fStake Gmx551282222023-02-05 10:16:0020 mins ago0x3aa69f6360806ab5da9f9f77f6cc09f9092b255b IN  Mummy Finance: Reward Router0 FTM0.042764729506
0xde350539d442f8b88cf6b92dafbab55161113275d3ea605f9807c384c69a3bceStake Gmx551281982023-02-05 10:15:3521 mins ago0x9e9bf7495369e73e76e0f41c00481b16a270711c IN  Mummy Finance: Reward Router0 FTM0.037307476318
0xbd421c0ee835208ecf199254c46a150bb25fb05e59b09a3d5fe0ad3505652c77Handle Rewards551280932023-02-05 10:13:4323 mins ago0x4e24212d52acfa5e2b3dc7867dfd926adde82bba IN  Mummy Finance: Reward Router0 FTM0.06275977065
0x3c4c968f03da972d46b8bca3d55fb537fa80711fb45025b15b18530e8b730116Unstake And Rede...551280782023-02-05 10:13:2223 mins ago0x9e9bf7495369e73e76e0f41c00481b16a270711c IN  Mummy Finance: Reward Router0 FTM0.074816551376
0xb2dab9b161c5c5fb70a336ee567719515fb486790fed64419095a9e9e0868607Unstake Gmx551279982023-02-05 10:11:5425 mins ago0x3aa69f6360806ab5da9f9f77f6cc09f9092b255b IN  Mummy Finance: Reward Router0 FTM0.053670258064
0x988fb7e27da40e40aab560f04fca58fdc4a74a87adb7865a67c8cab30828eed5Handle Rewards551278622023-02-05 10:09:2127 mins ago0x86acfb84c20cfe8b2b519109f7719cec3651016b IN  Mummy Finance: Reward Router0 FTM0.041045214212
0xe3c98280fac4f53dae6880cd6e85a46e1269e1bf2f4329fa66ba2817c841ccdaHandle Rewards551277762023-02-05 10:07:4529 mins ago0xee88dfc5883e81ef199284da4912514642e3c417 IN  Mummy Finance: Reward Router0 FTM0.047024213619
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x2aa87ff657cc61e84bbae57c19d54d2767cbac2b7e9f9f2040ba138ad5218c4e551291282023-02-05 10:32:534 mins ago Mummy Finance: Reward Router0x5583bbda575f142993c10a335daf29dc7510e8f263.027487419730078543 FTM
0x2aa87ff657cc61e84bbae57c19d54d2767cbac2b7e9f9f2040ba138ad5218c4e551291282023-02-05 10:32:534 mins ago Fantom Finance: Wrapped Fantom Token Mummy Finance: Reward Router63.027487419730078543 FTM
0xffdffecd79fe6071671a64ea58a817b2b83fc72ba42dc587c26103e7c722577e551290802023-02-05 10:31:555 mins ago Mummy Finance: Reward Router0xb9543b7819483ba1fbff8294bdbac4984a2aab4c0.333052587190021187 FTM
0xffdffecd79fe6071671a64ea58a817b2b83fc72ba42dc587c26103e7c722577e551290802023-02-05 10:31:555 mins ago Fantom Finance: Wrapped Fantom Token Mummy Finance: Reward Router0.333052587190021187 FTM
0x6f1774a6915310f7c0c9947a44ceb823e7b7764b857385f774b316b124bc5f19551290502023-02-05 10:31:185 mins ago Mummy Finance: Reward Router0x2223c48525716a100ec1324658fd7e6bf18f97d78.309350397085916403 FTM
0x6f1774a6915310f7c0c9947a44ceb823e7b7764b857385f774b316b124bc5f19551290502023-02-05 10:31:185 mins ago Fantom Finance: Wrapped Fantom Token Mummy Finance: Reward Router8.309350397085916403 FTM
0x30e2285fa5b0b99215ae4a2d6df308f921f39acb72993866f8bf4c895accffef551290442023-02-05 10:31:135 mins ago Mummy Finance: Reward Router0xb3891f9743f200d9728e6c6aea8b4375ecc2f5663.675465480297686733 FTM
0x30e2285fa5b0b99215ae4a2d6df308f921f39acb72993866f8bf4c895accffef551290442023-02-05 10:31:135 mins ago Fantom Finance: Wrapped Fantom Token Mummy Finance: Reward Router3.675465480297686733 FTM
0xa6b73fdc46fda95063cb9e3d1f7224589d1f0e975ad930ad968ae4ee5eef5ebf551289952023-02-05 10:30:236 mins ago Mummy Finance: Reward Router0x73cbdf131364a3b8dc6110a6037aba1f868167ee0.621096554873054076 FTM
0xa6b73fdc46fda95063cb9e3d1f7224589d1f0e975ad930ad968ae4ee5eef5ebf551289952023-02-05 10:30:236 mins ago Fantom Finance: Wrapped Fantom Token Mummy Finance: Reward Router0.621096554873054076 FTM
0x38af1dc5a7003511ead5c0fcb11825399be8a513b746885e1bccb2bbfbc61a99551289752023-02-05 10:30:036 mins ago Mummy Finance: Reward Router0x26384bac62582eca0062cef1028a1610ae5006206.187216397208825635 FTM
0x38af1dc5a7003511ead5c0fcb11825399be8a513b746885e1bccb2bbfbc61a99551289752023-02-05 10:30:036 mins ago Fantom Finance: Wrapped Fantom Token Mummy Finance: Reward Router6.187216397208825635 FTM
0x9a10009f7f780eafd90e24bfbe3a02dc5c128360e2fdc56b1794edacc4cfb94b551289612023-02-05 10:29:507 mins ago Mummy Finance: Reward Router0x4abddbc37ddcd2d8a5736efa157274690c7bd9231.679774158318720198 FTM
0x9a10009f7f780eafd90e24bfbe3a02dc5c128360e2fdc56b1794edacc4cfb94b551289612023-02-05 10:29:507 mins ago Fantom Finance: Wrapped Fantom Token Mummy Finance: Reward Router1.679774158318720198 FTM
0xfc9dd2f79d6917a10eb2b0aca642d136b5c35ea9b8c3d0e5c3d77449fe946ed4551289492023-02-05 10:29:377 mins ago Mummy Finance: Reward Router0x0e04cab2146752790f9d4a7d68806d0531f967ca13.463710537777432485 FTM
0xfc9dd2f79d6917a10eb2b0aca642d136b5c35ea9b8c3d0e5c3d77449fe946ed4551289492023-02-05 10:29:377 mins ago Fantom Finance: Wrapped Fantom Token Mummy Finance: Reward Router13.463710537777432485 FTM
0x73744e874fa42d896905697e8dae6cb9c141d4f827c22ea29af1f6ab81fc0046551287162023-02-05 10:25:5311 mins ago Mummy Finance: Reward Router0xc967ad1761a29ae81fa6065577b6abe3357287b00.981216978150904998 FTM
0x73744e874fa42d896905697e8dae6cb9c141d4f827c22ea29af1f6ab81fc0046551287162023-02-05 10:25:5311 mins ago Fantom Finance: Wrapped Fantom Token Mummy Finance: Reward Router0.981216978150904998 FTM
0x7619424aecc43d43c3692966ef5a0a7cf079179c066abc662b2c7a52ee85b042551286892023-02-05 10:25:2611 mins ago Mummy Finance: Reward Router Fantom Finance: Wrapped Fantom Token68,330 FTM
0x53272fc8125f67aa49773ff5a61a89efdda0b90c8494098a7bf970e8407be4fe551284642023-02-05 10:21:0315 mins ago Mummy Finance: Reward Router0x08048f6d9db401d2716dcbb1979513231e5e3c811,022.929961699472483612 FTM
0x53272fc8125f67aa49773ff5a61a89efdda0b90c8494098a7bf970e8407be4fe551284642023-02-05 10:21:0315 mins ago Fantom Finance: Wrapped Fantom Token Mummy Finance: Reward Router1,022.929961699472483612 FTM
0x8372f57ee1e80822597e9f536a641de4ee812aafaf9788e7acde980f898c58b5551284432023-02-05 10:20:4116 mins ago Mummy Finance: Reward Router0x79269c79e84ad6d9ed1b913e1fb30b26c83846297.27585571118131663 FTM
0x8372f57ee1e80822597e9f536a641de4ee812aafaf9788e7acde980f898c58b5551284432023-02-05 10:20:4116 mins ago Fantom Finance: Wrapped Fantom Token Mummy Finance: Reward Router7.27585571118131663 FTM
0xe2ece56f192ee4a4be78e15405bad17f408197d31aee82cc93a825e65b303547551282702023-02-05 10:17:0119 mins ago Mummy Finance: Reward Router0x9e9bf7495369e73e76e0f41c00481b16a270711c0.978506371895766372 FTM
0xe2ece56f192ee4a4be78e15405bad17f408197d31aee82cc93a825e65b303547551282702023-02-05 10:17:0119 mins ago Fantom Finance: Wrapped Fantom Token Mummy Finance: Reward Router0.978506371895766372 FTM
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
RewardRouterV2

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 8 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at FtmScan.com on 2022-12-02
*/

pragma solidity 0.6.12;



/**
 * @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) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        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-contracts/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) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        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) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}


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

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

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

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

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

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

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

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


/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.3._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.3._
     */
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}


/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor () internal {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}


interface IRewardTracker {
    function depositBalances(address _account, address _depositToken) external view returns (uint256);
    function stakedAmounts(address _account) external view returns (uint256);
    function updateRewards() external;
    function stake(address _depositToken, uint256 _amount) external;
    function stakeForAccount(address _fundingAccount, address _account, address _depositToken, uint256 _amount) external;
    function unstake(address _depositToken, uint256 _amount) external;
    function unstakeForAccount(address _account, address _depositToken, uint256 _amount, address _receiver) external;
    function tokensPerInterval() external view returns (uint256);
    function claim(address _receiver) external returns (uint256);
    function claimForAccount(address _account, address _receiver) external returns (uint256);
    function claimable(address _account) external view returns (uint256);
    function averageStakedAmounts(address _account) external view returns (uint256);
    function cumulativeRewards(address _account) external view returns (uint256);
}


interface IRewardRouterV2 {
    function feeGlpTracker() external view returns (address);
    function stakedGlpTracker() external view returns (address);
}


interface IVester {
    function rewardTracker() external view returns (address);

    function claimForAccount(address _account, address _receiver) external returns (uint256);

    function claimable(address _account) external view returns (uint256);
    function cumulativeClaimAmounts(address _account) external view returns (uint256);
    function claimedAmounts(address _account) external view returns (uint256);
    function pairAmounts(address _account) external view returns (uint256);
    function getVestedAmount(address _account) external view returns (uint256);
    function transferredAverageStakedAmounts(address _account) external view returns (uint256);
    function transferredCumulativeRewards(address _account) external view returns (uint256);
    function cumulativeRewardDeductions(address _account) external view returns (uint256);
    function bonusRewards(address _account) external view returns (uint256);

    function transferStakeValues(address _sender, address _receiver) external;
    function setTransferredAverageStakedAmounts(address _account, uint256 _amount) external;
    function setTransferredCumulativeRewards(address _account, uint256 _amount) external;
    function setCumulativeRewardDeductions(address _account, uint256 _amount) external;
    function setBonusRewards(address _account, uint256 _amount) external;

    function getMaxVestableAmount(address _account) external view returns (uint256);
    function getCombinedAverageStakedAmount(address _account) external view returns (uint256);
}


interface IMintable {
    function isMinter(address _account) external returns (bool);
    function setMinter(address _minter, bool _isActive) external;
    function mint(address _account, uint256 _amount) external;
    function burn(address _account, uint256 _amount) external;
}

//SPDX-License-Identifier: MIT
interface IWETH {
    function deposit() external payable;
    function transfer(address to, uint value) external returns (bool);
    function withdraw(uint) external;
}


interface IVaultUtils {
    function updateCumulativeFundingRate(address _collateralToken, address _indexToken) external returns (bool);
    function validateIncreasePosition(address _account, address _collateralToken, address _indexToken, uint256 _sizeDelta, bool _isLong) external view;
    function validateDecreasePosition(address _account, address _collateralToken, address _indexToken, uint256 _collateralDelta, uint256 _sizeDelta, bool _isLong, address _receiver) external view;
    function validateLiquidation(address _account, address _collateralToken, address _indexToken, bool _isLong, bool _raise) external view returns (uint256, uint256);
    function getEntryFundingRate(address _collateralToken, address _indexToken, bool _isLong) external view returns (uint256);
    function getPositionFee(address _account, address _collateralToken, address _indexToken, bool _isLong, uint256 _sizeDelta) external view returns (uint256);
    function getFundingFee(address _account, address _collateralToken, address _indexToken, bool _isLong, uint256 _size, uint256 _entryFundingRate) external view returns (uint256);
    function getBuyUsdgFeeBasisPoints(address _token, uint256 _usdgAmount) external view returns (uint256);
    function getSellUsdgFeeBasisPoints(address _token, uint256 _usdgAmount) external view returns (uint256);
    function getSwapFeeBasisPoints(address _tokenIn, address _tokenOut, uint256 _usdgAmount) external view returns (uint256);
    function getFeeBasisPoints(address _token, uint256 _usdgDelta, uint256 _feeBasisPoints, uint256 _taxBasisPoints, bool _increment) external view returns (uint256);
}


interface IVault {
    function isInitialized() external view returns (bool);
    function isSwapEnabled() external view returns (bool);
    function isLeverageEnabled() external view returns (bool);

    function setVaultUtils(IVaultUtils _vaultUtils) external;
    function setError(uint256 _errorCode, string calldata _error) external;

    function router() external view returns (address);
    function usdg() external view returns (address);
    function gov() external view returns (address);

    function whitelistedTokenCount() external view returns (uint256);
    function maxLeverage() external view returns (uint256);

    function minProfitTime() external view returns (uint256);
    function hasDynamicFees() external view returns (bool);
    function fundingInterval() external view returns (uint256);
    function totalTokenWeights() external view returns (uint256);
    function getTargetUsdgAmount(address _token) external view returns (uint256);

    function inManagerMode() external view returns (bool);
    function inPrivateLiquidationMode() external view returns (bool);

    function maxGasPrice() external view returns (uint256);

    function approvedRouters(address _account, address _router) external view returns (bool);
    function isLiquidator(address _account) external view returns (bool);
    function isManager(address _account) external view returns (bool);

    function minProfitBasisPoints(address _token) external view returns (uint256);
    function tokenBalances(address _token) external view returns (uint256);
    function lastFundingTimes(address _token) external view returns (uint256);

    function setMaxLeverage(uint256 _maxLeverage) external;
    function setInManagerMode(bool _inManagerMode) external;
    function setManager(address _manager, bool _isManager) external;
    function setIsSwapEnabled(bool _isSwapEnabled) external;
    function setIsLeverageEnabled(bool _isLeverageEnabled) external;
    function setMaxGasPrice(uint256 _maxGasPrice) external;
    function setUsdgAmount(address _token, uint256 _amount) external;
    function setBufferAmount(address _token, uint256 _amount) external;
    function setMaxGlobalShortSize(address _token, uint256 _amount) external;
    function setInPrivateLiquidationMode(bool _inPrivateLiquidationMode) external;
    function setLiquidator(address _liquidator, bool _isActive) external;

    function setFundingRate(uint256 _fundingInterval, uint256 _fundingRateFactor, uint256 _stableFundingRateFactor) external;

    function setFees(
        uint256 _taxBasisPoints,
        uint256 _stableTaxBasisPoints,
        uint256 _mintBurnFeeBasisPoints,
        uint256 _swapFeeBasisPoints,
        uint256 _stableSwapFeeBasisPoints,
        uint256 _marginFeeBasisPoints,
        uint256 _liquidationFeeUsd,
        uint256 _minProfitTime,
        bool _hasDynamicFees
    ) external;

    function setTokenConfig(
        address _token,
        uint256 _tokenDecimals,
        uint256 _redemptionBps,
        uint256 _minProfitBps,
        uint256 _maxUsdgAmount,
        bool _isStable,
        bool _isShortable
    ) external;

    function setPriceFeed(address _priceFeed) external;
    function withdrawFees(address _token, address _receiver) external returns (uint256);

    function directPoolDeposit(address _token) external;
    function buyUSDG(address _token, address _receiver) external returns (uint256);
    function sellUSDG(address _token, address _receiver) external returns (uint256);
    function swap(address _tokenIn, address _tokenOut, address _receiver) external returns (uint256);
    function increasePosition(address _account, address _collateralToken, address _indexToken, uint256 _sizeDelta, bool _isLong) external;
    function decreasePosition(address _account, address _collateralToken, address _indexToken, uint256 _collateralDelta, uint256 _sizeDelta, bool _isLong, address _receiver) external returns (uint256);
    function validateLiquidation(address _account, address _collateralToken, address _indexToken, bool _isLong, bool _raise) external view returns (uint256, uint256);
    function liquidatePosition(address _account, address _collateralToken, address _indexToken, bool _isLong, address _feeReceiver) external;
    function tokenToUsdMin(address _token, uint256 _tokenAmount) external view returns (uint256);

    function priceFeed() external view returns (address);
    function fundingRateFactor() external view returns (uint256);
    function stableFundingRateFactor() external view returns (uint256);
    function cumulativeFundingRates(address _token) external view returns (uint256);
    function getNextFundingRate(address _token) external view returns (uint256);
    function getFeeBasisPoints(address _token, uint256 _usdgDelta, uint256 _feeBasisPoints, uint256 _taxBasisPoints, bool _increment) external view returns (uint256);

    function liquidationFeeUsd() external view returns (uint256);
    function taxBasisPoints() external view returns (uint256);
    function stableTaxBasisPoints() external view returns (uint256);
    function mintBurnFeeBasisPoints() external view returns (uint256);
    function swapFeeBasisPoints() external view returns (uint256);
    function stableSwapFeeBasisPoints() external view returns (uint256);
    function marginFeeBasisPoints() external view returns (uint256);

    function allWhitelistedTokensLength() external view returns (uint256);
    function allWhitelistedTokens(uint256) external view returns (address);
    function whitelistedTokens(address _token) external view returns (bool);
    function stableTokens(address _token) external view returns (bool);
    function shortableTokens(address _token) external view returns (bool);
    function feeReserves(address _token) external view returns (uint256);
    function globalShortSizes(address _token) external view returns (uint256);
    function globalShortAveragePrices(address _token) external view returns (uint256);
    function maxGlobalShortSizes(address _token) external view returns (uint256);
    function tokenDecimals(address _token) external view returns (uint256);
    function tokenWeights(address _token) external view returns (uint256);
    function guaranteedUsd(address _token) external view returns (uint256);
    function poolAmounts(address _token) external view returns (uint256);
    function bufferAmounts(address _token) external view returns (uint256);
    function reservedAmounts(address _token) external view returns (uint256);
    function usdgAmounts(address _token) external view returns (uint256);
    function maxUsdgAmounts(address _token) external view returns (uint256);
    function getRedemptionAmount(address _token, uint256 _usdgAmount) external view returns (uint256);
    function getMaxPrice(address _token) external view returns (uint256);
    function getMinPrice(address _token) external view returns (uint256);

    function getDelta(address _indexToken, uint256 _size, uint256 _averagePrice, bool _isLong, uint256 _lastIncreasedTime) external view returns (bool, uint256);
    function getPosition(address _account, address _collateralToken, address _indexToken, bool _isLong) external view returns (uint256, uint256, uint256, uint256, uint256, uint256, bool, uint256);
}


interface IGlpManager {
    function glp() external view returns (address);
    function usdg() external view returns (address);
    function vault() external view returns (IVault);
    function cooldownDuration() external returns (uint256);
    function getAumInUsdg(bool maximise) external view returns (uint256);
    function lastAddedAt(address _account) external returns (uint256);
    function addLiquidity(address _token, uint256 _amount, uint256 _minUsdg, uint256 _minGlp) external returns (uint256);
    function addLiquidityForAccount(address _fundingAccount, address _account, address _token, uint256 _amount, uint256 _minUsdg, uint256 _minGlp) external returns (uint256);
    function removeLiquidity(address _tokenOut, uint256 _glpAmount, uint256 _minOut, address _receiver) external returns (uint256);
    function removeLiquidityForAccount(address _account, address _tokenOut, uint256 _glpAmount, uint256 _minOut, address _receiver) external returns (uint256);
    function setShortsTrackerAveragePriceWeight(uint256 _shortsTrackerAveragePriceWeight) external;
    function setCooldownDuration(uint256 _cooldownDuration) external;
}


contract Governable {
    address public gov;

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

    modifier onlyGov() {
        require(msg.sender == gov, "Governable: forbidden");
        _;
    }

    function setGov(address _gov) external onlyGov {
        gov = _gov;
    }
}


contract RewardRouterV2 is IRewardRouterV2, ReentrancyGuard, Governable {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;
    using Address for address payable;

    bool public isInitialized;

    address public weth;

    address public gmx;
    address public esGmx;
    address public bnGmx;

    address public glp; // GMX Liquidity Provider token

    address public stakedGmxTracker;
    address public bonusGmxTracker;
    address public feeGmxTracker;

    address public override stakedGlpTracker;
    address public override feeGlpTracker;

    address public glpManager;

    address public gmxVester;
    address public glpVester;

    mapping (address => address) public pendingReceivers;

    event StakeGmx(address account, address token, uint256 amount);
    event UnstakeGmx(address account, address token, uint256 amount);

    event StakeGlp(address account, uint256 amount);
    event UnstakeGlp(address account, uint256 amount);

    receive() external payable {
        require(msg.sender == weth, "Router: invalid sender");
    }

    function initialize(
        address _weth,
        address _gmx,
        address _esGmx,
        address _bnGmx,
        address _glp,
        address _stakedGmxTracker,
        address _bonusGmxTracker,
        address _feeGmxTracker,
        address _feeGlpTracker,
        address _stakedGlpTracker,
        address _glpManager,
        address _gmxVester,
        address _glpVester
    ) external onlyGov {
        require(!isInitialized, "RewardRouter: already initialized");
        isInitialized = true;

        weth = _weth;

        gmx = _gmx;
        esGmx = _esGmx;
        bnGmx = _bnGmx;

        glp = _glp;

        stakedGmxTracker = _stakedGmxTracker;
        bonusGmxTracker = _bonusGmxTracker;
        feeGmxTracker = _feeGmxTracker;

        feeGlpTracker = _feeGlpTracker;
        stakedGlpTracker = _stakedGlpTracker;

        glpManager = _glpManager;

        gmxVester = _gmxVester;
        glpVester = _glpVester;
    }

    // to help users who accidentally send their tokens to this contract
    function withdrawToken(address _token, address _account, uint256 _amount) external onlyGov {
        IERC20(_token).safeTransfer(_account, _amount);
    }

    function batchStakeGmxForAccount(address[] memory _accounts, uint256[] memory _amounts) external nonReentrant onlyGov {
        address _gmx = gmx;
        for (uint256 i = 0; i < _accounts.length; i++) {
            _stakeGmx(msg.sender, _accounts[i], _gmx, _amounts[i]);
        }
    }

    function stakeGmxForAccount(address _account, uint256 _amount) external nonReentrant onlyGov {
        _stakeGmx(msg.sender, _account, gmx, _amount);
    }

    function stakeGmx(uint256 _amount) external nonReentrant {
        _stakeGmx(msg.sender, msg.sender, gmx, _amount);
    }

    function stakeEsGmx(uint256 _amount) external nonReentrant {
        _stakeGmx(msg.sender, msg.sender, esGmx, _amount);
    }

    function unstakeGmx(uint256 _amount) external nonReentrant {
        _unstakeGmx(msg.sender, gmx, _amount, true);
    }

    function unstakeEsGmx(uint256 _amount) external nonReentrant {
        _unstakeGmx(msg.sender, esGmx, _amount, true);
    }

    function mintAndStakeGlp(address _token, uint256 _amount, uint256 _minUsdg, uint256 _minGlp) external nonReentrant returns (uint256) {
        require(_amount > 0, "RewardRouter: invalid _amount");

        address account = msg.sender;
        uint256 glpAmount = IGlpManager(glpManager).addLiquidityForAccount(account, account, _token, _amount, _minUsdg, _minGlp);
        IRewardTracker(feeGlpTracker).stakeForAccount(account, account, glp, glpAmount);
        IRewardTracker(stakedGlpTracker).stakeForAccount(account, account, feeGlpTracker, glpAmount);

        emit StakeGlp(account, glpAmount);

        return glpAmount;
    }

    function mintAndStakeGlpETH(uint256 _minUsdg, uint256 _minGlp) external payable nonReentrant returns (uint256) {
        require(msg.value > 0, "RewardRouter: invalid msg.value");

        IWETH(weth).deposit{value: msg.value}();
        IERC20(weth).approve(glpManager, msg.value);

        address account = msg.sender;
        uint256 glpAmount = IGlpManager(glpManager).addLiquidityForAccount(address(this), account, weth, msg.value, _minUsdg, _minGlp);

        IRewardTracker(feeGlpTracker).stakeForAccount(account, account, glp, glpAmount);
        IRewardTracker(stakedGlpTracker).stakeForAccount(account, account, feeGlpTracker, glpAmount);

        emit StakeGlp(account, glpAmount);

        return glpAmount;
    }

    function unstakeAndRedeemGlp(address _tokenOut, uint256 _glpAmount, uint256 _minOut, address _receiver) external nonReentrant returns (uint256) {
        require(_glpAmount > 0, "RewardRouter: invalid _glpAmount");

        address account = msg.sender;
        IRewardTracker(stakedGlpTracker).unstakeForAccount(account, feeGlpTracker, _glpAmount, account);
        IRewardTracker(feeGlpTracker).unstakeForAccount(account, glp, _glpAmount, account);
        uint256 amountOut = IGlpManager(glpManager).removeLiquidityForAccount(account, _tokenOut, _glpAmount, _minOut, _receiver);

        emit UnstakeGlp(account, _glpAmount);

        return amountOut;
    }

    function unstakeAndRedeemGlpETH(uint256 _glpAmount, uint256 _minOut, address payable _receiver) external nonReentrant returns (uint256) {
        require(_glpAmount > 0, "RewardRouter: invalid _glpAmount");

        address account = msg.sender;
        IRewardTracker(stakedGlpTracker).unstakeForAccount(account, feeGlpTracker, _glpAmount, account);
        IRewardTracker(feeGlpTracker).unstakeForAccount(account, glp, _glpAmount, account);
        uint256 amountOut = IGlpManager(glpManager).removeLiquidityForAccount(account, weth, _glpAmount, _minOut, address(this));

        IWETH(weth).withdraw(amountOut);

        _receiver.sendValue(amountOut);

        emit UnstakeGlp(account, _glpAmount);

        return amountOut;
    }

    function claim() external nonReentrant {
        address account = msg.sender;

        IRewardTracker(feeGmxTracker).claimForAccount(account, account);
        IRewardTracker(feeGlpTracker).claimForAccount(account, account);

        IRewardTracker(stakedGmxTracker).claimForAccount(account, account);
        IRewardTracker(stakedGlpTracker).claimForAccount(account, account);
    }

    function claimEsGmx() external nonReentrant {
        address account = msg.sender;

        IRewardTracker(stakedGmxTracker).claimForAccount(account, account);
        IRewardTracker(stakedGlpTracker).claimForAccount(account, account);
    }

    function claimFees() external nonReentrant {
        address account = msg.sender;

        IRewardTracker(feeGmxTracker).claimForAccount(account, account);
        IRewardTracker(feeGlpTracker).claimForAccount(account, account);
    }

    function compound() external nonReentrant {
        _compound(msg.sender);
    }

    function compoundForAccount(address _account) external nonReentrant onlyGov {
        _compound(_account);
    }

    function handleRewards(
        bool _shouldClaimGmx,
        bool _shouldStakeGmx,
        bool _shouldClaimEsGmx,
        bool _shouldStakeEsGmx,
        bool _shouldStakeMultiplierPoints,
        bool _shouldClaimWeth,
        bool _shouldConvertWethToEth
    ) external nonReentrant {
        address account = msg.sender;

        uint256 gmxAmount = 0;
        if (_shouldClaimGmx) {
            uint256 gmxAmount0 = IVester(gmxVester).claimForAccount(account, account);
            uint256 gmxAmount1 = IVester(glpVester).claimForAccount(account, account);
            gmxAmount = gmxAmount0.add(gmxAmount1);
        }

        if (_shouldStakeGmx && gmxAmount > 0) {
            _stakeGmx(account, account, gmx, gmxAmount);
        }

        uint256 esGmxAmount = 0;
        if (_shouldClaimEsGmx) {
            uint256 esGmxAmount0 = IRewardTracker(stakedGmxTracker).claimForAccount(account, account);
            uint256 esGmxAmount1 = IRewardTracker(stakedGlpTracker).claimForAccount(account, account);
            esGmxAmount = esGmxAmount0.add(esGmxAmount1);
        }

        if (_shouldStakeEsGmx && esGmxAmount > 0) {
            _stakeGmx(account, account, esGmx, esGmxAmount);
        }

        if (_shouldStakeMultiplierPoints) {
            uint256 bnGmxAmount = IRewardTracker(bonusGmxTracker).claimForAccount(account, account);
            if (bnGmxAmount > 0) {
                IRewardTracker(feeGmxTracker).stakeForAccount(account, account, bnGmx, bnGmxAmount);
            }
        }

        if (_shouldClaimWeth) {
            if (_shouldConvertWethToEth) {
                uint256 weth0 = IRewardTracker(feeGmxTracker).claimForAccount(account, address(this));
                uint256 weth1 = IRewardTracker(feeGlpTracker).claimForAccount(account, address(this));

                uint256 wethAmount = weth0.add(weth1);
                IWETH(weth).withdraw(wethAmount);

                payable(account).sendValue(wethAmount);
            } else {
                IRewardTracker(feeGmxTracker).claimForAccount(account, account);
                IRewardTracker(feeGlpTracker).claimForAccount(account, account);
            }
        }
    }

    function batchCompoundForAccounts(address[] memory _accounts) external nonReentrant onlyGov {
        for (uint256 i = 0; i < _accounts.length; i++) {
            _compound(_accounts[i]);
        }
    }

    function signalTransfer(address _receiver) external nonReentrant {
        require(IERC20(gmxVester).balanceOf(msg.sender) == 0, "RewardRouter: sender has vested tokens");
        require(IERC20(glpVester).balanceOf(msg.sender) == 0, "RewardRouter: sender has vested tokens");

        _validateReceiver(_receiver);
        pendingReceivers[msg.sender] = _receiver;
    }

    function acceptTransfer(address _sender) external nonReentrant {
        require(IERC20(gmxVester).balanceOf(_sender) == 0, "RewardRouter: sender has vested tokens");
        require(IERC20(glpVester).balanceOf(_sender) == 0, "RewardRouter: sender has vested tokens");

        address receiver = msg.sender;
        require(pendingReceivers[_sender] == receiver, "RewardRouter: transfer not signalled");
        delete pendingReceivers[_sender];

        _validateReceiver(receiver);
        _compound(_sender);

        uint256 stakedGmx = IRewardTracker(stakedGmxTracker).depositBalances(_sender, gmx);
        if (stakedGmx > 0) {
            _unstakeGmx(_sender, gmx, stakedGmx, false);
            _stakeGmx(_sender, receiver, gmx, stakedGmx);
        }

        uint256 stakedEsGmx = IRewardTracker(stakedGmxTracker).depositBalances(_sender, esGmx);
        if (stakedEsGmx > 0) {
            _unstakeGmx(_sender, esGmx, stakedEsGmx, false);
            _stakeGmx(_sender, receiver, esGmx, stakedEsGmx);
        }

        uint256 stakedBnGmx = IRewardTracker(feeGmxTracker).depositBalances(_sender, bnGmx);
        if (stakedBnGmx > 0) {
            IRewardTracker(feeGmxTracker).unstakeForAccount(_sender, bnGmx, stakedBnGmx, _sender);
            IRewardTracker(feeGmxTracker).stakeForAccount(_sender, receiver, bnGmx, stakedBnGmx);
        }

        uint256 esGmxBalance = IERC20(esGmx).balanceOf(_sender);
        if (esGmxBalance > 0) {
            IERC20(esGmx).transferFrom(_sender, receiver, esGmxBalance);
        }

        uint256 glpAmount = IRewardTracker(feeGlpTracker).depositBalances(_sender, glp);
        if (glpAmount > 0) {
            IRewardTracker(stakedGlpTracker).unstakeForAccount(_sender, feeGlpTracker, glpAmount, _sender);
            IRewardTracker(feeGlpTracker).unstakeForAccount(_sender, glp, glpAmount, _sender);

            IRewardTracker(feeGlpTracker).stakeForAccount(_sender, receiver, glp, glpAmount);
            IRewardTracker(stakedGlpTracker).stakeForAccount(receiver, receiver, feeGlpTracker, glpAmount);
        }

        IVester(gmxVester).transferStakeValues(_sender, receiver);
        IVester(glpVester).transferStakeValues(_sender, receiver);
    }

    function _validateReceiver(address _receiver) private view {
        require(IRewardTracker(stakedGmxTracker).averageStakedAmounts(_receiver) == 0, "RewardRouter: stakedGmxTracker.averageStakedAmounts > 0");
        require(IRewardTracker(stakedGmxTracker).cumulativeRewards(_receiver) == 0, "RewardRouter: stakedGmxTracker.cumulativeRewards > 0");

        require(IRewardTracker(bonusGmxTracker).averageStakedAmounts(_receiver) == 0, "RewardRouter: bonusGmxTracker.averageStakedAmounts > 0");
        require(IRewardTracker(bonusGmxTracker).cumulativeRewards(_receiver) == 0, "RewardRouter: bonusGmxTracker.cumulativeRewards > 0");

        require(IRewardTracker(feeGmxTracker).averageStakedAmounts(_receiver) == 0, "RewardRouter: feeGmxTracker.averageStakedAmounts > 0");
        require(IRewardTracker(feeGmxTracker).cumulativeRewards(_receiver) == 0, "RewardRouter: feeGmxTracker.cumulativeRewards > 0");

        require(IVester(gmxVester).transferredAverageStakedAmounts(_receiver) == 0, "RewardRouter: gmxVester.transferredAverageStakedAmounts > 0");
        require(IVester(gmxVester).transferredCumulativeRewards(_receiver) == 0, "RewardRouter: gmxVester.transferredCumulativeRewards > 0");

        require(IRewardTracker(stakedGlpTracker).averageStakedAmounts(_receiver) == 0, "RewardRouter: stakedGlpTracker.averageStakedAmounts > 0");
        require(IRewardTracker(stakedGlpTracker).cumulativeRewards(_receiver) == 0, "RewardRouter: stakedGlpTracker.cumulativeRewards > 0");

        require(IRewardTracker(feeGlpTracker).averageStakedAmounts(_receiver) == 0, "RewardRouter: feeGlpTracker.averageStakedAmounts > 0");
        require(IRewardTracker(feeGlpTracker).cumulativeRewards(_receiver) == 0, "RewardRouter: feeGlpTracker.cumulativeRewards > 0");

        require(IVester(glpVester).transferredAverageStakedAmounts(_receiver) == 0, "RewardRouter: gmxVester.transferredAverageStakedAmounts > 0");
        require(IVester(glpVester).transferredCumulativeRewards(_receiver) == 0, "RewardRouter: gmxVester.transferredCumulativeRewards > 0");

        require(IERC20(gmxVester).balanceOf(_receiver) == 0, "RewardRouter: gmxVester.balance > 0");
        require(IERC20(glpVester).balanceOf(_receiver) == 0, "RewardRouter: glpVester.balance > 0");
    }

    function _compound(address _account) private {
        _compoundGmx(_account);
        _compoundGlp(_account);
    }

    function _compoundGmx(address _account) private {
        uint256 esGmxAmount = IRewardTracker(stakedGmxTracker).claimForAccount(_account, _account);
        if (esGmxAmount > 0) {
            _stakeGmx(_account, _account, esGmx, esGmxAmount);
        }

        uint256 bnGmxAmount = IRewardTracker(bonusGmxTracker).claimForAccount(_account, _account);
        if (bnGmxAmount > 0) {
            IRewardTracker(feeGmxTracker).stakeForAccount(_account, _account, bnGmx, bnGmxAmount);
        }
    }

    function _compoundGlp(address _account) private {
        uint256 esGmxAmount = IRewardTracker(stakedGlpTracker).claimForAccount(_account, _account);
        if (esGmxAmount > 0) {
            _stakeGmx(_account, _account, esGmx, esGmxAmount);
        }
    }

    function _stakeGmx(address _fundingAccount, address _account, address _token, uint256 _amount) private {
        require(_amount > 0, "RewardRouter: invalid _amount");

        IRewardTracker(stakedGmxTracker).stakeForAccount(_fundingAccount, _account, _token, _amount);
        IRewardTracker(bonusGmxTracker).stakeForAccount(_account, _account, stakedGmxTracker, _amount);
        IRewardTracker(feeGmxTracker).stakeForAccount(_account, _account, bonusGmxTracker, _amount);

        emit StakeGmx(_account, _token, _amount);
    }

    function _unstakeGmx(address _account, address _token, uint256 _amount, bool _shouldReduceBnGmx) private {
        require(_amount > 0, "RewardRouter: invalid _amount");

        uint256 balance = IRewardTracker(stakedGmxTracker).stakedAmounts(_account);

        IRewardTracker(feeGmxTracker).unstakeForAccount(_account, bonusGmxTracker, _amount, _account);
        IRewardTracker(bonusGmxTracker).unstakeForAccount(_account, stakedGmxTracker, _amount, _account);
        IRewardTracker(stakedGmxTracker).unstakeForAccount(_account, _token, _amount, _account);

        if (_shouldReduceBnGmx) {
            uint256 bnGmxAmount = IRewardTracker(bonusGmxTracker).claimForAccount(_account, _account);
            if (bnGmxAmount > 0) {
                IRewardTracker(feeGmxTracker).stakeForAccount(_account, _account, bnGmx, bnGmxAmount);
            }

            uint256 stakedBnGmx = IRewardTracker(feeGmxTracker).depositBalances(_account, bnGmx);
            if (stakedBnGmx > 0) {
                uint256 reductionAmount = stakedBnGmx.mul(_amount).div(balance);
                IRewardTracker(feeGmxTracker).unstakeForAccount(_account, bnGmx, reductionAmount, _account);
                IMintable(bnGmx).burn(_account, reductionAmount);
            }
        }

        emit UnstakeGmx(_account, _token, _amount);
    }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"StakeGlp","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"StakeGmx","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UnstakeGlp","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UnstakeGmx","type":"event"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"}],"name":"acceptTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_accounts","type":"address[]"}],"name":"batchCompoundForAccounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_accounts","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"batchStakeGmxForAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bnGmx","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bonusGmxTracker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimEsGmx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"compound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"compoundForAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"esGmx","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeGlpTracker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeGmxTracker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"glp","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"glpManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"glpVester","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gmx","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gmxVester","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gov","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_shouldClaimGmx","type":"bool"},{"internalType":"bool","name":"_shouldStakeGmx","type":"bool"},{"internalType":"bool","name":"_shouldClaimEsGmx","type":"bool"},{"internalType":"bool","name":"_shouldStakeEsGmx","type":"bool"},{"internalType":"bool","name":"_shouldStakeMultiplierPoints","type":"bool"},{"internalType":"bool","name":"_shouldClaimWeth","type":"bool"},{"internalType":"bool","name":"_shouldConvertWethToEth","type":"bool"}],"name":"handleRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_weth","type":"address"},{"internalType":"address","name":"_gmx","type":"address"},{"internalType":"address","name":"_esGmx","type":"address"},{"internalType":"address","name":"_bnGmx","type":"address"},{"internalType":"address","name":"_glp","type":"address"},{"internalType":"address","name":"_stakedGmxTracker","type":"address"},{"internalType":"address","name":"_bonusGmxTracker","type":"address"},{"internalType":"address","name":"_feeGmxTracker","type":"address"},{"internalType":"address","name":"_feeGlpTracker","type":"address"},{"internalType":"address","name":"_stakedGlpTracker","type":"address"},{"internalType":"address","name":"_glpManager","type":"address"},{"internalType":"address","name":"_gmxVester","type":"address"},{"internalType":"address","name":"_glpVester","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minUsdg","type":"uint256"},{"internalType":"uint256","name":"_minGlp","type":"uint256"}],"name":"mintAndStakeGlp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minUsdg","type":"uint256"},{"internalType":"uint256","name":"_minGlp","type":"uint256"}],"name":"mintAndStakeGlpETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pendingReceivers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_gov","type":"address"}],"name":"setGov","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"}],"name":"signalTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"stakeEsGmx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"stakeGmx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"stakeGmxForAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakedGlpTracker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakedGmxTracker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenOut","type":"address"},{"internalType":"uint256","name":"_glpAmount","type":"uint256"},{"internalType":"uint256","name":"_minOut","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"unstakeAndRedeemGlp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_glpAmount","type":"uint256"},{"internalType":"uint256","name":"_minOut","type":"uint256"},{"internalType":"address payable","name":"_receiver","type":"address"}],"name":"unstakeAndRedeemGlpETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"unstakeEsGmx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"unstakeGmx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405234801561001057600080fd5b506001600081905580546001600160a01b031916331790556153a4806100376000396000f3fe6080604052600436106101b95760003560e01c806301e336671461021d578063078580d2146102605780630ce4018a1461028a5780630db79e52146102bb5780630f3aa554146103eb57806312d43a51146104445780631af276a6146104595780631fcd60e5146105075780632a9f40831461051c5780632fdd983d1461054f57806330b70002146105ea57806331e67c7114610646578063364e23111461065b5780633671df25146106a0578063392e53cd146106b55780633fc8cef3146106de57806341d315b4146106f35780634e71d92d1461070857806351c3e3b41461071d57806353a8aa03146107325780635da4b8dd146107555780635fe3945f1461078e57806364f64467146107a3578063655603a4146107cd5780636a192a781461080057806378a207ee14610815578063abb5e5e21461082a578063af394d0014610869578063cfad57a21461087e578063d294f093146108b1578063e102f564146108c6578063e1b9db89146108db578063e1c363b71461090e578063ef8c599414610923578063ef9aacfd1461094d578063f3daeacc14610980578063f69e2046146109aa578063fa6db1bc146109bf57610218565b36610218576002546001600160a01b03163314610216576040805162461bcd60e51b81526020600482015260166024820152752937baba32b91d1034b73b30b634b21039b2b73232b960511b604482015290519081900360640190fd5b005b600080fd5b34801561022957600080fd5b506102166004803603606081101561024057600080fd5b506001600160a01b038135811691602081013590911690604001356109d4565b34801561026c57600080fd5b506102166004803603602081101561028357600080fd5b5035610a3a565b34801561029657600080fd5b5061029f610aa7565b604080516001600160a01b039092168252519081900360200190f35b3480156102c757600080fd5b50610216600480360360408110156102de57600080fd5b810190602081018135600160201b8111156102f857600080fd5b82018360208201111561030a57600080fd5b803590602001918460208302840111600160201b8311171561032b57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561037a57600080fd5b82018360208201111561038c57600080fd5b803590602001918460208302840111600160201b831117156103ad57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610ab6945050505050565b3480156103f757600080fd5b506104326004803603608081101561040e57600080fd5b506001600160a01b0381358116916020810135916040820135916060013516610bab565b60408051918252519081900360200190f35b34801561045057600080fd5b5061029f610e1b565b34801561046557600080fd5b506102166004803603602081101561047c57600080fd5b810190602081018135600160201b81111561049657600080fd5b8201836020820111156104a857600080fd5b803590602001918460208302840111600160201b831117156104c957600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610e2a945050505050565b34801561051357600080fd5b5061029f610efb565b34801561052857600080fd5b506102166004803603602081101561053f57600080fd5b50356001600160a01b0316610f0a565b34801561055b57600080fd5b5061021660048036036101a081101561057357600080fd5b506001600160a01b038135811691602081013582169160408201358116916060810135821691608082013581169160a081013582169160c082013581169160e08101358216916101008201358116916101208101358216916101408201358116916101608101358216916101809091013516610fab565b3480156105f657600080fd5b50610216600480360360e081101561060d57600080fd5b508035151590602081013515159060408101351515906060810135151590608081013515159060a081013515159060c001351515611138565b34801561065257600080fd5b5061029f6117fa565b34801561066757600080fd5b506104326004803603608081101561067e57600080fd5b506001600160a01b038135169060208101359060408101359060600135611809565b3480156106ac57600080fd5b5061029f611a77565b3480156106c157600080fd5b506106ca611a86565b604080519115158252519081900360200190f35b3480156106ea57600080fd5b5061029f611a96565b3480156106ff57600080fd5b5061029f611aa5565b34801561071457600080fd5b50610216611ab4565b34801561072957600080fd5b5061029f611d13565b6104326004803603604081101561074857600080fd5b5080359060200135611d22565b34801561076157600080fd5b506102166004803603604081101561077857600080fd5b506001600160a01b03813516906020013561208d565b34801561079a57600080fd5b5061021661213f565b3480156107af57600080fd5b50610216600480360360208110156107c657600080fd5b50356121e4565b3480156107d957600080fd5b50610216600480360360208110156107f057600080fd5b50356001600160a01b0316612249565b34801561080c57600080fd5b5061029f612c52565b34801561082157600080fd5b5061029f612c61565b34801561083657600080fd5b506104326004803603606081101561084d57600080fd5b50803590602081013590604001356001600160a01b0316612c70565b34801561087557600080fd5b5061029f612f59565b34801561088a57600080fd5b50610216600480360360208110156108a157600080fd5b50356001600160a01b0316612f68565b3480156108bd57600080fd5b50610216612fd7565b3480156108d257600080fd5b5061029f6130fe565b3480156108e757600080fd5b5061029f600480360360208110156108fe57600080fd5b50356001600160a01b031661310d565b34801561091a57600080fd5b5061029f613128565b34801561092f57600080fd5b506102166004803603602081101561094657600080fd5b5035613137565b34801561095957600080fd5b506102166004803603602081101561097057600080fd5b50356001600160a01b031661319c565b34801561098c57600080fd5b50610216600480360360208110156109a357600080fd5b503561338a565b3480156109b657600080fd5b506102166133ef565b3480156109cb57600080fd5b5061029f61344a565b6001546001600160a01b03163314610a21576040805162461bcd60e51b81526020600482015260156024820152600080516020614f51833981519152604482015290519081900360640190fd5b610a356001600160a01b0384168383613459565b505050565b60026000541415610a80576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b6002600055600354610a9f9033906001600160a01b03168360016134ab565b506001600055565b6007546001600160a01b031681565b60026000541415610afc576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b60026000556001546001600160a01b03163314610b4e576040805162461bcd60e51b81526020600482015260156024820152600080516020614f51833981519152604482015290519081900360640190fd5b6003546001600160a01b031660005b8351811015610ba057610b9833858381518110610b7657fe5b602002602001015184868581518110610b8b57fe5b60200260200101516139ed565b600101610b5d565b505060016000555050565b600060026000541415610bf3576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b600260005583610c38576040805162461bcd60e51b815260206004820181905260248201526000805160206152b8833981519152604482015290519081900360640190fd5b600a54600b546040805163098bf59d60e01b815233600482018190526001600160a01b039384166024830152604482018990526064820181905291519193929092169163098bf59d91608480830192600092919082900301818387803b158015610ca157600080fd5b505af1158015610cb5573d6000803e3d6000fd5b5050600b546006546040805163098bf59d60e01b81526001600160a01b03878116600483018190529381166024830152604482018c90526064820193909352905191909216935063098bf59d9250608480830192600092919082900301818387803b158015610d2357600080fd5b505af1158015610d37573d6000803e3d6000fd5b5050600c54604080516371d597ad60e01b81526001600160a01b0386811660048301528b81166024830152604482018b9052606482018a905288811660848301529151600095509190921692506371d597ad9160a48082019260209290919082900301818787803b158015610dab57600080fd5b505af1158015610dbf573d6000803e3d6000fd5b505050506040513d6020811015610dd557600080fd5b5051604080516001600160a01b03851681526020810189905281519293506000805160206151d1833981519152929081900390910190a160016000559695505050505050565b6001546001600160a01b031681565b60026000541415610e70576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b60026000556001546001600160a01b03163314610ec2576040805162461bcd60e51b81526020600482015260156024820152600080516020614f51833981519152604482015290519081900360640190fd5b60005b8151811015610ef257610eea828281518110610edd57fe5b6020026020010151613bfc565b600101610ec5565b50506001600055565b6008546001600160a01b031681565b60026000541415610f50576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b60026000556001546001600160a01b03163314610fa2576040805162461bcd60e51b81526020600482015260156024820152600080516020614f51833981519152604482015290519081900360640190fd5b610a9f81613bfc565b6001546001600160a01b03163314610ff8576040805162461bcd60e51b81526020600482015260156024820152600080516020614f51833981519152604482015290519081900360640190fd5b600154600160a01b900460ff16156110415760405162461bcd60e51b8152600401808060200182810382526021815260200180614fe26021913960400191505060405180910390fd5b6001805460ff60a01b1916600160a01b179055600280546001600160a01b039e8f166001600160a01b031991821617909155600380549d8f169d82169d909d17909c55600480549b8e169b8d169b909b17909a5560058054998d16998c169990991790985560068054978c16978b169790971790965560078054958b16958a169590951790945560088054938a169389169390931790925560098054918916918816919091179055600b8054918816918716919091179055600a8054918716918616919091179055600c8054918616918516919091179055600d8054918516918416919091179055600e8054919093169116179055565b6002600054141561117e576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b60026000908155339088156112aa57600d54604080516309f4173d60e11b81526001600160a01b03858116600483018190526024830152915160009392909216916313e82e7a9160448082019260209290919082900301818787803b1580156111e657600080fd5b505af11580156111fa573d6000803e3d6000fd5b505050506040513d602081101561121057600080fd5b5051600e54604080516309f4173d60e11b81526001600160a01b03878116600483018190526024830152915193945060009391909216916313e82e7a91604480830192602092919082900301818787803b15801561126d57600080fd5b505af1158015611281573d6000803e3d6000fd5b505050506040513d602081101561129757600080fd5b505190506112a58282613c11565b925050505b8780156112b75750600081115b156112d6576003546112d690839081906001600160a01b0316846139ed565b600087156113fb57600754604080516309f4173d60e11b81526001600160a01b03868116600483018190526024830152915160009392909216916313e82e7a9160448082019260209290919082900301818787803b15801561133757600080fd5b505af115801561134b573d6000803e3d6000fd5b505050506040513d602081101561136157600080fd5b5051600a54604080516309f4173d60e11b81526001600160a01b03888116600483018190526024830152915193945060009391909216916313e82e7a91604480830192602092919082900301818787803b1580156113be57600080fd5b505af11580156113d2573d6000803e3d6000fd5b505050506040513d60208110156113e857600080fd5b505190506113f68282613c11565b925050505b8680156114085750600081115b156114275760045461142790849081906001600160a01b0316846139ed565b851561153c57600854604080516309f4173d60e11b81526001600160a01b03868116600483018190526024830152915160009392909216916313e82e7a9160448082019260209290919082900301818787803b15801561148657600080fd5b505af115801561149a573d6000803e3d6000fd5b505050506040513d60208110156114b057600080fd5b50519050801561153a5760095460055460408051631e42d69b60e21b81526001600160a01b038881166004830181905260248301529283166044820152606481018590529051919092169163790b5a6c91608480830192600092919082900301818387803b15801561152157600080fd5b505af1158015611535573d6000803e3d6000fd5b505050505b505b84156117e95783156116e457600954604080516309f4173d60e11b81526001600160a01b038681166004830152306024830152915160009392909216916313e82e7a9160448082019260209290919082900301818787803b1580156115a057600080fd5b505af11580156115b4573d6000803e3d6000fd5b505050506040513d60208110156115ca57600080fd5b5051600b54604080516309f4173d60e11b81526001600160a01b038881166004830152306024830152915193945060009391909216916313e82e7a91604480830192602092919082900301818787803b15801561162657600080fd5b505af115801561163a573d6000803e3d6000fd5b505050506040513d602081101561165057600080fd5b5051905060006116608383613c11565b60025460408051632e1a7d4d60e01b81526004810184905290519293506001600160a01b0390911691632e1a7d4d9160248082019260009290919082900301818387803b1580156116b057600080fd5b505af11580156116c4573d6000803e3d6000fd5b506116dc925050506001600160a01b03871682613c72565b5050506117e9565b600954604080516309f4173d60e11b81526001600160a01b03868116600483018190526024830152915191909216916313e82e7a9160448083019260209291908290030181600087803b15801561173a57600080fd5b505af115801561174e573d6000803e3d6000fd5b505050506040513d602081101561176457600080fd5b5050600b54604080516309f4173d60e11b81526001600160a01b03868116600483018190526024830152915191909216916313e82e7a9160448083019260209291908290030181600087803b1580156117bc57600080fd5b505af11580156117d0573d6000803e3d6000fd5b505050506040513d60208110156117e657600080fd5b50505b505060016000555050505050505050565b6003546001600160a01b031681565b600060026000541415611851576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b600260005583611896576040805162461bcd60e51b815260206004820152601d60248201526000805160206152fb833981519152604482015290519081900360640190fd5b600c54604080516317eb2a1560e01b81523360048201819052602482018190526001600160a01b038981166044840152606483018990526084830188905260a483018790529251909360009316916317eb2a159160c480830192602092919082900301818787803b15801561190a57600080fd5b505af115801561191e573d6000803e3d6000fd5b505050506040513d602081101561193457600080fd5b5051600b5460065460408051631e42d69b60e21b81526001600160a01b03878116600483018190526024830152928316604482015260648101859052905193945091169163790b5a6c9160848082019260009290919082900301818387803b15801561199f57600080fd5b505af11580156119b3573d6000803e3d6000fd5b5050600a54600b5460408051631e42d69b60e21b81526001600160a01b03888116600483018190526024830152928316604482015260648101879052905191909216935063790b5a6c9250608480830192600092919082900301818387803b158015611a1e57600080fd5b505af1158015611a32573d6000803e3d6000fd5b5050604080516001600160a01b038616815260208101859052815160008051602061517d8339815191529450908190039091019150a160016000559695505050505050565b600e546001600160a01b031681565b600154600160a01b900460ff1681565b6002546001600160a01b031681565b600d546001600160a01b031681565b60026000541415611afa576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b60026000908155600954604080516309f4173d60e11b8152336004820181905260248201819052915191936001600160a01b03909316926313e82e7a926044808401936020939083900390910190829087803b158015611b5957600080fd5b505af1158015611b6d573d6000803e3d6000fd5b505050506040513d6020811015611b8357600080fd5b5050600b54604080516309f4173d60e11b81526001600160a01b03848116600483018190526024830152915191909216916313e82e7a9160448083019260209291908290030181600087803b158015611bdb57600080fd5b505af1158015611bef573d6000803e3d6000fd5b505050506040513d6020811015611c0557600080fd5b5050600754604080516309f4173d60e11b81526001600160a01b03848116600483018190526024830152915191909216916313e82e7a9160448083019260209291908290030181600087803b158015611c5d57600080fd5b505af1158015611c71573d6000803e3d6000fd5b505050506040513d6020811015611c8757600080fd5b5050600a54604080516309f4173d60e11b81526001600160a01b03848116600483018190526024830152915191909216916313e82e7a9160448083019260209291908290030181600087803b158015611cdf57600080fd5b505af1158015611cf3573d6000803e3d6000fd5b505050506040513d6020811015611d0957600080fd5b5050600160005550565b6009546001600160a01b031681565b600060026000541415611d6a576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b600260005534611dc1576040805162461bcd60e51b815260206004820152601f60248201527f526577617264526f757465723a20696e76616c6964206d73672e76616c756500604482015290519081900360640190fd5b600260009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015611e1157600080fd5b505af1158015611e25573d6000803e3d6000fd5b5050600254600c546040805163095ea7b360e01b81526001600160a01b039283166004820152346024820152905191909216945063095ea7b39350604480830193506020928290030181600087803b158015611e8057600080fd5b505af1158015611e94573d6000803e3d6000fd5b505050506040513d6020811015611eaa57600080fd5b5050600c54600254604080516317eb2a1560e01b815230600482015233602482018190526001600160a01b0393841660448301523460648301526084820188905260a482018790529151919360009316916317eb2a159160c48082019260209290919082900301818787803b158015611f2257600080fd5b505af1158015611f36573d6000803e3d6000fd5b505050506040513d6020811015611f4c57600080fd5b5051600b5460065460408051631e42d69b60e21b81526001600160a01b03878116600483018190526024830152928316604482015260648101859052905193945091169163790b5a6c9160848082019260009290919082900301818387803b158015611fb757600080fd5b505af1158015611fcb573d6000803e3d6000fd5b5050600a54600b5460408051631e42d69b60e21b81526001600160a01b03888116600483018190526024830152928316604482015260648101879052905191909216935063790b5a6c9250608480830192600092919082900301818387803b15801561203657600080fd5b505af115801561204a573d6000803e3d6000fd5b5050604080516001600160a01b038616815260208101859052815160008051602061517d8339815191529450908190039091019150a16001600055949350505050565b600260005414156120d3576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b60026000556001546001600160a01b03163314612125576040805162461bcd60e51b81526020600482015260156024820152600080516020614f51833981519152604482015290519081900360640190fd5b600354610ef290339084906001600160a01b0316846139ed565b60026000541415612185576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b60026000908155600754604080516309f4173d60e11b8152336004820181905260248201819052915191936001600160a01b03909316926313e82e7a926044808401936020939083900390910190829087803b158015611c5d57600080fd5b6002600054141561222a576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b6002600055600454610a9f9033906001600160a01b03168360016134ab565b6002600054141561228f576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b6002600055600d54604080516370a0823160e01b81526001600160a01b038481166004830152915191909216916370a08231916024808301926020929190829003018186803b1580156122e157600080fd5b505afa1580156122f5573d6000803e3d6000fd5b505050506040513d602081101561230b57600080fd5b5051156123495760405162461bcd60e51b8152600401808060200182810382526026815260200180614f2b6026913960400191505060405180910390fd5b600e54604080516370a0823160e01b81526001600160a01b038481166004830152915191909216916370a08231916024808301926020929190829003018186803b15801561239657600080fd5b505afa1580156123aa573d6000803e3d6000fd5b505050506040513d60208110156123c057600080fd5b5051156123fe5760405162461bcd60e51b8152600401808060200182810382526026815260200180614f2b6026913960400191505060405180910390fd5b6001600160a01b038181166000908152600f602052604090205433911681146124585760405162461bcd60e51b81526004018080602001828103825260248152602001806150296024913960400191505060405180910390fd5b6001600160a01b0382166000908152600f6020526040902080546001600160a01b031916905561248781613d57565b61249082613bfc565b60075460035460408051637aeceb1f60e11b81526001600160a01b03868116600483015292831660248201529051600093929092169163f5d9d63e91604480820192602092909190829003018186803b1580156124ec57600080fd5b505afa158015612500573d6000803e3d6000fd5b505050506040513d602081101561251657600080fd5b5051905080156125545760035461253a9084906001600160a01b03168360006134ab565b60035461255490849084906001600160a01b0316846139ed565b6007546004805460408051637aeceb1f60e11b81526001600160a01b0388811694820194909452918316602483015251600093929092169163f5d9d63e91604480820192602092909190829003018186803b1580156125b257600080fd5b505afa1580156125c6573d6000803e3d6000fd5b505050506040513d60208110156125dc57600080fd5b50519050801561261a576004546126009085906001600160a01b03168360006134ab565b60045461261a90859085906001600160a01b0316846139ed565b60095460055460408051637aeceb1f60e11b81526001600160a01b03888116600483015292831660248201529051600093929092169163f5d9d63e91604480820192602092909190829003018186803b15801561267657600080fd5b505afa15801561268a573d6000803e3d6000fd5b505050506040513d60208110156126a057600080fd5b5051905080156127ad576009546005546040805163098bf59d60e01b81526001600160a01b038981166004830181905293811660248301526044820186905260648201939093529051919092169163098bf59d91608480830192600092919082900301818387803b15801561271457600080fd5b505af1158015612728573d6000803e3d6000fd5b505060095460055460408051631e42d69b60e21b81526001600160a01b038b811660048301528a81166024830152928316604482015260648101879052905191909216935063790b5a6c9250608480830192600092919082900301818387803b15801561279457600080fd5b505af11580156127a8573d6000803e3d6000fd5b505050505b6000600460009054906101000a90046001600160a01b03166001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561281157600080fd5b505afa158015612825573d6000803e3d6000fd5b505050506040513d602081101561283b57600080fd5b5051905080156128d45760048054604080516323b872dd60e01b81526001600160a01b038a811694820194909452888416602482015260448101859052905192909116916323b872dd916064808201926020929091908290030181600087803b1580156128a757600080fd5b505af11580156128bb573d6000803e3d6000fd5b505050506040513d60208110156128d157600080fd5b50505b600b5460065460408051637aeceb1f60e11b81526001600160a01b038a8116600483015292831660248201529051600093929092169163f5d9d63e91604480820192602092909190829003018186803b15801561293057600080fd5b505afa158015612944573d6000803e3d6000fd5b505050506040513d602081101561295a57600080fd5b505190508015612b6857600a54600b546040805163098bf59d60e01b81526001600160a01b038b81166004830181905293811660248301526044820186905260648201939093529051919092169163098bf59d91608480830192600092919082900301818387803b1580156129ce57600080fd5b505af11580156129e2573d6000803e3d6000fd5b5050600b546006546040805163098bf59d60e01b81526001600160a01b038d8116600483018190529381166024830152604482018890526064820193909352905191909216935063098bf59d9250608480830192600092919082900301818387803b158015612a5057600080fd5b505af1158015612a64573d6000803e3d6000fd5b5050600b5460065460408051631e42d69b60e21b81526001600160a01b038d811660048301528c81166024830152928316604482015260648101879052905191909216935063790b5a6c9250608480830192600092919082900301818387803b158015612ad057600080fd5b505af1158015612ae4573d6000803e3d6000fd5b5050600a54600b5460408051631e42d69b60e21b81526001600160a01b038c8116600483018190526024830152928316604482015260648101879052905191909216935063790b5a6c9250608480830192600092919082900301818387803b158015612b4f57600080fd5b505af1158015612b63573d6000803e3d6000fd5b505050505b600d5460408051630f713c2360e41b81526001600160a01b038a8116600483015289811660248301529151919092169163f713c23091604480830192600092919082900301818387803b158015612bbe57600080fd5b505af1158015612bd2573d6000803e3d6000fd5b5050600e5460408051630f713c2360e41b81526001600160a01b038c811660048301528b81166024830152915191909216935063f713c2309250604480830192600092919082900301818387803b158015612c2c57600080fd5b505af1158015612c40573d6000803e3d6000fd5b50506001600055505050505050505050565b6004546001600160a01b031681565b6006546001600160a01b031681565b600060026000541415612cb8576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b600260005583612cfd576040805162461bcd60e51b815260206004820181905260248201526000805160206152b8833981519152604482015290519081900360640190fd5b600a54600b546040805163098bf59d60e01b815233600482018190526001600160a01b039384166024830152604482018990526064820181905291519193929092169163098bf59d91608480830192600092919082900301818387803b158015612d6657600080fd5b505af1158015612d7a573d6000803e3d6000fd5b5050600b546006546040805163098bf59d60e01b81526001600160a01b03878116600483018190529381166024830152604482018c90526064820193909352905191909216935063098bf59d9250608480830192600092919082900301818387803b158015612de857600080fd5b505af1158015612dfc573d6000803e3d6000fd5b5050600c54600254604080516371d597ad60e01b81526001600160a01b0387811660048301529283166024820152604481018b9052606481018a90523060848201529051600095509190921692506371d597ad9160a48082019260209290919082900301818787803b158015612e7157600080fd5b505af1158015612e85573d6000803e3d6000fd5b505050506040513d6020811015612e9b57600080fd5b505160025460408051632e1a7d4d60e01b81526004810184905290519293506001600160a01b0390911691632e1a7d4d9160248082019260009290919082900301818387803b158015612eed57600080fd5b505af1158015612f01573d6000803e3d6000fd5b50612f19925050506001600160a01b03851682613c72565b604080516001600160a01b03841681526020810188905281516000805160206151d1833981519152929181900390910190a1600160005595945050505050565b600a546001600160a01b031681565b6001546001600160a01b03163314612fb5576040805162461bcd60e51b81526020600482015260156024820152600080516020614f51833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6002600054141561301d576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b60026000908155600954604080516309f4173d60e11b8152336004820181905260248201819052915191936001600160a01b03909316926313e82e7a926044808401936020939083900390910190829087803b15801561307c57600080fd5b505af1158015613090573d6000803e3d6000fd5b505050506040513d60208110156130a657600080fd5b5050600b54604080516309f4173d60e11b81526001600160a01b03848116600483018190526024830152915191909216916313e82e7a9160448083019260209291908290030181600087803b158015611cdf57600080fd5b6005546001600160a01b031681565b600f602052600090815260409020546001600160a01b031681565b600b546001600160a01b031681565b6002600054141561317d576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b6002600055600454610a9f90339081906001600160a01b0316846139ed565b600260005414156131e2576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b6002600055600d54604080516370a0823160e01b815233600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561323257600080fd5b505afa158015613246573d6000803e3d6000fd5b505050506040513d602081101561325c57600080fd5b50511561329a5760405162461bcd60e51b8152600401808060200182810382526026815260200180614f2b6026913960400191505060405180910390fd5b600e54604080516370a0823160e01b815233600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b1580156132e557600080fd5b505afa1580156132f9573d6000803e3d6000fd5b505050506040513d602081101561330f57600080fd5b50511561334d5760405162461bcd60e51b8152600401808060200182810382526026815260200180614f2b6026913960400191505060405180910390fd5b61335681613d57565b336000908152600f6020526040812080546001600160a01b0319166001600160a01b03939093169290921790915560019055565b600260005414156133d0576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b6002600055600354610a9f90339081906001600160a01b0316846139ed565b60026000541415613435576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b600260005561344333613bfc565b6001600055565b600c546001600160a01b031681565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610a359084906148a7565b600082116134ee576040805162461bcd60e51b815260206004820152601d60248201526000805160206152fb833981519152604482015290519081900360640190fd5b600754604080516310c1c10360e01b81526001600160a01b038781166004830152915160009392909216916310c1c10391602480820192602092909190829003018186803b15801561353f57600080fd5b505afa158015613553573d6000803e3d6000fd5b505050506040513d602081101561356957600080fd5b50516009546008546040805163098bf59d60e01b81526001600160a01b038a8116600483018190529381166024830152604482018990526064820193909352905193945091169163098bf59d9160848082019260009290919082900301818387803b1580156135d757600080fd5b505af11580156135eb573d6000803e3d6000fd5b50506008546007546040805163098bf59d60e01b81526001600160a01b038b8116600483018190529381166024830152604482018a90526064820193909352905191909216935063098bf59d9250608480830192600092919082900301818387803b15801561365957600080fd5b505af115801561366d573d6000803e3d6000fd5b50506007546040805163098bf59d60e01b81526001600160a01b038a8116600483018190528a82166024840152604483018a90526064830152915191909216935063098bf59d9250608480830192600092919082900301818387803b1580156136d557600080fd5b505af11580156136e9573d6000803e3d6000fd5b50505050811561399c57600854604080516309f4173d60e11b81526001600160a01b03888116600483018190526024830152915160009392909216916313e82e7a9160448082019260209290919082900301818787803b15801561374c57600080fd5b505af1158015613760573d6000803e3d6000fd5b505050506040513d602081101561377657600080fd5b5051905080156138005760095460055460408051631e42d69b60e21b81526001600160a01b038a81166004830181905260248301529283166044820152606481018590529051919092169163790b5a6c91608480830192600092919082900301818387803b1580156137e757600080fd5b505af11580156137fb573d6000803e3d6000fd5b505050505b60095460055460408051637aeceb1f60e11b81526001600160a01b038a8116600483015292831660248201529051600093929092169163f5d9d63e91604480820192602092909190829003018186803b15801561385c57600080fd5b505afa158015613870573d6000803e3d6000fd5b505050506040513d602081101561388657600080fd5b5051905080156139995760006138a6846138a08489614958565b906149b1565b6009546005546040805163098bf59d60e01b81526001600160a01b038d8116600483018190529381166024830152604482018690526064820193909352905193945091169163098bf59d9160848082019260009290919082900301818387803b15801561391257600080fd5b505af1158015613926573d6000803e3d6000fd5b505060055460408051632770a7eb60e21b81526001600160a01b038d81166004830152602482018790529151919092169350639dc29fac9250604480830192600092919082900301818387803b15801561397f57600080fd5b505af1158015613993573d6000803e3d6000fd5b50505050505b50505b604080516001600160a01b0380881682528616602082015280820185905290517fce8eb393006add0768cc6cefb3ca0fc4787015ce1ac86bd800e72a79993103459181900360600190a15050505050565b60008111613a30576040805162461bcd60e51b815260206004820152601d60248201526000805160206152fb833981519152604482015290519081900360640190fd5b60075460408051631e42d69b60e21b81526001600160a01b03878116600483015286811660248301528581166044830152606482018590529151919092169163790b5a6c91608480830192600092919082900301818387803b158015613a9557600080fd5b505af1158015613aa9573d6000803e3d6000fd5b505060085460075460408051631e42d69b60e21b81526001600160a01b03898116600483018190526024830152928316604482015260648101879052905191909216935063790b5a6c9250608480830192600092919082900301818387803b158015613b1457600080fd5b505af1158015613b28573d6000803e3d6000fd5b505060095460085460408051631e42d69b60e21b81526001600160a01b03898116600483018190526024830152928316604482015260648101879052905191909216935063790b5a6c9250608480830192600092919082900301818387803b158015613b9357600080fd5b505af1158015613ba7573d6000803e3d6000fd5b5050604080516001600160a01b0380881682528616602082015280820185905290517fad0723806aa1e5a8fb826fc9f0c5b589e585a6b60dc768a1b20691c95062d2d69350908190036060019150a150505050565b613c05816149f0565b613c0e81614ba8565b50565b600082820183811015613c69576040805162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b604482015290519081900360640190fd5b90505b92915050565b80471015613cc7576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015290519081900360640190fd5b6040516000906001600160a01b0384169083908381818185875af1925050503d8060008114613d12576040519150601f19603f3d011682016040523d82523d6000602084013e613d17565b606091505b5050905080610a355760405162461bcd60e51b815260040180806020018281038252603a815260200180614fa8603a913960400191505060405180910390fd5b6007546040805163a318021760e01b81526001600160a01b0384811660048301529151919092169163a3180217916024808301926020929190829003018186803b158015613da457600080fd5b505afa158015613db8573d6000803e3d6000fd5b505050506040513d6020811015613dce57600080fd5b505115613e0c5760405162461bcd60e51b8152600401808060200182810382526037815260200180614f716037913960400191505060405180910390fd5b60075460408051633792def360e01b81526001600160a01b03848116600483015291519190921691633792def3916024808301926020929190829003018186803b158015613e5957600080fd5b505afa158015613e6d573d6000803e3d6000fd5b505050506040513d6020811015613e8357600080fd5b505115613ec15760405162461bcd60e51b81526004018080602001828103825260348152602001806151496034913960400191505060405180910390fd5b6008546040805163a318021760e01b81526001600160a01b0384811660048301529151919092169163a3180217916024808301926020929190829003018186803b158015613f0e57600080fd5b505afa158015613f22573d6000803e3d6000fd5b505050506040513d6020811015613f3857600080fd5b505115613f765760405162461bcd60e51b81526004018080602001828103825260368152602001806150e06036913960400191505060405180910390fd5b60085460408051633792def360e01b81526001600160a01b03848116600483015291519190921691633792def3916024808301926020929190829003018186803b158015613fc357600080fd5b505afa158015613fd7573d6000803e3d6000fd5b505050506040513d6020811015613fed57600080fd5b50511561402b5760405162461bcd60e51b81526004018080602001828103825260338152602001806151166033913960400191505060405180910390fd5b6009546040805163a318021760e01b81526001600160a01b0384811660048301529151919092169163a3180217916024808301926020929190829003018186803b15801561407857600080fd5b505afa15801561408c573d6000803e3d6000fd5b505050506040513d60208110156140a257600080fd5b5051156140e05760405162461bcd60e51b815260040180806020018281038252603481526020018061519d6034913960400191505060405180910390fd5b60095460408051633792def360e01b81526001600160a01b03848116600483015291519190921691633792def3916024808301926020929190829003018186803b15801561412d57600080fd5b505afa158015614141573d6000803e3d6000fd5b505050506040513d602081101561415757600080fd5b5051156141955760405162461bcd60e51b81526004018080602001828103825260318152602001806152256031913960400191505060405180910390fd5b600d5460408051631ccdc0d760e21b81526001600160a01b03848116600483015291519190921691637337035c916024808301926020929190829003018186803b1580156141e257600080fd5b505afa1580156141f6573d6000803e3d6000fd5b505050506040513d602081101561420c57600080fd5b50511561424a5760405162461bcd60e51b815260040180806020018281038252603b8152602001806150a5603b913960400191505060405180910390fd5b600d5460408051635b8de71560e11b81526001600160a01b0384811660048301529151919092169163b71bce2a916024808301926020929190829003018186803b15801561429757600080fd5b505afa1580156142ab573d6000803e3d6000fd5b505050506040513d60208110156142c157600080fd5b5051156142ff5760405162461bcd60e51b81526004018080602001828103825260388152602001806152806038913960400191505060405180910390fd5b600a546040805163a318021760e01b81526001600160a01b0384811660048301529151919092169163a3180217916024808301926020929190829003018186803b15801561434c57600080fd5b505afa158015614360573d6000803e3d6000fd5b505050506040513d602081101561437657600080fd5b5051156143b45760405162461bcd60e51b815260040180806020018281038252603781526020018061504d6037913960400191505060405180910390fd5b600a5460408051633792def360e01b81526001600160a01b03848116600483015291519190921691633792def3916024808301926020929190829003018186803b15801561440157600080fd5b505afa158015614415573d6000803e3d6000fd5b505050506040513d602081101561442b57600080fd5b5051156144695760405162461bcd60e51b8152600401808060200182810382526034815260200180614ed76034913960400191505060405180910390fd5b600b546040805163a318021760e01b81526001600160a01b0384811660048301529151919092169163a3180217916024808301926020929190829003018186803b1580156144b657600080fd5b505afa1580156144ca573d6000803e3d6000fd5b505050506040513d60208110156144e057600080fd5b50511561451e5760405162461bcd60e51b81526004018080602001828103825260348152602001806151f16034913960400191505060405180910390fd5b600b5460408051633792def360e01b81526001600160a01b03848116600483015291519190921691633792def3916024808301926020929190829003018186803b15801561456b57600080fd5b505afa15801561457f573d6000803e3d6000fd5b505050506040513d602081101561459557600080fd5b5051156145d35760405162461bcd60e51b815260040180806020018281038252603181526020018061533e6031913960400191505060405180910390fd5b600e5460408051631ccdc0d760e21b81526001600160a01b03848116600483015291519190921691637337035c916024808301926020929190829003018186803b15801561462057600080fd5b505afa158015614634573d6000803e3d6000fd5b505050506040513d602081101561464a57600080fd5b5051156146885760405162461bcd60e51b815260040180806020018281038252603b8152602001806150a5603b913960400191505060405180910390fd5b600e5460408051635b8de71560e11b81526001600160a01b0384811660048301529151919092169163b71bce2a916024808301926020929190829003018186803b1580156146d557600080fd5b505afa1580156146e9573d6000803e3d6000fd5b505050506040513d60208110156146ff57600080fd5b50511561473d5760405162461bcd60e51b81526004018080602001828103825260388152602001806152806038913960400191505060405180910390fd5b600d54604080516370a0823160e01b81526001600160a01b038481166004830152915191909216916370a08231916024808301926020929190829003018186803b15801561478a57600080fd5b505afa15801561479e573d6000803e3d6000fd5b505050506040513d60208110156147b457600080fd5b5051156147f25760405162461bcd60e51b815260040180806020018281038252602381526020018061531b6023913960400191505060405180910390fd5b600e54604080516370a0823160e01b81526001600160a01b038481166004830152915191909216916370a08231916024808301926020929190829003018186803b15801561483f57600080fd5b505afa158015614853573d6000803e3d6000fd5b505050506040513d602081101561486957600080fd5b505115613c0e5760405162461bcd60e51b81526004018080602001828103825260238152602001806152d86023913960400191505060405180910390fd5b60606148fc826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316614c539092919063ffffffff16565b805190915015610a355780806020019051602081101561491b57600080fd5b5051610a355760405162461bcd60e51b815260040180806020018281038252602a815260200180615256602a913960400191505060405180910390fd5b60008261496757506000613c6c565b8282028284828161497457fe5b0414613c695760405162461bcd60e51b81526004018080602001828103825260218152602001806150846021913960400191505060405180910390fd5b6000613c6983836040518060400160405280601a815260200179536166654d6174683a206469766973696f6e206279207a65726f60301b815250614c6c565b600754604080516309f4173d60e11b81526001600160a01b03848116600483018190526024830152915160009392909216916313e82e7a9160448082019260209290919082900301818787803b158015614a4957600080fd5b505af1158015614a5d573d6000803e3d6000fd5b505050506040513d6020811015614a7357600080fd5b505190508015614a9757600454614a9790839081906001600160a01b0316846139ed565b600854604080516309f4173d60e11b81526001600160a01b03858116600483018190526024830152915160009392909216916313e82e7a9160448082019260209290919082900301818787803b158015614af057600080fd5b505af1158015614b04573d6000803e3d6000fd5b505050506040513d6020811015614b1a57600080fd5b505190508015610a355760095460055460408051631e42d69b60e21b81526001600160a01b038781166004830181905260248301529283166044820152606481018590529051919092169163790b5a6c91608480830192600092919082900301818387803b158015614b8b57600080fd5b505af1158015614b9f573d6000803e3d6000fd5b50505050505050565b600a54604080516309f4173d60e11b81526001600160a01b03848116600483018190526024830152915160009392909216916313e82e7a9160448082019260209290919082900301818787803b158015614c0157600080fd5b505af1158015614c15573d6000803e3d6000fd5b505050506040513d6020811015614c2b57600080fd5b505190508015614c4f57600454614c4f90839081906001600160a01b0316846139ed565b5050565b6060614c628484600085614d0e565b90505b9392505050565b60008183614cf85760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614cbd578181015183820152602001614ca5565b50505050905090810190601f168015614cea5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581614d0457fe5b0495945050505050565b606082471015614d4f5760405162461bcd60e51b81526004018080602001828103825260268152602001806150036026913960400191505060405180910390fd5b614d5885614e6a565b614da9576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310614de85780518252601f199092019160209182019101614dc9565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114614e4a576040519150601f19603f3d011682016040523d82523d6000602084013e614e4f565b606091505b5091509150614e5f828286614e70565b979650505050505050565b3b151590565b60608315614e7f575081614c65565b825115614e8f5782518084602001fd5b60405162461bcd60e51b8152602060048201818152845160248401528451859391928392604401919085019080838360008315614cbd578181015183820152602001614ca556fe526577617264526f757465723a207374616b6564476c70547261636b65722e63756d756c617469766552657761726473203e20305265656e7472616e637947756172643a207265656e7472616e742063616c6c00526577617264526f757465723a2073656e646572206861732076657374656420746f6b656e73476f7665726e61626c653a20666f7262696464656e0000000000000000000000526577617264526f757465723a207374616b6564476d78547261636b65722e617665726167655374616b6564416d6f756e7473203e2030416464726573733a20756e61626c6520746f2073656e642076616c75652c20726563697069656e74206d61792068617665207265766572746564526577617264526f757465723a20616c726561647920696e697469616c697a6564416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c526577617264526f757465723a207472616e73666572206e6f74207369676e616c6c6564526577617264526f757465723a207374616b6564476c70547261636b65722e617665726167655374616b6564416d6f756e7473203e2030536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77526577617264526f757465723a20676d785665737465722e7472616e73666572726564417665726167655374616b6564416d6f756e7473203e2030526577617264526f757465723a20626f6e7573476d78547261636b65722e617665726167655374616b6564416d6f756e7473203e2030526577617264526f757465723a20626f6e7573476d78547261636b65722e63756d756c617469766552657761726473203e2030526577617264526f757465723a207374616b6564476d78547261636b65722e63756d756c617469766552657761726473203e2030a4725d47fa458d9222498e4d63f34527cf7318c1506f89d9092b35fdbcb64f3a526577617264526f757465723a20666565476d78547261636b65722e617665726167655374616b6564416d6f756e7473203e20301cb6202519b6b6c72ba5ed11e2c3f53af3cea010f96bfc705584e53e75cf034c526577617264526f757465723a20666565476c70547261636b65722e617665726167655374616b6564416d6f756e7473203e2030526577617264526f757465723a20666565476d78547261636b65722e63756d756c617469766552657761726473203e20305361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564526577617264526f757465723a20676d785665737465722e7472616e7366657272656443756d756c617469766552657761726473203e2030526577617264526f757465723a20696e76616c6964205f676c70416d6f756e74526577617264526f757465723a20676c705665737465722e62616c616e6365203e2030526577617264526f757465723a20696e76616c6964205f616d6f756e74000000526577617264526f757465723a20676d785665737465722e62616c616e6365203e2030526577617264526f757465723a20666565476c70547261636b65722e63756d756c617469766552657761726473203e2030a264697066735822122022d2dc2472894765a18f60a06f0934fd0515dead610d7ab00c5425a37710f68264736f6c634300060c0033

Deployed ByteCode Sourcemap

36109:17503:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37176:4;;-1:-1:-1;;;;;37176:4:0;37162:10;:18;37154:53;;;;;-1:-1:-1;;;37154:53:0;;;;;;;;;;;;-1:-1:-1;;;37154:53:0;;;;;;;;;;;;;;;36109:17503;;;;;38291:156;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;38291:156:0;;;;;;;;;;;;;;;;;:::i;39187:121::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39187:121:0;;:::i;36498:31::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;36498:31:0;;;;;;;;;;;;;;38455:293;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;38455:293:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;38455:293:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38455:293:0;;;;;;;;-1:-1:-1;38455:293:0;;-1:-1:-1;;;;;38455:293:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;38455:293:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38455:293:0;;-1:-1:-1;38455:293:0;;-1:-1:-1;;;;;38455:293:0:i;40851:672::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;40851:672:0;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;35824:18;;;;;;;;;;;;;:::i;45636:207::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;45636:207:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;45636:207:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45636:207:0;;-1:-1:-1;45636:207:0;;-1:-1:-1;;;;;45636:207:0:i;36536:30::-;;;;;;;;;;;;;:::i;43282:114::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43282:114:0;-1:-1:-1;;;;;43282:114:0;;:::i;37223:986::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;37223:986:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;43404:2224::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43404:2224:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;36358:18::-;;;;;;;;;;;;;:::i;39449:645::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;39449:645:0;;;;;;;;;;;;;;;;;;:::i;36768:24::-;;;;;;;;;;;;;:::i;36296:25::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;36330:19;;;;;;;;;;;;;:::i;36737:24::-;;;;;;;;;;;;;:::i;42289:392::-;;;;;;;;;;;;;:::i;36573:28::-;;;;;;;;;;;;;:::i;40102:741::-;;;;;;;;;;;;;;;;-1:-1:-1;40102:741:0;;;;;;;:::i;38756:157::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;38756:157:0;;;;;;;;:::i;42689:247::-;;;;;;;;;;;;;:::i;39316:125::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39316:125:0;;:::i;46236:2254::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46236:2254:0;-1:-1:-1;;;;;46236:2254:0;;:::i;36383:20::-;;;;;;;;;;;;;:::i;36439:18::-;;;;;;;;;;;;;:::i;41531:750::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41531:750:0;;;;;;;;;;;-1:-1:-1;;;;;41531:750:0;;:::i;36610:40::-;;;;;;;;;;;;;:::i;36024:76::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36024:76:0;-1:-1:-1;;;;;36024:76:0;;:::i;42944:240::-;;;;;;;;;;;;;:::i;36410:20::-;;;;;;;;;;;;;:::i;36801:52::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36801:52:0;-1:-1:-1;;;;;36801:52:0;;:::i;36657:37::-;;;;;;;;;;;;;:::i;39052:127::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39052:127:0;;:::i;45851:377::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45851:377:0;-1:-1:-1;;;;;45851:377:0;;:::i;38921:123::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38921:123:0;;:::i;43192:82::-;;;;;;;;;;;;;:::i;36703:25::-;;;;;;;;;;;;;:::i;38291:156::-;35967:3;;-1:-1:-1;;;;;35967:3:0;35953:10;:17;35945:51;;;;;-1:-1:-1;;;35945:51:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;35945:51:0;;;;;;;;;;;;;;;38393:46:::1;-1:-1:-1::0;;;;;38393:27:0;::::1;38421:8:::0;38431:7;38393:27:::1;:46::i;:::-;38291:156:::0;;;:::o;39187:121::-;21266:1;21872:7;;:19;;21864:63;;;;;-1:-1:-1;;;21864:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21864:63:0;;;;;;;;;;;;;;;21266:1;22005:7;:18;39281:3:::1;::::0;39257:43:::1;::::0;39269:10:::1;::::0;-1:-1:-1;;;;;39281:3:0::1;39286:7:::0;39281:3;39257:11:::1;:43::i;:::-;-1:-1:-1::0;21222:1:0;22184:7;:22;39187:121::o;36498:31::-;;;-1:-1:-1;;;;;36498:31:0;;:::o;38455:293::-;21266:1;21872:7;;:19;;21864:63;;;;;-1:-1:-1;;;21864:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21864:63:0;;;;;;;;;;;;;;;21266:1;22005:7;:18;35967:3:::1;::::0;-1:-1:-1;;;;;35967:3:0::1;35953:10;:17;35945:51;;;::::0;;-1:-1:-1;;;35945:51:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;35945:51:0;;;;;;;;;;;;;::::1;;38599:3:::2;::::0;-1:-1:-1;;;;;38599:3:0::2;38584:12;38613:128;38637:9;:16;38633:1;:20;38613:128;;;38675:54;38685:10;38697:9;38707:1;38697:12;;;;;;;;;;;;;;38711:4;38717:8;38726:1;38717:11;;;;;;;;;;;;;;38675:9;:54::i;:::-;38655:3;;38613:128;;;-1:-1:-1::0;;21222:1:0;22184:7;:22;-1:-1:-1;;38455:293:0:o;40851:672::-;40986:7;21266:1;21872:7;;:19;;21864:63;;;;;-1:-1:-1;;;21864:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21864:63:0;;;;;;;;;;;;;;;21266:1;22005:7;:18;41014:14;41006:59:::1;;;::::0;;-1:-1:-1;;;41006:59:0;;::::1;;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;41006:59:0;;;;;;;;;;;;;::::1;;41132:16;::::0;41177:13:::1;::::0;41117:95:::1;::::0;;-1:-1:-1;;;41117:95:0;;41096:10:::1;41117:95;::::0;::::1;::::0;;;-1:-1:-1;;;;;41177:13:0;;::::1;41117:95:::0;;;;;;;;;;;;;;;;;;41096:10;;41132:16;;;::::1;::::0;41117:50:::1;::::0;:95;;;;;41078:15:::1;::::0;41117:95;;;;;;;41078:15;41132:16;41117:95;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;41238:13:0::1;::::0;41280:3:::1;::::0;41223:82:::1;::::0;;-1:-1:-1;;;41223:82:0;;-1:-1:-1;;;;;41223:82:0;;::::1;;::::0;::::1;::::0;;;41280:3;;::::1;41223:82:::0;;;;;;;;;;;;;;;;;;;41238:13;;;::::1;::::0;-1:-1:-1;41223:47:0::1;::::0;-1:-1:-1;41223:82:0;;;;;41238:13:::1;::::0;41223:82;;;;;;;41238:13;;41223:82;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;41348:10:0::1;::::0;41336:101:::1;::::0;;-1:-1:-1;;;41336:101:0;;-1:-1:-1;;;;;41336:101:0;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;;;;;;;;;;;::::1;::::0;;;;;;41316:17:::1;::::0;-1:-1:-1;41348:10:0;;;::::1;::::0;-1:-1:-1;41336:49:0::1;::::0;:101;;;;;::::1;::::0;;;;;;;;;41316:17;41348:10;41336:101;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;41336:101:0;41455:31:::1;::::0;;-1:-1:-1;;;;;41455:31:0;::::1;::::0;;41336:101:::1;41455:31:::0;::::1;::::0;;;;;41336:101;;-1:-1:-1;;;;;;;;;;;;41455:31:0;;;;;;;;;::::1;21222:1:::0;22184:7;:22;41506:9;40851:672;-1:-1:-1;;;;;;40851:672:0:o;35824:18::-;;;-1:-1:-1;;;;;35824:18:0;;:::o;45636:207::-;21266:1;21872:7;;:19;;21864:63;;;;;-1:-1:-1;;;21864:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21864:63:0;;;;;;;;;;;;;;;21266:1;22005:7;:18;35967:3:::1;::::0;-1:-1:-1;;;;;35967:3:0::1;35953:10;:17;35945:51;;;::::0;;-1:-1:-1;;;35945:51:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;35945:51:0;;;;;;;;;;;;;::::1;;45744:9:::2;45739:97;45763:9;:16;45759:1;:20;45739:97;;;45801:23;45811:9;45821:1;45811:12;;;;;;;;;;;;;;45801:9;:23::i;:::-;45781:3;;45739:97;;;-1:-1:-1::0;;21222:1:0;22184:7;:22;45636:207::o;36536:30::-;;;-1:-1:-1;;;;;36536:30:0;;:::o;43282:114::-;21266:1;21872:7;;:19;;21864:63;;;;;-1:-1:-1;;;21864:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21864:63:0;;;;;;;;;;;;;;;21266:1;22005:7;:18;35967:3:::1;::::0;-1:-1:-1;;;;;35967:3:0::1;35953:10;:17;35945:51;;;::::0;;-1:-1:-1;;;35945:51:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;35945:51:0;;;;;;;;;;;;;::::1;;43369:19:::2;43379:8;43369:9;:19::i;37223:986::-:0;35967:3;;-1:-1:-1;;;;;35967:3:0;35953:10;:17;35945:51;;;;;-1:-1:-1;;;35945:51:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;35945:51:0;;;;;;;;;;;;;;;37668:13:::1;::::0;-1:-1:-1;;;37668:13:0;::::1;;;37667:14;37659:60;;;;-1:-1:-1::0;;;37659:60:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37746:4;37730:20:::0;;-1:-1:-1;;;;37730:20:0::1;-1:-1:-1::0;;;37730:20:0::1;::::0;;37763:4:::1;:12:::0;;-1:-1:-1;;;;;37763:12:0;;::::1;-1:-1:-1::0;;;;;;37763:12:0;;::::1;;::::0;;;37788:3:::1;:10:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;37809:5:::1;:14:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;37834:5:::1;:14:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;37861:3:::1;:10:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;37884:16:::1;:36:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;37931:15:::1;:34:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;37976:13:::1;:30:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;38019:13:::1;:30:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;38060:16:::1;:36:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;38109:10:::1;:24:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;38146:9:::1;:22:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;38179:9:::1;:22:::0;;;;;::::1;::::0;::::1;;::::0;;37223:986::o;43404:2224::-;21266:1;21872:7;;:19;;21864:63;;;;;-1:-1:-1;;;21864:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21864:63:0;;;;;;;;;;;;;;;21266:1;22005:7;:18;;;43728:10:::1;::::0;43783:262;::::1;;;43848:9;::::0;43840:52:::1;::::0;;-1:-1:-1;;;43840:52:0;;-1:-1:-1;;;;;43840:52:0;;::::1;;::::0;::::1;::::0;;;;;;;;;43819:18:::1;::::0;43848:9;;;::::1;::::0;43840:34:::1;::::0;:52;;;;;::::1;::::0;;;;;;;;;43819:18;43848:9;43840:52;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;43840:52:0;43936:9:::1;::::0;43928:52:::1;::::0;;-1:-1:-1;;;43928:52:0;;-1:-1:-1;;;;;43928:52:0;;::::1;;::::0;::::1;::::0;;;;;;;;;43840;;-1:-1:-1;43907:18:0::1;::::0;43936:9;;;::::1;::::0;43928:34:::1;::::0;:52;;;;;43840::::1;::::0;43928;;;;;;;43907:18;43936:9;43928:52;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;43928:52:0;;-1:-1:-1;44007:26:0::1;:10:::0;43928:52;44007:14:::1;:26::i;:::-;43995:38;;43783:262;;;44061:15;:32;;;;;44092:1;44080:9;:13;44061:32;44057:108;;;44138:3;::::0;44110:43:::1;::::0;44120:7;;;;-1:-1:-1;;;;;44138:3:0::1;44143:9:::0;44110::::1;:43::i;:::-;44177:19;44215:17;44211:302;;;44287:16;::::0;44272:66:::1;::::0;;-1:-1:-1;;;44272:66:0;;-1:-1:-1;;;;;44272:66:0;;::::1;;::::0;::::1;::::0;;;;;;;;;44249:20:::1;::::0;44287:16;;;::::1;::::0;44272:48:::1;::::0;:66;;;;;::::1;::::0;;;;;;;;;44249:20;44287:16;44272:66;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;44272:66:0;44391:16:::1;::::0;44376:66:::1;::::0;;-1:-1:-1;;;44376:66:0;;-1:-1:-1;;;;;44376:66:0;;::::1;;::::0;::::1;::::0;;;;;;;;;44272;;-1:-1:-1;44353:20:0::1;::::0;44391:16;;;::::1;::::0;44376:48:::1;::::0;:66;;;;;44272::::1;::::0;44376;;;;;;;44353:20;44391:16;44376:66;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;44376:66:0;;-1:-1:-1;44471:30:0::1;:12:::0;44376:66;44471:16:::1;:30::i;:::-;44457:44;;44211:302;;;44529:17;:36;;;;;44564:1;44550:11;:15;44529:36;44525:116;;;44610:5;::::0;44582:47:::1;::::0;44592:7;;;;-1:-1:-1;;;;;44610:5:0::1;44617:11:::0;44582:9:::1;:47::i;:::-;44657:28;44653:301;;;44739:15;::::0;44724:65:::1;::::0;;-1:-1:-1;;;44724:65:0;;-1:-1:-1;;;;;44724:65:0;;::::1;;::::0;::::1;::::0;;;;;;;;;44702:19:::1;::::0;44739:15;;;::::1;::::0;44724:47:::1;::::0;:65;;;;;::::1;::::0;;;;;;;;;44702:19;44739:15;44724:65;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;44724:65:0;;-1:-1:-1;44808:15:0;;44804:139:::1;;44859:13;::::0;44908:5:::1;::::0;44844:83:::1;::::0;;-1:-1:-1;;;44844:83:0;;-1:-1:-1;;;;;44844:83:0;;::::1;;::::0;::::1;::::0;;;;;;;44908:5;;::::1;44844:83:::0;;;;;;;;;;;;44859:13;;;::::1;::::0;44844:45:::1;::::0;:83;;;;;44859:13:::1;::::0;44844:83;;;;;;;44859:13;;44844:83;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;44804:139;44653:301;;44970:16;44966:655;;;45007:23;45003:607;;;45082:13;::::0;45067:69:::1;::::0;;-1:-1:-1;;;45067:69:0;;-1:-1:-1;;;;;45067:69:0;;::::1;;::::0;::::1;::::0;45130:4:::1;45067:69:::0;;;;;;45051:13:::1;::::0;45082;;;::::1;::::0;45067:45:::1;::::0;:69;;;;;::::1;::::0;;;;;;;;;45051:13;45082;45067:69;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;45067:69:0;45186:13:::1;::::0;45171:69:::1;::::0;;-1:-1:-1;;;45171:69:0;;-1:-1:-1;;;;;45171:69:0;;::::1;;::::0;::::1;::::0;45234:4:::1;45171:69:::0;;;;;;45067;;-1:-1:-1;45155:13:0::1;::::0;45186;;;::::1;::::0;45171:45:::1;::::0;:69;;;;;45067::::1;::::0;45171;;;;;;;45155:13;45186;45171:69;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;45171:69:0;;-1:-1:-1;45261:18:0::1;45282:16;:5:::0;45171:69;45282:9:::1;:16::i;:::-;45323:4;::::0;45317:32:::1;::::0;;-1:-1:-1;;;45317:32:0;;::::1;::::0;::::1;::::0;;;;;45261:37;;-1:-1:-1;;;;;;45323:4:0;;::::1;::::0;45317:20:::1;::::0;:32;;;;;45323:4:::1;::::0;45317:32;;;;;;;;45323:4;;45317:32;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;45370:38:0::1;::::0;-1:-1:-1;;;;;;;;45370:26:0;::::1;45397:10:::0;45370:26:::1;:38::i;:::-;45003:607;;;;;;45464:13;::::0;45449:63:::1;::::0;;-1:-1:-1;;;45449:63:0;;-1:-1:-1;;;;;45449:63:0;;::::1;;::::0;::::1;::::0;;;;;;;;;45464:13;;;::::1;::::0;45449:45:::1;::::0;:63;;;;;::::1;::::0;;;;;;;;45464:13:::1;::::0;45449:63;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;45546:13:0::1;::::0;45531:63:::1;::::0;;-1:-1:-1;;;45531:63:0;;-1:-1:-1;;;;;45531:63:0;;::::1;;::::0;::::1;::::0;;;;;;;;;45546:13;;;::::1;::::0;45531:45:::1;::::0;:63;;;;;45449::::1;::::0;45531;;;;;;;45546:13:::1;::::0;45531:63;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;45003:607:0::1;-1:-1:-1::0;;21222:1:0;22184:7;:22;-1:-1:-1;;;;;;;;43404:2224:0:o;36358:18::-;;;-1:-1:-1;;;;;36358:18:0;;:::o;39449:645::-;39573:7;21266:1;21872:7;;:19;;21864:63;;;;;-1:-1:-1;;;21864:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21864:63:0;;;;;;;;;;;;;;;21266:1;22005:7;:18;39601:11;39593:53:::1;;;::::0;;-1:-1:-1;;;39593:53:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;39593:53:0;;;;;;;;;;;;;::::1;;39730:10;::::0;39718:100:::1;::::0;;-1:-1:-1;;;39718:100:0;;39677:10:::1;39718:100;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;;;;;39718:100:0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;39677:10;;39659:15:::1;::::0;39730:10:::1;::::0;39718:46:::1;::::0;:100;;;;;::::1;::::0;;;;;;;;39659:15;39730:10;39718:100;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;39718:100:0;39844:13:::1;::::0;39893:3:::1;::::0;39829:79:::1;::::0;;-1:-1:-1;;;39829:79:0;;-1:-1:-1;;;;;39829:79:0;;::::1;;::::0;::::1;::::0;;;;;;;39893:3;;::::1;39829:79:::0;;;;;;;;;;;;39718:100;;-1:-1:-1;39844:13:0;::::1;::::0;39829:45:::1;::::0;:79;;;;;39844:13:::1;::::0;39829:79;;;;;;;;39844:13;;39829:79;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;39934:16:0::1;::::0;39986:13:::1;::::0;39919:92:::1;::::0;;-1:-1:-1;;;39919:92:0;;-1:-1:-1;;;;;39919:92:0;;::::1;;::::0;::::1;::::0;;;;;;;39986:13;;::::1;39919:92:::0;;;;;;;;;;;;39934:16;;;::::1;::::0;-1:-1:-1;39919:48:0::1;::::0;-1:-1:-1;39919:92:0;;;;;39934:16:::1;::::0;39919:92;;;;;;;39934:16;;39919:92;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;40029:28:0::1;::::0;;-1:-1:-1;;;;;40029:28:0;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;;;;;;;;;;40029:28:0;-1:-1:-1;40029:28:0;;;;;;;;-1:-1:-1;40029:28:0::1;21222:1:::0;22184:7;:22;40077:9;39449:645;-1:-1:-1;;;;;;39449:645:0:o;36768:24::-;;;-1:-1:-1;;;;;36768:24:0;;:::o;36296:25::-;;;-1:-1:-1;;;36296:25:0;;;;;:::o;36330:19::-;;;-1:-1:-1;;;;;36330:19:0;;:::o;36737:24::-;;;-1:-1:-1;;;;;36737:24:0;;:::o;42289:392::-;21266:1;21872:7;;:19;;21864:63;;;;;-1:-1:-1;;;21864:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21864:63:0;;;;;;;;;;;;;;;21266:1;22005:7;:18;;;42395:13:::1;::::0;42380:63:::1;::::0;;-1:-1:-1;;;42380:63:0;;42357:10:::1;42380:63;::::0;::::1;::::0;;;;;;;;;;;42357:10;;-1:-1:-1;;;;;42395:13:0;;::::1;::::0;42380:45:::1;::::0;:63;;;;;::::1;::::0;;;;;;;;;;;42395:13;42380:63;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;42469:13:0::1;::::0;42454:63:::1;::::0;;-1:-1:-1;;;42454:63:0;;-1:-1:-1;;;;;42454:63:0;;::::1;;::::0;::::1;::::0;;;;;;;;;42469:13;;;::::1;::::0;42454:45:::1;::::0;:63;;;;;42380::::1;::::0;42454;;;;;;;42469:13:::1;::::0;42454:63;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;42545:16:0::1;::::0;42530:66:::1;::::0;;-1:-1:-1;;;42530:66:0;;-1:-1:-1;;;;;42530:66:0;;::::1;;::::0;::::1;::::0;;;;;;;;;42545:16;;;::::1;::::0;42530:48:::1;::::0;:66;;;;;42454:63:::1;::::0;42530:66;;;;;;;42545:16:::1;::::0;42530:66;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;42622:16:0::1;::::0;42607:66:::1;::::0;;-1:-1:-1;;;42607:66:0;;-1:-1:-1;;;;;42607:66:0;;::::1;;::::0;::::1;::::0;;;;;;;;;42622:16;;;::::1;::::0;42607:48:::1;::::0;:66;;;;;42530::::1;::::0;42607;;;;;;;42622:16:::1;::::0;42607:66;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;21222:1:0;22184:7;:22;-1:-1:-1;42289:392:0:o;36573:28::-;;;-1:-1:-1;;;;;36573:28:0;;:::o;40102:741::-;40204:7;21266:1;21872:7;;:19;;21864:63;;;;;-1:-1:-1;;;21864:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21864:63:0;;;;;;;;;;;;;;;21266:1;22005:7;:18;40232:9:::1;40224:57;;;::::0;;-1:-1:-1;;;40224:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;40300:4;;;;;;;;;-1:-1:-1::0;;;;;40300:4:0::1;-1:-1:-1::0;;;;;40294:19:0::1;;40321:9;40294:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;40351:4:0::1;::::0;40365:10:::1;::::0;40344:43:::1;::::0;;-1:-1:-1;;;40344:43:0;;-1:-1:-1;;;;;40365:10:0;;::::1;40344:43;::::0;::::1;::::0;40377:9:::1;40344:43:::0;;;;;;40351:4;;;::::1;::::0;-1:-1:-1;40344:20:0::1;::::0;-1:-1:-1;40344:43:0;;;;;-1:-1:-1;40344:43:0::1;::::0;;;;;;40351:4:::1;::::0;40344:43;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;40471:10:0::1;::::0;40530:4:::1;::::0;40459:106:::1;::::0;;-1:-1:-1;;;40459:106:0;;40514:4:::1;40459:106;::::0;::::1;::::0;40418:10:::1;40459:106:::0;;;;;;-1:-1:-1;;;;;40530:4:0;;::::1;40459:106:::0;;;;40536:9:::1;40459:106:::0;;;;;;;;;;;;;;;;;;40418:10;;40400:15:::1;::::0;40471:10:::1;::::0;40459:46:::1;::::0;:106;;;;;40344:43:::1;::::0;40459:106;;;;;;;;40400:15;40471:10;40459:106;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;40459:106:0;40593:13:::1;::::0;40642:3:::1;::::0;40578:79:::1;::::0;;-1:-1:-1;;;40578:79:0;;-1:-1:-1;;;;;40578:79:0;;::::1;;::::0;::::1;::::0;;;;;;;40642:3;;::::1;40578:79:::0;;;;;;;;;;;;40459:106;;-1:-1:-1;40593:13:0;::::1;::::0;40578:45:::1;::::0;:79;;;;;40593:13:::1;::::0;40578:79;;;;;;;;40593:13;;40578:79;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;40683:16:0::1;::::0;40735:13:::1;::::0;40668:92:::1;::::0;;-1:-1:-1;;;40668:92:0;;-1:-1:-1;;;;;40668:92:0;;::::1;;::::0;::::1;::::0;;;;;;;40735:13;;::::1;40668:92:::0;;;;;;;;;;;;40683:16;;;::::1;::::0;-1:-1:-1;40668:48:0::1;::::0;-1:-1:-1;40668:92:0;;;;;40683:16:::1;::::0;40668:92;;;;;;;40683:16;;40668:92;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;40778:28:0::1;::::0;;-1:-1:-1;;;;;40778:28:0;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;;;;;;;;;;40778:28:0;-1:-1:-1;40778:28:0;;;;;;;;-1:-1:-1;40778:28:0::1;21222:1:::0;22184:7;:22;40826:9;40102:741;-1:-1:-1;;;;40102:741:0:o;38756:157::-;21266:1;21872:7;;:19;;21864:63;;;;;-1:-1:-1;;;21864:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21864:63:0;;;;;;;;;;;;;;;21266:1;22005:7;:18;35967:3:::1;::::0;-1:-1:-1;;;;;35967:3:0::1;35953:10;:17;35945:51;;;::::0;;-1:-1:-1;;;35945:51:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;35945:51:0;;;;;;;;;;;;;::::1;;38892:3:::2;::::0;38860:45:::2;::::0;38870:10:::2;::::0;38882:8;;-1:-1:-1;;;;;38892:3:0::2;38897:7:::0;38860:9:::2;:45::i;42689:247::-:0;21266:1;21872:7;;:19;;21864:63;;;;;-1:-1:-1;;;21864:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21864:63:0;;;;;;;;;;;;;;;21266:1;22005:7;:18;;;42800:16:::1;::::0;42785:66:::1;::::0;;-1:-1:-1;;;42785:66:0;;42762:10:::1;42785:66;::::0;::::1;::::0;;;;;;;;;;;42762:10;;-1:-1:-1;;;;;42800:16:0;;::::1;::::0;42785:48:::1;::::0;:66;;;;;::::1;::::0;;;;;;;;;;;42800:16;42785:66;::::1;;::::0;::::1;;;;::::0;::::1;39316:125:::0;21266:1;21872:7;;:19;;21864:63;;;;;-1:-1:-1;;;21864:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21864:63:0;;;;;;;;;;;;;;;21266:1;22005:7;:18;39412:5:::1;::::0;39388:45:::1;::::0;39400:10:::1;::::0;-1:-1:-1;;;;;39412:5:0::1;39419:7:::0;39412:5;39388:11:::1;:45::i;46236:2254::-:0;21266:1;21872:7;;:19;;21864:63;;;;;-1:-1:-1;;;21864:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21864:63:0;;;;;;;;;;;;;;;21266:1;22005:7;:18;46325:9:::1;::::0;46318:36:::1;::::0;;-1:-1:-1;;;46318:36:0;;-1:-1:-1;;;;;46318:36:0;;::::1;;::::0;::::1;::::0;;;46325:9;;;::::1;::::0;46318:27:::1;::::0;:36;;;;;::::1;::::0;;;;;;;;46325:9;46318:36;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;46318:36:0;:41;46310:92:::1;;;;-1:-1:-1::0;;;46310:92:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46428:9;::::0;46421:36:::1;::::0;;-1:-1:-1;;;46421:36:0;;-1:-1:-1;;;;;46421:36:0;;::::1;;::::0;::::1;::::0;;;46428:9;;;::::1;::::0;46421:27:::1;::::0;:36;;;;;::::1;::::0;;;;;;;;46428:9;46421:36;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;46421:36:0;:41;46413:92:::1;;;;-1:-1:-1::0;;;46413:92:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;46566:25:0;;::::1;46518:16;46566:25:::0;;;:16:::1;:25;::::0;;;;;46537:10:::1;::::0;46566:25:::1;:37:::0;::::1;46558:86;;;;-1:-1:-1::0;;;46558:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;46662:25:0;::::1;;::::0;;;:16:::1;:25;::::0;;;;46655:32;;-1:-1:-1;;;;;;46655:32:0::1;::::0;;46700:27:::1;46718:8:::0;46700:17:::1;:27::i;:::-;46738:18;46748:7;46738:9;:18::i;:::-;46804:16;::::0;46847:3:::1;::::0;46789:62:::1;::::0;;-1:-1:-1;;;46789:62:0;;-1:-1:-1;;;;;46789:62:0;;::::1;;::::0;::::1;::::0;46847:3;;::::1;46789:62:::0;;;;;;46769:17:::1;::::0;46804:16;;;::::1;::::0;46789:48:::1;::::0;:62;;;;;::::1;::::0;;;;;;;;;46804:16;46789:62;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;46789:62:0;;-1:-1:-1;46866:13:0;;46862:148:::1;;46917:3;::::0;46896:43:::1;::::0;46908:7;;-1:-1:-1;;;;;46917:3:0::1;46922:9:::0;46917:3:::1;46896:11;:43::i;:::-;46983:3;::::0;46954:44:::1;::::0;46964:7;;46973:8;;-1:-1:-1;;;;;46983:3:0::1;46988:9:::0;46954::::1;:44::i;:::-;47059:16;::::0;47102:5:::1;::::0;;47044:64:::1;::::0;;-1:-1:-1;;;47044:64:0;;-1:-1:-1;;;;;47044:64:0;;::::1;::::0;;::::1;::::0;;;;47102:5;;::::1;47044:64:::0;;;;;47022:19:::1;::::0;47059:16;;;::::1;::::0;47044:48:::1;::::0;:64;;;;;::::1;::::0;;;;;;;;;47059:16;47044:64;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;47044:64:0;;-1:-1:-1;47123:15:0;;47119:158:::1;;47176:5;::::0;47155:47:::1;::::0;47167:7;;-1:-1:-1;;;;;47176:5:0::1;47183:11:::0;47176:5:::1;47155:11;:47::i;:::-;47246:5;::::0;47217:48:::1;::::0;47227:7;;47236:8;;-1:-1:-1;;;;;47246:5:0::1;47253:11:::0;47217:9:::1;:48::i;:::-;47326:13;::::0;47366:5:::1;::::0;47311:61:::1;::::0;;-1:-1:-1;;;47311:61:0;;-1:-1:-1;;;;;47311:61:0;;::::1;;::::0;::::1;::::0;47366:5;;::::1;47311:61:::0;;;;;;47289:19:::1;::::0;47326:13;;;::::1;::::0;47311:45:::1;::::0;:61;;;;;::::1;::::0;;;;;;;;;47326:13;47311:61;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;47311:61:0;;-1:-1:-1;47387:15:0;;47383:232:::1;;47434:13;::::0;47476:5:::1;::::0;47419:85:::1;::::0;;-1:-1:-1;;;47419:85:0;;-1:-1:-1;;;;;47419:85:0;;::::1;;::::0;::::1;::::0;;;47476:5;;::::1;47419:85:::0;;;;;;;;;;;;;;;;;;;47434:13;;;::::1;::::0;47419:47:::1;::::0;:85;;;;;47434:13:::1;::::0;47419:85;;;;;;;47434:13;;47419:85;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;47534:13:0::1;::::0;47584:5:::1;::::0;47519:84:::1;::::0;;-1:-1:-1;;;47519:84:0;;-1:-1:-1;;;;;47519:84:0;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;47584:5;;::::1;47519:84:::0;;;;;;;;;;;;47534:13;;;::::1;::::0;-1:-1:-1;47519:45:0::1;::::0;-1:-1:-1;47519:84:0;;;;;47534:13:::1;::::0;47519:84;;;;;;;47534:13;;47519:84;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;47383:232;47627:20;47657:5;;;;;;;;;-1:-1:-1::0;;;;;47657:5:0::1;-1:-1:-1::0;;;;;47650:23:0::1;;47674:7;47650:32;;;;;;;;;;;;;-1:-1:-1::0;;;;;47650:32:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;47650:32:0;;-1:-1:-1;47697:16:0;;47693:108:::1;;47737:5;::::0;;47730:59:::1;::::0;;-1:-1:-1;;;47730:59:0;;-1:-1:-1;;;;;47730:59:0;;::::1;::::0;;::::1;::::0;;;;;;::::1;::::0;;;;;;;;;;;;47737:5;;;::::1;::::0;47730:26:::1;::::0;:59;;;;;::::1;::::0;;;;;;;;;47737:5:::1;::::0;47730:59;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;47693:108:0::1;47848:13;::::0;47888:3:::1;::::0;47833:59:::1;::::0;;-1:-1:-1;;;47833:59:0;;-1:-1:-1;;;;;47833:59:0;;::::1;;::::0;::::1;::::0;47888:3;;::::1;47833:59:::0;;;;;;47813:17:::1;::::0;47848:13;;;::::1;::::0;47833:45:::1;::::0;:59;;;;;::::1;::::0;;;;;;;;;47848:13;47833:59;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;47833:59:0;;-1:-1:-1;47907:13:0;;47903:442:::1;;47952:16;::::0;47997:13:::1;::::0;47937:94:::1;::::0;;-1:-1:-1;;;47937:94:0;;-1:-1:-1;;;;;47937:94:0;;::::1;;::::0;::::1;::::0;;;47997:13;;::::1;47937:94:::0;;;;;;;;;;;;;;;;;;;47952:16;;;::::1;::::0;47937:50:::1;::::0;:94;;;;;47952:16:::1;::::0;47937:94;;;;;;;47952:16;;47937:94;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;48061:13:0::1;::::0;48103:3:::1;::::0;48046:81:::1;::::0;;-1:-1:-1;;;48046:81:0;;-1:-1:-1;;;;;48046:81:0;;::::1;;::::0;::::1;::::0;;;48103:3;;::::1;48046:81:::0;;;;;;;;;;;;;;;;;;;48061:13;;;::::1;::::0;-1:-1:-1;48046:47:0::1;::::0;-1:-1:-1;48046:81:0;;;;;48061:13:::1;::::0;48046:81;;;;;;;48061:13;;48046:81;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;48159:13:0::1;::::0;48209:3:::1;::::0;48144:80:::1;::::0;;-1:-1:-1;;;48144:80:0;;-1:-1:-1;;;;;48144:80:0;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;48209:3;;::::1;48144:80:::0;;;;;;;;;;;;48159:13;;;::::1;::::0;-1:-1:-1;48144:45:0::1;::::0;-1:-1:-1;48144:80:0;;;;;48159:13:::1;::::0;48144:80;;;;;;;48159:13;;48144:80;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;48254:16:0::1;::::0;48308:13:::1;::::0;48239:94:::1;::::0;;-1:-1:-1;;;48239:94:0;;-1:-1:-1;;;;;48239:94:0;;::::1;;::::0;::::1;::::0;;;;;;;48308:13;;::::1;48239:94:::0;;;;;;;;;;;;48254:16;;;::::1;::::0;-1:-1:-1;48239:48:0::1;::::0;-1:-1:-1;48239:94:0;;;;;48254:16:::1;::::0;48239:94;;;;;;;48254:16;;48239:94;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;47903:442;48365:9;::::0;48357:57:::1;::::0;;-1:-1:-1;;;48357:57:0;;-1:-1:-1;;;;;48357:57:0;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;;;48365:9;;;::::1;::::0;48357:38:::1;::::0;:57;;;;;48365:9:::1;::::0;48357:57;;;;;;;48365:9;;48357:57;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;48433:9:0::1;::::0;48425:57:::1;::::0;;-1:-1:-1;;;48425:57:0;;-1:-1:-1;;;;;48425:57:0;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;;;48433:9;;;::::1;::::0;-1:-1:-1;48425:38:0::1;::::0;-1:-1:-1;48425:57:0;;;;;48433:9:::1;::::0;48425:57;;;;;;;48433:9;;48425:57;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;21222:1:0;22184:7;:22;-1:-1:-1;;;;;;;;;46236:2254:0:o;36383:20::-;;;-1:-1:-1;;;;;36383:20:0;;:::o;36439:18::-;;;-1:-1:-1;;;;;36439:18:0;;:::o;41531:750::-;41658:7;21266:1;21872:7;;:19;;21864:63;;;;;-1:-1:-1;;;21864:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21864:63:0;;;;;;;;;;;;;;;21266:1;22005:7;:18;41686:14;41678:59:::1;;;::::0;;-1:-1:-1;;;41678:59:0;;::::1;;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;41678:59:0;;;;;;;;;;;;;::::1;;41804:16;::::0;41849:13:::1;::::0;41789:95:::1;::::0;;-1:-1:-1;;;41789:95:0;;41768:10:::1;41789:95;::::0;::::1;::::0;;;-1:-1:-1;;;;;41849:13:0;;::::1;41789:95:::0;;;;;;;;;;;;;;;;;;41768:10;;41804:16;;;::::1;::::0;41789:50:::1;::::0;:95;;;;;41750:15:::1;::::0;41789:95;;;;;;;41750:15;41804:16;41789:95;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;41910:13:0::1;::::0;41952:3:::1;::::0;41895:82:::1;::::0;;-1:-1:-1;;;41895:82:0;;-1:-1:-1;;;;;41895:82:0;;::::1;;::::0;::::1;::::0;;;41952:3;;::::1;41895:82:::0;;;;;;;;;;;;;;;;;;;41910:13;;;::::1;::::0;-1:-1:-1;41895:47:0::1;::::0;-1:-1:-1;41895:82:0;;;;;41910:13:::1;::::0;41895:82;;;;;;;41910:13;;41895:82;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;42020:10:0::1;::::0;42067:4:::1;::::0;42008:100:::1;::::0;;-1:-1:-1;;;42008:100:0;;-1:-1:-1;;;;;42008:100:0;;::::1;;::::0;::::1;::::0;42067:4;;::::1;42008:100:::0;;;;;;;;;;;;;;;;42102:4:::1;42008:100:::0;;;;;;41988:17:::1;::::0;-1:-1:-1;42020:10:0;;;::::1;::::0;-1:-1:-1;42008:49:0::1;::::0;:100;;;;;::::1;::::0;;;;;;;;;41988:17;42020:10;42008:100;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;42008:100:0;42127:4:::1;::::0;42121:31:::1;::::0;;-1:-1:-1;;;42121:31:0;;::::1;::::0;::::1;::::0;;;;;42008:100;;-1:-1:-1;;;;;;42127:4:0;;::::1;::::0;42121:20:::1;::::0;:31;;;;;42127:4:::1;::::0;42121:31;;;;;;;;42127:4;;42121:31;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;42165:30:0::1;::::0;-1:-1:-1;;;;;;;;42165:19:0;::::1;42185:9:::0;42165:19:::1;:30::i;:::-;42213:31;::::0;;-1:-1:-1;;;;;42213:31:0;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;;;;;;;;;;42213:31:0;;;;;;;;;::::1;21222:1:::0;22184:7;:22;42264:9;41531:750;-1:-1:-1;;;;;41531:750:0:o;36610:40::-;;;-1:-1:-1;;;;;36610:40:0;;:::o;36024:76::-;35967:3;;-1:-1:-1;;;;;35967:3:0;35953:10;:17;35945:51;;;;;-1:-1:-1;;;35945:51:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;35945:51:0;;;;;;;;;;;;;;;36082:3:::1;:10:::0;;-1:-1:-1;;;;;;36082:10:0::1;-1:-1:-1::0;;;;;36082:10:0;;;::::1;::::0;;;::::1;::::0;;36024:76::o;42944:240::-;21266:1;21872:7;;:19;;21864:63;;;;;-1:-1:-1;;;21864:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21864:63:0;;;;;;;;;;;;;;;21266:1;22005:7;:18;;;43054:13:::1;::::0;43039:63:::1;::::0;;-1:-1:-1;;;43039:63:0;;43016:10:::1;43039:63;::::0;::::1;::::0;;;;;;;;;;;43016:10;;-1:-1:-1;;;;;43054:13:0;;::::1;::::0;43039:45:::1;::::0;:63;;;;;::::1;::::0;;;;;;;;;;;43054:13;43039:63;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;43128:13:0::1;::::0;43113:63:::1;::::0;;-1:-1:-1;;;43113:63:0;;-1:-1:-1;;;;;43113:63:0;;::::1;;::::0;::::1;::::0;;;;;;;;;43128:13;;;::::1;::::0;43113:45:::1;::::0;:63;;;;;43039::::1;::::0;43113;;;;;;;43128:13:::1;::::0;43113:63;::::1;;::::0;::::1;;;;::::0;::::1;36410:20:::0;;;-1:-1:-1;;;;;36410:20:0;;:::o;36801:52::-;;;;;;;;;;;;-1:-1:-1;;;;;36801:52:0;;:::o;36657:37::-;;;-1:-1:-1;;;;;36657:37:0;;:::o;39052:127::-;21266:1;21872:7;;:19;;21864:63;;;;;-1:-1:-1;;;21864:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21864:63:0;;;;;;;;;;;;;;;21266:1;22005:7;:18;39156:5:::1;::::0;39122:49:::1;::::0;39132:10:::1;::::0;;;-1:-1:-1;;;;;39156:5:0::1;39163:7:::0;39122:9:::1;:49::i;45851:377::-:0;21266:1;21872:7;;:19;;21864:63;;;;;-1:-1:-1;;;21864:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21864:63:0;;;;;;;;;;;;;;;21266:1;22005:7;:18;45942:9:::1;::::0;45935:39:::1;::::0;;-1:-1:-1;;;45935:39:0;;45963:10:::1;45935:39;::::0;::::1;::::0;;;-1:-1:-1;;;;;45942:9:0;;::::1;::::0;45935:27:::1;::::0;:39;;;;;::::1;::::0;;;;;;;;;45942:9;45935:39;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;45935:39:0;:44;45927:95:::1;;;;-1:-1:-1::0;;;45927:95:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46048:9;::::0;46041:39:::1;::::0;;-1:-1:-1;;;46041:39:0;;46069:10:::1;46041:39;::::0;::::1;::::0;;;-1:-1:-1;;;;;46048:9:0;;::::1;::::0;46041:27:::1;::::0;:39;;;;;::::1;::::0;;;;;;;;;46048:9;46041:39;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;46041:39:0;:44;46033:95:::1;;;;-1:-1:-1::0;;;46033:95:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46141:28;46159:9;46141:17;:28::i;:::-;46197:10;46180:28;::::0;;;:16:::1;:28;::::0;;;;:40;;-1:-1:-1;;;;;;46180:40:0::1;-1:-1:-1::0;;;;;46180:40:0;;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;22184:22:0;;45851:377::o;38921:123::-;21266:1;21872:7;;:19;;21864:63;;;;;-1:-1:-1;;;21864:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21864:63:0;;;;;;;;;;;;;;;21266:1;22005:7;:18;39023:3:::1;::::0;38989:47:::1;::::0;38999:10:::1;::::0;;;-1:-1:-1;;;;;39023:3:0::1;39028:7:::0;38989:9:::1;:47::i;43192:82::-:0;21266:1;21872:7;;:19;;21864:63;;;;;-1:-1:-1;;;21864:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21864:63:0;;;;;;;;;;;;;;;21266:1;22005:7;:18;43245:21:::1;43255:10;43245:9;:21::i;:::-;21222:1:::0;22184:7;:22;43192:82::o;36703:25::-;;;-1:-1:-1;;;;;36703:25:0;;:::o;16549:177::-;16659:58;;;-1:-1:-1;;;;;16659:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16659:58:0;-1:-1:-1;;;16659:58:0;;;16632:86;;16652:5;;16632:19;:86::i;52261:1348::-;52395:1;52385:7;:11;52377:53;;;;;-1:-1:-1;;;52377:53:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;52377:53:0;;;;;;;;;;;;;;;52476:16;;52461:56;;;-1:-1:-1;;;52461:56:0;;-1:-1:-1;;;;;52461:56:0;;;;;;;;;52443:15;;52476:16;;;;;52461:46;;:56;;;;;;;;;;;;;;;52476:16;52461:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52461:56:0;52545:13;;52588:15;;52530:93;;;-1:-1:-1;;;52530:93:0;;-1:-1:-1;;;;;52530:93:0;;;;;;;;;52588:15;;;52530:93;;;;;;;;;;;;;;;;;;;52461:56;;-1:-1:-1;52545:13:0;;;52530:47;;:93;;;;;52545:13;;52530:93;;;;;;;;52545:13;;52530:93;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52649:15:0;;52694:16;;52634:96;;;-1:-1:-1;;;52634:96:0;;-1:-1:-1;;;;;52634:96:0;;;;;;;;;52694:16;;;52634:96;;;;;;;;;;;;;;;;;;;52649:15;;;;;-1:-1:-1;52634:49:0;;-1:-1:-1;52634:96:0;;;;;52649:15;;52634:96;;;;;;;52649:15;;52634:96;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52756:16:0;;52741:87;;;-1:-1:-1;;;52741:87:0;;-1:-1:-1;;;;;52741:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;52756:16;;;;;-1:-1:-1;52741:50:0;;-1:-1:-1;52741:87:0;;;;;52756:16;;52741:87;;;;;;;52756:16;;52741:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52845:18;52841:706;;;52917:15;;52902:67;;;-1:-1:-1;;;52902:67:0;;-1:-1:-1;;;;;52902:67:0;;;;;;;;;;;;;;;52880:19;;52917:15;;;;;52902:47;;:67;;;;;;;;;;;;;;;52880:19;52917:15;52902:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52902:67:0;;-1:-1:-1;52988:15:0;;52984:141;;53039:13;;53090:5;;53024:85;;;-1:-1:-1;;;53024:85:0;;-1:-1:-1;;;;;53024:85:0;;;;;;;;;;;;;53090:5;;;53024:85;;;;;;;;;;;;53039:13;;;;;53024:45;;:85;;;;;53039:13;;53024:85;;;;;;;53039:13;;53024:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52984:141;53178:13;;53219:5;;53163:62;;;-1:-1:-1;;;53163:62:0;;-1:-1:-1;;;;;53163:62:0;;;;;;;53219:5;;;53163:62;;;;;;53141:19;;53178:13;;;;;53163:45;;:62;;;;;;;;;;;;;;;53178:13;53163:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53163:62:0;;-1:-1:-1;53244:15:0;;53240:296;;53280:23;53306:37;53335:7;53306:24;:11;53322:7;53306:15;:24::i;:::-;:28;;:37::i;:::-;53377:13;;53420:5;;53362:91;;;-1:-1:-1;;;53362:91:0;;-1:-1:-1;;;;;53362:91:0;;;;;;;;;53420:5;;;53362:91;;;;;;;;;;;;;;;;;;;53280:63;;-1:-1:-1;53377:13:0;;;53362:47;;:91;;;;;53377:13;;53362:91;;;;;;;;53377:13;;53362:91;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;53482:5:0;;53472:48;;;-1:-1:-1;;;53472:48:0;;-1:-1:-1;;;;;53472:48:0;;;;;;;;;;;;;;;53482:5;;;;;-1:-1:-1;53472:21:0;;-1:-1:-1;53472:48:0;;;;;53482:5;;53472:48;;;;;;;53482:5;;53472:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53240:296;;52841:706;;;53564:37;;;-1:-1:-1;;;;;53564:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;52261:1348;;;;;:::o;51713:540::-;51845:1;51835:7;:11;51827:53;;;;;-1:-1:-1;;;51827:53:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;51827:53:0;;;;;;;;;;;;;;;51908:16;;51893:92;;;-1:-1:-1;;;51893:92:0;;-1:-1:-1;;;;;51893:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51908:16;;;;;51893:48;;:92;;;;;51908:16;;51893:92;;;;;;;51908:16;;51893:92;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52011:15:0;;52064:16;;51996:94;;;-1:-1:-1;;;51996:94:0;;-1:-1:-1;;;;;51996:94:0;;;;;;;;;;;;;52064:16;;;51996:94;;;;;;;;;;;;52011:15;;;;;-1:-1:-1;51996:47:0;;-1:-1:-1;51996:94:0;;;;;52011:15;;51996:94;;;;;;;52011:15;;51996:94;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52116:13:0;;52167:15;;52101:91;;;-1:-1:-1;;;52101:91:0;;-1:-1:-1;;;;;52101:91:0;;;;;;;;;;;;;52167:15;;;52101:91;;;;;;;;;;;;52116:13;;;;;-1:-1:-1;52101:45:0;;-1:-1:-1;52101:91:0;;;;;52116:13;;52101:91;;;;;;;52116:13;;52101:91;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52210:35:0;;;-1:-1:-1;;;;;52210:35:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52210:35:0;;;;;;;-1:-1:-1;52210:35:0;51713:540;;;;:::o;50797:119::-;50853:22;50866:8;50853:12;:22::i;:::-;50886;50899:8;50886:12;:22::i;:::-;50797:119;:::o;871:181::-;929:7;961:5;;;985:6;;;;977:46;;;;;-1:-1:-1;;;977:46:0;;;;;;;;;;;;-1:-1:-1;;;977:46:0;;;;;;;;;;;;;;;1043:1;-1:-1:-1;871:181:0;;;;;:::o;10086:397::-;10201:6;10176:21;:31;;10168:73;;;;;-1:-1:-1;;;10168:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10351:35;;10333:12;;-1:-1:-1;;;;;10351:14:0;;;10374:6;;10333:12;10351:35;10333:12;10351:35;10374:6;10351:14;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10332:54;;;10405:7;10397:78;;;;-1:-1:-1;;;10397:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48498:2291;48591:16;;48576:64;;;-1:-1:-1;;;48576:64:0;;-1:-1:-1;;;;;48576:64:0;;;;;;;;;48591:16;;;;;48576:53;;:64;;;;;;;;;;;;;;48591:16;48576:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48576:64:0;:69;48568:137;;;;-1:-1:-1;;;48568:137:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48739:16;;48724:61;;;-1:-1:-1;;;48724:61:0;;-1:-1:-1;;;;;48724:61:0;;;;;;;;;48739:16;;;;;48724:50;;:61;;;;;;;;;;;;;;48739:16;48724:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48724:61:0;:66;48716:131;;;;-1:-1:-1;;;48716:131:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48883:15;;48868:63;;;-1:-1:-1;;;48868:63:0;;-1:-1:-1;;;;;48868:63:0;;;;;;;;;48883:15;;;;;48868:52;;:63;;;;;;;;;;;;;;48883:15;48868:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48868:63:0;:68;48860:135;;;;-1:-1:-1;;;48860:135:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49029:15;;49014:60;;;-1:-1:-1;;;49014:60:0;;-1:-1:-1;;;;;49014:60:0;;;;;;;;;49029:15;;;;;49014:49;;:60;;;;;;;;;;;;;;49029:15;49014:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49014:60:0;:65;49006:129;;;;-1:-1:-1;;;49006:129:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49171:13;;49156:61;;;-1:-1:-1;;;49156:61:0;;-1:-1:-1;;;;;49156:61:0;;;;;;;;;49171:13;;;;;49156:50;;:61;;;;;;;;;;;;;;49171:13;49156:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49156:61:0;:66;49148:131;;;;-1:-1:-1;;;49148:131:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49313:13;;49298:58;;;-1:-1:-1;;;49298:58:0;;-1:-1:-1;;;;;49298:58:0;;;;;;;;;49313:13;;;;;49298:47;;:58;;;;;;;;;;;;;;49313:13;49298:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49298:58:0;:63;49290:125;;;;-1:-1:-1;;;49290:125:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49444:9;;49436:61;;;-1:-1:-1;;;49436:61:0;;-1:-1:-1;;;;;49436:61:0;;;;;;;;;49444:9;;;;;49436:50;;:61;;;;;;;;;;;;;;49444:9;49436:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49436:61:0;:66;49428:138;;;;-1:-1:-1;;;49428:138:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49593:9;;49585:58;;;-1:-1:-1;;;49585:58:0;;-1:-1:-1;;;;;49585:58:0;;;;;;;;;49593:9;;;;;49585:47;;:58;;;;;;;;;;;;;;49593:9;49585:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49585:58:0;:63;49577:132;;;;-1:-1:-1;;;49577:132:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49745:16;;49730:64;;;-1:-1:-1;;;49730:64:0;;-1:-1:-1;;;;;49730:64:0;;;;;;;;;49745:16;;;;;49730:53;;:64;;;;;;;;;;;;;;49745:16;49730:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49730:64:0;:69;49722:137;;;;-1:-1:-1;;;49722:137:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49893:16;;49878:61;;;-1:-1:-1;;;49878:61:0;;-1:-1:-1;;;;;49878:61:0;;;;;;;;;49893:16;;;;;49878:50;;:61;;;;;;;;;;;;;;49893:16;49878:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49878:61:0;:66;49870:131;;;;-1:-1:-1;;;49870:131:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50037:13;;50022:61;;;-1:-1:-1;;;50022:61:0;;-1:-1:-1;;;;;50022:61:0;;;;;;;;;50037:13;;;;;50022:50;;:61;;;;;;;;;;;;;;50037:13;50022:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50022:61:0;:66;50014:131;;;;-1:-1:-1;;;50014:131:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50179:13;;50164:58;;;-1:-1:-1;;;50164:58:0;;-1:-1:-1;;;;;50164:58:0;;;;;;;;;50179:13;;;;;50164:47;;:58;;;;;;;;;;;;;;50179:13;50164:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50164:58:0;:63;50156:125;;;;-1:-1:-1;;;50156:125:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50310:9;;50302:61;;;-1:-1:-1;;;50302:61:0;;-1:-1:-1;;;;;50302:61:0;;;;;;;;;50310:9;;;;;50302:50;;:61;;;;;;;;;;;;;;50310:9;50302:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50302:61:0;:66;50294:138;;;;-1:-1:-1;;;50294:138:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50459:9;;50451:58;;;-1:-1:-1;;;50451:58:0;;-1:-1:-1;;;;;50451:58:0;;;;;;;;;50459:9;;;;;50451:47;;:58;;;;;;;;;;;;;;50459:9;50451:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50451:58:0;:63;50443:132;;;;-1:-1:-1;;;50443:132:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50603:9;;50596:38;;;-1:-1:-1;;;50596:38:0;;-1:-1:-1;;;;;50596:38:0;;;;;;;;;50603:9;;;;;50596:27;;:38;;;;;;;;;;;;;;50603:9;50596:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50596:38:0;:43;50588:91;;;;-1:-1:-1;;;50588:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50705:9;;50698:38;;;-1:-1:-1;;;50698:38:0;;-1:-1:-1;;;;;50698:38:0;;;;;;;;;50705:9;;;;;50698:27;;:38;;;;;;;;;;;;;;50705:9;50698:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50698:38:0;:43;50690:91;;;;-1:-1:-1;;;50690:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18854:761;19278:23;19304:69;19332:4;19304:69;;;;;;;;;;;;;;;;;19312:5;-1:-1:-1;;;;;19304:27:0;;;:69;;;;;:::i;:::-;19388:17;;19278:95;;-1:-1:-1;19388:21:0;19384:224;;19530:10;19519:30;;;;;;;;;;;;;;;-1:-1:-1;19519:30:0;19511:85;;;;-1:-1:-1;;;19511:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2225:471;2283:7;2528:6;2524:47;;-1:-1:-1;2558:1:0;2551:8;;2524:47;2595:5;;;2599:1;2595;:5;:1;2619:5;;;;;:10;2611:56;;;;-1:-1:-1;;;2611:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3172:132;3230:7;3257:39;3261:1;3264;3257:39;;;;;;;;;;;;;-1:-1:-1;;;3257:39:0;;;:3;:39::i;50924:509::-;51020:16;;51005:68;;;-1:-1:-1;;;51005:68:0;;-1:-1:-1;;;;;51005:68:0;;;;;;;;;;;;;;;50983:19;;51020:16;;;;;51005:48;;:68;;;;;;;;;;;;;;;50983:19;51020:16;51005:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51005:68:0;;-1:-1:-1;51088:15:0;;51084:97;;51150:5;;51120:49;;51130:8;;;;-1:-1:-1;;;;;51150:5:0;51157:11;51120:9;:49::i;:::-;51230:15;;51215:67;;;-1:-1:-1;;;51215:67:0;;-1:-1:-1;;;;;51215:67:0;;;;;;;;;;;;;;;51193:19;;51230:15;;;;;51215:47;;:67;;;;;;;;;;;;;;;51193:19;51230:15;51215:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51215:67:0;;-1:-1:-1;51297:15:0;;51293:133;;51344:13;;51395:5;;51329:85;;;-1:-1:-1;;;51329:85:0;;-1:-1:-1;;;;;51329:85:0;;;;;;;;;;;;;51395:5;;;51329:85;;;;;;;;;;;;51344:13;;;;;51329:45;;:85;;;;;51344:13;;51329:85;;;;;;;51344:13;;51329:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50924:509;;;:::o;51441:264::-;51537:16;;51522:68;;;-1:-1:-1;;;51522:68:0;;-1:-1:-1;;;;;51522:68:0;;;;;;;;;;;;;;;51500:19;;51537:16;;;;;51522:48;;:68;;;;;;;;;;;;;;;51500:19;51537:16;51522:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51522:68:0;;-1:-1:-1;51605:15:0;;51601:97;;51667:5;;51637:49;;51647:8;;;;-1:-1:-1;;;;;51667:5:0;51674:11;51637:9;:49::i;:::-;51441:264;;:::o;11647:195::-;11750:12;11782:52;11804:6;11812:4;11818:1;11821:12;11782:21;:52::i;:::-;11775:59;;11647:195;;;;;;:::o;3800:278::-;3886:7;3921:12;3914:5;3906:28;;;;-1:-1:-1;;;3906:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3945:9;3961:1;3957;:5;;;;;;;3800:278;-1:-1:-1;;;;;3800:278:0:o;12699:530::-;12826:12;12884:5;12859:21;:30;;12851:81;;;;-1:-1:-1;;;12851:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12951:18;12962:6;12951:10;:18::i;:::-;12943:60;;;;;-1:-1:-1;;;12943:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13077:12;13091:23;13118:6;-1:-1:-1;;;;;13118:11:0;13138:5;13146:4;13118:33;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;13118:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13076:75;;;;13169:52;13187:7;13196:10;13208:12;13169:17;:52::i;:::-;13162:59;12699:530;-1:-1:-1;;;;;;;12699:530:0:o;8729:422::-;9096:20;9135:8;;;8729:422::o;15239:742::-;15354:12;15383:7;15379:595;;;-1:-1:-1;15414:10:0;15407:17;;15379:595;15528:17;;:21;15524:439;;15791:10;15785:17;15852:15;15839:10;15835:2;15831:19;15824:44;15739:148;15927:20;;-1:-1:-1;;;15927:20:0;;;;;;;;;;;;;;;;;15934:12;;15927:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

ipfs://22d2dc2472894765a18f60a06f0934fd0515dead610d7ab00c5425a37710f682
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Validator ID :
0 FTM

Amount Staked
0

Amount Delegated
0

Staking Total
0

Staking Start Epoch
0

Staking Start Time
0

Proof of Importance
0

Origination Score
0

Validation Score
0

Active
0

Online
0

Downtime
0 s
Address Amount claimed Rewards Created On Epoch Created On
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.