ETH Price: $3,352.52 (+0.54%)

Opium Network Position Token (ONP)
 

Overview

TokenID

1140414594515114468802072032663029938490...

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
TokenID: 1140414594515114468802072032663029938490...
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x419aa1B7...BF6bD4308
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
TokenMinter

Compiler Version
v0.5.16+commit.9c3226ce

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-02-25
*/

/**

  Source code of Opium Protocol
  Web https://opium.network
  Telegram https://t.me/opium_network
  Twitter https://twitter.com/opium_network

 */

// File: LICENSE

/**

The software and documentation available in this repository (the "Software") is protected by copyright law and accessible pursuant to the license set forth below. Copyright © 2020 Blockeys BV. All rights reserved.

Permission is hereby granted, free of charge, to any person or organization obtaining the Software (the “Licensee”) to privately study, review, and analyze the Software. Licensee shall not use the Software for any other purpose. Licensee shall not modify, transfer, assign, share, or sub-license the Software or any derivative works of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/

// File: openzeppelin-solidity/contracts/token/ERC721/IERC721Receiver.sol

pragma solidity ^0.5.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
contract IERC721Receiver {
    /**
     * @notice Handle the receipt of an NFT
     * @dev The ERC721 smart contract calls this function on the recipient
     * after a {IERC721-safeTransferFrom}. This function MUST return the function selector,
     * otherwise the caller will revert the transaction. The selector to be
     * returned can be obtained as `this.onERC721Received.selector`. This
     * function MAY throw to revert and reject the transfer.
     * Note: the ERC721 contract address is always the message sender.
     * @param operator The address which called `safeTransferFrom` function
     * @param from The address which previously owned the token
     * @param tokenId The NFT identifier which is being transferred
     * @param data Additional data with no specified format
     * @return bytes4 `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
     */
    function onERC721Received(address operator, address from, uint256 tokenId, bytes memory data)
    public returns (bytes4);
}

// File: openzeppelin-solidity/contracts/math/SafeMath.sol

pragma solidity ^0.5.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, 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.
     *
     * _Available since v2.4.0._
     */
    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.
     *
     * _Available since v2.4.0._
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        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.
     *
     * _Available since v2.4.0._
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

// File: erc721o/contracts/Libs/UintArray.sol

pragma solidity ^0.5.4;

library UintArray {
  function indexOf(uint256[] memory A, uint256 a) internal pure returns (uint256, bool) {
    uint256 length = A.length;
    for (uint256 i = 0; i < length; i++) {
      if (A[i] == a) {
        return (i, true);
      }
    }
    return (0, false);
  }

  function contains(uint256[] memory A, uint256 a) internal pure returns (bool) {
    (, bool isIn) = indexOf(A, a);
    return isIn;
  }

  function difference(uint256[] memory A, uint256[] memory B) internal pure returns (uint256[] memory, uint256[] memory) {
    uint256 length = A.length;
    bool[] memory includeMap = new bool[](length);
    uint256 count = 0;
    // First count the new length because can't push for in-memory arrays
    for (uint256 i = 0; i < length; i++) {
      uint256 e = A[i];
      if (!contains(B, e)) {
        includeMap[i] = true;
        count++;
      }
    }
    uint256[] memory newUints = new uint256[](count);
    uint256[] memory newUintsIdxs = new uint256[](count);
    uint256 j = 0;
    for (uint256 i = 0; i < length; i++) {
      if (includeMap[i]) {
        newUints[j] = A[i];
        newUintsIdxs[j] = i;
        j++;
      }
    }
    return (newUints, newUintsIdxs);
  }

  function intersect(uint256[] memory A, uint256[] memory B) internal pure returns (uint256[] memory, uint256[] memory, uint256[] memory) {
    uint256 length = A.length;
    bool[] memory includeMap = new bool[](length);
    uint256 newLength = 0;
    for (uint256 i = 0; i < length; i++) {
      if (contains(B, A[i])) {
        includeMap[i] = true;
        newLength++;
      }
    }
    uint256[] memory newUints = new uint256[](newLength);
    uint256[] memory newUintsAIdxs = new uint256[](newLength);
    uint256[] memory newUintsBIdxs = new uint256[](newLength);
    uint256 j = 0;
    for (uint256 i = 0; i < length; i++) {
      if (includeMap[i]) {
        newUints[j] = A[i];
        newUintsAIdxs[j] = i;
        (newUintsBIdxs[j], ) = indexOf(B, A[i]);
        j++;
      }
    }
    return (newUints, newUintsAIdxs, newUintsBIdxs);
  }

  function isUnique(uint256[] memory A) internal pure returns (bool) {
    uint256 length = A.length;

    for (uint256 i = 0; i < length; i++) {
      (uint256 idx, bool isIn) = indexOf(A, A[i]);

      if (isIn && idx < i) {
        return false;
      }
    }

    return true;
  }
}

// File: openzeppelin-solidity/contracts/utils/Address.sol

pragma solidity ^0.5.5;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * This test is non-exhaustive, and there may be false-negatives: during the
     * execution of a contract's constructor, its address will be reported as
     * not containing 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.
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies in extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != 0x0 && codehash != accountHash);
    }

    /**
     * @dev Converts an `address` into `address payable`. Note that this is
     * simply a type cast: the actual underlying value is not changed.
     *
     * _Available since v2.4.0._
     */
    function toPayable(address account) internal pure returns (address payable) {
        return address(uint160(account));
    }

    /**
     * @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].
     *
     * _Available since v2.4.0._
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

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

// File: openzeppelin-solidity/contracts/utils/ReentrancyGuard.sol

pragma solidity ^0.5.0;

/**
 * @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.
 */
contract ReentrancyGuard {
    // counter to allow mutex lock with only one SSTORE operation
    uint256 private _guardCounter;

    constructor () internal {
        // The counter starts at one to prevent changing it from zero to a non-zero
        // value, which is a more expensive operation.
        _guardCounter = 1;
    }

    /**
     * @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() {
        _guardCounter += 1;
        uint256 localCounter = _guardCounter;
        _;
        require(localCounter == _guardCounter, "ReentrancyGuard: reentrant call");
    }
}

// File: openzeppelin-solidity/contracts/introspection/IERC165.sol

pragma solidity ^0.5.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: openzeppelin-solidity/contracts/introspection/ERC165.sol

pragma solidity ^0.5.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 */
contract ERC165 is IERC165 {
    /*
     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
     */
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor () internal {
        // Derived contracts need only register support for their own interfaces,
        // we register support for ERC165 itself here
        _registerInterface(_INTERFACE_ID_ERC165);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     *
     * Time complexity O(1), guaranteed to always use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool) {
        return _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See {IERC165-supportsInterface}.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}

// File: openzeppelin-solidity/contracts/token/ERC721/IERC721.sol

pragma solidity ^0.5.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
contract IERC721 is IERC165 {
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of NFTs in `owner`'s account.
     */
    function balanceOf(address owner) public view returns (uint256 balance);

    /**
     * @dev Returns the owner of the NFT specified by `tokenId`.
     */
    function ownerOf(uint256 tokenId) public view returns (address owner);

    /**
     * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to
     * another (`to`).
     *
     *
     *
     * Requirements:
     * - `from`, `to` cannot be zero.
     * - `tokenId` must be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this
     * NFT by either {approve} or {setApprovalForAll}.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId) public;
    /**
     * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to
     * another (`to`).
     *
     * Requirements:
     * - If the caller is not `from`, it must be approved to move this NFT by
     * either {approve} or {setApprovalForAll}.
     */
    function transferFrom(address from, address to, uint256 tokenId) public;
    function approve(address to, uint256 tokenId) public;
    function getApproved(uint256 tokenId) public view returns (address operator);

    function setApprovalForAll(address operator, bool _approved) public;
    function isApprovedForAll(address owner, address operator) public view returns (bool);


    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public;
}

// File: erc721o/contracts/Interfaces/IERC721O.sol

pragma solidity ^0.5.4;

contract IERC721O {
  // Token description
  function name() external view returns (string memory);
  function symbol() external view returns (string memory);
  function totalSupply() public view returns (uint256);
  function exists(uint256 _tokenId) public view returns (bool);

  function implementsERC721() public pure returns (bool);
  function tokenByIndex(uint256 _index) public view returns (uint256);
  function tokenOfOwnerByIndex(address _owner, uint256 _index) public view returns (uint256 _tokenId);
  function tokenURI(uint256 _tokenId) public view returns (string memory tokenUri);
  function getApproved(uint256 _tokenId) public view returns (address);
  
  function implementsERC721O() public pure returns (bool);
  function ownerOf(uint256 _tokenId) public view returns (address _owner);
  function balanceOf(address owner) public view returns (uint256);
  function balanceOf(address _owner, uint256 _tokenId) public view returns (uint256);
  function tokensOwned(address _owner) public view returns (uint256[] memory, uint256[] memory);

  // Non-Fungible Safe Transfer From
  function safeTransferFrom(address _from, address _to, uint256 _tokenId) public;
  function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes memory _data) public;

  // Non-Fungible Unsafe Transfer From
  function transferFrom(address _from, address _to, uint256 _tokenId) public;

  // Fungible Unsafe Transfer
  function transfer(address _to, uint256 _tokenId, uint256 _quantity) public;

  // Fungible Unsafe Transfer From
  function transferFrom(address _from, address _to, uint256 _tokenId, uint256 _quantity) public;

  // Fungible Safe Transfer From
  function safeTransferFrom(address _from, address _to, uint256 _tokenId, uint256 _amount) public;
  function safeTransferFrom(address _from, address _to, uint256 _tokenId, uint256 _amount, bytes memory _data) public;

  // Fungible Safe Batch Transfer From
  function safeBatchTransferFrom(address _from, address _to, uint256[] memory _tokenIds, uint256[] memory _amounts) public;
  function safeBatchTransferFrom(address _from, address _to, uint256[] memory _tokenIds, uint256[] memory _amounts, bytes memory _data) public;

  // Fungible Unsafe Batch Transfer From
  function batchTransferFrom(address _from, address _to, uint256[] memory _tokenIds, uint256[] memory _amounts) public;

  // Approvals
  function setApprovalForAll(address _operator, bool _approved) public;
  function approve(address _to, uint256 _tokenId) public;
  function getApproved(uint256 _tokenId, address _tokenOwner) public view returns (address);
  function isApprovedForAll(address _owner, address _operator) public view returns (bool isOperator);
  function isApprovedOrOwner(address _spender, address _owner, uint256 _tokenId) public view returns (bool);
  function permit(address _holder, address _spender, uint256 _nonce, uint256 _expiry, bool _allowed, bytes calldata _signature) external;

  // Composable
  function compose(uint256[] memory _tokenIds, uint256[] memory _tokenRatio, uint256 _quantity) public;
  function decompose(uint256 _portfolioId, uint256[] memory _tokenIds, uint256[] memory _tokenRatio, uint256 _quantity) public;
  function recompose(uint256 _portfolioId, uint256[] memory _initialTokenIds, uint256[] memory _initialTokenRatio, uint256[] memory _finalTokenIds, uint256[] memory _finalTokenRatio, uint256 _quantity) public;

  // Required Events
  event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
  event TransferWithQuantity(address indexed from, address indexed to, uint256 indexed tokenId, uint256 quantity);
  event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);
  event BatchTransfer(address indexed from, address indexed to, uint256[] tokenTypes, uint256[] amounts);
  event Composition(uint256 portfolioId, uint256[] tokenIds, uint256[] tokenRatio);
}

// File: erc721o/contracts/Interfaces/IERC721OReceiver.sol

pragma solidity ^0.5.4;

/**
 * @title ERC721O token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 *  from ERC721O contracts.
 */
contract IERC721OReceiver {
  /**
    * @dev Magic value to be returned upon successful reception of an amount of ERC721O tokens
    *  ERC721O_RECEIVED = `bytes4(keccak256("onERC721OReceived(address,address,uint256,uint256,bytes)"))` = 0xf891ffe0
    *  ERC721O_BATCH_RECEIVED = `bytes4(keccak256("onERC721OBatchReceived(address,address,uint256[],uint256[],bytes)"))` = 0xd0e17c0b
    */
  bytes4 constant internal ERC721O_RECEIVED = 0xf891ffe0;
  bytes4 constant internal ERC721O_BATCH_RECEIVED = 0xd0e17c0b;

  function onERC721OReceived(
    address _operator,
    address _from,
    uint256 tokenId,
    uint256 amount,
    bytes memory data
  ) public returns(bytes4);

  function onERC721OBatchReceived(
    address _operator,
    address _from,
    uint256[] memory _types,
    uint256[] memory _amounts,
    bytes memory _data
  ) public returns (bytes4);
}

// File: erc721o/contracts/Libs/ObjectsLib.sol

pragma solidity ^0.5.4;


library ObjectLib {
  // Libraries
  using SafeMath for uint256;

  enum Operations { ADD, SUB, REPLACE }

  // Constants regarding bin or chunk sizes for balance packing
  uint256 constant TYPES_BITS_SIZE   = 32;                     // Max size of each object
  uint256 constant TYPES_PER_UINT256 = 256 / TYPES_BITS_SIZE; // Number of types per uint256

  //
  // Objects and Tokens Functions
  //

  /**
  * @dev Return the bin number and index within that bin where ID is
  * @param _tokenId Object type
  * @return (Bin number, ID's index within that bin)
  */
  function getTokenBinIndex(uint256 _tokenId) internal pure returns (uint256 bin, uint256 index) {
    bin = _tokenId * TYPES_BITS_SIZE / 256;
    index = _tokenId % TYPES_PER_UINT256;
    return (bin, index);
  }


  /**
  * @dev update the balance of a type provided in _binBalances
  * @param _binBalances Uint256 containing the balances of objects
  * @param _index Index of the object in the provided bin
  * @param _amount Value to update the type balance
  * @param _operation Which operation to conduct :
  *     Operations.REPLACE : Replace type balance with _amount
  *     Operations.ADD     : ADD _amount to type balance
  *     Operations.SUB     : Substract _amount from type balance
  */
  function updateTokenBalance(
    uint256 _binBalances,
    uint256 _index,
    uint256 _amount,
    Operations _operation) internal pure returns (uint256 newBinBalance)
  {
    uint256 objectBalance;
    if (_operation == Operations.ADD) {
      objectBalance = getValueInBin(_binBalances, _index);
      newBinBalance = writeValueInBin(_binBalances, _index, objectBalance.add(_amount));
    } else if (_operation == Operations.SUB) {
      objectBalance = getValueInBin(_binBalances, _index);
      newBinBalance = writeValueInBin(_binBalances, _index, objectBalance.sub(_amount));
    } else if (_operation == Operations.REPLACE) {
      newBinBalance = writeValueInBin(_binBalances, _index, _amount);
    } else {
      revert("Invalid operation"); // Bad operation
    }

    return newBinBalance;
  }
  
  /*
  * @dev return value in _binValue at position _index
  * @param _binValue uint256 containing the balances of TYPES_PER_UINT256 types
  * @param _index index at which to retrieve value
  * @return Value at given _index in _bin
  */
  function getValueInBin(uint256 _binValue, uint256 _index) internal pure returns (uint256) {

    // Mask to retrieve data for a given binData
    uint256 mask = (uint256(1) << TYPES_BITS_SIZE) - 1;

    // Shift amount
    uint256 rightShift = 256 - TYPES_BITS_SIZE * (_index + 1);
    return (_binValue >> rightShift) & mask;
  }

  /**
  * @dev return the updated _binValue after writing _amount at _index
  * @param _binValue uint256 containing the balances of TYPES_PER_UINT256 types
  * @param _index Index at which to retrieve value
  * @param _amount Value to store at _index in _bin
  * @return Value at given _index in _bin
  */
  function writeValueInBin(uint256 _binValue, uint256 _index, uint256 _amount) internal pure returns (uint256) {
    require(_amount < 2**TYPES_BITS_SIZE, "Amount to write in bin is too large");

    // Mask to retrieve data for a given binData
    uint256 mask = (uint256(1) << TYPES_BITS_SIZE) - 1;

    // Shift amount
    uint256 leftShift = 256 - TYPES_BITS_SIZE * (_index + 1);
    return (_binValue & ~(mask << leftShift) ) | (_amount << leftShift);
  }

}

// File: erc721o/contracts/ERC721OBase.sol

pragma solidity ^0.5.4;






contract ERC721OBase is IERC721O, ERC165, IERC721 {
  // Libraries
  using ObjectLib for ObjectLib.Operations;
  using ObjectLib for uint256;

  // Array with all tokenIds
  uint256[] internal allTokens;

  // Packed balances
  mapping(address => mapping(uint256 => uint256)) internal packedTokenBalance;

  // Operators
  mapping(address => mapping(address => bool)) internal operators;

  // Keeps aprovals for tokens from owner to approved address
  // tokenApprovals[tokenId][owner] = approved
  mapping (uint256 => mapping (address => address)) internal tokenApprovals;

  // Token Id state
  mapping(uint256 => uint256) internal tokenTypes;

  uint256 constant internal INVALID = 0;
  uint256 constant internal POSITION = 1;
  uint256 constant internal PORTFOLIO = 2;

  // Interface constants
  bytes4 internal constant INTERFACE_ID_ERC721O = 0x12345678;

  // EIP712 constants
  bytes32 public DOMAIN_SEPARATOR;
  bytes32 public PERMIT_TYPEHASH;

  // mapping holds nonces for approval permissions
  // nonces[holder] => nonce
  mapping (address => uint) public nonces;

  modifier isOperatorOrOwner(address _from) {
    require((msg.sender == _from) || operators[_from][msg.sender], "msg.sender is neither _from nor operator");
    _;
  }

  constructor() public {
    _registerInterface(INTERFACE_ID_ERC721O);
    
    // Calculate EIP712 constants
    DOMAIN_SEPARATOR = keccak256(abi.encode(
      keccak256("EIP712Domain(string name,string version,address verifyingContract)"),
      keccak256(bytes("ERC721o")),
      keccak256(bytes("1")),
      address(this)
    ));
    PERMIT_TYPEHASH = keccak256("Permit(address holder,address spender,uint256 nonce,uint256 expiry,bool allowed)");
  }

  function implementsERC721O() public pure returns (bool) {
    return true;
  }

  /**
   * @dev Returns whether the specified token exists
   * @param _tokenId uint256 ID of the token to query the existence of
   * @return whether the token exists
   */
  function exists(uint256 _tokenId) public view returns (bool) {
    return tokenTypes[_tokenId] != INVALID;
  }

  /**
   * @dev return the _tokenId type' balance of _address
   * @param _address Address to query balance of
   * @param _tokenId type to query balance of
   * @return Amount of objects of a given type ID
   */
  function balanceOf(address _address, uint256 _tokenId) public view returns (uint256) {
    (uint256 bin, uint256 index) = _tokenId.getTokenBinIndex();
    return packedTokenBalance[_address][bin].getValueInBin(index);
  }

  /**
   * @dev Gets the total amount of tokens stored by the contract
   * @return uint256 representing the total amount of tokens
   */
  function totalSupply() public view returns (uint256) {
    return allTokens.length;
  }

  /**
   * @dev Gets Iterate through the list of existing tokens and return the indexes
   *        and balances of the tokens owner by the user
   * @param _owner The adddress we are checking
   * @return indexes The tokenIds
   * @return balances The balances of each token
   */
  function tokensOwned(address _owner) public view returns (uint256[] memory indexes, uint256[] memory balances) {
    uint256 numTokens = totalSupply();
    uint256[] memory tokenIndexes = new uint256[](numTokens);
    uint256[] memory tempTokens = new uint256[](numTokens);

    uint256 count;
    for (uint256 i = 0; i < numTokens; i++) {
      uint256 tokenId = allTokens[i];
      if (balanceOf(_owner, tokenId) > 0) {
        tempTokens[count] = balanceOf(_owner, tokenId);
        tokenIndexes[count] = tokenId;
        count++;
      }
    }

    // copy over the data to a correct size array
    uint256[] memory _ownedTokens = new uint256[](count);
    uint256[] memory _ownedTokensIndexes = new uint256[](count);

    for (uint256 i = 0; i < count; i++) {
      _ownedTokens[i] = tempTokens[i];
      _ownedTokensIndexes[i] = tokenIndexes[i];
    }

    return (_ownedTokensIndexes, _ownedTokens);
  }

  /**
   * @dev Will set _operator operator status to true or false
   * @param _operator Address to changes operator status.
   * @param _approved  _operator's new operator status (true or false)
   */
  function setApprovalForAll(address _operator, bool _approved) public {
    // Update operator status
    operators[msg.sender][_operator] = _approved;
    emit ApprovalForAll(msg.sender, _operator, _approved);
  }

  /// @notice Approve for all by signature
  function permit(address _holder, address _spender, uint256 _nonce, uint256 _expiry, bool _allowed, bytes calldata _signature) external {
    // Calculate hash
    bytes32 digest =
      keccak256(abi.encodePacked(
        "\x19\x01",
        DOMAIN_SEPARATOR,
        keccak256(abi.encode(
          PERMIT_TYPEHASH,
          _holder,
          _spender,
          _nonce,
          _expiry,
          _allowed
        ))
    ));

    // Divide the signature in r, s and v variables
    // ecrecover takes the signature parameters, and the only way to get them
    // currently is to use assembly.
    // solium-disable-next-line security/no-inline-assembly
    bytes32 r;
    bytes32 s;
    uint8 v;

    bytes memory signature = _signature;

    assembly {
      r := mload(add(signature, 32))
      s := mload(add(signature, 64))
      v := byte(0, mload(add(signature, 96)))
    }

    // Version of signature should be 27 or 28, but 0 and 1 are also possible versions
    if (v < 27) {
      v += 27;
    }

    address recoveredAddress;

    // If the version is correct return the signer address
    if (v != 27 && v != 28) {
      recoveredAddress = address(0);
    } else {
      // solium-disable-next-line arg-overflow
      recoveredAddress = ecrecover(digest, v, r, s);
    }

    require(_holder != address(0), "Holder can't be zero address");
    require(_holder == recoveredAddress, "Signer address is invalid");
    require(_expiry == 0 || now <= _expiry, "Permission expired");
    require(_nonce == nonces[_holder]++, "Nonce is invalid");
    
    // Update operator status
    operators[_holder][_spender] = _allowed;
    emit ApprovalForAll(_holder, _spender, _allowed);
  }

  /**
   * @dev Approves another address to transfer the given token ID
   * The zero address indicates there is no approved address.
   * There can only be one approved address per token at a given time.
   * Can only be called by the token owner or an approved operator.
   * @param _to address to be approved for the given token ID
   * @param _tokenId uint256 ID of the token to be approved
   */
  function approve(address _to, uint256 _tokenId) public {
    require(_to != msg.sender, "Can't approve to yourself");
    tokenApprovals[_tokenId][msg.sender] = _to;
    emit Approval(msg.sender, _to, _tokenId);
  }

  /**
   * @dev Gets the approved address for a token ID, or zero if no address set
   * @param _tokenId uint256 ID of the token to query the approval of
   * @return address currently approved for the given token ID
   */
  function getApproved(uint256 _tokenId, address _tokenOwner) public view returns (address) {
    return tokenApprovals[_tokenId][_tokenOwner];
  }

  /**
   * @dev Function that verifies whether _operator is an authorized operator of _tokenHolder.
   * @param _operator The address of the operator to query status of
   * @param _owner Address of the tokenHolder
   * @return A uint256 specifying the amount of tokens still available for the spender.
   */
  function isApprovedForAll(address _owner, address _operator) public view returns (bool isOperator) {
    return operators[_owner][_operator];
  }

  function isApprovedOrOwner(
    address _spender,
    address _owner,
    uint256 _tokenId
  ) public view returns (bool) {
    return (
      _spender == _owner ||
      getApproved(_tokenId, _owner) == _spender ||
      isApprovedForAll(_owner, _spender)
    );
  }

  function _updateTokenBalance(
    address _from,
    uint256 _tokenId,
    uint256 _amount,
    ObjectLib.Operations op
  ) internal {
    (uint256 bin, uint256 index) = _tokenId.getTokenBinIndex();
    packedTokenBalance[_from][bin] = packedTokenBalance[_from][bin].updateTokenBalance(
      index, _amount, op
    );
  }
}

// File: erc721o/contracts/ERC721OTransferable.sol

pragma solidity ^0.5.4;




contract ERC721OTransferable is ERC721OBase, ReentrancyGuard {
  // Libraries
  using Address for address;

  // safeTransfer constants
  bytes4 internal constant ERC721O_RECEIVED = 0xf891ffe0;
  bytes4 internal constant ERC721O_BATCH_RECEIVED = 0xd0e17c0b;

  function batchTransferFrom(address _from, address _to, uint256[] memory _tokenIds, uint256[] memory _amounts) public {
    // Batch Transfering
    _batchTransferFrom(_from, _to, _tokenIds, _amounts);
  }

  /**
    * @dev transfer objects from different tokenIds to specified address
    * @param _from The address to BatchTransfer objects from.
    * @param _to The address to batchTransfer objects to.
    * @param _tokenIds Array of tokenIds to update balance of
    * @param _amounts Array of amount of object per type to be transferred.
    * @param _data Data to pass to onERC721OReceived() function if recipient is contract
    * Note:  Arrays should be sorted so that all tokenIds in a same bin are adjacent (more efficient).
    */
  function safeBatchTransferFrom(
    address _from,
    address _to,
    uint256[] memory _tokenIds,
    uint256[] memory _amounts,
    bytes memory _data
  ) public nonReentrant {
    // Batch Transfering
    _batchTransferFrom(_from, _to, _tokenIds, _amounts);

    // Pass data if recipient is contract
    if (_to.isContract()) {
      bytes4 retval = IERC721OReceiver(_to).onERC721OBatchReceived(
        msg.sender, _from, _tokenIds, _amounts, _data
      );
      require(retval == ERC721O_BATCH_RECEIVED);
    }
  }

  function safeBatchTransferFrom(
    address _from,
    address _to,
    uint256[] memory _tokenIds,
    uint256[] memory _amounts
  ) public {
    safeBatchTransferFrom(_from, _to, _tokenIds, _amounts, "");
  }

  function transfer(address _to, uint256 _tokenId, uint256 _amount) public {
    _transferFrom(msg.sender, _to, _tokenId, _amount);
  }

  function transferFrom(address _from, address _to, uint256 _tokenId, uint256 _amount) public {
    _transferFrom(_from, _to, _tokenId, _amount);
  }

  function safeTransferFrom(address _from, address _to, uint256 _tokenId, uint256 _amount) public {
    safeTransferFrom(_from, _to, _tokenId, _amount, "");
  }

  function safeTransferFrom(address _from, address _to, uint256 _tokenId, uint256 _amount, bytes memory _data) public nonReentrant {
    _transferFrom(_from, _to, _tokenId, _amount);
    require(
      _checkAndCallSafeTransfer(_from, _to, _tokenId, _amount, _data),
      "Sent to a contract which is not an ERC721O receiver"
    );
  }

  /**
    * @dev transfer objects from different tokenIds to specified address
    * @param _from The address to BatchTransfer objects from.
    * @param _to The address to batchTransfer objects to.
    * @param _tokenIds Array of tokenIds to update balance of
    * @param _amounts Array of amount of object per type to be transferred.
    * Note:  Arrays should be sorted so that all tokenIds in a same bin are adjacent (more efficient).
    */
  function _batchTransferFrom(
    address _from,
    address _to,
    uint256[] memory _tokenIds,
    uint256[] memory _amounts
  ) internal isOperatorOrOwner(_from) {
    // Requirements
    require(_tokenIds.length == _amounts.length, "Inconsistent array length between args");
    require(_to != address(0), "Invalid to address");

    // Number of transfers to execute
    uint256 nTransfer = _tokenIds.length;

    // Don't do useless calculations
    if (_from == _to) {
      for (uint256 i = 0; i < nTransfer; i++) {
        emit Transfer(_from, _to, _tokenIds[i]);
        emit TransferWithQuantity(_from, _to, _tokenIds[i], _amounts[i]);
      }
      return;
    }

    for (uint256 i = 0; i < nTransfer; i++) {
      require(_amounts[i] <= balanceOf(_from, _tokenIds[i]), "Quantity greater than from balance");
      _updateTokenBalance(_from, _tokenIds[i], _amounts[i], ObjectLib.Operations.SUB);
      _updateTokenBalance(_to, _tokenIds[i], _amounts[i], ObjectLib.Operations.ADD);

      emit Transfer(_from, _to, _tokenIds[i]);
      emit TransferWithQuantity(_from, _to, _tokenIds[i], _amounts[i]);
    }

    // Emit batchTransfer event
    emit BatchTransfer(_from, _to, _tokenIds, _amounts);
  }

  function _transferFrom(address _from, address _to, uint256 _tokenId, uint256 _amount) internal {
    require(isApprovedOrOwner(msg.sender, _from, _tokenId), "Not approved");
    require(_amount <= balanceOf(_from, _tokenId), "Quantity greater than from balance");
    require(_to != address(0), "Invalid to address");

    _updateTokenBalance(_from, _tokenId, _amount, ObjectLib.Operations.SUB);
    _updateTokenBalance(_to, _tokenId, _amount, ObjectLib.Operations.ADD);
    emit Transfer(_from, _to, _tokenId);
    emit TransferWithQuantity(_from, _to, _tokenId, _amount);
  }

  function _checkAndCallSafeTransfer(
    address _from,
    address _to,
    uint256 _tokenId,
    uint256 _amount,
    bytes memory _data
  ) internal returns (bool) {
    if (!_to.isContract()) {
      return true;
    }

    bytes4 retval = IERC721OReceiver(_to).onERC721OReceived(msg.sender, _from, _tokenId, _amount, _data);
    return(retval == ERC721O_RECEIVED);
  }
}

// File: erc721o/contracts/Libs/LibPosition.sol

pragma solidity ^0.5.4;

library LibPosition {
  function getLongTokenId(bytes32 _hash) public pure returns (uint256 tokenId) {
    tokenId = uint256(keccak256(abi.encodePacked(_hash, "LONG")));
  }

  function getShortTokenId(bytes32 _hash) public pure returns (uint256 tokenId) {
    tokenId = uint256(keccak256(abi.encodePacked(_hash, "SHORT")));
  }
}

// File: erc721o/contracts/ERC721OMintable.sol

pragma solidity ^0.5.4;



contract ERC721OMintable is ERC721OTransferable {
  // Libraries
  using LibPosition for bytes32;

  // Internal functions
  function _mint(uint256 _tokenId, address _to, uint256 _supply) internal {
    // If the token doesn't exist, add it to the tokens array
    if (!exists(_tokenId)) {
      tokenTypes[_tokenId] = POSITION;
      allTokens.push(_tokenId);
    }

    _updateTokenBalance(_to, _tokenId, _supply, ObjectLib.Operations.ADD);
    emit Transfer(address(0), _to, _tokenId);
    emit TransferWithQuantity(address(0), _to, _tokenId, _supply);
  }

  function _burn(address _tokenOwner, uint256 _tokenId, uint256 _quantity) internal {
    uint256 ownerBalance = balanceOf(_tokenOwner, _tokenId);
    require(ownerBalance >= _quantity, "TOKEN_MINTER:NOT_ENOUGH_POSITIONS");

    _updateTokenBalance(_tokenOwner, _tokenId, _quantity, ObjectLib.Operations.SUB);
    emit Transfer(_tokenOwner, address(0), _tokenId);
    emit TransferWithQuantity(_tokenOwner, address(0), _tokenId, _quantity);
  }

  function _mint(address _buyer, address _seller, bytes32 _derivativeHash, uint256 _quantity) internal {
    _mintLong(_buyer, _derivativeHash, _quantity);
    _mintShort(_seller, _derivativeHash, _quantity);
  }
  
  function _mintLong(address _buyer, bytes32 _derivativeHash, uint256 _quantity) internal {
    uint256 longTokenId = _derivativeHash.getLongTokenId();
    _mint(longTokenId, _buyer, _quantity);
  }
  
  function _mintShort(address _seller, bytes32 _derivativeHash, uint256 _quantity) internal {
    uint256 shortTokenId = _derivativeHash.getShortTokenId();
    _mint(shortTokenId, _seller, _quantity);
  }

  function _registerPortfolio(uint256 _portfolioId, uint256[] memory _tokenIds, uint256[] memory _tokenRatio) internal {
    if (!exists(_portfolioId)) {
      tokenTypes[_portfolioId] = PORTFOLIO;
      emit Composition(_portfolioId, _tokenIds, _tokenRatio);
    }
  }
}

// File: erc721o/contracts/ERC721OComposable.sol

pragma solidity ^0.5.4;




contract ERC721OComposable is ERC721OMintable {
  // Libraries
  using UintArray for uint256[];
  using SafeMath for uint256;

  function compose(uint256[] memory _tokenIds, uint256[] memory _tokenRatio, uint256 _quantity) public {
    require(_tokenIds.length == _tokenRatio.length, "TOKEN_MINTER:TOKEN_IDS_AND_RATIO_LENGTH_DOES_NOT_MATCH");
    require(_quantity > 0, "TOKEN_MINTER:WRONG_QUANTITY");
    require(_tokenIds.length > 0, "TOKEN_MINTER:WRONG_QUANTITY");
    require(_tokenIds.isUnique(), "TOKEN_MINTER:TOKEN_IDS_NOT_UNIQUE");

    for (uint256 i = 0; i < _tokenIds.length; i++) {
      _burn(msg.sender, _tokenIds[i], _tokenRatio[i].mul(_quantity));
    }

    uint256 portfolioId = uint256(keccak256(abi.encodePacked(
      _tokenIds,
      _tokenRatio
    )));

    _registerPortfolio(portfolioId, _tokenIds, _tokenRatio);
    _mint(portfolioId, msg.sender, _quantity);
  }

  function decompose(uint256 _portfolioId, uint256[] memory _tokenIds, uint256[] memory _tokenRatio, uint256 _quantity) public {
    require(_tokenIds.length == _tokenRatio.length, "TOKEN_MINTER:TOKEN_IDS_AND_RATIO_LENGTH_DOES_NOT_MATCH");
    require(_quantity > 0, "TOKEN_MINTER:WRONG_QUANTITY");
    require(_tokenIds.length > 0, "TOKEN_MINTER:WRONG_QUANTITY");
    require(_tokenIds.isUnique(), "TOKEN_MINTER:TOKEN_IDS_NOT_UNIQUE");

    uint256 portfolioId = uint256(keccak256(abi.encodePacked(
      _tokenIds,
      _tokenRatio
    )));

    require(portfolioId == _portfolioId, "TOKEN_MINTER:WRONG_PORTFOLIO_ID");
    _burn(msg.sender, _portfolioId, _quantity);

    for (uint256 i = 0; i < _tokenIds.length; i++) {
      _mint(_tokenIds[i], msg.sender, _tokenRatio[i].mul(_quantity));
    }
  }

  function recompose(
    uint256 _portfolioId,
    uint256[] memory _initialTokenIds,
    uint256[] memory _initialTokenRatio,
    uint256[] memory _finalTokenIds,
    uint256[] memory _finalTokenRatio,
    uint256 _quantity
  ) public {
    require(_initialTokenIds.length == _initialTokenRatio.length, "TOKEN_MINTER:INITIAL_TOKEN_IDS_AND_RATIO_LENGTH_DOES_NOT_MATCH");
    require(_finalTokenIds.length == _finalTokenRatio.length, "TOKEN_MINTER:FINAL_TOKEN_IDS_AND_RATIO_LENGTH_DOES_NOT_MATCH");
    require(_quantity > 0, "TOKEN_MINTER:WRONG_QUANTITY");
    require(_initialTokenIds.length > 0, "TOKEN_MINTER:WRONG_QUANTITY");
    require(_finalTokenIds.length > 0, "TOKEN_MINTER:WRONG_QUANTITY");
    require(_initialTokenIds.isUnique(), "TOKEN_MINTER:TOKEN_IDS_NOT_UNIQUE");
    require(_finalTokenIds.isUnique(), "TOKEN_MINTER:TOKEN_IDS_NOT_UNIQUE");

    uint256 oldPortfolioId = uint256(keccak256(abi.encodePacked(
      _initialTokenIds,
      _initialTokenRatio
    )));

    require(oldPortfolioId == _portfolioId, "TOKEN_MINTER:WRONG_PORTFOLIO_ID");
    _burn(msg.sender, _portfolioId, _quantity);
    
    _removedIds(_initialTokenIds, _initialTokenRatio, _finalTokenIds, _finalTokenRatio, _quantity);
    _addedIds(_initialTokenIds, _initialTokenRatio, _finalTokenIds, _finalTokenRatio, _quantity);
    _keptIds(_initialTokenIds, _initialTokenRatio, _finalTokenIds, _finalTokenRatio, _quantity);

    uint256 newPortfolioId = uint256(keccak256(abi.encodePacked(
      _finalTokenIds,
      _finalTokenRatio
    )));

    _registerPortfolio(newPortfolioId, _finalTokenIds, _finalTokenRatio);
    _mint(newPortfolioId, msg.sender, _quantity);
  }

  function _removedIds(
    uint256[] memory _initialTokenIds,
    uint256[] memory _initialTokenRatio,
    uint256[] memory _finalTokenIds,
    uint256[] memory _finalTokenRatio,
    uint256 _quantity
  ) private {
    (uint256[] memory removedIds, uint256[] memory removedIdsIdxs) = _initialTokenIds.difference(_finalTokenIds);

    for (uint256 i = 0; i < removedIds.length; i++) {
      uint256 index = removedIdsIdxs[i];
      _mint(_initialTokenIds[index], msg.sender, _initialTokenRatio[index].mul(_quantity));
    }

    _finalTokenRatio;
  }

  function _addedIds(
      uint256[] memory _initialTokenIds,
      uint256[] memory _initialTokenRatio,
      uint256[] memory _finalTokenIds,
      uint256[] memory _finalTokenRatio,
      uint256 _quantity
  ) private {
    (uint256[] memory addedIds, uint256[] memory addedIdsIdxs) = _finalTokenIds.difference(_initialTokenIds);

    for (uint256 i = 0; i < addedIds.length; i++) {
      uint256 index = addedIdsIdxs[i];
      _burn(msg.sender, _finalTokenIds[index], _finalTokenRatio[index].mul(_quantity));
    }

    _initialTokenRatio;
  }

  function _keptIds(
      uint256[] memory _initialTokenIds,
      uint256[] memory _initialTokenRatio,
      uint256[] memory _finalTokenIds,
      uint256[] memory _finalTokenRatio,
      uint256 _quantity
  ) private {
    (uint256[] memory keptIds, uint256[] memory keptInitialIdxs, uint256[] memory keptFinalIdxs) = _initialTokenIds.intersect(_finalTokenIds);

    for (uint256 i = 0; i < keptIds.length; i++) {
      uint256 initialIndex = keptInitialIdxs[i];
      uint256 finalIndex = keptFinalIdxs[i];

      if (_initialTokenRatio[initialIndex] > _finalTokenRatio[finalIndex]) {
        uint256 diff = _initialTokenRatio[initialIndex] - _finalTokenRatio[finalIndex];
        _mint(_initialTokenIds[initialIndex], msg.sender, diff.mul(_quantity));
      } else if (_initialTokenRatio[initialIndex] < _finalTokenRatio[finalIndex]) {
        uint256 diff = _finalTokenRatio[finalIndex] - _initialTokenRatio[initialIndex];
        _burn(msg.sender, _initialTokenIds[initialIndex], diff.mul(_quantity));
      }
    }
  }
}

// File: erc721o/contracts/Libs/UintsLib.sol

pragma solidity ^0.5.4;

library UintsLib {
  function uint2str(uint _i) internal pure returns (string memory _uintAsString) {
    if (_i == 0) {
      return "0";
    }

    uint j = _i;
    uint len;
    while (j != 0) {
      len++;
      j /= 10;
    }

    bytes memory bstr = new bytes(len);
    uint k = len - 1;
    while (_i != 0) {
      bstr[k--] = byte(uint8(48 + _i % 10));
      _i /= 10;
    }

    return string(bstr);
  }
}

// File: erc721o/contracts/ERC721OBackwardCompatible.sol

pragma solidity ^0.5.4;




contract ERC721OBackwardCompatible is ERC721OComposable {
  using UintsLib for uint256;

  // Interface constants
  bytes4 internal constant INTERFACE_ID_ERC721 = 0x80ac58cd;
  bytes4 internal constant INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63;
  bytes4 internal constant INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;

  // Reciever constants
  bytes4 internal constant ERC721_RECEIVED = 0x150b7a02;

  // Metadata URI
  string internal baseTokenURI;

  constructor(string memory _baseTokenURI) public ERC721OBase() {
    baseTokenURI = _baseTokenURI;
    _registerInterface(INTERFACE_ID_ERC721);
    _registerInterface(INTERFACE_ID_ERC721_ENUMERABLE);
    _registerInterface(INTERFACE_ID_ERC721_METADATA);
  }

  // ERC721 compatibility
  function implementsERC721() public pure returns (bool) {
    return true;
  }

  /**
    * @dev Gets the owner of a given NFT
    * @param _tokenId uint256 representing the unique token identifier
    * @return address the owner of the token
    */
  function ownerOf(uint256 _tokenId) public view returns (address) {
    if (exists(_tokenId)) {
      return address(this);
    }

    return address(0);
  }

  /**
   *  @dev Gets the number of tokens owned by the address we are checking
   *  @param _owner The adddress we are checking
   *  @return balance The unique amount of tokens owned
   */
  function balanceOf(address _owner) public view returns (uint256 balance) {
    (, uint256[] memory tokens) = tokensOwned(_owner);
    return tokens.length;
  }

  // ERC721 - Enumerable compatibility
  /**
   * @dev Gets the token ID at a given index of all the tokens in this contract
   * Reverts if the index is greater or equal to the total number of tokens
   * @param _index uint256 representing the index to be accessed of the tokens list
   * @return uint256 token ID at the given index of the tokens list
   */
  function tokenByIndex(uint256 _index) public view returns (uint256) {
    require(_index < totalSupply());
    return allTokens[_index];
  }

  function tokenOfOwnerByIndex(address _owner, uint256 _index) public view returns (uint256 _tokenId) {
    (, uint256[] memory tokens) = tokensOwned(_owner);
    require(_index < tokens.length);
    return tokens[_index];
  }

  // ERC721 - Metadata compatibility
  function tokenURI(uint256 _tokenId) public view returns (string memory tokenUri) {
    require(exists(_tokenId), "Token doesn't exist");
    return string(abi.encodePacked(
      baseTokenURI, 
      _tokenId.uint2str(),
      ".json"
    ));
  }

  /**
   * @dev Gets the approved address for a token ID, or zero if no address set
   * @param _tokenId uint256 ID of the token to query the approval of
   * @return address currently approved for the given token ID
   */
  function getApproved(uint256 _tokenId) public view returns (address) {
    if (exists(_tokenId)) {
      return address(this);
    }

    return address(0);
  }

  function safeTransferFrom(address _from, address _to, uint256 _tokenId) public {
    safeTransferFrom(_from, _to, _tokenId, "");
  }

  function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes memory _data) public nonReentrant {
    _transferFrom(_from, _to, _tokenId, 1);
    require(
      _checkAndCallSafeTransfer(_from, _to, _tokenId, _data),
      "Sent to a contract which is not an ERC721 receiver"
    );
  }

  function transferFrom(address _from, address _to, uint256 _tokenId) public {
    _transferFrom(_from, _to, _tokenId, 1);
  }

  /**
   * @dev Internal function to invoke `onERC721Received` on a target address
   * The call is not executed if the target address is not a contract
   * @param _from address representing the previous owner of the given token ID
   * @param _to target address that will receive the tokens
   * @param _tokenId uint256 ID of the token to be transferred
   * @param _data bytes optional data to send along with the call
   * @return whether the call correctly returned the expected magic value
   */
  function _checkAndCallSafeTransfer(
    address _from,
    address _to,
    uint256 _tokenId,
    bytes memory _data
  ) internal returns (bool) {
    if (!_to.isContract()) {
      return true;
    }
    bytes4 retval = IERC721Receiver(_to).onERC721Received(
        msg.sender, _from, _tokenId, _data
    );
    return (retval == ERC721_RECEIVED);
  }
}

// File: contracts/Errors/RegistryErrors.sol

pragma solidity 0.5.16;

contract RegistryErrors {
    string constant internal ERROR_REGISTRY_ONLY_INITIALIZER = "REGISTRY:ONLY_INITIALIZER";
    string constant internal ERROR_REGISTRY_ONLY_OPIUM_ADDRESS_ALLOWED = "REGISTRY:ONLY_OPIUM_ADDRESS_ALLOWED";
    
    string constant internal ERROR_REGISTRY_CANT_BE_ZERO_ADDRESS = "REGISTRY:CANT_BE_ZERO_ADDRESS";

    string constant internal ERROR_REGISTRY_ALREADY_SET = "REGISTRY:ALREADY_SET";
}

// File: contracts/Registry.sol

pragma solidity 0.5.16;


/// @title Opium.Registry contract keeps addresses of deployed Opium contracts set to allow them route and communicate to each other
contract Registry is RegistryErrors {

    // Address of Opium.TokenMinter contract
    address private minter;

    // Address of Opium.Core contract
    address private core;

    // Address of Opium.OracleAggregator contract
    address private oracleAggregator;

    // Address of Opium.SyntheticAggregator contract
    address private syntheticAggregator;

    // Address of Opium.TokenSpender contract
    address private tokenSpender;

    // Address of Opium commission receiver
    address private opiumAddress;

    // Address of Opium contract set deployer
    address public initializer;

    /// @notice This modifier restricts access to functions, which could be called only by initializer
    modifier onlyInitializer() {
        require(msg.sender == initializer, ERROR_REGISTRY_ONLY_INITIALIZER);
        _;
    }

    /// @notice Sets initializer
    constructor() public {
        initializer = msg.sender;
    }

    // SETTERS

    /// @notice Sets Opium.TokenMinter, Opium.Core, Opium.OracleAggregator, Opium.SyntheticAggregator, Opium.TokenSpender, Opium commission receiver addresses and allows to do it only once
    /// @param _minter address Address of Opium.TokenMinter
    /// @param _core address Address of Opium.Core
    /// @param _oracleAggregator address Address of Opium.OracleAggregator
    /// @param _syntheticAggregator address Address of Opium.SyntheticAggregator
    /// @param _tokenSpender address Address of Opium.TokenSpender
    /// @param _opiumAddress address Address of Opium commission receiver
    function init(
        address _minter,
        address _core,
        address _oracleAggregator,
        address _syntheticAggregator,
        address _tokenSpender,
        address _opiumAddress
    ) external onlyInitializer {
        require(
            minter == address(0) &&
            core == address(0) &&
            oracleAggregator == address(0) &&
            syntheticAggregator == address(0) &&
            tokenSpender == address(0) &&
            opiumAddress == address(0),
            ERROR_REGISTRY_ALREADY_SET
        );

        require(
            _minter != address(0) &&
            _core != address(0) &&
            _oracleAggregator != address(0) &&
            _syntheticAggregator != address(0) &&
            _tokenSpender != address(0) &&
            _opiumAddress != address(0),
            ERROR_REGISTRY_CANT_BE_ZERO_ADDRESS
        );

        minter = _minter;
        core = _core;
        oracleAggregator = _oracleAggregator;
        syntheticAggregator = _syntheticAggregator;
        tokenSpender = _tokenSpender;
        opiumAddress = _opiumAddress;
    }

    /// @notice Allows opium commission receiver address to change itself
    /// @param _opiumAddress address New opium commission receiver address
    function changeOpiumAddress(address _opiumAddress) external {
        require(opiumAddress == msg.sender, ERROR_REGISTRY_ONLY_OPIUM_ADDRESS_ALLOWED);
        require(_opiumAddress != address(0), ERROR_REGISTRY_CANT_BE_ZERO_ADDRESS);
        opiumAddress = _opiumAddress;
    }

    // GETTERS

    /// @notice Returns address of Opium.TokenMinter
    /// @param result address Address of Opium.TokenMinter
    function getMinter() external view returns (address result) {
        return minter;
    }

    /// @notice Returns address of Opium.Core
    /// @param result address Address of Opium.Core
    function getCore() external view returns (address result) {
        return core;
    }

    /// @notice Returns address of Opium.OracleAggregator
    /// @param result address Address of Opium.OracleAggregator
    function getOracleAggregator() external view returns (address result) {
        return oracleAggregator;
    }

    /// @notice Returns address of Opium.SyntheticAggregator
    /// @param result address Address of Opium.SyntheticAggregator
    function getSyntheticAggregator() external view returns (address result) {
        return syntheticAggregator;
    }

    /// @notice Returns address of Opium.TokenSpender
    /// @param result address Address of Opium.TokenSpender
    function getTokenSpender() external view returns (address result) {
        return tokenSpender;
    }

    /// @notice Returns address of Opium commission receiver
    /// @param result address Address of Opium commission receiver
    function getOpiumAddress() external view returns (address result) {
        return opiumAddress;
    }
}

// File: contracts/Errors/UsingRegistryErrors.sol

pragma solidity 0.5.16;

contract UsingRegistryErrors {
    string constant internal ERROR_USING_REGISTRY_ONLY_CORE_ALLOWED = "USING_REGISTRY:ONLY_CORE_ALLOWED";
}

// File: contracts/Lib/UsingRegistry.sol

pragma solidity 0.5.16;



/// @title Opium.Lib.UsingRegistry contract should be inherited by contracts, that are going to use Opium.Registry
contract UsingRegistry is UsingRegistryErrors {
    // Emitted when registry instance is set
    event RegistrySet(address registry);

    // Instance of Opium.Registry contract
    Registry internal registry;

    /// @notice This modifier restricts access to functions, which could be called only by Opium.Core
    modifier onlyCore() {
        require(msg.sender == registry.getCore(), ERROR_USING_REGISTRY_ONLY_CORE_ALLOWED);
        _;
    }

    /// @notice Defines registry instance and emits appropriate event
    constructor(address _registry) public {
        registry = Registry(_registry);
        emit RegistrySet(_registry);
    }

    /// @notice Getter for registry variable
    /// @return address Address of registry set in current contract
    function getRegistry() external view returns (address) {
        return address(registry);
    }
}

// File: contracts/TokenMinter.sol

pragma solidity 0.5.16;



/// @title Opium.TokenMinter contract implements ERC721O token standard for minting, burning and transferring position tokens
contract TokenMinter is ERC721OBackwardCompatible, UsingRegistry {
    /// @notice Calls constructors of super-contracts
    /// @param _baseTokenURI string URI for token explorers
    /// @param _registry address Address of Opium.registry
    constructor(string memory _baseTokenURI, address _registry) public ERC721OBackwardCompatible(_baseTokenURI) UsingRegistry(_registry) {}

    /// @notice Mints LONG and SHORT position tokens
    /// @param _buyer address Address of LONG position receiver
    /// @param _seller address Address of SHORT position receiver
    /// @param _derivativeHash bytes32 Hash of derivative (ticker) of position
    /// @param _quantity uint256 Quantity of positions to mint
    function mint(address _buyer, address _seller, bytes32 _derivativeHash, uint256 _quantity) external onlyCore {
        _mint(_buyer, _seller, _derivativeHash, _quantity);
    }

    /// @notice Mints only LONG position tokens for "pooled" derivatives
    /// @param _buyer address Address of LONG position receiver
    /// @param _derivativeHash bytes32 Hash of derivative (ticker) of position
    /// @param _quantity uint256 Quantity of positions to mint
    function mint(address _buyer, bytes32 _derivativeHash, uint256 _quantity) external onlyCore {
        _mintLong(_buyer, _derivativeHash, _quantity);
    }

    /// @notice Burns position tokens
    /// @param _tokenOwner address Address of tokens owner
    /// @param _tokenId uint256 tokenId of positions to burn
    /// @param _quantity uint256 Quantity of positions to burn
    function burn(address _tokenOwner, uint256 _tokenId, uint256 _quantity) external onlyCore {
        _burn(_tokenOwner, _tokenId, _quantity);
    }

    /// @notice ERC721 interface compatible function for position token name retrieving
    /// @return Returns name of token
    function name() external view returns (string memory) {
        return "Opium Network Position Token";
    }

    /// @notice ERC721 interface compatible function for position token symbol retrieving
    /// @return Returns symbol of token
    function symbol() external view returns (string memory) {
        return "ONP";
    }

    /// VIEW FUNCTIONS

    /// @notice Checks whether _spender is approved to spend tokens on _owners behalf or owner itself
    /// @param _spender address Address of spender
    /// @param _owner address Address of owner
    /// @param _tokenId address tokenId of interest
    /// @return Returns whether _spender is approved to spend tokens
    function isApprovedOrOwner(
        address _spender,
        address _owner,
        uint256 _tokenId
    ) public view returns (bool) {
        return (
        _spender == _owner ||
        getApproved(_tokenId, _owner) == _spender ||
        isApprovedForAll(_owner, _spender) ||
        isOpiumSpender(_spender)
        );
    }

    /// @notice Checks whether _spender is Opium.TokenSpender
    /// @return Returns whether _spender is Opium.TokenSpender
    function isOpiumSpender(address _spender) public view returns (bool) {
        return _spender == registry.getTokenSpender();
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"},{"internalType":"address","name":"_registry","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"tokenTypes","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"BatchTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"portfolioId","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenRatio","type":"uint256[]"}],"name":"Composition","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"registry","type":"address"}],"name":"RegistrySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"TransferWithQuantity","type":"event"},{"constant":true,"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_tokenOwner","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_tokenRatio","type":"uint256[]"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"compose","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_portfolioId","type":"uint256"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_tokenRatio","type":"uint256[]"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"decompose","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_tokenOwner","type":"address"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getRegistry","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"implementsERC721","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"implementsERC721O","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"isOperator","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"isApprovedOrOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_spender","type":"address"}],"name":"isOpiumSpender","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_buyer","type":"address"},{"internalType":"address","name":"_seller","type":"address"},{"internalType":"bytes32","name":"_derivativeHash","type":"bytes32"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"mint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_buyer","type":"address"},{"internalType":"bytes32","name":"_derivativeHash","type":"bytes32"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"mint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_holder","type":"address"},{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_nonce","type":"uint256"},{"internalType":"uint256","name":"_expiry","type":"uint256"},{"internalType":"bool","name":"_allowed","type":"bool"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"permit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_portfolioId","type":"uint256"},{"internalType":"uint256[]","name":"_initialTokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_initialTokenRatio","type":"uint256[]"},{"internalType":"uint256[]","name":"_finalTokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_finalTokenRatio","type":"uint256[]"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"recompose","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"safeBatchTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"tokenUri","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOwned","outputs":[{"internalType":"uint256[]","name":"indexes","type":"uint256[]"},{"internalType":"uint256[]","name":"balances","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162004a6338038062004a63833981810160405260408110156200003757600080fd5b81019080805160405193929190846401000000008211156200005857600080fd5b9083019060208201858111156200006e57600080fd5b82516401000000008111828201881017156200008957600080fd5b82525081516020918201929091019080838360005b83811015620000b85781810151838201526020016200009e565b50505050905090810190601f168015620000e65780820380516001836020036101000a031916815260200191505b50604052602001519150819050826200010f6301ffc9a760e01b6001600160e01b03620002cf16565b6200012a6302468acf60e31b6001600160e01b03620002cf16565b604051806042620049d1823960408051918290036042018220828201825260078352664552433732316f60c81b6020938401528151808301835260018152603160f81b908401528151808401919091527fe2e27f86dca355ac92ad62b9c84ff21cbd0c850d0a1d93695bcf66a63a10a2a1818301527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152306080808301919091528251808303909101815260a0909101918290528051920191909120600655905080605062004a13823960405190819003605001902060075550600160095580516200022290600a90602084019062000354565b506200023e6380ac58cd60e01b6001600160e01b03620002cf16565b6200025963780e9d6360e01b6001600160e01b03620002cf16565b62000274635b5e139f60e01b6001600160e01b03620002cf16565b50600b80546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f27fe5f0c1c3b1ed427cc63d0f05759ffdecf9aec9e18d31ef366fc8a6cb5dc3b9181900360200190a1505050620003f9565b6001600160e01b031980821614156200032f576040805162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015290519081900360640190fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200039757805160ff1916838001178555620003c7565b82800160010185558215620003c7579182015b82811115620003c7578251825591602001919060010190620003aa565b50620003d5929150620003d9565b5090565b620003f691905b80821115620003d55760008155600101620003e0565b90565b6145c880620004096000396000f3fe608060405234801561001057600080fd5b506004361061025d5760003560e01c80635ab1bd5311610146578063a22cb465116100c3578063dd10f33811610087578063dd10f3381461102d578063e985e9c514611059578063f242432a14611087578063f5298aca14611150578063fba0ee6414611182578063fe99049a146112be5761025d565b8063a22cb46514610dc0578063b88d4fde14610dee578063c3e6d64014610eb2578063c87b56dd14610fde578063c89dcfce14610ffb5761025d565b80638049f3de1161010a5780638049f3de14610bbb5780638348500d14610c5757806387bffc4e1461065d57806395d89b4114610d7c578063a0ecdb3f14610d845761025d565b80635ab1bd5314610b315780636352211e1461035857806370a0823114610b3957806372982cd214610b5f5780637ecebe0014610b955761025d565b806317fad7fc116101df5780632f745c59116101a35780632f745c5914610a8557806330adf81f14610ab15780633644e51514610ab957806342842e0e14610ac15780634f558e7914610af75780634f6ccce714610b145761025d565b806317fad7fc1461068b57806318160ddd146107c757806321cda790146107cf57806323b872dd1461088e5780632eb2c2d6146108c45761025d565b8063095ea7b311610226578063095ea7b3146103c55780630b2d3bf1146103f15780630febdd49146106215780631051db341461065d57806312042d32146106655761025d565b8062fdd58e1461026257806301ffc9a7146102a057806306fdde03146102db578063081812fc14610358578063095bcdb614610391575b600080fd5b61028e6004803603604081101561027857600080fd5b506001600160a01b0381351690602001356112fa565b60408051918252519081900360200190f35b6102c7600480360360208110156102b657600080fd5b50356001600160e01b03191661134c565b604080519115158252519081900360200190f35b6102e361136f565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561031d578181015183820152602001610305565b50505050905090810190601f16801561034a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103756004803603602081101561036e57600080fd5b50356113a6565b604080516001600160a01b039092168252519081900360200190f35b6103c3600480360360608110156103a757600080fd5b506001600160a01b0381351690602081013590604001356113c5565b005b6103c3600480360360408110156103db57600080fd5b506001600160a01b0381351690602001356113d6565b6103c3600480360360c081101561040757600080fd5b81359190810190604081016020820135600160201b81111561042857600080fd5b82018360208201111561043a57600080fd5b803590602001918460208302840111600160201b8311171561045b57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156104aa57600080fd5b8201836020820111156104bc57600080fd5b803590602001918460208302840111600160201b831117156104dd57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561052c57600080fd5b82018360208201111561053e57600080fd5b803590602001918460208302840111600160201b8311171561055f57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156105ae57600080fd5b8201836020820111156105c057600080fd5b803590602001918460208302840111600160201b831117156105e157600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250611498915050565b6103c36004803603608081101561063757600080fd5b506001600160a01b03813581169160208101359091169060408101359060600135611825565b6102c7611847565b6102c76004803603602081101561067b57600080fd5b50356001600160a01b031661184c565b6103c3600480360360808110156106a157600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b8111156106d457600080fd5b8201836020820111156106e657600080fd5b803590602001918460208302840111600160201b8311171561070757600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561075657600080fd5b82018360208201111561076857600080fd5b803590602001918460208302840111600160201b8311171561078957600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506118d2945050505050565b61028e6118de565b6107f5600480360360208110156107e557600080fd5b50356001600160a01b03166118e4565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015610839578181015183820152602001610821565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015610878578181015183820152602001610860565b5050505090500194505050505060405180910390f35b6103c3600480360360608110156108a457600080fd5b506001600160a01b03813581169160208101359091169060400135611aac565b6103c3600480360360a08110156108da57600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b81111561090d57600080fd5b82018360208201111561091f57600080fd5b803590602001918460208302840111600160201b8311171561094057600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561098f57600080fd5b8201836020820111156109a157600080fd5b803590602001918460208302840111600160201b831117156109c257600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610a1157600080fd5b820183602082011115610a2357600080fd5b803590602001918460018302840111600160201b83111715610a4457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611ab9945050505050565b61028e60048036036040811015610a9b57600080fd5b506001600160a01b038135169060200135611cfc565b61028e611d36565b61028e611d3c565b6103c360048036036060811015610ad757600080fd5b506001600160a01b03813581169160208101359091169060400135611d42565b6102c760048036036020811015610b0d57600080fd5b5035611d5d565b61028e60048036036020811015610b2a57600080fd5b5035611d71565b610375611da5565b61028e60048036036020811015610b4f57600080fd5b50356001600160a01b0316611db4565b6102c760048036036060811015610b7557600080fd5b506001600160a01b03813581169160208101359091169060400135611dca565b61028e60048036036020811015610bab57600080fd5b50356001600160a01b0316611e2d565b6103c3600480360360c0811015610bd157600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359160808201351515919081019060c0810160a0820135600160201b811115610c1957600080fd5b820183602082011115610c2b57600080fd5b803590602001918460018302840111600160201b83111715610c4c57600080fd5b509092509050611e3f565b6103c360048036036060811015610c6d57600080fd5b810190602081018135600160201b811115610c8757600080fd5b820183602082011115610c9957600080fd5b803590602001918460208302840111600160201b83111715610cba57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610d0957600080fd5b820183602082011115610d1b57600080fd5b803590602001918460208302840111600160201b83111715610d3c57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250612201915050565b6102e3612404565b6103c360048036036080811015610d9a57600080fd5b506001600160a01b03813581169160208101359091169060408101359060600135612421565b6103c360048036036040811015610dd657600080fd5b506001600160a01b0381351690602001351515612570565b6103c360048036036080811015610e0457600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b811115610e3e57600080fd5b820183602082011115610e5057600080fd5b803590602001918460018302840111600160201b83111715610e7157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506125de945050505050565b6103c360048036036080811015610ec857600080fd5b81359190810190604081016020820135600160201b811115610ee957600080fd5b820183602082011115610efb57600080fd5b803590602001918460208302840111600160201b83111715610f1c57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610f6b57600080fd5b820183602082011115610f7d57600080fd5b803590602001918460208302840111600160201b83111715610f9e57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550509135925061269e915050565b6102e360048036036020811015610ff457600080fd5b50356128d3565b6103c36004803603606081101561101157600080fd5b506001600160a01b038135169060208101359060400135612a04565b6103756004803603604081101561104357600080fd5b50803590602001356001600160a01b0316612b15565b6102c76004803603604081101561106f57600080fd5b506001600160a01b0381358116916020013516612b3e565b6103c3600480360360a081101561109d57600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b8111156110dc57600080fd5b8201836020820111156110ee57600080fd5b803590602001918460018302840111600160201b8311171561110f57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612b6c945050505050565b6103c36004803603606081101561116657600080fd5b506001600160a01b038135169060208101359060400135612bcb565b6103c36004803603608081101561119857600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b8111156111cb57600080fd5b8201836020820111156111dd57600080fd5b803590602001918460208302840111600160201b831117156111fe57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561124d57600080fd5b82018360208201111561125f57600080fd5b803590602001918460208302840111600160201b8311171561128057600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612cdc945050505050565b6103c3600480360360808110156112d457600080fd5b506001600160a01b03813581169160208101359091169060408101359060600135612cf8565b600080600061130884612d04565b6001600160a01b03871660009081526002602090815260408083208584529091529020549193509150611341908263ffffffff612d1516565b925050505b92915050565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b60408051808201909152601c81527f4f7069756d204e6574776f726b20506f736974696f6e20546f6b656e00000000602082015290565b60006113b182611d5d565b156113bd57503061136a565b506000919050565b6113d133848484612d2f565b505050565b6001600160a01b038216331415611434576040805162461bcd60e51b815260206004820152601960248201527f43616e277420617070726f766520746f20796f757273656c6600000000000000604482015290519081900360640190fd5b600081815260046020908152604080832033808552925280832080546001600160a01b0319166001600160a01b038716908117909155905184939192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a45050565b83518551146114d85760405162461bcd60e51b815260040180806020018281038252603e81526020018061436f603e913960400191505060405180910390fd5b81518351146115185760405162461bcd60e51b815260040180806020018281038252603c8152602001806144cd603c913960400191505060405180910390fd5b6000811161155b576040805162461bcd60e51b815260206004820152601b6024820152600080516020614329833981519152604482015290519081900360640190fd5b600085511161159f576040805162461bcd60e51b815260206004820152601b6024820152600080516020614329833981519152604482015290519081900360640190fd5b60008351116115e3576040805162461bcd60e51b815260206004820152601b6024820152600080516020614329833981519152604482015290519081900360640190fd5b6115ec85612e9b565b6116275760405162461bcd60e51b81526004018080602001828103825260218152602001806145296021913960400191505060405180910390fd5b61163083612e9b565b61166b5760405162461bcd60e51b81526004018080602001828103825260218152602001806145296021913960400191505060405180910390fd5b6000858560405160200180838051906020019060200280838360005b8381101561169f578181015183820152602001611687565b50505050905001828051906020019060200280838360005b838110156116cf5781810151838201526020016116b7565b50505050905001925050506040516020818303038152906040528051906020012060001c9050868114611749576040805162461bcd60e51b815260206004820152601f60248201527f544f4b454e5f4d494e5445523a57524f4e475f504f5254464f4c494f5f494400604482015290519081900360640190fd5b611754338884612f00565b6117618686868686612fb8565b61176e8686868686613025565b61177b8686868686613092565b6000848460405160200180838051906020019060200280838360005b838110156117af578181015183820152602001611797565b50505050905001828051906020019060200280838360005b838110156117df5781810151838201526020016117c7565b50505050905001925050506040516020818303038152906040528051906020012060001c9050611810818686613212565b61181b813385613300565b5050505050505050565b6118418484848460405180602001604052806000815250612b6c565b50505050565b600190565b600b546040805163beb5bd8160e01b815290516000926001600160a01b03169163beb5bd81916004808301926020929190829003018186803b15801561189157600080fd5b505afa1580156118a5573d6000803e3d6000fd5b505050506040513d60208110156118bb57600080fd5b50516001600160a01b038381169116149050919050565b611841848484846133ba565b60015490565b60608060006118f16118de565b905060608160405190808252806020026020018201604052801561191f578160200160208202803883390190505b50905060608260405190808252806020026020018201604052801561194e578160200160208202803883390190505b5090506000805b848110156119d55760006001828154811061196c57fe5b9060005260206000200154905060006119858a836112fa565b11156119cc5761199589826112fa565b8484815181106119a157fe5b602002602001018181525050808584815181106119ba57fe5b60209081029190910101526001909201915b50600101611955565b50606081604051908082528060200260200182016040528015611a02578160200160208202803883390190505b509050606082604051908082528060200260200182016040528015611a31578160200160208202803883390190505b50905060005b83811015611a9e57848181518110611a4b57fe5b6020026020010151838281518110611a5f57fe5b602002602001018181525050858181518110611a7757fe5b6020026020010151828281518110611a8b57fe5b6020908102919091010152600101611a37565b509650945050505050915091565b6113d18383836001612d2f565b6009805460010190819055611ad0868686866133ba565b611ae2856001600160a01b03166137f3565b15611c9e576000856001600160a01b031663d0e17c0b33898888886040518663ffffffff1660e01b815260040180866001600160a01b03166001600160a01b03168152602001856001600160a01b03166001600160a01b03168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b83811015611b84578181015183820152602001611b6c565b50505050905001848103835286818151815260200191508051906020019060200280838360005b83811015611bc3578181015183820152602001611bab565b50505050905001848103825285818151815260200191508051906020019080838360005b83811015611bff578181015183820152602001611be7565b50505050905090810190601f168015611c2c5780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600087803b158015611c5157600080fd5b505af1158015611c65573d6000803e3d6000fd5b505050506040513d6020811015611c7b57600080fd5b505190506001600160e01b0319811663d0e17c0b60e01b14611c9c57600080fd5b505b6009548114611cf4576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b505050505050565b60006060611d09846118e4565b91505080518310611d1957600080fd5b808381518110611d2557fe5b602002602001015191505092915050565b60075481565b60065481565b6113d1838383604051806020016040528060008152506125de565b600090815260056020526040902054151590565b6000611d7b6118de565b8210611d8657600080fd5b60018281548110611d9357fe5b90600052602060002001549050919050565b600b546001600160a01b031690565b60006060611dc1836118e4565b51949350505050565b6000826001600160a01b0316846001600160a01b03161480611e065750836001600160a01b0316611dfb8385612b15565b6001600160a01b0316145b80611e165750611e168385612b3e565b80611e255750611e258461184c565b949350505050565b60086020526000908152604090205481565b600654600754604080516020808201939093526001600160a01b03808c16828401528a16606080830191909152608082018a905260a0820189905287151560c0808401919091528351808403909101815260e08301845280519085012061190160f01b61010084015261010283019590955261012280830195909552825180830390950185526101428201808452855195850195909520610162601f880186900490950283018501909352858552919360009384938493909291899189918291018382808284376000920182905250602085015160408601516060870151919a509850901a95509293505050601b8310159050611f3d57601b820191505b60008260ff16601b14158015611f5757508260ff16601c14155b15611f6457506000611fc8565b6040805160008152602080820180845289905260ff8616828401526060820188905260808201879052915160019260a0808401939192601f1981019281900390910190855afa158015611fbb573d6000803e3d6000fd5b5050506020604051035190505b6001600160a01b038d16612023576040805162461bcd60e51b815260206004820152601c60248201527f486f6c6465722063616e2774206265207a65726f206164647265737300000000604482015290519081900360640190fd5b806001600160a01b03168d6001600160a01b031614612089576040805162461bcd60e51b815260206004820152601960248201527f5369676e6572206164647265737320697320696e76616c696400000000000000604482015290519081900360640190fd5b8915806120965750894211155b6120dc576040805162461bcd60e51b815260206004820152601260248201527114195c9b5a5cdcda5bdb88195e1c1a5c995960721b604482015290519081900360640190fd5b6001600160a01b038d1660009081526008602052604090208054600181019091558b14612143576040805162461bcd60e51b815260206004820152601060248201526f139bdb98d9481a5cc81a5b9d985b1a5960821b604482015290519081900360640190fd5b88600360008f6001600160a01b03166001600160a01b0316815260200190815260200160002060008e6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055508b6001600160a01b03168d6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318b604051808215151515815260200191505060405180910390a350505050505050505050505050565b81518351146122415760405162461bcd60e51b81526004018080602001828103825260368152602001806143f06036913960400191505060405180910390fd5b60008111612284576040805162461bcd60e51b815260206004820152601b6024820152600080516020614329833981519152604482015290519081900360640190fd5b60008351116122c8576040805162461bcd60e51b815260206004820152601b6024820152600080516020614329833981519152604482015290519081900360640190fd5b6122d183612e9b565b61230c5760405162461bcd60e51b81526004018080602001828103825260218152602001806145296021913960400191505060405180910390fd5b60005b83518110156123635761235b3385838151811061232857fe5b60200260200101516123568587868151811061234057fe5b602002602001015161382a90919063ffffffff16565b612f00565b60010161230f565b506000838360405160200180838051906020019060200280838360005b83811015612398578181015183820152602001612380565b50505050905001828051906020019060200280838360005b838110156123c85781810151838201526020016123b0565b50505050905001925050506040516020818303038152906040528051906020012060001c90506123f9818585613212565b611841813384613300565b60408051808201909152600381526204f4e560ec1b602082015290565b600b60009054906101000a90046001600160a01b03166001600160a01b031663da4fbe526040518163ffffffff1660e01b815260040160206040518083038186803b15801561246f57600080fd5b505afa158015612483573d6000803e3d6000fd5b505050506040513d602081101561249957600080fd5b50516040805180820190915260208082527f5553494e475f52454749535452593a4f4e4c595f434f52455f414c4c4f57454490820152906001600160a01b031633146125635760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612528578181015183820152602001612510565b50505050905090810190601f1680156125555780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506118418484848461388a565b3360008181526003602090815260408083206001600160a01b03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b600980546001908101918290556125fa90869086908690612d2f565b612606858585856138a0565b6126415760405162461bcd60e51b81526004018080602001828103825260328152602001806144596032913960400191505060405180910390fd5b6009548114612697576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b5050505050565b81518351146126de5760405162461bcd60e51b81526004018080602001828103825260368152602001806143f06036913960400191505060405180910390fd5b60008111612721576040805162461bcd60e51b815260206004820152601b6024820152600080516020614329833981519152604482015290519081900360640190fd5b6000835111612765576040805162461bcd60e51b815260206004820152601b6024820152600080516020614329833981519152604482015290519081900360640190fd5b61276e83612e9b565b6127a95760405162461bcd60e51b81526004018080602001828103825260218152602001806145296021913960400191505060405180910390fd5b6000838360405160200180838051906020019060200280838360005b838110156127dd5781810151838201526020016127c5565b50505050905001828051906020019060200280838360005b8381101561280d5781810151838201526020016127f5565b50505050905001925050506040516020818303038152906040528051906020012060001c9050848114612887576040805162461bcd60e51b815260206004820152601f60248201527f544f4b454e5f4d494e5445523a57524f4e475f504f5254464f4c494f5f494400604482015290519081900360640190fd5b612892338684612f00565b60005b8451811015611cf4576128cb8582815181106128ad57fe5b6020026020010151336128c68688868151811061234057fe5b613300565b600101612895565b60606128de82611d5d565b612925576040805162461bcd60e51b8152602060048201526013602482015272151bdad95b88191bd95cdb89dd08195e1a5cdd606a1b604482015290519081900360640190fd5b600a612930836139d3565b604051602001808380546001816001161561010002031660029004801561298e5780601f1061296c57610100808354040283529182019161298e565b820191906000526020600020905b81548152906001019060200180831161297a575b5050825160208401908083835b602083106129ba5780518252601f19909201916020918201910161299b565b5181516020939093036101000a600019018019909116921691909117905264173539b7b760d91b92019182525060408051808303601a190181526005909201905295945050505050565b600b60009054906101000a90046001600160a01b03166001600160a01b031663da4fbe526040518163ffffffff1660e01b815260040160206040518083038186803b158015612a5257600080fd5b505afa158015612a66573d6000803e3d6000fd5b505050506040513d6020811015612a7c57600080fd5b50516040805180820190915260208082527f5553494e475f52454749535452593a4f4e4c595f434f52455f414c4c4f57454490820152906001600160a01b03163314612b095760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612528578181015183820152602001612510565b506113d1838383613a94565b60009182526004602090815260408084206001600160a01b039384168552909152909120541690565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205460ff1690565b6009805460010190819055612b8386868686612d2f565b612b908686868686613b20565b611c9e5760405162461bcd60e51b81526004018080602001828103825260338152602001806144266033913960400191505060405180910390fd5b600b60009054906101000a90046001600160a01b03166001600160a01b031663da4fbe526040518163ffffffff1660e01b815260040160206040518083038186803b158015612c1957600080fd5b505afa158015612c2d573d6000803e3d6000fd5b505050506040513d6020811015612c4357600080fd5b50516040805180820190915260208082527f5553494e475f52454749535452593a4f4e4c595f434f52455f414c4c4f57454490820152906001600160a01b03163314612cd05760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612528578181015183820152602001612510565b506113d1838383612f00565b6118418484848460405180602001604052806000815250611ab9565b61184184848484612d2f565b610100602082020491600790911690565b600181016020026101000382901c63ffffffff1692915050565b612d3a338584611dca565b612d7a576040805162461bcd60e51b815260206004820152600c60248201526b139bdd08185c1c1c9bdd995960a21b604482015290519081900360640190fd5b612d8484836112fa565b811115612dc25760405162461bcd60e51b81526004018080602001828103825260228152602001806145726022913960400191505060405180910390fd5b6001600160a01b038316612e12576040805162461bcd60e51b8152602060048201526012602482015271496e76616c696420746f206164647265737360701b604482015290519081900360640190fd5b612e1f8483836001613c7a565b612e2c8383836000613c7a565b81836001600160a01b0316856001600160a01b031660008051602061450983398151915260405160405180910390a481836001600160a01b0316856001600160a01b03166000805160206143ad833981519152846040518082815260200191505060405180910390a450505050565b8051600090815b81811015612ef657600080612eca86878581518110612ebd57fe5b6020026020010151613cf1565b91509150808015612eda57508282105b15612eec57600094505050505061136a565b5050600101612ea2565b5060019392505050565b6000612f0c84846112fa565b905081811015612f4d5760405162461bcd60e51b81526004018080602001828103825260218152602001806144ac6021913960400191505060405180910390fd5b612f5a8484846001613c7a565b60405183906000906001600160a01b03871690600080516020614509833981519152908390a460408051838152905184916000916001600160a01b038816916000805160206143ad833981519152919081900360200190a450505050565b606080612fcb878663ffffffff613d4316565b909250905060005b825181101561181b576000828281518110612fea57fe5b6020026020010151905061301c89828151811061300357fe5b6020026020010151336128c6888c868151811061234057fe5b50600101612fd3565b606080613038858863ffffffff613d4316565b909250905060005b825181101561181b57600082828151811061305757fe5b602002602001015190506130893388838151811061307157fe5b6020026020010151612356888a868151811061234057fe5b50600101613040565b606080806130a6888763ffffffff613ec216565b9194509250905060005b83518110156132075760008382815181106130c757fe5b6020026020010151905060008383815181106130df57fe5b602002602001015190508781815181106130f557fe5b60200260200101518a838151811061310957fe5b6020026020010151111561317557600088828151811061312557fe5b60200260200101518b848151811061313957fe5b602002602001015103905061316f8c848151811061315357fe5b6020026020010151336128c68b8561382a90919063ffffffff16565b506131fd565b87818151811061318157fe5b60200260200101518a838151811061319557fe5b602002602001015110156131fd5760008a83815181106131b157fe5b60200260200101518983815181106131c557fe5b60200260200101510390506131fb338d85815181106131e057fe5b60200260200101516123568b8561382a90919063ffffffff16565b505b50506001016130b0565b505050505050505050565b61321b83611d5d565b6113d157600260056000858152602001908152602001600020819055507f942e21426178d7f44f5fc38ad086c24504b41d256a2f125368d8e097de99fd8c838383604051808481526020018060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156132a657818101518382015260200161328e565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156132e55781810151838201526020016132cd565b505050509050019550505050505060405180910390a1505050565b61330983611d5d565b6133505760008381526005602052604081206001908190558054808201825591527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6018390555b61335d8284836000613c7a565b60405183906001600160a01b03841690600090600080516020614509833981519152908290a460408051828152905184916001600160a01b038516916000916000805160206143ad833981519152919081900360200190a4505050565b83336001600160a01b03821614806133f557506001600160a01b038116600090815260036020908152604080832033845290915290205460ff165b6134305760405162461bcd60e51b815260040180806020018281038252602881526020018061454a6028913960400191505060405180910390fd5b81518351146134705760405162461bcd60e51b81526004018080602001828103825260268152602001806143496026913960400191505060405180910390fd5b6001600160a01b0384166134c0576040805162461bcd60e51b8152602060048201526012602482015271496e76616c696420746f206164647265737360701b604482015290519081900360640190fd5b82516001600160a01b0386811690861614156135925760005b8181101561358b578481815181106134ed57fe5b6020026020010151866001600160a01b0316886001600160a01b031660008051602061450983398151915260405160405180910390a484818151811061352f57fe5b6020026020010151866001600160a01b0316886001600160a01b03166000805160206143ad83398151915287858151811061356657fe5b60200260200101516040518082815260200191505060405180910390a46001016134d9565b5050612697565b60005b8181101561371b576135ba878683815181106135ad57fe5b60200260200101516112fa565b8482815181106135c657fe5b6020026020010151111561360b5760405162461bcd60e51b81526004018080602001828103825260228152602001806145726022913960400191505060405180910390fd5b61363e8786838151811061361b57fe5b602002602001015186848151811061362f57fe5b60200260200101516001613c7a565b6136718686838151811061364e57fe5b602002602001015186848151811061366257fe5b60200260200101516000613c7a565b84818151811061367d57fe5b6020026020010151866001600160a01b0316886001600160a01b031660008051602061450983398151915260405160405180910390a48481815181106136bf57fe5b6020026020010151866001600160a01b0316886001600160a01b03166000805160206143ad8339815191528785815181106136f657fe5b60200260200101516040518082815260200191505060405180910390a4600101613595565b50846001600160a01b0316866001600160a01b03167ff59807b2c31ca3ba212e90599175c120c556422950bac5be656274483e8581df8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561379757818101518382015260200161377f565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156137d65781810151838201526020016137be565b5050505090500194505050505060405180910390a3505050505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708115801590611e255750141592915050565b60008261383957506000611346565b8282028284828161384657fe5b04146138835760405162461bcd60e51b815260040180806020018281038252602181526020018061448b6021913960400191505060405180910390fd5b9392505050565b613895848383613a94565b611841838383614098565b60006138b4846001600160a01b03166137f3565b6138c057506001611e25565b604051630a85bd0160e11b815233600482018181526001600160a01b03888116602485015260448401879052608060648501908152865160848601528651600095928a169463150b7a029490938c938b938b939260a4019060208501908083838e5b8381101561393a578181015183820152602001613922565b50505050905090810190601f1680156139675780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561398957600080fd5b505af115801561399d573d6000803e3d6000fd5b505050506040513d60208110156139b357600080fd5b50516001600160e01b031916630a85bd0160e11b14915050949350505050565b6060816139f857506040805180820190915260018152600360fc1b602082015261136a565b8160005b8115613a1057600101600a820491506139fc565b6060816040519080825280601f01601f191660200182016040528015613a3d576020820181803883390190505b50905060001982015b8515613a8b57600a860660300160f81b82828060019003935081518110613a6957fe5b60200101906001600160f81b031916908160001a905350600a86049550613a46565b50949350505050565b6000827356c54b408c44b12f6c9219c9c73fcda4e783fc2063a085725990916040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015613ae757600080fd5b505af4158015613afb573d6000803e3d6000fd5b505050506040513d6020811015613b1157600080fd5b50519050611841818584613300565b6000613b34856001600160a01b03166137f3565b613b4057506001613c71565b6000856001600160a01b031663f891ffe033898888886040518663ffffffff1660e01b815260040180866001600160a01b03166001600160a01b03168152602001856001600160a01b03166001600160a01b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015613bde578181015183820152602001613bc6565b50505050905090810190601f168015613c0b5780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b158015613c2e57600080fd5b505af1158015613c42573d6000803e3d6000fd5b505050506040513d6020811015613c5857600080fd5b50516001600160e01b0319166307c48fff60e51b149150505b95945050505050565b600080613c8685612d04565b6001600160a01b03881660009081526002602090815260408083208584529091529020549193509150613cc19082868663ffffffff6140eb16565b6001600160a01b039096166000908152600260209081526040808320948352939052919091209490945550505050565b81516000908190815b81811015613d325784868281518110613d0f57fe5b60200260200101511415613d2a57925060019150613d3c9050565b600101613cfa565b5060009250829150505b9250929050565b606080600084519050606081604051908082528060200260200182016040528015613d78578160200160208202803883390190505b5090506000805b83811015613ddb576000888281518110613d9557fe5b60200260200101519050613da988826141c3565b613dd2576001848381518110613dbb57fe5b911515602092830291909101909101526001909201915b50600101613d7f565b50606081604051908082528060200260200182016040528015613e08578160200160208202803883390190505b509050606082604051908082528060200260200182016040528015613e37578160200160208202803883390190505b5090506000805b86811015613eb257858181518110613e5257fe5b602002602001015115613eaa578a8181518110613e6b57fe5b6020026020010151848381518110613e7f57fe5b60200260200101818152505080838381518110613e9857fe5b60209081029190910101526001909101905b600101613e3e565b5091999098509650505050505050565b6060806060600085519050606081604051908082528060200260200182016040528015613ef9578160200160208202803883390190505b5090506000805b83811015613f5757613f25888a8381518110613f1857fe5b60200260200101516141c3565b15613f4f576001838281518110613f3857fe5b911515602092830291909101909101526001909101905b600101613f00565b50606081604051908082528060200260200182016040528015613f84578160200160208202803883390190505b509050606082604051908082528060200260200182016040528015613fb3578160200160208202803883390190505b509050606083604051908082528060200260200182016040528015613fe2578160200160208202803883390190505b5090506000805b8781101561408657868181518110613ffd57fe5b60200260200101511561407e578c818151811061401657fe5b602002602001015185838151811061402a57fe5b6020026020010181815250508084838151811061404357fe5b60200260200101818152505061405f8c8e8381518110612ebd57fe5b5083838151811061406c57fe5b60209081029190910101526001909101905b600101613fe9565b50929b919a5098509650505050505050565b6000827356c54b408c44b12f6c9219c9c73fcda4e783fc20635b667cf990916040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015613ae757600080fd5b600080808360028111156140fb57fe5b141561412e5761410b8686612d15565b90506141278686614122848863ffffffff6141d016565b61422a565b9150613a8b565b600183600281111561413c57fe5b14156141635761414c8686612d15565b90506141278686614122848863ffffffff61429116565b600283600281111561417157fe5b14156141825761412786868661422a565b6040805162461bcd60e51b815260206004820152601160248201527024b73b30b634b21037b832b930ba34b7b760791b604482015290519081900360640190fd5b6000806113418484613cf1565b600082820183811015613883576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000600160201b821061426e5760405162461bcd60e51b81526004018080602001828103825260238152602001806143cd6023913960400191505060405180910390fd5b5063ffffffff600183016020026101000390811b1984169082901b179392505050565b600061388383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250600081848411156143205760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612528578181015183820152602001612510565b50505090039056fe544f4b454e5f4d494e5445523a57524f4e475f5155414e544954590000000000496e636f6e73697374656e74206172726179206c656e677468206265747765656e2061726773544f4b454e5f4d494e5445523a494e495449414c5f544f4b454e5f4944535f414e445f524154494f5f4c454e4754485f444f45535f4e4f545f4d415443482114851a3e2a54429989f46c1ab0743e37ded205d9bbdfd85635aed5bd595a06416d6f756e7420746f20777269746520696e2062696e20697320746f6f206c61726765544f4b454e5f4d494e5445523a544f4b454e5f4944535f414e445f524154494f5f4c454e4754485f444f45535f4e4f545f4d4154434853656e7420746f206120636f6e7472616374207768696368206973206e6f7420616e204552433732314f20726563656976657253656e7420746f206120636f6e7472616374207768696368206973206e6f7420616e20455243373231207265636569766572536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77544f4b454e5f4d494e5445523a4e4f545f454e4f5547485f504f534954494f4e53544f4b454e5f4d494e5445523a46494e414c5f544f4b454e5f4944535f414e445f524154494f5f4c454e4754485f444f45535f4e4f545f4d41544348ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef544f4b454e5f4d494e5445523a544f4b454e5f4944535f4e4f545f554e495155456d73672e73656e646572206973206e656974686572205f66726f6d206e6f72206f70657261746f725175616e746974792067726561746572207468616e2066726f6d2062616c616e6365a265627a7a723158206a1940fe777b8e63309c21dd7e676ea6257c61bdc096c85c9b740ba169001d6764736f6c63430005100032454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c6164647265737320766572696679696e67436f6e7472616374295065726d6974286164647265737320686f6c6465722c61646472657373207370656e6465722c75696e74323536206e6f6e63652c75696e74323536206578706972792c626f6f6c20616c6c6f7765642900000000000000000000000000000000000000000000000000000000000000400000000000000000000000001cad268f540aa7e5c606b203e8443562332a3a35000000000000000000000000000000000000000000000000000000000000002768747470733a2f2f6578706c6f7265722e6f7069756d2e6e6574776f726b2f6572633732316f2f00000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061025d5760003560e01c80635ab1bd5311610146578063a22cb465116100c3578063dd10f33811610087578063dd10f3381461102d578063e985e9c514611059578063f242432a14611087578063f5298aca14611150578063fba0ee6414611182578063fe99049a146112be5761025d565b8063a22cb46514610dc0578063b88d4fde14610dee578063c3e6d64014610eb2578063c87b56dd14610fde578063c89dcfce14610ffb5761025d565b80638049f3de1161010a5780638049f3de14610bbb5780638348500d14610c5757806387bffc4e1461065d57806395d89b4114610d7c578063a0ecdb3f14610d845761025d565b80635ab1bd5314610b315780636352211e1461035857806370a0823114610b3957806372982cd214610b5f5780637ecebe0014610b955761025d565b806317fad7fc116101df5780632f745c59116101a35780632f745c5914610a8557806330adf81f14610ab15780633644e51514610ab957806342842e0e14610ac15780634f558e7914610af75780634f6ccce714610b145761025d565b806317fad7fc1461068b57806318160ddd146107c757806321cda790146107cf57806323b872dd1461088e5780632eb2c2d6146108c45761025d565b8063095ea7b311610226578063095ea7b3146103c55780630b2d3bf1146103f15780630febdd49146106215780631051db341461065d57806312042d32146106655761025d565b8062fdd58e1461026257806301ffc9a7146102a057806306fdde03146102db578063081812fc14610358578063095bcdb614610391575b600080fd5b61028e6004803603604081101561027857600080fd5b506001600160a01b0381351690602001356112fa565b60408051918252519081900360200190f35b6102c7600480360360208110156102b657600080fd5b50356001600160e01b03191661134c565b604080519115158252519081900360200190f35b6102e361136f565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561031d578181015183820152602001610305565b50505050905090810190601f16801561034a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103756004803603602081101561036e57600080fd5b50356113a6565b604080516001600160a01b039092168252519081900360200190f35b6103c3600480360360608110156103a757600080fd5b506001600160a01b0381351690602081013590604001356113c5565b005b6103c3600480360360408110156103db57600080fd5b506001600160a01b0381351690602001356113d6565b6103c3600480360360c081101561040757600080fd5b81359190810190604081016020820135600160201b81111561042857600080fd5b82018360208201111561043a57600080fd5b803590602001918460208302840111600160201b8311171561045b57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156104aa57600080fd5b8201836020820111156104bc57600080fd5b803590602001918460208302840111600160201b831117156104dd57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561052c57600080fd5b82018360208201111561053e57600080fd5b803590602001918460208302840111600160201b8311171561055f57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156105ae57600080fd5b8201836020820111156105c057600080fd5b803590602001918460208302840111600160201b831117156105e157600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250611498915050565b6103c36004803603608081101561063757600080fd5b506001600160a01b03813581169160208101359091169060408101359060600135611825565b6102c7611847565b6102c76004803603602081101561067b57600080fd5b50356001600160a01b031661184c565b6103c3600480360360808110156106a157600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b8111156106d457600080fd5b8201836020820111156106e657600080fd5b803590602001918460208302840111600160201b8311171561070757600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561075657600080fd5b82018360208201111561076857600080fd5b803590602001918460208302840111600160201b8311171561078957600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506118d2945050505050565b61028e6118de565b6107f5600480360360208110156107e557600080fd5b50356001600160a01b03166118e4565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015610839578181015183820152602001610821565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015610878578181015183820152602001610860565b5050505090500194505050505060405180910390f35b6103c3600480360360608110156108a457600080fd5b506001600160a01b03813581169160208101359091169060400135611aac565b6103c3600480360360a08110156108da57600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b81111561090d57600080fd5b82018360208201111561091f57600080fd5b803590602001918460208302840111600160201b8311171561094057600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561098f57600080fd5b8201836020820111156109a157600080fd5b803590602001918460208302840111600160201b831117156109c257600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610a1157600080fd5b820183602082011115610a2357600080fd5b803590602001918460018302840111600160201b83111715610a4457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611ab9945050505050565b61028e60048036036040811015610a9b57600080fd5b506001600160a01b038135169060200135611cfc565b61028e611d36565b61028e611d3c565b6103c360048036036060811015610ad757600080fd5b506001600160a01b03813581169160208101359091169060400135611d42565b6102c760048036036020811015610b0d57600080fd5b5035611d5d565b61028e60048036036020811015610b2a57600080fd5b5035611d71565b610375611da5565b61028e60048036036020811015610b4f57600080fd5b50356001600160a01b0316611db4565b6102c760048036036060811015610b7557600080fd5b506001600160a01b03813581169160208101359091169060400135611dca565b61028e60048036036020811015610bab57600080fd5b50356001600160a01b0316611e2d565b6103c3600480360360c0811015610bd157600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359160808201351515919081019060c0810160a0820135600160201b811115610c1957600080fd5b820183602082011115610c2b57600080fd5b803590602001918460018302840111600160201b83111715610c4c57600080fd5b509092509050611e3f565b6103c360048036036060811015610c6d57600080fd5b810190602081018135600160201b811115610c8757600080fd5b820183602082011115610c9957600080fd5b803590602001918460208302840111600160201b83111715610cba57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610d0957600080fd5b820183602082011115610d1b57600080fd5b803590602001918460208302840111600160201b83111715610d3c57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250612201915050565b6102e3612404565b6103c360048036036080811015610d9a57600080fd5b506001600160a01b03813581169160208101359091169060408101359060600135612421565b6103c360048036036040811015610dd657600080fd5b506001600160a01b0381351690602001351515612570565b6103c360048036036080811015610e0457600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b811115610e3e57600080fd5b820183602082011115610e5057600080fd5b803590602001918460018302840111600160201b83111715610e7157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506125de945050505050565b6103c360048036036080811015610ec857600080fd5b81359190810190604081016020820135600160201b811115610ee957600080fd5b820183602082011115610efb57600080fd5b803590602001918460208302840111600160201b83111715610f1c57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610f6b57600080fd5b820183602082011115610f7d57600080fd5b803590602001918460208302840111600160201b83111715610f9e57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550509135925061269e915050565b6102e360048036036020811015610ff457600080fd5b50356128d3565b6103c36004803603606081101561101157600080fd5b506001600160a01b038135169060208101359060400135612a04565b6103756004803603604081101561104357600080fd5b50803590602001356001600160a01b0316612b15565b6102c76004803603604081101561106f57600080fd5b506001600160a01b0381358116916020013516612b3e565b6103c3600480360360a081101561109d57600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b8111156110dc57600080fd5b8201836020820111156110ee57600080fd5b803590602001918460018302840111600160201b8311171561110f57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612b6c945050505050565b6103c36004803603606081101561116657600080fd5b506001600160a01b038135169060208101359060400135612bcb565b6103c36004803603608081101561119857600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b8111156111cb57600080fd5b8201836020820111156111dd57600080fd5b803590602001918460208302840111600160201b831117156111fe57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561124d57600080fd5b82018360208201111561125f57600080fd5b803590602001918460208302840111600160201b8311171561128057600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612cdc945050505050565b6103c3600480360360808110156112d457600080fd5b506001600160a01b03813581169160208101359091169060408101359060600135612cf8565b600080600061130884612d04565b6001600160a01b03871660009081526002602090815260408083208584529091529020549193509150611341908263ffffffff612d1516565b925050505b92915050565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b60408051808201909152601c81527f4f7069756d204e6574776f726b20506f736974696f6e20546f6b656e00000000602082015290565b60006113b182611d5d565b156113bd57503061136a565b506000919050565b6113d133848484612d2f565b505050565b6001600160a01b038216331415611434576040805162461bcd60e51b815260206004820152601960248201527f43616e277420617070726f766520746f20796f757273656c6600000000000000604482015290519081900360640190fd5b600081815260046020908152604080832033808552925280832080546001600160a01b0319166001600160a01b038716908117909155905184939192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a45050565b83518551146114d85760405162461bcd60e51b815260040180806020018281038252603e81526020018061436f603e913960400191505060405180910390fd5b81518351146115185760405162461bcd60e51b815260040180806020018281038252603c8152602001806144cd603c913960400191505060405180910390fd5b6000811161155b576040805162461bcd60e51b815260206004820152601b6024820152600080516020614329833981519152604482015290519081900360640190fd5b600085511161159f576040805162461bcd60e51b815260206004820152601b6024820152600080516020614329833981519152604482015290519081900360640190fd5b60008351116115e3576040805162461bcd60e51b815260206004820152601b6024820152600080516020614329833981519152604482015290519081900360640190fd5b6115ec85612e9b565b6116275760405162461bcd60e51b81526004018080602001828103825260218152602001806145296021913960400191505060405180910390fd5b61163083612e9b565b61166b5760405162461bcd60e51b81526004018080602001828103825260218152602001806145296021913960400191505060405180910390fd5b6000858560405160200180838051906020019060200280838360005b8381101561169f578181015183820152602001611687565b50505050905001828051906020019060200280838360005b838110156116cf5781810151838201526020016116b7565b50505050905001925050506040516020818303038152906040528051906020012060001c9050868114611749576040805162461bcd60e51b815260206004820152601f60248201527f544f4b454e5f4d494e5445523a57524f4e475f504f5254464f4c494f5f494400604482015290519081900360640190fd5b611754338884612f00565b6117618686868686612fb8565b61176e8686868686613025565b61177b8686868686613092565b6000848460405160200180838051906020019060200280838360005b838110156117af578181015183820152602001611797565b50505050905001828051906020019060200280838360005b838110156117df5781810151838201526020016117c7565b50505050905001925050506040516020818303038152906040528051906020012060001c9050611810818686613212565b61181b813385613300565b5050505050505050565b6118418484848460405180602001604052806000815250612b6c565b50505050565b600190565b600b546040805163beb5bd8160e01b815290516000926001600160a01b03169163beb5bd81916004808301926020929190829003018186803b15801561189157600080fd5b505afa1580156118a5573d6000803e3d6000fd5b505050506040513d60208110156118bb57600080fd5b50516001600160a01b038381169116149050919050565b611841848484846133ba565b60015490565b60608060006118f16118de565b905060608160405190808252806020026020018201604052801561191f578160200160208202803883390190505b50905060608260405190808252806020026020018201604052801561194e578160200160208202803883390190505b5090506000805b848110156119d55760006001828154811061196c57fe5b9060005260206000200154905060006119858a836112fa565b11156119cc5761199589826112fa565b8484815181106119a157fe5b602002602001018181525050808584815181106119ba57fe5b60209081029190910101526001909201915b50600101611955565b50606081604051908082528060200260200182016040528015611a02578160200160208202803883390190505b509050606082604051908082528060200260200182016040528015611a31578160200160208202803883390190505b50905060005b83811015611a9e57848181518110611a4b57fe5b6020026020010151838281518110611a5f57fe5b602002602001018181525050858181518110611a7757fe5b6020026020010151828281518110611a8b57fe5b6020908102919091010152600101611a37565b509650945050505050915091565b6113d18383836001612d2f565b6009805460010190819055611ad0868686866133ba565b611ae2856001600160a01b03166137f3565b15611c9e576000856001600160a01b031663d0e17c0b33898888886040518663ffffffff1660e01b815260040180866001600160a01b03166001600160a01b03168152602001856001600160a01b03166001600160a01b03168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b83811015611b84578181015183820152602001611b6c565b50505050905001848103835286818151815260200191508051906020019060200280838360005b83811015611bc3578181015183820152602001611bab565b50505050905001848103825285818151815260200191508051906020019080838360005b83811015611bff578181015183820152602001611be7565b50505050905090810190601f168015611c2c5780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600087803b158015611c5157600080fd5b505af1158015611c65573d6000803e3d6000fd5b505050506040513d6020811015611c7b57600080fd5b505190506001600160e01b0319811663d0e17c0b60e01b14611c9c57600080fd5b505b6009548114611cf4576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b505050505050565b60006060611d09846118e4565b91505080518310611d1957600080fd5b808381518110611d2557fe5b602002602001015191505092915050565b60075481565b60065481565b6113d1838383604051806020016040528060008152506125de565b600090815260056020526040902054151590565b6000611d7b6118de565b8210611d8657600080fd5b60018281548110611d9357fe5b90600052602060002001549050919050565b600b546001600160a01b031690565b60006060611dc1836118e4565b51949350505050565b6000826001600160a01b0316846001600160a01b03161480611e065750836001600160a01b0316611dfb8385612b15565b6001600160a01b0316145b80611e165750611e168385612b3e565b80611e255750611e258461184c565b949350505050565b60086020526000908152604090205481565b600654600754604080516020808201939093526001600160a01b03808c16828401528a16606080830191909152608082018a905260a0820189905287151560c0808401919091528351808403909101815260e08301845280519085012061190160f01b61010084015261010283019590955261012280830195909552825180830390950185526101428201808452855195850195909520610162601f880186900490950283018501909352858552919360009384938493909291899189918291018382808284376000920182905250602085015160408601516060870151919a509850901a95509293505050601b8310159050611f3d57601b820191505b60008260ff16601b14158015611f5757508260ff16601c14155b15611f6457506000611fc8565b6040805160008152602080820180845289905260ff8616828401526060820188905260808201879052915160019260a0808401939192601f1981019281900390910190855afa158015611fbb573d6000803e3d6000fd5b5050506020604051035190505b6001600160a01b038d16612023576040805162461bcd60e51b815260206004820152601c60248201527f486f6c6465722063616e2774206265207a65726f206164647265737300000000604482015290519081900360640190fd5b806001600160a01b03168d6001600160a01b031614612089576040805162461bcd60e51b815260206004820152601960248201527f5369676e6572206164647265737320697320696e76616c696400000000000000604482015290519081900360640190fd5b8915806120965750894211155b6120dc576040805162461bcd60e51b815260206004820152601260248201527114195c9b5a5cdcda5bdb88195e1c1a5c995960721b604482015290519081900360640190fd5b6001600160a01b038d1660009081526008602052604090208054600181019091558b14612143576040805162461bcd60e51b815260206004820152601060248201526f139bdb98d9481a5cc81a5b9d985b1a5960821b604482015290519081900360640190fd5b88600360008f6001600160a01b03166001600160a01b0316815260200190815260200160002060008e6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055508b6001600160a01b03168d6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318b604051808215151515815260200191505060405180910390a350505050505050505050505050565b81518351146122415760405162461bcd60e51b81526004018080602001828103825260368152602001806143f06036913960400191505060405180910390fd5b60008111612284576040805162461bcd60e51b815260206004820152601b6024820152600080516020614329833981519152604482015290519081900360640190fd5b60008351116122c8576040805162461bcd60e51b815260206004820152601b6024820152600080516020614329833981519152604482015290519081900360640190fd5b6122d183612e9b565b61230c5760405162461bcd60e51b81526004018080602001828103825260218152602001806145296021913960400191505060405180910390fd5b60005b83518110156123635761235b3385838151811061232857fe5b60200260200101516123568587868151811061234057fe5b602002602001015161382a90919063ffffffff16565b612f00565b60010161230f565b506000838360405160200180838051906020019060200280838360005b83811015612398578181015183820152602001612380565b50505050905001828051906020019060200280838360005b838110156123c85781810151838201526020016123b0565b50505050905001925050506040516020818303038152906040528051906020012060001c90506123f9818585613212565b611841813384613300565b60408051808201909152600381526204f4e560ec1b602082015290565b600b60009054906101000a90046001600160a01b03166001600160a01b031663da4fbe526040518163ffffffff1660e01b815260040160206040518083038186803b15801561246f57600080fd5b505afa158015612483573d6000803e3d6000fd5b505050506040513d602081101561249957600080fd5b50516040805180820190915260208082527f5553494e475f52454749535452593a4f4e4c595f434f52455f414c4c4f57454490820152906001600160a01b031633146125635760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612528578181015183820152602001612510565b50505050905090810190601f1680156125555780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506118418484848461388a565b3360008181526003602090815260408083206001600160a01b03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b600980546001908101918290556125fa90869086908690612d2f565b612606858585856138a0565b6126415760405162461bcd60e51b81526004018080602001828103825260328152602001806144596032913960400191505060405180910390fd5b6009548114612697576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b5050505050565b81518351146126de5760405162461bcd60e51b81526004018080602001828103825260368152602001806143f06036913960400191505060405180910390fd5b60008111612721576040805162461bcd60e51b815260206004820152601b6024820152600080516020614329833981519152604482015290519081900360640190fd5b6000835111612765576040805162461bcd60e51b815260206004820152601b6024820152600080516020614329833981519152604482015290519081900360640190fd5b61276e83612e9b565b6127a95760405162461bcd60e51b81526004018080602001828103825260218152602001806145296021913960400191505060405180910390fd5b6000838360405160200180838051906020019060200280838360005b838110156127dd5781810151838201526020016127c5565b50505050905001828051906020019060200280838360005b8381101561280d5781810151838201526020016127f5565b50505050905001925050506040516020818303038152906040528051906020012060001c9050848114612887576040805162461bcd60e51b815260206004820152601f60248201527f544f4b454e5f4d494e5445523a57524f4e475f504f5254464f4c494f5f494400604482015290519081900360640190fd5b612892338684612f00565b60005b8451811015611cf4576128cb8582815181106128ad57fe5b6020026020010151336128c68688868151811061234057fe5b613300565b600101612895565b60606128de82611d5d565b612925576040805162461bcd60e51b8152602060048201526013602482015272151bdad95b88191bd95cdb89dd08195e1a5cdd606a1b604482015290519081900360640190fd5b600a612930836139d3565b604051602001808380546001816001161561010002031660029004801561298e5780601f1061296c57610100808354040283529182019161298e565b820191906000526020600020905b81548152906001019060200180831161297a575b5050825160208401908083835b602083106129ba5780518252601f19909201916020918201910161299b565b5181516020939093036101000a600019018019909116921691909117905264173539b7b760d91b92019182525060408051808303601a190181526005909201905295945050505050565b600b60009054906101000a90046001600160a01b03166001600160a01b031663da4fbe526040518163ffffffff1660e01b815260040160206040518083038186803b158015612a5257600080fd5b505afa158015612a66573d6000803e3d6000fd5b505050506040513d6020811015612a7c57600080fd5b50516040805180820190915260208082527f5553494e475f52454749535452593a4f4e4c595f434f52455f414c4c4f57454490820152906001600160a01b03163314612b095760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612528578181015183820152602001612510565b506113d1838383613a94565b60009182526004602090815260408084206001600160a01b039384168552909152909120541690565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205460ff1690565b6009805460010190819055612b8386868686612d2f565b612b908686868686613b20565b611c9e5760405162461bcd60e51b81526004018080602001828103825260338152602001806144266033913960400191505060405180910390fd5b600b60009054906101000a90046001600160a01b03166001600160a01b031663da4fbe526040518163ffffffff1660e01b815260040160206040518083038186803b158015612c1957600080fd5b505afa158015612c2d573d6000803e3d6000fd5b505050506040513d6020811015612c4357600080fd5b50516040805180820190915260208082527f5553494e475f52454749535452593a4f4e4c595f434f52455f414c4c4f57454490820152906001600160a01b03163314612cd05760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612528578181015183820152602001612510565b506113d1838383612f00565b6118418484848460405180602001604052806000815250611ab9565b61184184848484612d2f565b610100602082020491600790911690565b600181016020026101000382901c63ffffffff1692915050565b612d3a338584611dca565b612d7a576040805162461bcd60e51b815260206004820152600c60248201526b139bdd08185c1c1c9bdd995960a21b604482015290519081900360640190fd5b612d8484836112fa565b811115612dc25760405162461bcd60e51b81526004018080602001828103825260228152602001806145726022913960400191505060405180910390fd5b6001600160a01b038316612e12576040805162461bcd60e51b8152602060048201526012602482015271496e76616c696420746f206164647265737360701b604482015290519081900360640190fd5b612e1f8483836001613c7a565b612e2c8383836000613c7a565b81836001600160a01b0316856001600160a01b031660008051602061450983398151915260405160405180910390a481836001600160a01b0316856001600160a01b03166000805160206143ad833981519152846040518082815260200191505060405180910390a450505050565b8051600090815b81811015612ef657600080612eca86878581518110612ebd57fe5b6020026020010151613cf1565b91509150808015612eda57508282105b15612eec57600094505050505061136a565b5050600101612ea2565b5060019392505050565b6000612f0c84846112fa565b905081811015612f4d5760405162461bcd60e51b81526004018080602001828103825260218152602001806144ac6021913960400191505060405180910390fd5b612f5a8484846001613c7a565b60405183906000906001600160a01b03871690600080516020614509833981519152908390a460408051838152905184916000916001600160a01b038816916000805160206143ad833981519152919081900360200190a450505050565b606080612fcb878663ffffffff613d4316565b909250905060005b825181101561181b576000828281518110612fea57fe5b6020026020010151905061301c89828151811061300357fe5b6020026020010151336128c6888c868151811061234057fe5b50600101612fd3565b606080613038858863ffffffff613d4316565b909250905060005b825181101561181b57600082828151811061305757fe5b602002602001015190506130893388838151811061307157fe5b6020026020010151612356888a868151811061234057fe5b50600101613040565b606080806130a6888763ffffffff613ec216565b9194509250905060005b83518110156132075760008382815181106130c757fe5b6020026020010151905060008383815181106130df57fe5b602002602001015190508781815181106130f557fe5b60200260200101518a838151811061310957fe5b6020026020010151111561317557600088828151811061312557fe5b60200260200101518b848151811061313957fe5b602002602001015103905061316f8c848151811061315357fe5b6020026020010151336128c68b8561382a90919063ffffffff16565b506131fd565b87818151811061318157fe5b60200260200101518a838151811061319557fe5b602002602001015110156131fd5760008a83815181106131b157fe5b60200260200101518983815181106131c557fe5b60200260200101510390506131fb338d85815181106131e057fe5b60200260200101516123568b8561382a90919063ffffffff16565b505b50506001016130b0565b505050505050505050565b61321b83611d5d565b6113d157600260056000858152602001908152602001600020819055507f942e21426178d7f44f5fc38ad086c24504b41d256a2f125368d8e097de99fd8c838383604051808481526020018060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156132a657818101518382015260200161328e565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156132e55781810151838201526020016132cd565b505050509050019550505050505060405180910390a1505050565b61330983611d5d565b6133505760008381526005602052604081206001908190558054808201825591527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6018390555b61335d8284836000613c7a565b60405183906001600160a01b03841690600090600080516020614509833981519152908290a460408051828152905184916001600160a01b038516916000916000805160206143ad833981519152919081900360200190a4505050565b83336001600160a01b03821614806133f557506001600160a01b038116600090815260036020908152604080832033845290915290205460ff165b6134305760405162461bcd60e51b815260040180806020018281038252602881526020018061454a6028913960400191505060405180910390fd5b81518351146134705760405162461bcd60e51b81526004018080602001828103825260268152602001806143496026913960400191505060405180910390fd5b6001600160a01b0384166134c0576040805162461bcd60e51b8152602060048201526012602482015271496e76616c696420746f206164647265737360701b604482015290519081900360640190fd5b82516001600160a01b0386811690861614156135925760005b8181101561358b578481815181106134ed57fe5b6020026020010151866001600160a01b0316886001600160a01b031660008051602061450983398151915260405160405180910390a484818151811061352f57fe5b6020026020010151866001600160a01b0316886001600160a01b03166000805160206143ad83398151915287858151811061356657fe5b60200260200101516040518082815260200191505060405180910390a46001016134d9565b5050612697565b60005b8181101561371b576135ba878683815181106135ad57fe5b60200260200101516112fa565b8482815181106135c657fe5b6020026020010151111561360b5760405162461bcd60e51b81526004018080602001828103825260228152602001806145726022913960400191505060405180910390fd5b61363e8786838151811061361b57fe5b602002602001015186848151811061362f57fe5b60200260200101516001613c7a565b6136718686838151811061364e57fe5b602002602001015186848151811061366257fe5b60200260200101516000613c7a565b84818151811061367d57fe5b6020026020010151866001600160a01b0316886001600160a01b031660008051602061450983398151915260405160405180910390a48481815181106136bf57fe5b6020026020010151866001600160a01b0316886001600160a01b03166000805160206143ad8339815191528785815181106136f657fe5b60200260200101516040518082815260200191505060405180910390a4600101613595565b50846001600160a01b0316866001600160a01b03167ff59807b2c31ca3ba212e90599175c120c556422950bac5be656274483e8581df8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561379757818101518382015260200161377f565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156137d65781810151838201526020016137be565b5050505090500194505050505060405180910390a3505050505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708115801590611e255750141592915050565b60008261383957506000611346565b8282028284828161384657fe5b04146138835760405162461bcd60e51b815260040180806020018281038252602181526020018061448b6021913960400191505060405180910390fd5b9392505050565b613895848383613a94565b611841838383614098565b60006138b4846001600160a01b03166137f3565b6138c057506001611e25565b604051630a85bd0160e11b815233600482018181526001600160a01b03888116602485015260448401879052608060648501908152865160848601528651600095928a169463150b7a029490938c938b938b939260a4019060208501908083838e5b8381101561393a578181015183820152602001613922565b50505050905090810190601f1680156139675780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561398957600080fd5b505af115801561399d573d6000803e3d6000fd5b505050506040513d60208110156139b357600080fd5b50516001600160e01b031916630a85bd0160e11b14915050949350505050565b6060816139f857506040805180820190915260018152600360fc1b602082015261136a565b8160005b8115613a1057600101600a820491506139fc565b6060816040519080825280601f01601f191660200182016040528015613a3d576020820181803883390190505b50905060001982015b8515613a8b57600a860660300160f81b82828060019003935081518110613a6957fe5b60200101906001600160f81b031916908160001a905350600a86049550613a46565b50949350505050565b6000827356c54b408c44b12f6c9219c9c73fcda4e783fc2063a085725990916040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015613ae757600080fd5b505af4158015613afb573d6000803e3d6000fd5b505050506040513d6020811015613b1157600080fd5b50519050611841818584613300565b6000613b34856001600160a01b03166137f3565b613b4057506001613c71565b6000856001600160a01b031663f891ffe033898888886040518663ffffffff1660e01b815260040180866001600160a01b03166001600160a01b03168152602001856001600160a01b03166001600160a01b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015613bde578181015183820152602001613bc6565b50505050905090810190601f168015613c0b5780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b158015613c2e57600080fd5b505af1158015613c42573d6000803e3d6000fd5b505050506040513d6020811015613c5857600080fd5b50516001600160e01b0319166307c48fff60e51b149150505b95945050505050565b600080613c8685612d04565b6001600160a01b03881660009081526002602090815260408083208584529091529020549193509150613cc19082868663ffffffff6140eb16565b6001600160a01b039096166000908152600260209081526040808320948352939052919091209490945550505050565b81516000908190815b81811015613d325784868281518110613d0f57fe5b60200260200101511415613d2a57925060019150613d3c9050565b600101613cfa565b5060009250829150505b9250929050565b606080600084519050606081604051908082528060200260200182016040528015613d78578160200160208202803883390190505b5090506000805b83811015613ddb576000888281518110613d9557fe5b60200260200101519050613da988826141c3565b613dd2576001848381518110613dbb57fe5b911515602092830291909101909101526001909201915b50600101613d7f565b50606081604051908082528060200260200182016040528015613e08578160200160208202803883390190505b509050606082604051908082528060200260200182016040528015613e37578160200160208202803883390190505b5090506000805b86811015613eb257858181518110613e5257fe5b602002602001015115613eaa578a8181518110613e6b57fe5b6020026020010151848381518110613e7f57fe5b60200260200101818152505080838381518110613e9857fe5b60209081029190910101526001909101905b600101613e3e565b5091999098509650505050505050565b6060806060600085519050606081604051908082528060200260200182016040528015613ef9578160200160208202803883390190505b5090506000805b83811015613f5757613f25888a8381518110613f1857fe5b60200260200101516141c3565b15613f4f576001838281518110613f3857fe5b911515602092830291909101909101526001909101905b600101613f00565b50606081604051908082528060200260200182016040528015613f84578160200160208202803883390190505b509050606082604051908082528060200260200182016040528015613fb3578160200160208202803883390190505b509050606083604051908082528060200260200182016040528015613fe2578160200160208202803883390190505b5090506000805b8781101561408657868181518110613ffd57fe5b60200260200101511561407e578c818151811061401657fe5b602002602001015185838151811061402a57fe5b6020026020010181815250508084838151811061404357fe5b60200260200101818152505061405f8c8e8381518110612ebd57fe5b5083838151811061406c57fe5b60209081029190910101526001909101905b600101613fe9565b50929b919a5098509650505050505050565b6000827356c54b408c44b12f6c9219c9c73fcda4e783fc20635b667cf990916040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015613ae757600080fd5b600080808360028111156140fb57fe5b141561412e5761410b8686612d15565b90506141278686614122848863ffffffff6141d016565b61422a565b9150613a8b565b600183600281111561413c57fe5b14156141635761414c8686612d15565b90506141278686614122848863ffffffff61429116565b600283600281111561417157fe5b14156141825761412786868661422a565b6040805162461bcd60e51b815260206004820152601160248201527024b73b30b634b21037b832b930ba34b7b760791b604482015290519081900360640190fd5b6000806113418484613cf1565b600082820183811015613883576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000600160201b821061426e5760405162461bcd60e51b81526004018080602001828103825260238152602001806143cd6023913960400191505060405180910390fd5b5063ffffffff600183016020026101000390811b1984169082901b179392505050565b600061388383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250600081848411156143205760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612528578181015183820152602001612510565b50505090039056fe544f4b454e5f4d494e5445523a57524f4e475f5155414e544954590000000000496e636f6e73697374656e74206172726179206c656e677468206265747765656e2061726773544f4b454e5f4d494e5445523a494e495449414c5f544f4b454e5f4944535f414e445f524154494f5f4c454e4754485f444f45535f4e4f545f4d415443482114851a3e2a54429989f46c1ab0743e37ded205d9bbdfd85635aed5bd595a06416d6f756e7420746f20777269746520696e2062696e20697320746f6f206c61726765544f4b454e5f4d494e5445523a544f4b454e5f4944535f414e445f524154494f5f4c454e4754485f444f45535f4e4f545f4d4154434853656e7420746f206120636f6e7472616374207768696368206973206e6f7420616e204552433732314f20726563656976657253656e7420746f206120636f6e7472616374207768696368206973206e6f7420616e20455243373231207265636569766572536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77544f4b454e5f4d494e5445523a4e4f545f454e4f5547485f504f534954494f4e53544f4b454e5f4d494e5445523a46494e414c5f544f4b454e5f4944535f414e445f524154494f5f4c454e4754485f444f45535f4e4f545f4d41544348ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef544f4b454e5f4d494e5445523a544f4b454e5f4944535f4e4f545f554e495155456d73672e73656e646572206973206e656974686572205f66726f6d206e6f72206f70657261746f725175616e746974792067726561746572207468616e2066726f6d2062616c616e6365a265627a7a723158206a1940fe777b8e63309c21dd7e676ea6257c61bdc096c85c9b740ba169001d6764736f6c63430005100032

Libraries Used


Deployed Bytecode Sourcemap

62572:3175:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;62572:3175:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31135:224;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;31135:224:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;17113:135;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17113:135:0;-1:-1:-1;;;;;;17113:135:0;;:::i;:::-;;;;;;;;;;;;;;;;;;64435:110;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;64435:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54154:166;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54154:166:0;;:::i;:::-;;;;-1:-1:-1;;;;;54154:166:0;;;;;;;;;;;;;;39051:135;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;39051:135:0;;;;;;;;;;;;;:::i;:::-;;35473:219;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;35473:219:0;;;;;;;;:::i;46831:1692::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;46831:1692:0;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;46831:1692:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;46831:1692:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;46831:1692:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;46831:1692:0;;;;;;;;-1:-1:-1;46831:1692:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;46831:1692:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;46831:1692:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;46831:1692:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;46831:1692:0;;;;;;;;-1:-1:-1;46831:1692:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;46831:1692:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;46831:1692:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;46831:1692:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;46831:1692:0;;;;;;;;-1:-1:-1;46831:1692:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;46831:1692:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;46831:1692:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;46831:1692:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;46831:1692:0;;-1:-1:-1;;46831:1692:0;;;-1:-1:-1;46831:1692:0;;-1:-1:-1;;46831:1692:0:i;39347:160::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;39347:160:0;;;;;;;;;;;;;;;;;;;;;;:::i;52088:79::-;;;:::i;65611:133::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;65611:133:0;-1:-1:-1;;;;;65611:133:0;;:::i;37525:207::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;37525:207:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;37525:207:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;37525:207:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;37525:207:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;37525:207:0;;;;;;;;-1:-1:-1;37525:207:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;37525:207:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;37525:207:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;37525:207:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;37525:207:0;;-1:-1:-1;37525:207:0;;-1:-1:-1;;;;;37525:207:0:i;31507:89::-;;;:::i;31891:935::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31891:935:0;-1:-1:-1;;;;;31891:935:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;31891:935:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;31891:935:0;;;;;;;;;;;;;;;;;;;54780:126;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;54780:126:0;;;;;;;;;;;;;;;;;:::i;38283:539::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;38283:539:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;38283:539:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;38283:539:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;38283:539:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;38283:539:0;;;;;;;;-1:-1:-1;38283:539:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;38283:539:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;38283:539:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;38283:539:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;38283:539:0;;;;;;;;-1:-1:-1;38283:539:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;38283:539:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;38283:539:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;38283:539:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;38283:539:0;;-1:-1:-1;38283:539:0;;-1:-1:-1;;;;;38283:539:0:i;53395:228::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;53395:228:0;;;;;;;;:::i;29724:30::-;;;:::i;29688:31::-;;;:::i;54326:134::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;54326:134:0;;;;;;;;;;;;;;;;;:::i;30798:112::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30798:112:0;;:::i;53246:143::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53246:143:0;;:::i;62271:98::-;;;:::i;52712:162::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52712:162:0;-1:-1:-1;;;;;52712:162:0;;:::i;65132:344::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;65132:344:0;;;;;;;;;;;;;;;;;:::i;29843:39::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29843:39:0;-1:-1:-1;;;;;29843:39:0;;:::i;33307:1751::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;33307:1751:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;33307:1751:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;33307:1751:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;33307:1751:0;;-1:-1:-1;33307:1751:0;-1:-1:-1;33307:1751:0;:::i;45224:777::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;45224:777:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;45224:777:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;45224:777:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;45224:777:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;45224:777:0;;;;;;;;-1:-1:-1;45224:777:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;45224:777:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;45224:777:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;45224:777:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;45224:777:0;;-1:-1:-1;;45224:777:0;;;-1:-1:-1;45224:777:0;;-1:-1:-1;;45224:777:0:i;64685:87::-;;;:::i;63293:178::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;63293:178:0;;;;;;;;;;;;;;;;;;;;;;:::i;33040:217::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;33040:217:0;;;;;;;;;;:::i;54466:308::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;54466:308:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;54466:308:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;54466:308:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;54466:308:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;54466:308:0;;-1:-1:-1;54466:308:0;;-1:-1:-1;;;;;54466:308:0:i;46007:818::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;46007:818:0;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;46007:818:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;46007:818:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;46007:818:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;46007:818:0;;;;;;;;-1:-1:-1;46007:818:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;46007:818:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;46007:818:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;46007:818:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;46007:818:0;;-1:-1:-1;;46007:818:0;;;-1:-1:-1;46007:818:0;;-1:-1:-1;;46007:818:0:i;53667:253::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53667:253:0;;:::i;63762:156::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;63762:156:0;;;;;;;;;;;;;:::i;35926:147::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35926:147:0;;;;;;-1:-1:-1;;;;;35926:147:0;;:::i;36394:::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;36394:147:0;;;;;;;;;;:::i;39513:341::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;39513:341:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;39513:341:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;39513:341:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;39513:341:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;39513:341:0;;-1:-1:-1;39513:341:0;;-1:-1:-1;;;;;39513:341:0:i;64151:148::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;64151:148:0;;;;;;;;;;;;;:::i;38828:217::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;38828:217:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;38828:217:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;38828:217:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;38828:217:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;38828:217:0;;;;;;;;-1:-1:-1;38828:217:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;38828:217:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;38828:217:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;38828:217:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;38828:217:0;;-1:-1:-1;38828:217:0;;-1:-1:-1;;;;;38828:217:0:i;39192:149::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;39192:149:0;;;;;;;;;;;;;;;;;;;;;;:::i;31135:224::-;31211:7;31228:11;31241:13;31258:27;:8;:25;:27::i;:::-;-1:-1:-1;;;;;31299:28:0;;;;;;:18;:28;;;;;;;;:33;;;;;;;;;31227:58;;-1:-1:-1;31227:58:0;-1:-1:-1;31299:54:0;;31227:58;31299:54;:47;:54;:::i;:::-;31292:61;;;;31135:224;;;;;:::o;17113:135::-;-1:-1:-1;;;;;;17207:33:0;;17183:4;17207:33;;;;;;;;;;;;;17113:135;;;;:::o;64435:110::-;64500:37;;;;;;;;;;;;;;;;;64435:110;:::o;54154:166::-;54214:7;54234:16;54241:8;54234:6;:16::i;:::-;54230:59;;;-1:-1:-1;54276:4:0;54261:20;;54230:59;-1:-1:-1;54312:1:0;54154:166;;;:::o;39051:135::-;39131:49;39145:10;39157:3;39162:8;39172:7;39131:13;:49::i;:::-;39051:135;;;:::o;35473:219::-;-1:-1:-1;;;;;35543:17:0;;35550:10;35543:17;;35535:55;;;;;-1:-1:-1;;;35535:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;35597:24;;;;:14;:24;;;;;;;;35622:10;35597:36;;;;;;;;:42;;-1:-1:-1;;;;;;35597:42:0;-1:-1:-1;;;;;35597:42:0;;;;;;;;35651:35;;35597:24;;:42;;35622:10;35651:35;;;35473:219;;:::o;46831:1692::-;47115:18;:25;47088:16;:23;:52;47080:127;;;;-1:-1:-1;;;47080:127:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47247:16;:23;47222:14;:21;:48;47214:121;;;;-1:-1:-1;;;47214:121:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47362:1;47350:9;:13;47342:53;;;;;-1:-1:-1;;;47342:53:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;47342:53:0;;;;;;;;;;;;;;;47436:1;47410:16;:23;:27;47402:67;;;;;-1:-1:-1;;;47402:67:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;47402:67:0;;;;;;;;;;;;;;;47508:1;47484:14;:21;:25;47476:65;;;;;-1:-1:-1;;;47476:65:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;47476:65:0;;;;;;;;;;;;;;;47556:27;:16;:25;:27::i;:::-;47548:73;;;;-1:-1:-1;;;47548:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47636:25;:14;:23;:25::i;:::-;47628:71;;;;-1:-1:-1;;;47628:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47708:22;47776:16;47801:18;47751:75;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;47751:75:0;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;47751:75:0;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;47751:75:0;;;47741:86;;;;;;47733:95;;47708:120;;47863:12;47845:14;:30;47837:74;;;;;-1:-1:-1;;;47837:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;47918:42;47924:10;47936:12;47950:9;47918:5;:42::i;:::-;47973:94;47985:16;48003:18;48023:14;48039:16;48057:9;47973:11;:94::i;:::-;48074:92;48084:16;48102:18;48122:14;48138:16;48156:9;48074;:92::i;:::-;48173:91;48182:16;48200:18;48220:14;48236:16;48254:9;48173:8;:91::i;:::-;48273:22;48341:14;48364:16;48316:71;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;48316:71:0;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;48316:71:0;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;48316:71:0;;;48306:82;;;;;;48298:91;;48273:116;;48398:68;48417:14;48433;48449:16;48398:18;:68::i;:::-;48473:44;48479:14;48495:10;48507:9;48473:5;:44::i;:::-;46831:1692;;;;;;;;:::o;39347:160::-;39450:51;39467:5;39474:3;39479:8;39489:7;39450:51;;;;;;;;;;;;:16;:51::i;:::-;39347:160;;;;:::o;52088:79::-;52157:4;52088:79;:::o;65611:133::-;65710:8;;:26;;;-1:-1:-1;;;65710:26:0;;;;65674:4;;-1:-1:-1;;;;;65710:8:0;;:24;;:26;;;;;;;;;;;;;;:8;:26;;;5:2:-1;;;;30:1;27;20:12;5:2;65710:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;65710:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;65710:26:0;-1:-1:-1;;;;;65698:38:0;;;;;;;-1:-1:-1;65611:133:0;;;:::o;37525:207::-;37675:51;37694:5;37701:3;37706:9;37717:8;37675:18;:51::i;31507:89::-;31574:9;:16;31507:89;:::o;31891:935::-;31949:24;31975:25;32009:17;32029:13;:11;:13::i;:::-;32009:33;;32049:29;32095:9;32081:24;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;32081:24:0;;32049:56;;32112:27;32156:9;32142:24;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;32142:24:0;-1:-1:-1;32112:54:0;-1:-1:-1;32175:13:0;;32195:256;32219:9;32215:1;:13;32195:256;;;32244:15;32262:9;32272:1;32262:12;;;;;;;;;;;;;;;;32244:30;;32316:1;32287:26;32297:6;32305:7;32287:9;:26::i;:::-;:30;32283:161;;;32350:26;32360:6;32368:7;32350:9;:26::i;:::-;32330:10;32341:5;32330:17;;;;;;;;;;;;;:46;;;;;32409:7;32387:12;32400:5;32387:19;;;;;;;;;;;;;;;;;:29;32427:7;;;;;32283:161;-1:-1:-1;32230:3:0;;32195:256;;;;32510:29;32556:5;32542:20;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;32542:20:0;;32510:52;;32569:36;32622:5;32608:20;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;32608:20:0;-1:-1:-1;32569:59:0;-1:-1:-1;32642:9:0;32637:133;32661:5;32657:1;:9;32637:133;;;32700:10;32711:1;32700:13;;;;;;;;;;;;;;32682:12;32695:1;32682:15;;;;;;;;;;;;;:31;;;;;32747:12;32760:1;32747:15;;;;;;;;;;;;;;32722:19;32742:1;32722:22;;;;;;;;;;;;;;;;;:40;32668:3;;32637:133;;;-1:-1:-1;32786:19:0;-1:-1:-1;32807:12:0;-1:-1:-1;;;;;31891:935:0;;;:::o;54780:126::-;54862:38;54876:5;54883:3;54888:8;54898:1;54862:13;:38::i;38283:539::-;15099:13;:18;;15116:1;15099:18;;;;;38500:51;38519:5;38526:3;38531:9;38542:8;38500:18;:51::i;:::-;38607:16;:3;-1:-1:-1;;;;;38607:14:0;;:16::i;:::-;38603:214;;;38634:13;38667:3;-1:-1:-1;;;;;38650:44:0;;38705:10;38717:5;38724:9;38735:8;38745:5;38650:109;;;;;;;;;;;;;-1:-1:-1;;;;;38650:109:0;-1:-1:-1;;;;;38650:109:0;;;;;;-1:-1:-1;;;;;38650:109:0;-1:-1:-1;;;;;38650:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;38650:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;38650:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;38650:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38650:109:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38650:109:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38650:109:0;;-1:-1:-1;;;;;;;38776:32:0;;-1:-1:-1;;;38776:32:0;38768:41;;;;;;38603:214;;15211:13;;15195:12;:29;15187:73;;;;;-1:-1:-1;;;15187:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;38283:539;;;;;;:::o;53395:228::-;53477:16;53505:23;53532:19;53544:6;53532:11;:19::i;:::-;53502:49;;;53575:6;:13;53566:6;:22;53558:31;;;;;;53603:6;53610;53603:14;;;;;;;;;;;;;;53596:21;;;53395:228;;;;:::o;29724:30::-;;;;:::o;29688:31::-;;;;:::o;54326:134::-;54412:42;54429:5;54436:3;54441:8;54412:42;;;;;;;;;;;;:16;:42::i;30798:112::-;30853:4;30873:20;;;:10;:20;;;;;;:31;;;30798:112::o;53246:143::-;53305:7;53338:13;:11;:13::i;:::-;53329:6;:22;53321:31;;;;;;53366:9;53376:6;53366:17;;;;;;;;;;;;;;;;53359:24;;53246:143;;;:::o;62271:98::-;62352:8;;-1:-1:-1;;;;;62352:8:0;62271:98;:::o;52712:162::-;52768:15;52795:23;52822:19;52834:6;52822:11;:19::i;:::-;52855:13;;52712:162;-1:-1:-1;;;;52712:162:0:o;65132:344::-;65266:4;65313:6;-1:-1:-1;;;;;65301:18:0;:8;-1:-1:-1;;;;;65301:18:0;;:72;;;;65365:8;-1:-1:-1;;;;;65332:41:0;:29;65344:8;65354:6;65332:11;:29::i;:::-;-1:-1:-1;;;;;65332:41:0;;65301:72;:119;;;;65386:34;65403:6;65411:8;65386:16;:34::i;:::-;65301:156;;;;65433:24;65448:8;65433:14;:24::i;:::-;65283:185;65132:344;-1:-1:-1;;;;65132:344:0:o;29843:39::-;;;;;;;;;;;;;:::o;33307:1751::-;33554:16;;33614:15;;33591:150;;;;;;;;;;;-1:-1:-1;;;;;33591:150:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;33591:150:0;;;;;33581:161;;;;;;-1:-1:-1;;;33506:243:0;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;33506:243:0;;;;;;33496:254;;;;;;;;;34038:35;;;;;;;;;;;;;;;;;;;;33496:254;;33472:14;;;;;;33591:150;;33506:243;34063:10;;;;;;34038:35;34063:10;;;;34038:35;1:33:-1;99:1;81:16;;74:27;;;-1:-1;34126:2:0;34111:18;;34105:25;34164:2;34149:18;;34143:25;34210:2;34195:18;;34189:25;34105;;-1:-1:-1;34143:25:0;-1:-1:-1;34181:34:0;;;-1:-1:-1;34038:35:0;;-1:-1:-1;;;34326:2:0;34322:6;;34318:36;;-1:-1:-1;34318:36:0;;34344:2;34339:7;;;;34318:36;34362:24;34459:1;:7;;34464:2;34459:7;;:18;;;;;34470:1;:7;;34475:2;34470:7;;34459:18;34455:186;;;-1:-1:-1;34515:1:0;34455:186;;;34607:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;34607:26:0;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34607:26:0;;;;;;;;34588:45;;34455:186;-1:-1:-1;;;;;34657:21:0;;34649:62;;;;;-1:-1:-1;;;34649:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;34737:16;-1:-1:-1;;;;;34726:27:0;:7;-1:-1:-1;;;;;34726:27:0;;34718:65;;;;;-1:-1:-1;;;34718:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;34798:12;;;:30;;;34821:7;34814:3;:14;;34798:30;34790:61;;;;;-1:-1:-1;;;34790:61:0;;;;;;;;;;;;-1:-1:-1;;;34790:61:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;34876:15:0;;;;;;:6;:15;;;;;:17;;;;;;;;34866:27;;34858:56;;;;;-1:-1:-1;;;34858:56:0;;;;;;;;;;;;-1:-1:-1;;;34858:56:0;;;;;;;;;;;;;;;34989:8;34958:9;:18;34968:7;-1:-1:-1;;;;;34958:18:0;-1:-1:-1;;;;;34958:18:0;;;;;;;;;;;;:28;34977:8;-1:-1:-1;;;;;34958:28:0;-1:-1:-1;;;;;34958:28:0;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;35033:8;-1:-1:-1;;;;;35009:43:0;35024:7;-1:-1:-1;;;;;35009:43:0;;35043:8;35009:43;;;;;;;;;;;;;;;;;;;;;;33307:1751;;;;;;;;;;;;;:::o;45224:777::-;45360:11;:18;45340:9;:16;:38;45332:105;;;;-1:-1:-1;;;45332:105:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45464:1;45452:9;:13;45444:53;;;;;-1:-1:-1;;;45444:53:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;45444:53:0;;;;;;;;;;;;;;;45531:1;45512:9;:16;:20;45504:60;;;;;-1:-1:-1;;;45504:60:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;45504:60:0;;;;;;;;;;;;;;;45579:20;:9;:18;:20::i;:::-;45571:66;;;;-1:-1:-1;;;45571:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45651:9;45646:126;45670:9;:16;45666:1;:20;45646:126;;;45702:62;45708:10;45720:9;45730:1;45720:12;;;;;;;;;;;;;;45734:29;45753:9;45734:11;45746:1;45734:14;;;;;;;;;;;;;;:18;;:29;;;;:::i;:::-;45702:5;:62::i;:::-;45688:3;;45646:126;;;;45780:19;45845:9;45863:11;45820:61;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;45820:61:0;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;45820:61:0;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;45820:61:0;;;45810:72;;;;;;45802:81;;45780:103;;45892:55;45911:11;45924:9;45935:11;45892:18;:55::i;:::-;45954:41;45960:11;45973:10;45985:9;45954:5;:41::i;64685:87::-;64752:12;;;;;;;;;;;;-1:-1:-1;;;64752:12:0;;;;64685:87;:::o;63293:178::-;61865:8;;;;;;;;;-1:-1:-1;;;;;61865:8:0;-1:-1:-1;;;;;61865:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;61865:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;61865:18:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;61865:18:0;61885:38;;;;;;;;;61865:18;61885:38;;;;;;;;;-1:-1:-1;;;;;61851:32:0;:10;:32;61843:81;;;;-1:-1:-1;;;61843:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;61843:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63413:50;63419:6;63427:7;63436:15;63453:9;63413:5;:50::i;33040:217::-;33157:10;33147:21;;;;:9;:21;;;;;;;;-1:-1:-1;;;;;33147:32:0;;;;;;;;;;;;:44;;-1:-1:-1;;33147:44:0;;;;;;;;;;33203:48;;;;;;;33147:32;;33157:10;33203:48;;;;;;;;;;;33040:217;;:::o;54466:308::-;15099:13;:18;;15116:1;15099:18;;;;;;;54585:38;;54599:5;;54606:3;;54611:8;;54585:13;:38::i;:::-;54646:54;54672:5;54679:3;54684:8;54694:5;54646:25;:54::i;:::-;54630:138;;;;-1:-1:-1;;;54630:138:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15211:13;;15195:12;:29;15187:73;;;;;-1:-1:-1;;;15187:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;54466:308;;;;;:::o;46007:818::-;46167:11;:18;46147:9;:16;:38;46139:105;;;;-1:-1:-1;;;46139:105:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46271:1;46259:9;:13;46251:53;;;;;-1:-1:-1;;;46251:53:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;46251:53:0;;;;;;;;;;;;;;;46338:1;46319:9;:16;:20;46311:60;;;;;-1:-1:-1;;;46311:60:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;46311:60:0;;;;;;;;;;;;;;;46386:20;:9;:18;:20::i;:::-;46378:66;;;;-1:-1:-1;;;46378:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46453:19;46518:9;46536:11;46493:61;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;46493:61:0;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;46493:61:0;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;46493:61:0;;;46483:72;;;;;;46475:81;;46453:103;;46588:12;46573:11;:27;46565:71;;;;;-1:-1:-1;;;46565:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;46643:42;46649:10;46661:12;46675:9;46643:5;:42::i;:::-;46699:9;46694:126;46718:9;:16;46714:1;:20;46694:126;;;46750:62;46756:9;46766:1;46756:12;;;;;;;;;;;;;;46770:10;46782:29;46801:9;46782:11;46794:1;46782:14;;;;;;;:29;46750:5;:62::i;:::-;46736:3;;46694:126;;53667:253;53724:22;53763:16;53770:8;53763:6;:16::i;:::-;53755:48;;;;;-1:-1:-1;;;53755:48:0;;;;;;;;;;;;-1:-1:-1;;;53755:48:0;;;;;;;;;;;;;;;53849:12;53871:19;:8;:17;:19::i;:::-;53824:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;53824:89:0;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;;;;365:33;;-1:-1;;;53824:89:0;;;;;-1:-1:-1;53824:89:0;;;26:21:-1;;;-1:-1;;22:32;6:49;;53824:89:0;;;;;;;;-1:-1:-1;;;;;53667:253:0:o;63762:156::-;61865:8;;;;;;;;;-1:-1:-1;;;;;61865:8:0;-1:-1:-1;;;;;61865:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;61865:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;61865:18:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;61865:18:0;61885:38;;;;;;;;;61865:18;61885:38;;;;;;;;;-1:-1:-1;;;;;61851:32:0;:10;:32;61843:81;;;;-1:-1:-1;;;61843:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;61843:81:0;;63865:45;63875:6;63883:15;63900:9;63865;:45::i;35926:147::-;36007:7;36030:24;;;:14;:24;;;;;;;;-1:-1:-1;;;;;36030:37:0;;;;;;;;;;;;;;35926:147::o;36394:::-;-1:-1:-1;;;;;36507:17:0;;;36476:15;36507:17;;;:9;:17;;;;;;;;:28;;;;;;;;;;;;;;;36394:147::o;39513:341::-;15099:13;:18;;15116:1;15099:18;;;;;39649:44;39663:5;39670:3;39675:8;39685:7;39649:13;:44::i;:::-;39716:63;39742:5;39749:3;39754:8;39764:7;39773:5;39716:25;:63::i;:::-;39700:148;;;;-1:-1:-1;;;39700:148:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64151;61865:8;;;;;;;;;-1:-1:-1;;;;;61865:8:0;-1:-1:-1;;;;;61865:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;61865:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;61865:18:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;61865:18:0;61885:38;;;;;;;;;61865:18;61885:38;;;;;;;;;-1:-1:-1;;;;;61851:32:0;:10;:32;61843:81;;;;-1:-1:-1;;;61843:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;61843:81:0;;64252:39;64258:11;64271:8;64281:9;64252:5;:39::i;38828:217::-;38981:58;39003:5;39010:3;39015:9;39026:8;38981:58;;;;;;;;;;;;:21;:58::i;39192:149::-;39291:44;39305:5;39312:3;39317:8;39327:7;39291:13;:44::i;25760:215::-;25897:3;25391:2;25868:26;;:32;;25915:28;;;;;25760:215::o;27556:338::-;27754:1;27831:10;;25391:2;27812:30;27806:3;:36;27857:23;;;27720:35;27856:32;27556:338;;;;:::o;41567:586::-;41677:46;41695:10;41707:5;41714:8;41677:17;:46::i;:::-;41669:71;;;;;-1:-1:-1;;;41669:71:0;;;;;;;;;;;;-1:-1:-1;;;41669:71:0;;;;;;;;;;;;;;;41766:26;41776:5;41783:8;41766:9;:26::i;:::-;41755:7;:37;;41747:84;;;;-1:-1:-1;;;41747:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41846:17:0;;41838:48;;;;;-1:-1:-1;;;41838:48:0;;;;;;;;;;;;-1:-1:-1;;;41838:48:0;;;;;;;;;;;;;;;41895:71;41915:5;41922:8;41932:7;41941:24;41895:19;:71::i;:::-;41973:69;41993:3;41998:8;42008:7;42017:24;41973:19;:69::i;:::-;42075:8;42070:3;-1:-1:-1;;;;;42054:30:0;42063:5;-1:-1:-1;;;;;42054:30:0;-1:-1:-1;;;;;;;;;;;42054:30:0;;;;;;;;;42129:8;42124:3;-1:-1:-1;;;;;42096:51:0;42117:5;-1:-1:-1;;;;;42096:51:0;-1:-1:-1;;;;;;;;;;;42139:7:0;42096:51;;;;;;;;;;;;;;;;;;41567:586;;;;:::o;10255:294::-;10346:8;;10316:4;;;10363:161;10387:6;10383:1;:10;10363:161;;;10410:11;10423:9;10436:16;10444:1;10447;10449;10447:4;;;;;;;;;;;;;;10436:7;:16::i;:::-;10409:43;;;;10467:4;:15;;;;;10481:1;10475:3;:7;10467:15;10463:54;;;10502:5;10495:12;;;;;;;;10463:54;-1:-1:-1;;10395:3:0;;10363:161;;;-1:-1:-1;10539:4:0;;10255:294;-1:-1:-1;;;10255:294:0:o;43632:449::-;43721:20;43744:32;43754:11;43767:8;43744:9;:32::i;:::-;43721:55;;43807:9;43791:12;:25;;43783:71;;;;-1:-1:-1;;;43783:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43863:79;43883:11;43896:8;43906:9;43917:24;43863:19;:79::i;:::-;43954:43;;43988:8;;43984:1;;-1:-1:-1;;;;;43954:43:0;;;-1:-1:-1;;;;;;;;;;;43954:43:0;43984:1;;43954:43;44009:66;;;;;;;;44055:8;;44051:1;;-1:-1:-1;;;;;44009:66:0;;;-1:-1:-1;;;;;;;;;;;44009:66:0;;;;;;;;;43632:449;;;;:::o;48529:563::-;48755:27;;48819:43;:16;48847:14;48819:43;:27;:43;:::i;:::-;48754:108;;-1:-1:-1;48754:108:0;-1:-1:-1;48876:9:0;48871:191;48895:10;:17;48891:1;:21;48871:191;;;48928:13;48944:14;48959:1;48944:17;;;;;;;;;;;;;;48928:33;;48970:84;48976:16;48993:5;48976:23;;;;;;;;;;;;;;49001:10;49013:40;49043:9;49013:18;49032:5;49013:25;;;;;;;48970:84;-1:-1:-1;48914:3:0;;48871:191;;49098:561;49332:25;;49392:43;:14;49418:16;49392:43;:25;:43;:::i;:::-;49331:104;;-1:-1:-1;49331:104:0;-1:-1:-1;49449:9:0;49444:183;49468:8;:15;49464:1;:19;49444:183;;;49499:13;49515:12;49528:1;49515:15;;;;;;;;;;;;;;49499:31;;49539:80;49545:10;49557:14;49572:5;49557:21;;;;;;;;;;;;;;49580:38;49608:9;49580:16;49597:5;49580:23;;;;;;;49539:80;-1:-1:-1;49485:3:0;;49444:183;;49665:1046;49898:24;;;49992:42;:16;50019:14;49992:42;:26;:42;:::i;:::-;49897:137;;-1:-1:-1;49897:137:0;-1:-1:-1;49897:137:0;-1:-1:-1;50048:9:0;50043:663;50067:7;:14;50063:1;:18;50043:663;;;50097:20;50120:15;50136:1;50120:18;;;;;;;;;;;;;;50097:41;;50147:18;50168:13;50182:1;50168:16;;;;;;;;;;;;;;50147:37;;50234:16;50251:10;50234:28;;;;;;;;;;;;;;50199:18;50218:12;50199:32;;;;;;;;;;;;;;:63;50195:504;;;50275:12;50325:16;50342:10;50325:28;;;;;;;;;;;;;;50290:18;50309:12;50290:32;;;;;;;;;;;;;;:63;50275:78;;50364:70;50370:16;50387:12;50370:30;;;;;;;;;;;;;;50402:10;50414:19;50423:9;50414:4;:8;;:19;;;;:::i;50364:70::-;50195:504;;;;50489:16;50506:10;50489:28;;;;;;;;;;;;;;50454:18;50473:12;50454:32;;;;;;;;;;;;;;:63;50450:249;;;50530:12;50576:18;50595:12;50576:32;;;;;;;;;;;;;;50545:16;50562:10;50545:28;;;;;;;;;;;;;;:63;50530:78;;50619:70;50625:10;50637:16;50654:12;50637:30;;;;;;;;;;;;;;50669:19;50678:9;50669:4;:8;;:19;;;;:::i;50619:70::-;50450:249;;-1:-1:-1;;50083:3:0;;50043:663;;;;49665:1046;;;;;;;;:::o;44726:272::-;44855:20;44862:12;44855:6;:20::i;:::-;44850:143;;29566:1;44886:10;:24;44897:12;44886:24;;;;;;;;;;;:36;;;;44936:49;44948:12;44962:9;44973:11;44936:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;44936:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;44936:49:0;;;;;;;;;;;;;;;;;;;;44726:272;;;:::o;43182:444::-;43329:16;43336:8;43329:6;:16::i;:::-;43324:104;;43356:20;;;;:10;:20;;;;;29522:1;43356:31;;;;27:10:-1;;23:18;;;45:23;;43396:24:0;;;;;;;43324:104;43436:69;43456:3;43461:8;43471:7;43480:24;43436:19;:69::i;:::-;43517:35;;43543:8;;-1:-1:-1;;;;;43517:35:0;;;43534:1;;-1:-1:-1;;;;;;;;;;;43517:35:0;43534:1;;43517:35;43564:56;;;;;;;;43602:8;;-1:-1:-1;;;;;43564:56:0;;;43593:1;;-1:-1:-1;;;;;;;;;;;43564:56:0;;;;;;;;;43182:444;;;:::o;40315:1246::-;40478:5;29947:10;-1:-1:-1;;;;;29947:19:0;;;;29946:53;;-1:-1:-1;;;;;;29971:16:0;;;;;;:9;:16;;;;;;;;29988:10;29971:28;;;;;;;;;;29946:53;29938:106;;;;-1:-1:-1;;;29938:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40541:8;:15;40521:9;:16;:35;40513:86;;;;-1:-1:-1;;;40513:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40614:17:0;;40606:48;;;;;-1:-1:-1;;;40606:48:0;;;;;;;;;;;;-1:-1:-1;;;40606:48:0;;;;;;;;;;;;;;;40722:16;;-1:-1:-1;;;;;40789:12:0;;;;;;;40785:224;;;40817:9;40812:175;40836:9;40832:1;:13;40812:175;;;40889:9;40899:1;40889:12;;;;;;;;;;;;;;40884:3;-1:-1:-1;;;;;40868:34:0;40877:5;-1:-1:-1;;;;;40868:34:0;-1:-1:-1;;;;;;;;;;;40868:34:0;;;;;;;;;40951:9;40961:1;40951:12;;;;;;;;;;;;;;40946:3;-1:-1:-1;;;;;40918:59:0;40939:5;-1:-1:-1;;;;;40918:59:0;-1:-1:-1;;;;;;;;;;;40965:8:0;40974:1;40965:11;;;;;;;;;;;;;;40918:59;;;;;;;;;;;;;;;;;;40847:3;;40812:175;;;;40995:7;;;40785:224;41022:9;41017:446;41041:9;41037:1;:13;41017:446;;;41089:30;41099:5;41106:9;41116:1;41106:12;;;;;;;;;;;;;;41089:9;:30::i;:::-;41074:8;41083:1;41074:11;;;;;;;;;;;;;;:45;;41066:92;;;;-1:-1:-1;;;41066:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41167:79;41187:5;41194:9;41204:1;41194:12;;;;;;;;;;;;;;41208:8;41217:1;41208:11;;;;;;;;;;;;;;41221:24;41167:19;:79::i;:::-;41255:77;41275:3;41280:9;41290:1;41280:12;;;;;;;;;;;;;;41294:8;41303:1;41294:11;;;;;;;;;;;;;;41307:24;41255:19;:77::i;:::-;41369:9;41379:1;41369:12;;;;;;;;;;;;;;41364:3;-1:-1:-1;;;;;41348:34:0;41357:5;-1:-1:-1;;;;;41348:34:0;-1:-1:-1;;;;;;;;;;;41348:34:0;;;;;;;;;41429:9;41439:1;41429:12;;;;;;;;;;;;;;41424:3;-1:-1:-1;;;;;41396:59:0;41417:5;-1:-1:-1;;;;;41396:59:0;-1:-1:-1;;;;;;;;;;;41443:8:0;41452:1;41443:11;;;;;;;;;;;;;;41396:59;;;;;;;;;;;;;;;;;;41052:3;;41017:446;;;;41530:3;-1:-1:-1;;;;;41509:46:0;41523:5;-1:-1:-1;;;;;41509:46:0;;41535:9;41546:8;41509:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;41509:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;41509:46:0;;;;;;;;;;;;;;;;;;;30051:1;40315:1246;;;;;:::o;11192:810::-;11252:4;11911:20;;11754:66;11951:15;;;;;:42;;-1:-1:-1;11970:23:0;;;11943:51;-1:-1:-1;;11192:810:0:o;4833:471::-;4891:7;5136:6;5132:47;;-1:-1:-1;5166:1:0;5159:8;;5132:47;5203:5;;;5207:1;5203;:5;:1;5227:5;;;;;:10;5219:56;;;;-1:-1:-1;;;5219:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5295:1;4833:471;-1:-1:-1;;;4833:471:0:o;44087:213::-;44195:45;44205:6;44213:15;44230:9;44195;:45::i;:::-;44247:47;44258:7;44267:15;44284:9;44247:10;:47::i;55423:366::-;55567:4;55585:16;:3;-1:-1:-1;;;;;55585:14:0;;:16::i;:::-;55580:51;;-1:-1:-1;55619:4:0;55612:11;;55580:51;55653:89;;-1:-1:-1;;;55653:89:0;;55701:10;55653:89;;;;;;-1:-1:-1;;;;;55653:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;55637:13;;55653:37;;;;;;55701:10;;55713:5;;55720:8;;55730:5;;55653:89;;;;;;;;;;;55637:13;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;55653:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55653:89:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55653:89:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55653:89:0;-1:-1:-1;;;;;;55757:25:0;-1:-1:-1;;;55757:25:0;;-1:-1:-1;;55423:366:0;;;;;;:::o;50815:412::-;50865:27;50905:7;50901:40;;-1:-1:-1;50923:10:0;;;;;;;;;;;;-1:-1:-1;;;50923:10:0;;;;;;50901:40;50958:2;50949:6;50982:53;50989:6;;50982:53;;51006:5;;51025:2;51020:7;;;;50982:53;;;51043:17;51073:3;51063:14;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;51063:14:0;87:34:-1;135:17;;-1:-1;51063:14:0;-1:-1:-1;51043:34:0;-1:-1:-1;;;51093:7:0;;51107:87;51114:7;;51107:87;;51165:2;51160;:7;51155:2;:12;51144:25;;51132:4;51137:3;;;;;;;51132:9;;;;;;;;;;;:37;-1:-1:-1;;;;;51132:37:0;;;;;;;;-1:-1:-1;51184:2:0;51178:8;;;;51107:87;;;-1:-1:-1;51216:4:0;50815:412;-1:-1:-1;;;;50815:412:0:o;44308:199::-;44403:19;44425:15;:30;;;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44425:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44425:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44425:32:0;;-1:-1:-1;44464:37:0;44425:32;44483:6;44491:9;44464:5;:37::i;42159:385::-;42325:4;42343:16;:3;-1:-1:-1;;;;;42343:14:0;;:16::i;:::-;42338:51;;-1:-1:-1;42377:4:0;42370:11;;42338:51;42397:13;42430:3;-1:-1:-1;;;;;42413:39:0;;42453:10;42465:5;42472:8;42482:7;42491:5;42413:84;;;;;;;;;;;;;-1:-1:-1;;;;;42413:84:0;-1:-1:-1;;;;;42413:84:0;;;;;;-1:-1:-1;;;;;42413:84:0;-1:-1:-1;;;;;42413:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;42413:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42413:84:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42413:84:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42413:84:0;-1:-1:-1;;;;;;42511:26:0;-1:-1:-1;;;42511:26:0;;-1:-1:-1;;42159:385:0;;;;;;;;:::o;36830:332::-;36976:11;36989:13;37006:27;:8;:25;:27::i;:::-;-1:-1:-1;;;;;37073:25:0;;;;;;:18;:25;;;;;;;;:30;;;;;;;;;36975:58;;-1:-1:-1;36975:58:0;-1:-1:-1;37073:83:0;;36975:58;37138:7;37147:2;37073:83;:49;:83;:::i;:::-;-1:-1:-1;;;;;37040:25:0;;;;;;;:18;:25;;;;;;;;:30;;;;;;;;;;:116;;;;-1:-1:-1;;;;36830:332:0:o;8157:259::-;8267:8;;8228:7;;;;;8282:105;8306:6;8302:1;:10;8282:105;;;8340:1;8332;8334;8332:4;;;;;;;;;;;;;;:9;8328:52;;;8362:1;-1:-1:-1;8365:4:0;;-1:-1:-1;8354:16:0;;-1:-1:-1;8354:16:0;8328:52;8314:3;;8282:105;;;-1:-1:-1;8401:1:0;;-1:-1:-1;8401:1:0;;-1:-1:-1;;8157:259:0;;;;;;:::o;8566:805::-;8649:16;8667;8692:14;8709:1;:8;8692:25;;8724:24;8762:6;8751:18;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;8751:18:0;-1:-1:-1;8724:45:0;-1:-1:-1;8776:13:0;;8875:158;8899:6;8895:1;:10;8875:158;;;8921:9;8933:1;8935;8933:4;;;;;;;;;;;;;;8921:16;;8951:14;8960:1;8963;8951:8;:14::i;:::-;8946:80;;8994:4;8978:10;8989:1;8978:13;;;;;;;;:20;;;:13;;;;;;;;;;;:20;9009:7;;;;;8946:80;-1:-1:-1;8907:3:0;;8875:158;;;;9039:25;9081:5;9067:20;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;9067:20:0;;9039:48;;9094:29;9140:5;9126:20;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;9126:20:0;-1:-1:-1;9094:52:0;-1:-1:-1;9153:9:0;;9173:155;9197:6;9193:1;:10;9173:155;;;9223:10;9234:1;9223:13;;;;;;;;;;;;;;9219:102;;;9263:1;9265;9263:4;;;;;;;;;;;;;;9249:8;9258:1;9249:11;;;;;;;;;;;;;:18;;;;;9296:1;9278:12;9291:1;9278:15;;;;;;;;;;;;;;;;;:19;9308:3;;;;;9219:102;9205:3;;9173:155;;;-1:-1:-1;9342:8:0;;9352:12;;-1:-1:-1;8566:805:0;-1:-1:-1;;;;;;;8566:805:0:o;9377:872::-;9459:16;9477;9495;9520:14;9537:1;:8;9520:25;;9552:24;9590:6;9579:18;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;9579:18:0;-1:-1:-1;9552:45:0;-1:-1:-1;9604:17:0;;9632:139;9656:6;9652:1;:10;9632:139;;;9682:17;9691:1;9694;9696;9694:4;;;;;;;;;;;;;;9682:8;:17::i;:::-;9678:86;;;9728:4;9712:10;9723:1;9712:13;;;;;;;;:20;;;:13;;;;;;;;;;;:20;9743:11;;;;;9678:86;9664:3;;9632:139;;;;9777:25;9819:9;9805:24;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;9805:24:0;;9777:52;;9836:30;9883:9;9869:24;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;9869:24:0;;9836:57;;9900:30;9947:9;9933:24;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;9933:24:0;-1:-1:-1;9900:57:0;-1:-1:-1;9964:9:0;;9984:206;10008:6;10004:1;:10;9984:206;;;10034:10;10045:1;10034:13;;;;;;;;;;;;;;10030:153;;;10074:1;10076;10074:4;;;;;;;;;;;;;;10060:8;10069:1;10060:11;;;;;;;;;;;;;:18;;;;;10108:1;10089:13;10103:1;10089:16;;;;;;;;;;;;;:20;;;;;10143:16;10151:1;10154;10156;10154:4;;;;;;;10143:16;10120:39;10121:13;10135:1;10121:16;;;;;;;;;;;;;;;;;10120:39;10170:3;;;;;10030:153;10016:3;;9984:206;;;-1:-1:-1;10204:8:0;;10214:13;;-1:-1:-1;10214:13:0;-1:-1:-1;9377:872:0;-1:-1:-1;;;;;;;9377:872:0:o;44515:205::-;44612:20;44635:15;:31;;;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;26480:825:0;26630:21;;;26695:10;:28;;;;;;;;;26691:580;;;26750:35;26764:12;26778:6;26750:13;:35::i;:::-;26734:51;-1:-1:-1;26810:65:0;26826:12;26840:6;26848:26;26734:51;26866:7;26848:26;:17;:26;:::i;:::-;26810:15;:65::i;:::-;26794:81;;26691:580;;;26907:14;26893:10;:28;;;;;;;;;26889:382;;;26948:35;26962:12;26976:6;26948:13;:35::i;:::-;26932:51;-1:-1:-1;27008:65:0;27024:12;27038:6;27046:26;26932:51;27064:7;27046:26;:17;:26;:::i;26889:382::-;27105:18;27091:10;:32;;;;;;;;;27087:184;;;27150:46;27166:12;27180:6;27188:7;27150:15;:46::i;27087:184::-;27219:27;;;-1:-1:-1;;;27219:27:0;;;;;;;;;;;;-1:-1:-1;;;27219:27:0;;;;;;;;;;;;;;8422:138;8494:4;8510:9;8523:13;8531:1;8534;8523:7;:13::i;3461:181::-;3519:7;3551:5;;;3575:6;;;;3567:46;;;;;-1:-1:-1;;;3567:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;28213:467;28313:7;-1:-1:-1;;;28337:28:0;;28329:76;;;;-1:-1:-1;;;28329:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28479:35:0;28513:1;28589:10;;25391:2;28570:30;28564:3;:36;28629:17;;;28627:20;28615:32;;28653:20;;;;28614:60;28213:467;;;;;:::o;3917:136::-;3975:7;4002:43;4006:1;4009;4002:43;;;;;;;;;;;;;;;;;4476:7;4512:12;4504:6;;;;4496:29;;;;-1:-1:-1;;;4496:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;4496:29:0;-1:-1:-1;;;4548:5:0;;;4390:192::o

Swarm Source

bzzr://6a1940fe777b8e63309c21dd7e676ea6257c61bdc096c85c9b740ba169001d67
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.