ETH Price: $3,395.45 (-1.37%)
Gas: 2 Gwei

Token

Shares (SHARE)
 

Overview

Max Total Supply

0 SHARE

Holders

297

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

0x2e3a5f60a5590959b068587c47e643e18e7f5cdf
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ShareToken

Compiler Version
v0.5.15+commit.6a57276f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license
File 1 of 1 : ShareToken.sol
pragma solidity 0.5.15;

contract IAugur {
    function createChildUniverse(bytes32 _parentPayoutDistributionHash, uint256[] memory _parentPayoutNumerators) public returns (IUniverse);
    function isKnownUniverse(IUniverse _universe) public view returns (bool);
    function trustedCashTransfer(address _from, address _to, uint256 _amount) public returns (bool);
    function isTrustedSender(address _address) public returns (bool);
    function onCategoricalMarketCreated(uint256 _endTime, string memory _extraInfo, IMarket _market, address _marketCreator, address _designatedReporter, uint256 _feePerCashInAttoCash, bytes32[] memory _outcomes) public returns (bool);
    function onYesNoMarketCreated(uint256 _endTime, string memory _extraInfo, IMarket _market, address _marketCreator, address _designatedReporter, uint256 _feePerCashInAttoCash) public returns (bool);
    function onScalarMarketCreated(uint256 _endTime, string memory _extraInfo, IMarket _market, address _marketCreator, address _designatedReporter, uint256 _feePerCashInAttoCash, int256[] memory _prices, uint256 _numTicks)  public returns (bool);
    function logInitialReportSubmitted(IUniverse _universe, address _reporter, address _market, address _initialReporter, uint256 _amountStaked, bool _isDesignatedReporter, uint256[] memory _payoutNumerators, string memory _description, uint256 _nextWindowStartTime, uint256 _nextWindowEndTime) public returns (bool);
    function disputeCrowdsourcerCreated(IUniverse _universe, address _market, address _disputeCrowdsourcer, uint256[] memory _payoutNumerators, uint256 _size, uint256 _disputeRound) public returns (bool);
    function logDisputeCrowdsourcerContribution(IUniverse _universe, address _reporter, address _market, address _disputeCrowdsourcer, uint256 _amountStaked, string memory description, uint256[] memory _payoutNumerators, uint256 _currentStake, uint256 _stakeRemaining, uint256 _disputeRound) public returns (bool);
    function logDisputeCrowdsourcerCompleted(IUniverse _universe, address _market, address _disputeCrowdsourcer, uint256[] memory _payoutNumerators, uint256 _nextWindowStartTime, uint256 _nextWindowEndTime, bool _pacingOn, uint256 _totalRepStakedInPayout, uint256 _totalRepStakedInMarket, uint256 _disputeRound) public returns (bool);
    function logInitialReporterRedeemed(IUniverse _universe, address _reporter, address _market, uint256 _amountRedeemed, uint256 _repReceived, uint256[] memory _payoutNumerators) public returns (bool);
    function logDisputeCrowdsourcerRedeemed(IUniverse _universe, address _reporter, address _market, uint256 _amountRedeemed, uint256 _repReceived, uint256[] memory _payoutNumerators) public returns (bool);
    function logMarketFinalized(IUniverse _universe, uint256[] memory _winningPayoutNumerators) public returns (bool);
    function logMarketMigrated(IMarket _market, IUniverse _originalUniverse) public returns (bool);
    function logReportingParticipantDisavowed(IUniverse _universe, IMarket _market) public returns (bool);
    function logMarketParticipantsDisavowed(IUniverse _universe) public returns (bool);
    function logCompleteSetsPurchased(IUniverse _universe, IMarket _market, address _account, uint256 _numCompleteSets) public returns (bool);
    function logCompleteSetsSold(IUniverse _universe, IMarket _market, address _account, uint256 _numCompleteSets, uint256 _fees) public returns (bool);
    function logMarketOIChanged(IUniverse _universe, IMarket _market) public returns (bool);
    function logTradingProceedsClaimed(IUniverse _universe, address _sender, address _market, uint256 _outcome, uint256 _numShares, uint256 _numPayoutTokens, uint256 _fees) public returns (bool);
    function logUniverseForked(IMarket _forkingMarket) public returns (bool);
    function logReputationTokensTransferred(IUniverse _universe, address _from, address _to, uint256 _value, uint256 _fromBalance, uint256 _toBalance) public returns (bool);
    function logReputationTokensBurned(IUniverse _universe, address _target, uint256 _amount, uint256 _totalSupply, uint256 _balance) public returns (bool);
    function logReputationTokensMinted(IUniverse _universe, address _target, uint256 _amount, uint256 _totalSupply, uint256 _balance) public returns (bool);
    function logShareTokensBalanceChanged(address _account, IMarket _market, uint256 _outcome, uint256 _balance) public returns (bool);
    function logDisputeCrowdsourcerTokensTransferred(IUniverse _universe, address _from, address _to, uint256 _value, uint256 _fromBalance, uint256 _toBalance) public returns (bool);
    function logDisputeCrowdsourcerTokensBurned(IUniverse _universe, address _target, uint256 _amount, uint256 _totalSupply, uint256 _balance) public returns (bool);
    function logDisputeCrowdsourcerTokensMinted(IUniverse _universe, address _target, uint256 _amount, uint256 _totalSupply, uint256 _balance) public returns (bool);
    function logDisputeWindowCreated(IDisputeWindow _disputeWindow, uint256 _id, bool _initial) public returns (bool);
    function logParticipationTokensRedeemed(IUniverse universe, address _sender, uint256 _attoParticipationTokens, uint256 _feePayoutShare) public returns (bool);
    function logTimestampSet(uint256 _newTimestamp) public returns (bool);
    function logInitialReporterTransferred(IUniverse _universe, IMarket _market, address _from, address _to) public returns (bool);
    function logMarketTransferred(IUniverse _universe, address _from, address _to) public returns (bool);
    function logParticipationTokensTransferred(IUniverse _universe, address _from, address _to, uint256 _value, uint256 _fromBalance, uint256 _toBalance) public returns (bool);
    function logParticipationTokensBurned(IUniverse _universe, address _target, uint256 _amount, uint256 _totalSupply, uint256 _balance) public returns (bool);
    function logParticipationTokensMinted(IUniverse _universe, address _target, uint256 _amount, uint256 _totalSupply, uint256 _balance) public returns (bool);
    function logMarketRepBondTransferred(address _universe, address _from, address _to) public returns (bool);
    function logWarpSyncDataUpdated(address _universe, uint256 _warpSyncHash, uint256 _marketEndTime) public returns (bool);
    function isKnownFeeSender(address _feeSender) public view returns (bool);
    function lookup(bytes32 _key) public view returns (address);
    function getTimestamp() public view returns (uint256);
    function getMaximumMarketEndDate() public returns (uint256);
    function isKnownMarket(IMarket _market) public view returns (bool);
    function derivePayoutDistributionHash(uint256[] memory _payoutNumerators, uint256 _numTicks, uint256 numOutcomes) public view returns (bytes32);
    function logValidityBondChanged(uint256 _validityBond) public returns (bool);
    function logDesignatedReportStakeChanged(uint256 _designatedReportStake) public returns (bool);
    function logNoShowBondChanged(uint256 _noShowBond) public returns (bool);
    function logReportingFeeChanged(uint256 _reportingFee) public returns (bool);
    function getUniverseForkIndex(IUniverse _universe) public view returns (uint256);
}

library ContractExists {
    function exists(address _address) internal view returns (bool) {
        uint256 size;
        assembly { size := extcodesize(_address) }
        return size > 0;
    }
}

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);
}

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;
    }
}

contract IOwnable {
    function getOwner() public view returns (address);
    function transferOwnership(address _newOwner) public returns (bool);
}

contract ITyped {
    function getTypeName() public view returns (bytes32);
}

contract Initializable {
    bool private initialized = false;

    modifier beforeInitialized {
        require(!initialized);
        _;
    }

    function endInitialization() internal beforeInitialized {
        initialized = true;
    }

    function getInitialized() public view returns (bool) {
        return initialized;
    }
}

contract ReentrancyGuard {
    /**
     * @dev We use a single lock for the whole contract.
     */
    bool private rentrancyLock = false;

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * @notice If you mark a function `nonReentrant`, you should also mark it `external`. Calling one nonReentrant function from another is not supported. Instead, you can implement a `private` function doing the actual work, and a `external` wrapper marked as `nonReentrant`.
     */
    modifier nonReentrant() {
        require(!rentrancyLock);
        rentrancyLock = true;
        _;
        rentrancyLock = false;
    }
}

library TokenId {

    function getTokenId(IMarket _market, uint256 _outcome) internal pure returns (uint256 _tokenId) {
        bytes memory _tokenIdBytes = abi.encodePacked(_market, uint8(_outcome));
        assembly {
            _tokenId := mload(add(_tokenIdBytes, add(0x20, 0)))
        }
    }

    function getTokenIds(IMarket _market, uint256[] memory _outcomes) internal pure returns (uint256[] memory _tokenIds) {
        _tokenIds = new uint256[](_outcomes.length);
        for (uint256 _i = 0; _i < _outcomes.length; _i++) {
            _tokenIds[_i] = getTokenId(_market, _outcomes[_i]);
        }
    }

    function unpackTokenId(uint256 _tokenId) internal pure returns (address _market, uint256 _outcome) {
        assembly {
            _market := shr(96,  and(_tokenId, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000))
            _outcome := shr(88, and(_tokenId, 0x0000000000000000000000000000000000000000FF0000000000000000000000))
        }
    }
}

library SafeMathUint256 {
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b);

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // assert(b > 0); // Solidity automatically throws when dividing by 0
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold
        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a);
        return a - b;
    }

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a);
        return c;
    }

    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a <= b) {
            return a;
        } else {
            return b;
        }
    }

    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a >= b) {
            return a;
        } else {
            return b;
        }
    }

    function sqrt(uint256 y) internal pure returns (uint256 z) {
        if (y > 3) {
            uint256 x = (y + 1) / 2;
            z = y;
            while (x < z) {
                z = x;
                x = (y / x + x) / 2;
            }
        } else if (y != 0) {
            z = 1;
        }
    }

    function getUint256Min() internal pure returns (uint256) {
        return 0;
    }

    function getUint256Max() internal pure returns (uint256) {
        // 2 ** 256 - 1
        return 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff;
    }

    function isMultipleOf(uint256 a, uint256 b) internal pure returns (bool) {
        return a % b == 0;
    }

    // Float [fixed point] Operations
    function fxpMul(uint256 a, uint256 b, uint256 base) internal pure returns (uint256) {
        return div(mul(a, b), base);
    }

    function fxpDiv(uint256 a, uint256 b, uint256 base) internal pure returns (uint256) {
        return div(mul(a, base), b);
    }
}

interface IERC1155 {

    /// @dev Either TransferSingle or TransferBatch MUST emit when tokens are transferred,
    ///      including zero value transfers as well as minting or burning.
    /// Operator will always be msg.sender.
    /// Either event from address `0x0` signifies a minting operation.
    /// An event to address `0x0` signifies a burning or melting operation.
    /// The total value transferred from address 0x0 minus the total value transferred to 0x0 may
    /// be used by clients and exchanges to be added to the "circulating supply" for a given token ID.
    /// To define a token ID with no initial balance, the contract SHOULD emit the TransferSingle event
    /// from `0x0` to `0x0`, with the token creator as `_operator`.
    event TransferSingle(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256 id,
        uint256 value
    );

    /// @dev Either TransferSingle or TransferBatch MUST emit when tokens are transferred,
    ///      including zero value transfers as well as minting or burning.
    ///Operator will always be msg.sender.
    /// Either event from address `0x0` signifies a minting operation.
    /// An event to address `0x0` signifies a burning or melting operation.
    /// The total value transferred from address 0x0 minus the total value transferred to 0x0 may
    /// be used by clients and exchanges to be added to the "circulating supply" for a given token ID.
    /// To define multiple token IDs with no initial balance, this SHOULD emit the TransferBatch event
    /// from `0x0` to `0x0`, with the token creator as `_operator`.
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /// @dev MUST emit when an approval is updated.
    event ApprovalForAll(
        address indexed owner,
        address indexed operator,
        bool approved
    );

    /// @dev MUST emit when the URI is updated for a token ID.
    /// URIs are defined in RFC 3986.
    /// The URI MUST point a JSON file that conforms to the "ERC-1155 Metadata JSON Schema".
    event URI(
        string value,
        uint256 indexed id
    );

    /// @notice Transfers value amount of an _id from the _from address to the _to address specified.
    /// @dev MUST emit TransferSingle event on success.
    /// Caller must be approved to manage the _from account's tokens (see isApprovedForAll).
    /// MUST throw if `_to` is the zero address.
    /// MUST throw if balance of sender for token `_id` is lower than the `_value` sent.
    /// MUST throw on any other error.
    /// When transfer is complete, this function MUST check if `_to` is a smart contract (code size > 0).
    /// If so, it MUST call `onERC1155Received` on `_to` and revert if the return value
    /// is not `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`.
    /// @param from    Source address
    /// @param to      Target address
    /// @param id      ID of the token type
    /// @param value   Transfer amount
    /// @param data    Additional data with no specified format, sent in call to `_to`
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 value,
        bytes calldata data
    )
        external;

    /// @notice Send multiple types of Tokens from a 3rd party in one transfer (with safety call).
    /// @dev MUST emit TransferBatch event on success.
    /// Caller must be approved to manage the _from account's tokens (see isApprovedForAll).
    /// MUST throw if `_to` is the zero address.
    /// MUST throw if length of `_ids` is not the same as length of `_values`.
    ///  MUST throw if any of the balance of sender for token `_ids` is lower than the respective `_values` sent.
    /// MUST throw on any other error.
    /// When transfer is complete, this function MUST check if `_to` is a smart contract (code size > 0).
    /// If so, it MUST call `onERC1155BatchReceived` on `_to` and revert if the return value
    /// is not `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`.
    /// @param from    Source addresses
    /// @param to      Target addresses
    /// @param ids     IDs of each token type
    /// @param values  Transfer amounts per token type
    /// @param data    Additional data with no specified format, sent in call to `_to`
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    )
        external;

    /// @notice Enable or disable approval for a third party ("operator") to manage all of the caller's tokens.
    /// @dev MUST emit the ApprovalForAll event on success.
    /// @param operator  Address to add to the set of authorized operators
    /// @param approved  True if the operator is approved, false to revoke approval
    function setApprovalForAll(address operator, bool approved) external;

    /// @notice Queries the approval status of an operator for a given owner.
    /// @param owner     The owner of the Tokens
    /// @param operator  Address of authorized operator
    /// @return           True if the operator is approved, false if not
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /// @notice Get the balance of an account's Tokens.
    /// @param owner  The address of the token holder
    /// @param id     ID of the Token
    /// @return        The _owner's balance of the Token type requested
    function balanceOf(address owner, uint256 id) external view returns (uint256);

    /// @notice Get the total supply of a Token.
    /// @param id     ID of the Token
    /// @return        The total supply of the Token type requested
    function totalSupply(uint256 id) external view returns (uint256);

    /// @notice Get the balance of multiple account/token pairs
    /// @param owners The addresses of the token holders
    /// @param ids    ID of the Tokens
    /// @return        The _owner's balance of the Token types requested
    function balanceOfBatch(
        address[] calldata owners,
        uint256[] calldata ids
    )
        external
        view
        returns (uint256[] memory balances_);
}

contract ERC1155 is ERC165, IERC1155 {
    using SafeMathUint256 for uint256;
    using ContractExists for address;

    // Mapping from token ID to account balances
    mapping (uint256 => mapping(address => uint256)) public _balances;

    // Mapping from token ID to total supply
    mapping (uint256 => uint256) public _supplys;

    // Mapping from account to operator approvals
    mapping (address => mapping(address => bool)) public _operatorApprovals;

    constructor()
        public
    {
        _registerInterface(
            ERC1155(0).safeTransferFrom.selector ^
            ERC1155(0).safeBatchTransferFrom.selector ^
            ERC1155(0).balanceOf.selector ^
            ERC1155(0).balanceOfBatch.selector ^
            ERC1155(0).setApprovalForAll.selector ^
            ERC1155(0).isApprovedForAll.selector
        );
    }

    /**
        @dev Get the specified address' balance for token with specified ID.

        Attempting to query the zero account for a balance will result in a revert.

        @param account The address of the token holder
        @param id ID of the token
        @return The account's balance of the token type requested
     */
    function balanceOf(address account, uint256 id) public view returns (uint256) {
        require(account != address(0), "ERC1155: balance query for the zero address");
        return _balances[id][account];
    }

    function totalSupply(uint256 id) public view returns (uint256) {
        return _supplys[id];
    }

    /**
        @dev Get the balance of multiple account/token pairs.

        If any of the query accounts is the zero account, this query will revert.

        @param accounts The addresses of the token holders
        @param ids IDs of the tokens
        @return Balances for each account and token id pair
     */
    function balanceOfBatch(
        address[] memory accounts,
        uint256[] memory ids
    )
        public
        view
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and IDs must have same lengths");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            require(accounts[i] != address(0), "ERC1155: some address in batch balance query is zero");
            batchBalances[i] = _balances[ids[i]][accounts[i]];
        }

        return batchBalances;
    }

    /**
     * @dev Sets or unsets the approval of a given operator.
     *
     * An operator is allowed to transfer all tokens of the sender on their behalf.
     *
     * Because an account already has operator privileges for itself, this function will revert
     * if the account attempts to set the approval status for itself.
     *
     * @param operator address to set the approval
     * @param approved representing the status of the approval to be set
     */
    function setApprovalForAll(address operator, bool approved) external {
        require(msg.sender != operator, "ERC1155: cannot set approval status for self");
        _operatorApprovals[msg.sender][operator] = approved;
        emit ApprovalForAll(msg.sender, operator, approved);
    }

    /**
        @notice Queries the approval status of an operator for a given account.
        @param account   The account of the Tokens
        @param operator  Address of authorized operator
        @return           True if the operator is approved, false if not
    */
    function isApprovedForAll(address account, address operator) public view returns (bool) {
        return operator == address(this) || _operatorApprovals[account][operator];
    }

    /**
        @dev Transfers `value` amount of an `id` from the `from` address to the `to` address specified.
        Caller must be approved to manage the tokens being transferred out of the `from` account.
        If `to` is a smart contract, will call `onERC1155Received` on `to` and act appropriately.
        @param from Source address
        @param to Target address
        @param id ID of the token type
        @param value Transfer amount
        @param data Data forwarded to `onERC1155Received` if `to` is a contract receiver
    */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 value,
        bytes calldata data
    )
        external
    {
        _transferFrom(from, to, id, value, data, true);
    }

    function _transferFrom(
        address from,
        address to,
        uint256 id,
        uint256 value,
        bytes memory data,
        bool doAcceptanceCheck
    )
        internal
    {
        require(to != address(0), "ERC1155: target address must be non-zero");
        require(
            from == msg.sender || isApprovedForAll(from, msg.sender) == true,
            "ERC1155: need operator approval for 3rd party transfers"
        );

        _internalTransferFrom(from, to, id, value, data, doAcceptanceCheck);
    }

    function _internalTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 value,
        bytes memory data,
        bool doAcceptanceCheck
    )
        internal
    {
        _balances[id][from] = _balances[id][from].sub(value);
        _balances[id][to] = _balances[id][to].add(value);

        onTokenTransfer(id, from, to, value);
        emit TransferSingle(msg.sender, from, to, id, value);

        if (doAcceptanceCheck) {
            _doSafeTransferAcceptanceCheck(msg.sender, from, to, id, value, data);
        }
    }

    /**
        @dev Transfers `values` amount(s) of `ids` from the `from` address to the
        `to` address specified. Caller must be approved to manage the tokens being
        transferred out of the `from` account. If `to` is a smart contract, will
        call `onERC1155BatchReceived` on `to` and act appropriately.
        @param from Source address
        @param to Target address
        @param ids IDs of each token type
        @param values Transfer amounts per token type
        @param data Data forwarded to `onERC1155Received` if `to` is a contract receiver
    */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    )
        external
    {
        _batchTransferFrom(from, to, ids, values, data, true);
    }

    function _batchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory values,
        bytes memory data,
        bool doAcceptanceCheck
    )
        internal
    {
        require(ids.length == values.length, "ERC1155: IDs and values must have same lengths");
        if (ids.length == 0) {
            return;
        }
        require(to != address(0), "ERC1155: target address must be non-zero");
        require(
            from == msg.sender || isApprovedForAll(from, msg.sender) == true,
            "ERC1155: need operator approval for 3rd party transfers"
        );

        _internalBatchTransferFrom(from, to, ids, values, data, doAcceptanceCheck);
    }

    function _internalBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory values,
        bytes memory data,
        bool doAcceptanceCheck
    )
        internal
    {
        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 value = values[i];

            _balances[id][from] = _balances[id][from].sub(value);
            _balances[id][to] = _balances[id][to].add(value);
            onTokenTransfer(id, from, to, value);
        }

        emit TransferBatch(msg.sender, from, to, ids, values);

        if (doAcceptanceCheck) {
            _doSafeBatchTransferAcceptanceCheck(msg.sender, from, to, ids, values, data);
        }
    }

    /**
     * @dev Internal function to mint an amount of a token with the given ID
     * @param to The address that will own the minted token
     * @param id ID of the token to be minted
     * @param value Amount of the token to be minted
     * @param data Data forwarded to `onERC1155Received` if `to` is a contract receiver
     */
    function _mint(address to, uint256 id, uint256 value, bytes memory data, bool doAcceptanceCheck) internal {
        require(to != address(0), "ERC1155: mint to the zero address");

        _balances[id][to] = _balances[id][to].add(value);
        _supplys[id] = _supplys[id].add(value);

        onMint(id, to, value);
        emit TransferSingle(msg.sender, address(0), to, id, value);

        if (doAcceptanceCheck) {
            _doSafeTransferAcceptanceCheck(msg.sender, address(0), to, id, value, data);
        }
    }

    /**
     * @dev Internal function to batch mint amounts of tokens with the given IDs
     * @param to The address that will own the minted token
     * @param ids IDs of the tokens to be minted
     * @param values Amounts of the tokens to be minted
     * @param data Data forwarded to `onERC1155Received` if `to` is a contract receiver
     */
    function _mintBatch(address to, uint256[] memory ids, uint256[] memory values, bytes memory data, bool doAcceptanceCheck) internal {
        require(to != address(0), "ERC1155: batch mint to the zero address");
        require(ids.length == values.length, "ERC1155: minted IDs and values must have same lengths");

        for (uint i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] = values[i].add(_balances[ids[i]][to]);
            _supplys[ids[i]] = _supplys[ids[i]].add(values[i]);
            onMint(ids[i], to, values[i]);
        }

        emit TransferBatch(msg.sender, address(0), to, ids, values);

        if (doAcceptanceCheck) {
            _doSafeBatchTransferAcceptanceCheck(msg.sender, address(0), to, ids, values, data);
        }
    }

    /**
     * @dev Internal function to burn an amount of a token with the given ID
     * @param account Account which owns the token to be burnt
     * @param id ID of the token to be burnt
     * @param value Amount of the token to be burnt
     */
    function _burn(address account, uint256 id, uint256 value, bytes memory data, bool doAcceptanceCheck) internal {
        require(account != address(0), "ERC1155: attempting to burn tokens on zero account");

        _balances[id][account] = _balances[id][account].sub(value);
        _supplys[id] = _supplys[id].sub(value);
        onBurn(id, account, value);
        emit TransferSingle(msg.sender, account, address(0), id, value);

        if (doAcceptanceCheck) {
            _doSafeTransferAcceptanceCheck(msg.sender, account, address(0), id, value, data);
        }
    }

    /**
     * @dev Internal function to batch burn an amounts of tokens with the given IDs
     * @param account Account which owns the token to be burnt
     * @param ids IDs of the tokens to be burnt
     * @param values Amounts of the tokens to be burnt
     */
    function _burnBatch(address account, uint256[] memory ids, uint256[] memory values, bytes memory data, bool doAcceptanceCheck) internal {
        require(account != address(0), "ERC1155: attempting to burn batch of tokens on zero account");
        require(ids.length == values.length, "ERC1155: burnt IDs and values must have same lengths");

        for (uint i = 0; i < ids.length; i++) {
            _balances[ids[i]][account] = _balances[ids[i]][account].sub(values[i]);
            _supplys[ids[i]] = _supplys[ids[i]].sub(values[i]);
            onBurn(ids[i], account, values[i]);
        }

        emit TransferBatch(msg.sender, account, address(0), ids, values);

        if (doAcceptanceCheck) {
            _doSafeBatchTransferAcceptanceCheck(msg.sender, account, address(0), ids, values, data);
        }
    }

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 value,
        bytes memory data
    )
        internal
    {
        if (to.exists()) {
            require(
                IERC1155Receiver(to).onERC1155Received(operator, from, id, value, data) ==
                    IERC1155Receiver(to).onERC1155Received.selector,
                "ERC1155: got unknown value from onERC1155Received"
            );
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory values,
        bytes memory data
    )
        internal
    {
        if (to.exists()) {
            require(
                IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, values, data) ==
                    IERC1155Receiver(to).onERC1155BatchReceived.selector,
                "ERC1155: got unknown value from onERC1155BatchReceived"
            );
        }
    }

    // Subclasses of this token generally want to send additional logs through the centralized Augur log emitter contract
    function onTokenTransfer(uint256 _tokenId, address _from, address _to, uint256 _value) internal;

    // Subclasses of this token may want to send additional logs through the centralized Augur log emitter contract
    function onMint(uint256 _tokenId, address _target, uint256 _amount) internal;

    // Subclasses of this token may want to send additional logs through the centralized Augur log emitter contract
    function onBurn(uint256 _tokenId, address _target, uint256 _amount) internal;
}

contract IERC1155Receiver is IERC165 {

    /**
        @dev Handles the receipt of a single ERC1155 token type. This function is
        called at the end of a `safeTransferFrom` after the balance has been updated.
        To accept the transfer, this must return
        `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
        (i.e. 0xf23a6e61, or its own function selector).
        @param operator The address which initiated the transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param id The ID of the token being transferred
        @param value The amount of tokens being transferred
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
    */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    )
        external
        returns(bytes4);

    /**
        @dev Handles the receipt of a multiple ERC1155 token types. This function
        is called at the end of a `safeBatchTransferFrom` after the balances have
        been updated. To accept the transfer(s), this must return
        `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
        (i.e. 0xbc197c81, or its own function selector).
        @param operator The address which initiated the batch transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param ids An array containing ids of each token being transferred (order and length must match values array)
        @param values An array containing amounts of each token being transferred (order and length must match ids array)
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
    */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    )
        external
        returns(bytes4);
}

contract IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address owner) public view returns (uint256);
    function transfer(address to, uint256 amount) public returns (bool);
    function transferFrom(address from, address to, uint256 amount) public returns (bool);
    function approve(address spender, uint256 amount) public returns (bool);
    function allowance(address owner, address spender) public view returns (uint256);

    // solhint-disable-next-line no-simple-event-func-name
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

contract ICash is IERC20 {
}

contract IAffiliateValidator {
    function validateReference(address _account, address _referrer) external view returns (bool);
}

contract IDisputeWindow is ITyped, IERC20 {
    function invalidMarketsTotal() external view returns (uint256);
    function validityBondTotal() external view returns (uint256);

    function incorrectDesignatedReportTotal() external view returns (uint256);
    function initialReportBondTotal() external view returns (uint256);

    function designatedReportNoShowsTotal() external view returns (uint256);
    function designatedReporterNoShowBondTotal() external view returns (uint256);

    function initialize(IAugur _augur, IUniverse _universe, uint256 _disputeWindowId, bool _participationTokensEnabled, uint256 _duration, uint256 _startTime) public;
    function trustedBuy(address _buyer, uint256 _attotokens) public returns (bool);
    function getUniverse() public view returns (IUniverse);
    function getReputationToken() public view returns (IReputationToken);
    function getStartTime() public view returns (uint256);
    function getEndTime() public view returns (uint256);
    function getWindowId() public view returns (uint256);
    function isActive() public view returns (bool);
    function isOver() public view returns (bool);
    function onMarketFinalized() public;
    function redeem(address _account) public returns (bool);
}

contract IMarket is IOwnable {
    enum MarketType {
        YES_NO,
        CATEGORICAL,
        SCALAR
    }

    function initialize(IAugur _augur, IUniverse _universe, uint256 _endTime, uint256 _feePerCashInAttoCash, IAffiliateValidator _affiliateValidator, uint256 _affiliateFeeDivisor, address _designatedReporterAddress, address _creator, uint256 _numOutcomes, uint256 _numTicks) public;
    function derivePayoutDistributionHash(uint256[] memory _payoutNumerators) public view returns (bytes32);
    function doInitialReport(uint256[] memory _payoutNumerators, string memory _description, uint256 _additionalStake) public returns (bool);
    function getUniverse() public view returns (IUniverse);
    function getDisputeWindow() public view returns (IDisputeWindow);
    function getNumberOfOutcomes() public view returns (uint256);
    function getNumTicks() public view returns (uint256);
    function getMarketCreatorSettlementFeeDivisor() public view returns (uint256);
    function getForkingMarket() public view returns (IMarket _market);
    function getEndTime() public view returns (uint256);
    function getWinningPayoutDistributionHash() public view returns (bytes32);
    function getWinningPayoutNumerator(uint256 _outcome) public view returns (uint256);
    function getWinningReportingParticipant() public view returns (IReportingParticipant);
    function getReputationToken() public view returns (IV2ReputationToken);
    function getFinalizationTime() public view returns (uint256);
    function getInitialReporter() public view returns (IInitialReporter);
    function getDesignatedReportingEndTime() public view returns (uint256);
    function getValidityBondAttoCash() public view returns (uint256);
    function affiliateFeeDivisor() external view returns (uint256);
    function getNumParticipants() public view returns (uint256);
    function getDisputePacingOn() public view returns (bool);
    function deriveMarketCreatorFeeAmount(uint256 _amount) public view returns (uint256);
    function recordMarketCreatorFees(uint256 _marketCreatorFees, address _sourceAccount, bytes32 _fingerprint) public returns (bool);
    function isContainerForReportingParticipant(IReportingParticipant _reportingParticipant) public view returns (bool);
    function isFinalizedAsInvalid() public view returns (bool);
    function finalize() public returns (bool);
    function isFinalized() public view returns (bool);
    function getOpenInterest() public view returns (uint256);
}

contract IReportingParticipant {
    function getStake() public view returns (uint256);
    function getPayoutDistributionHash() public view returns (bytes32);
    function liquidateLosing() public;
    function redeem(address _redeemer) public returns (bool);
    function isDisavowed() public view returns (bool);
    function getPayoutNumerator(uint256 _outcome) public view returns (uint256);
    function getPayoutNumerators() public view returns (uint256[] memory);
    function getMarket() public view returns (IMarket);
    function getSize() public view returns (uint256);
}

contract IInitialReporter is IReportingParticipant, IOwnable {
    function initialize(IAugur _augur, IMarket _market, address _designatedReporter) public;
    function report(address _reporter, bytes32 _payoutDistributionHash, uint256[] memory _payoutNumerators, uint256 _initialReportStake) public;
    function designatedReporterShowed() public view returns (bool);
    function initialReporterWasCorrect() public view returns (bool);
    function getDesignatedReporter() public view returns (address);
    function getReportTimestamp() public view returns (uint256);
    function migrateToNewUniverse(address _designatedReporter) public;
    function returnRepFromDisavow() public;
}

contract IReputationToken is IERC20 {
    function migrateOutByPayout(uint256[] memory _payoutNumerators, uint256 _attotokens) public returns (bool);
    function migrateIn(address _reporter, uint256 _attotokens) public returns (bool);
    function trustedReportingParticipantTransfer(address _source, address _destination, uint256 _attotokens) public returns (bool);
    function trustedMarketTransfer(address _source, address _destination, uint256 _attotokens) public returns (bool);
    function trustedUniverseTransfer(address _source, address _destination, uint256 _attotokens) public returns (bool);
    function trustedDisputeWindowTransfer(address _source, address _destination, uint256 _attotokens) public returns (bool);
    function getUniverse() public view returns (IUniverse);
    function getTotalMigrated() public view returns (uint256);
    function getTotalTheoreticalSupply() public view returns (uint256);
    function mintForReportingParticipant(uint256 _amountMigrated) public returns (bool);
}

contract IShareToken is ITyped, IERC1155 {
    function initialize(IAugur _augur) external;
    function initializeMarket(IMarket _market, uint256 _numOutcomes, uint256 _numTicks) public;
    function unsafeTransferFrom(address _from, address _to, uint256 _id, uint256 _value) public;
    function unsafeBatchTransferFrom(address _from, address _to, uint256[] memory _ids, uint256[] memory _values) public;
    function claimTradingProceeds(IMarket _market, address _shareHolder, bytes32 _fingerprint) external returns (uint256[] memory _outcomeFees);
    function getMarket(uint256 _tokenId) external view returns (IMarket);
    function getOutcome(uint256 _tokenId) external view returns (uint256);
    function getTokenId(IMarket _market, uint256 _outcome) public pure returns (uint256 _tokenId);
    function getTokenIds(IMarket _market, uint256[] memory _outcomes) public pure returns (uint256[] memory _tokenIds);
    function buyCompleteSets(IMarket _market, address _account, uint256 _amount) external returns (bool);
    function buyCompleteSetsForTrade(IMarket _market, uint256 _amount, uint256 _longOutcome, address _longRecipient, address _shortRecipient) external returns (bool);
    function sellCompleteSets(IMarket _market, address _holder, address _recipient, uint256 _amount, bytes32 _fingerprint) external returns (uint256 _creatorFee, uint256 _reportingFee);
    function sellCompleteSetsForTrade(IMarket _market, uint256 _outcome, uint256 _amount, address _shortParticipant, address _longParticipant, address _shortRecipient, address _longRecipient, uint256 _price, address _sourceAccount, bytes32 _fingerprint) external returns (uint256 _creatorFee, uint256 _reportingFee);
    function totalSupplyForMarketOutcome(IMarket _market, uint256 _outcome) public view returns (uint256);
    function balanceOfMarketOutcome(IMarket _market, uint256 _outcome, address _account) public view returns (uint256);
    function lowestBalanceOfMarketOutcomes(IMarket _market, uint256[] memory _outcomes, address _account) public view returns (uint256);
}

contract IUniverse {
    function creationTime() external view returns (uint256);
    function marketBalance(address) external view returns (uint256);

    function fork() public returns (bool);
    function updateForkValues() public returns (bool);
    function getParentUniverse() public view returns (IUniverse);
    function createChildUniverse(uint256[] memory _parentPayoutNumerators) public returns (IUniverse);
    function getChildUniverse(bytes32 _parentPayoutDistributionHash) public view returns (IUniverse);
    function getReputationToken() public view returns (IV2ReputationToken);
    function getForkingMarket() public view returns (IMarket);
    function getForkEndTime() public view returns (uint256);
    function getForkReputationGoal() public view returns (uint256);
    function getParentPayoutDistributionHash() public view returns (bytes32);
    function getDisputeRoundDurationInSeconds(bool _initial) public view returns (uint256);
    function getOrCreateDisputeWindowByTimestamp(uint256 _timestamp, bool _initial) public returns (IDisputeWindow);
    function getOrCreateCurrentDisputeWindow(bool _initial) public returns (IDisputeWindow);
    function getOrCreateNextDisputeWindow(bool _initial) public returns (IDisputeWindow);
    function getOrCreatePreviousDisputeWindow(bool _initial) public returns (IDisputeWindow);
    function getOpenInterestInAttoCash() public view returns (uint256);
    function getTargetRepMarketCapInAttoCash() public view returns (uint256);
    function getOrCacheValidityBond() public returns (uint256);
    function getOrCacheDesignatedReportStake() public returns (uint256);
    function getOrCacheDesignatedReportNoShowBond() public returns (uint256);
    function getOrCacheMarketRepBond() public returns (uint256);
    function getOrCacheReportingFeeDivisor() public returns (uint256);
    function getDisputeThresholdForFork() public view returns (uint256);
    function getDisputeThresholdForDisputePacing() public view returns (uint256);
    function getInitialReportMinValue() public view returns (uint256);
    function getPayoutNumerators() public view returns (uint256[] memory);
    function getReportingFeeDivisor() public view returns (uint256);
    function getPayoutNumerator(uint256 _outcome) public view returns (uint256);
    function getWinningChildPayoutNumerator(uint256 _outcome) public view returns (uint256);
    function isOpenInterestCash(address) public view returns (bool);
    function isForkingMarket() public view returns (bool);
    function getCurrentDisputeWindow(bool _initial) public view returns (IDisputeWindow);
    function getDisputeWindowStartTimeAndDuration(uint256 _timestamp, bool _initial) public view returns (uint256, uint256);
    function isParentOf(IUniverse _shadyChild) public view returns (bool);
    function updateTentativeWinningChildUniverse(bytes32 _parentPayoutDistributionHash) public returns (bool);
    function isContainerForDisputeWindow(IDisputeWindow _shadyTarget) public view returns (bool);
    function isContainerForMarket(IMarket _shadyTarget) public view returns (bool);
    function isContainerForReportingParticipant(IReportingParticipant _reportingParticipant) public view returns (bool);
    function migrateMarketOut(IUniverse _destinationUniverse) public returns (bool);
    function migrateMarketIn(IMarket _market, uint256 _cashBalance, uint256 _marketOI) public returns (bool);
    function decrementOpenInterest(uint256 _amount) public returns (bool);
    function decrementOpenInterestFromMarket(IMarket _market) public returns (bool);
    function incrementOpenInterest(uint256 _amount) public returns (bool);
    function getWinningChildUniverse() public view returns (IUniverse);
    function isForking() public view returns (bool);
    function deposit(address _sender, uint256 _amount, address _market) public returns (bool);
    function withdraw(address _recipient, uint256 _amount, address _market) public returns (bool);
    function createScalarMarket(uint256 _endTime, uint256 _feePerCashInAttoCash, IAffiliateValidator _affiliateValidator, uint256 _affiliateFeeDivisor, address _designatedReporterAddress, int256[] memory _prices, uint256 _numTicks, string memory _extraInfo) public returns (IMarket _newMarket);
}

contract IV2ReputationToken is IReputationToken {
    function parentUniverse() external returns (IUniverse);
    function burnForMarket(uint256 _amountToBurn) public returns (bool);
    function mintForWarpSync(uint256 _amountToMint, address _target) public returns (bool);
}

contract IAugurTrading {
    function lookup(bytes32 _key) public view returns (address);
    function logProfitLossChanged(IMarket _market, address _account, uint256 _outcome, int256 _netPosition, uint256 _avgPrice, int256 _realizedProfit, int256 _frozenFunds, int256 _realizedCost) public returns (bool);
    function logOrderCreated(IUniverse _universe, bytes32 _orderId, bytes32 _tradeGroupId) public returns (bool);
    function logOrderCanceled(IUniverse _universe, IMarket _market, address _creator, uint256 _tokenRefund, uint256 _sharesRefund, bytes32 _orderId) public returns (bool);
    function logOrderFilled(IUniverse _universe, address _creator, address _filler, uint256 _price, uint256 _fees, uint256 _amountFilled, bytes32 _orderId, bytes32 _tradeGroupId) public returns (bool);
    function logMarketVolumeChanged(IUniverse _universe, address _market, uint256 _volume, uint256[] memory _outcomeVolumes, uint256 _totalTrades) public returns (bool);
    function logZeroXOrderFilled(IUniverse _universe, IMarket _market, bytes32 _orderHash, bytes32 _tradeGroupId, uint8 _orderType, address[] memory _addressData, uint256[] memory _uint256Data) public returns (bool);
    function logZeroXOrderCanceled(address _universe, address _market, address _account, uint256 _outcome, uint256 _price, uint256 _amount, uint8 _type, bytes32 _orderHash) public;
}

contract IOrders {
    function saveOrder(uint256[] calldata _uints, bytes32[] calldata _bytes32s, Order.Types _type, IMarket _market, address _sender) external returns (bytes32 _orderId);
    function removeOrder(bytes32 _orderId) external returns (bool);
    function getMarket(bytes32 _orderId) public view returns (IMarket);
    function getOrderType(bytes32 _orderId) public view returns (Order.Types);
    function getOutcome(bytes32 _orderId) public view returns (uint256);
    function getAmount(bytes32 _orderId) public view returns (uint256);
    function getPrice(bytes32 _orderId) public view returns (uint256);
    function getOrderCreator(bytes32 _orderId) public view returns (address);
    function getOrderSharesEscrowed(bytes32 _orderId) public view returns (uint256);
    function getOrderMoneyEscrowed(bytes32 _orderId) public view returns (uint256);
    function getOrderDataForCancel(bytes32 _orderId) public view returns (uint256, uint256, Order.Types, IMarket, uint256, address);
    function getOrderDataForLogs(bytes32 _orderId) public view returns (Order.Types, address[] memory _addressData, uint256[] memory _uint256Data);
    function getBetterOrderId(bytes32 _orderId) public view returns (bytes32);
    function getWorseOrderId(bytes32 _orderId) public view returns (bytes32);
    function getBestOrderId(Order.Types _type, IMarket _market, uint256 _outcome) public view returns (bytes32);
    function getWorstOrderId(Order.Types _type, IMarket _market, uint256 _outcome) public view returns (bytes32);
    function getLastOutcomePrice(IMarket _market, uint256 _outcome) public view returns (uint256);
    function getOrderId(Order.Types _type, IMarket _market, uint256 _amount, uint256 _price, address _sender, uint256 _blockNumber, uint256 _outcome, uint256 _moneyEscrowed, uint256 _sharesEscrowed) public pure returns (bytes32);
    function getTotalEscrowed(IMarket _market) public view returns (uint256);
    function isBetterPrice(Order.Types _type, uint256 _price, bytes32 _orderId) public view returns (bool);
    function isWorsePrice(Order.Types _type, uint256 _price, bytes32 _orderId) public view returns (bool);
    function assertIsNotBetterPrice(Order.Types _type, uint256 _price, bytes32 _betterOrderId) public view returns (bool);
    function assertIsNotWorsePrice(Order.Types _type, uint256 _price, bytes32 _worseOrderId) public returns (bool);
    function recordFillOrder(bytes32 _orderId, uint256 _sharesFilled, uint256 _tokensFilled, uint256 _fill) external returns (bool);
    function setPrice(IMarket _market, uint256 _outcome, uint256 _price) external returns (bool);
}

library Order {
    using SafeMathUint256 for uint256;

    enum Types {
        Bid, Ask
    }

    enum TradeDirections {
        Long, Short
    }

    struct Data {
        // Contracts
        IMarket market;
        IAugur augur;
        IAugurTrading augurTrading;
        IShareToken shareToken;
        ICash cash;

        // Order
        bytes32 id;
        address creator;
        uint256 outcome;
        Order.Types orderType;
        uint256 amount;
        uint256 price;
        uint256 sharesEscrowed;
        uint256 moneyEscrowed;
        bytes32 betterOrderId;
        bytes32 worseOrderId;
    }

    function create(IAugur _augur, IAugurTrading _augurTrading, address _creator, uint256 _outcome, Order.Types _type, uint256 _attoshares, uint256 _price, IMarket _market, bytes32 _betterOrderId, bytes32 _worseOrderId) internal view returns (Data memory) {
        require(_outcome < _market.getNumberOfOutcomes(), "Order.create: Outcome is not within market range");
        require(_price != 0, "Order.create: Price may not be 0");
        require(_price < _market.getNumTicks(), "Order.create: Price is outside of market range");
        require(_attoshares > 0, "Order.create: Cannot use amount of 0");
        require(_creator != address(0), "Order.create: Creator is 0x0");

        IShareToken _shareToken = IShareToken(_augur.lookup("ShareToken"));

        return Data({
            market: _market,
            augur: _augur,
            augurTrading: _augurTrading,
            shareToken: _shareToken,
            cash: ICash(_augur.lookup("Cash")),
            id: 0,
            creator: _creator,
            outcome: _outcome,
            orderType: _type,
            amount: _attoshares,
            price: _price,
            sharesEscrowed: 0,
            moneyEscrowed: 0,
            betterOrderId: _betterOrderId,
            worseOrderId: _worseOrderId
        });
    }

    //
    // "public" functions
    //

    function getOrderId(Order.Data memory _orderData, IOrders _orders) internal view returns (bytes32) {
        if (_orderData.id == bytes32(0)) {
            bytes32 _orderId = calculateOrderId(_orderData.orderType, _orderData.market, _orderData.amount, _orderData.price, _orderData.creator, block.number, _orderData.outcome, _orderData.moneyEscrowed, _orderData.sharesEscrowed);
            require(_orders.getAmount(_orderId) == 0, "Order.getOrderId: New order had amount. This should not be possible");
            _orderData.id = _orderId;
        }
        return _orderData.id;
    }

    function calculateOrderId(Order.Types _type, IMarket _market, uint256 _amount, uint256 _price, address _sender, uint256 _blockNumber, uint256 _outcome, uint256 _moneyEscrowed, uint256 _sharesEscrowed) internal pure returns (bytes32) {
        return sha256(abi.encodePacked(_type, _market, _amount, _price, _sender, _blockNumber, _outcome, _moneyEscrowed, _sharesEscrowed));
    }

    function getOrderTradingTypeFromMakerDirection(Order.TradeDirections _creatorDirection) internal pure returns (Order.Types) {
        return (_creatorDirection == Order.TradeDirections.Long) ? Order.Types.Bid : Order.Types.Ask;
    }

    function getOrderTradingTypeFromFillerDirection(Order.TradeDirections _fillerDirection) internal pure returns (Order.Types) {
        return (_fillerDirection == Order.TradeDirections.Long) ? Order.Types.Ask : Order.Types.Bid;
    }

    function saveOrder(Order.Data memory _orderData, bytes32 _tradeGroupId, IOrders _orders) internal returns (bytes32) {
        getOrderId(_orderData, _orders);
        uint256[] memory _uints = new uint256[](5);
        _uints[0] = _orderData.amount;
        _uints[1] = _orderData.price;
        _uints[2] = _orderData.outcome;
        _uints[3] = _orderData.moneyEscrowed;
        _uints[4] = _orderData.sharesEscrowed;
        bytes32[] memory _bytes32s = new bytes32[](4);
        _bytes32s[0] = _orderData.betterOrderId;
        _bytes32s[1] = _orderData.worseOrderId;
        _bytes32s[2] = _tradeGroupId;
        _bytes32s[3] = _orderData.id;
        return _orders.saveOrder(_uints, _bytes32s, _orderData.orderType, _orderData.market, _orderData.creator);
    }
}

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

contract ShareToken is ITyped, Initializable, ERC1155, IShareToken, ReentrancyGuard {

    string constant public name = "Shares";
    string constant public symbol = "SHARE";

    struct MarketData {
        uint256 numOutcomes;
        uint256 numTicks;
    }

    mapping(address => MarketData) markets;

    IAugur public augur;
    ICash public cash;

    function initialize(IAugur _augur) external beforeInitialized {
        endInitialization();
        augur = _augur;
        cash = ICash(_augur.lookup("Cash"));

        require(cash != ICash(0));
    }

    /**
        @dev Transfers `value` amount of an `id` from the `from` address to the `to` address specified.
        Caller must be approved to manage the tokens being transferred out of the `from` account.
        Regardless of if the desintation is a contract or not this will not call `onERC1155Received` on `to`
        @param _from Source address
        @param _to Target address
        @param _id ID of the token type
        @param _value Transfer amount
    */
    function unsafeTransferFrom(address _from, address _to, uint256 _id, uint256 _value) public {
        _transferFrom(_from, _to, _id, _value, bytes(""), false);
    }

    /**
        @dev Transfers `values` amount(s) of `ids` from the `from` address to the
        `to` address specified. Caller must be approved to manage the tokens being
        transferred out of the `from` account. Regardless of if the desintation is
        a contract or not this will not call `onERC1155Received` on `to`
        @param _from Source address
        @param _to Target address
        @param _ids IDs of each token type
        @param _values Transfer amounts per token type
    */
    function unsafeBatchTransferFrom(address _from, address _to, uint256[] memory _ids, uint256[] memory _values) public {
        _batchTransferFrom(_from, _to, _ids, _values, bytes(""), false);
    }

    function initializeMarket(IMarket _market, uint256 _numOutcomes, uint256 _numTicks) public {
        require (augur.isKnownUniverse(IUniverse(msg.sender)));
        markets[address(_market)].numOutcomes = _numOutcomes;
        markets[address(_market)].numTicks = _numTicks;
    }

    /**
     * @notice Buy some amount of complete sets for a market
     * @param _market The market to purchase complete sets in
     * @param _amount The number of complete sets to purchase
     * @return Bool True
     */
    function publicBuyCompleteSets(IMarket _market, uint256 _amount) external returns (bool) {
        buyCompleteSetsInternal(_market, msg.sender, _amount);
        augur.logCompleteSetsPurchased(_market.getUniverse(), _market, msg.sender, _amount);
        return true;
    }

    /**
     * @notice Buy some amount of complete sets for a market
     * @param _market The market to purchase complete sets in
     * @param _account The account receiving the complete sets
     * @param _amount The number of complete sets to purchase
     * @return Bool True
     */
    function buyCompleteSets(IMarket _market, address _account, uint256 _amount) external returns (bool) {
        buyCompleteSetsInternal(_market, _account, _amount);
        return true;
    }

    function buyCompleteSetsInternal(IMarket _market, address _account, uint256 _amount) internal returns (bool) {
        uint256 _numOutcomes = markets[address(_market)].numOutcomes;
        uint256 _numTicks = markets[address(_market)].numTicks;

        require(_numOutcomes != 0, "Invalid Market provided");

        IUniverse _universe = _market.getUniverse();

        uint256 _cost = _amount.mul(_numTicks);
        _universe.deposit(msg.sender, _cost, address(_market));

        uint256[] memory _tokenIds = new uint256[](_numOutcomes);
        uint256[] memory _values = new uint256[](_numOutcomes);

        for (uint256 _i = 0; _i < _numOutcomes; _i++) {
            _tokenIds[_i] = TokenId.getTokenId(_market, _i);
            _values[_i] = _amount;
        }

        _mintBatch(_account, _tokenIds, _values, bytes(""), false);

        if (!_market.isFinalized()) {
            _universe.incrementOpenInterest(_cost);
        }

        augur.logMarketOIChanged(_universe, _market);

        assertBalances(_market);
        return true;
    }

    /**
     * @notice Buy some amount of complete sets for a market and distribute the shares according to the positions of two accounts
     * @param _market The market to purchase complete sets in
     * @param _amount The number of complete sets to purchase
     * @param _longOutcome The outcome for the trade being fulfilled
     * @param _longRecipient The account which should recieve the _longOutcome shares
     * @param _shortRecipient The account which should recieve shares of every outcome other than _longOutcome
     * @return Bool True
     */
    function buyCompleteSetsForTrade(IMarket _market, uint256 _amount, uint256 _longOutcome, address _longRecipient, address _shortRecipient) external returns (bool) {
        uint256 _numOutcomes = markets[address(_market)].numOutcomes;

        require(_numOutcomes != 0, "Invalid Market provided");
        require(_longOutcome < _numOutcomes);

        IUniverse _universe = _market.getUniverse();

        {
            uint256 _numTicks = markets[address(_market)].numTicks;
            uint256 _cost = _amount.mul(_numTicks);
            _universe.deposit(msg.sender, _cost, address(_market));

            if (!_market.isFinalized()) {
                _universe.incrementOpenInterest(_cost);
            }
        }

        uint256[] memory _tokenIds = new uint256[](_numOutcomes - 1);
        uint256[] memory _values = new uint256[](_numOutcomes - 1);
        uint256 _outcome = 0;

        for (uint256 _i = 0; _i < _numOutcomes - 1; _i++) {
            if (_outcome == _longOutcome) {
                _outcome++;
            }
            _tokenIds[_i] = TokenId.getTokenId(_market, _outcome);
            _values[_i] = _amount;
            _outcome++;
        }

        _mintBatch(_shortRecipient, _tokenIds, _values, bytes(""), false);
        _mint(_longRecipient, TokenId.getTokenId(_market, _longOutcome), _amount, bytes(""), false);

        augur.logMarketOIChanged(_universe, _market);

        assertBalances(_market);
        return true;
    }

    /**
     * @notice Sell some amount of complete sets for a market
     * @param _market The market to sell complete sets in
     * @param _amount The number of complete sets to sell
     * @return (uint256 _creatorFee, uint256 _reportingFee) The fees taken for the market creator and reporting respectively
     */
    function publicSellCompleteSets(IMarket _market, uint256 _amount) external returns (uint256 _creatorFee, uint256 _reportingFee) {
        (uint256 _payout, uint256 _creatorFee, uint256 _reportingFee) = burnCompleteSets(_market, msg.sender, _amount, msg.sender, bytes32(0));

        require(cash.transfer(msg.sender, _payout));

        IUniverse _universe = _market.getUniverse();
        augur.logCompleteSetsSold(_universe, _market, msg.sender, _amount, _creatorFee.add(_reportingFee));

        assertBalances(_market);
        return (_creatorFee, _reportingFee);
    }

    /**
     * @notice Sell some amount of complete sets for a market
     * @param _market The market to sell complete sets in
     * @param _holder The holder of the complete sets
     * @param _recipient The recipient of funds from the sale
     * @param _amount The number of complete sets to sell
     * @param _fingerprint Fingerprint of the filler used to naively restrict affiliate fee dispursement
     * @return (uint256 _creatorFee, uint256 _reportingFee) The fees taken for the market creator and reporting respectively
     */
    function sellCompleteSets(IMarket _market, address _holder, address _recipient, uint256 _amount, bytes32 _fingerprint) external returns (uint256 _creatorFee, uint256 _reportingFee) {
        require(_holder == msg.sender || isApprovedForAll(_holder, msg.sender) == true, "ERC1155: need operator approval to sell complete sets");
        
        (uint256 _payout, uint256 _creatorFee, uint256 _reportingFee) = burnCompleteSets(_market, _holder, _amount, _holder, _fingerprint);

        require(cash.transfer(_recipient, _payout));

        assertBalances(_market);
        return (_creatorFee, _reportingFee);
    }

    /**
     * @notice Sell some amount of complete sets for a market
     * @param _market The market to sell complete sets in
     * @param _amount The number of complete sets to sell
     * @param _shortParticipant The account which should provide the short party portion of shares
     * @param _longParticipant The account which should provide the long party portion of shares
     * @param _longRecipient The account which should receive the remaining payout for providing the matching shares to the short recipients shares
     * @param _shortRecipient The account which should recieve the (price * shares provided) payout for selling their side of the sale
     * @param _price The price of the trade being done. This determines how much each recipient recieves from the sale proceeds
     * @param _fingerprint Fingerprint of the filler used to naively restrict affiliate fee dispursement
     * @return (uint256 _creatorFee, uint256 _reportingFee) The fees taken for the market creator and reporting respectively
     */
    function sellCompleteSetsForTrade(IMarket _market, uint256 _outcome, uint256 _amount, address _shortParticipant, address _longParticipant, address _shortRecipient, address _longRecipient, uint256 _price, address _sourceAccount, bytes32 _fingerprint) external returns (uint256 _creatorFee, uint256 _reportingFee) {
        require(isApprovedForAll(_shortParticipant, msg.sender) == true, "ERC1155: need operator approval to burn short account shares");
        require(isApprovedForAll(_longParticipant, msg.sender) == true, "ERC1155: need operator approval to burn long account shares");

        _internalTransferFrom(_shortParticipant, _longParticipant, getTokenId(_market, _outcome), _amount, bytes(""), false);

        // NOTE: burnCompleteSets will validate the market provided is legitimate
        (uint256 _payout, uint256 _creatorFee, uint256 _reportingFee) = burnCompleteSets(_market, _longParticipant, _amount, _sourceAccount, _fingerprint);

        {
            uint256 _longPayout = _payout.mul(_price) / _market.getNumTicks();
            require(cash.transfer(_longRecipient, _longPayout));
            require(cash.transfer(_shortRecipient, _payout.sub(_longPayout)));
        }

        assertBalances(_market);
        return (_creatorFee, _reportingFee);
    }

    function burnCompleteSets(IMarket _market, address _account, uint256 _amount, address _sourceAccount, bytes32 _fingerprint) private returns (uint256 _payout, uint256 _creatorFee, uint256 _reportingFee) {
        uint256 _numOutcomes = markets[address(_market)].numOutcomes;
        uint256 _numTicks = markets[address(_market)].numTicks;

        require(_numOutcomes != 0, "Invalid Market provided");

        // solium-disable indentation
        {
            uint256[] memory _tokenIds = new uint256[](_numOutcomes);
            uint256[] memory _values = new uint256[](_numOutcomes);

            for (uint256 i = 0; i < _numOutcomes; i++) {
                _tokenIds[i] = TokenId.getTokenId(_market, i);
                _values[i] = _amount;
            }

            _burnBatch(_account, _tokenIds, _values, bytes(""), false);
        }
        // solium-enable indentation

        _payout = _amount.mul(_numTicks);
        IUniverse _universe = _market.getUniverse();

        if (!_market.isFinalized()) {
            _universe.decrementOpenInterest(_payout);
        }

        _creatorFee = _market.deriveMarketCreatorFeeAmount(_payout);
        uint256 _reportingFeeDivisor = _universe.getOrCacheReportingFeeDivisor();
        _reportingFee = _payout.div(_reportingFeeDivisor);
        _payout = _payout.sub(_creatorFee).sub(_reportingFee);

        if (_creatorFee != 0) {
            _market.recordMarketCreatorFees(_creatorFee, _sourceAccount, _fingerprint);
        }

        _universe.withdraw(address(this), _payout.add(_reportingFee), address(_market));

        if (_reportingFee != 0) {
            require(cash.transfer(address(_universe.getOrCreateNextDisputeWindow(false)), _reportingFee));
        }

        augur.logMarketOIChanged(_universe, _market);
    }

    /**
     * @notice Claims winnings for a market and for a particular shareholder
     * @param _market The market to claim winnings for
     * @param _shareHolder The account to claim winnings for
     * @param _fingerprint Fingerprint of the filler used to naively restrict affiliate fee dispursement
     * @return Bool True
     */
    function claimTradingProceeds(IMarket _market, address _shareHolder, bytes32 _fingerprint) external nonReentrant returns (uint256[] memory _outcomeFees) {
        return claimTradingProceedsInternal(_market, _shareHolder, _fingerprint);
    }

    function claimTradingProceedsInternal(IMarket _market, address _shareHolder, bytes32 _fingerprint) internal returns (uint256[] memory _outcomeFees) {
        require(augur.isKnownMarket(_market));
        if (!_market.isFinalized()) {
            _market.finalize();
        }
        _outcomeFees = new uint256[](8);
        for (uint256 _outcome = 0; _outcome < _market.getNumberOfOutcomes(); ++_outcome) {
            uint256 _numberOfShares = balanceOfMarketOutcome(_market, _outcome, _shareHolder);

            if (_numberOfShares > 0) {
                uint256 _proceeds;
                uint256 _shareHolderShare;
                uint256 _creatorShare;
                uint256 _reporterShare;
                uint256 _tokenId = TokenId.getTokenId(_market, _outcome);
                (_proceeds, _shareHolderShare, _creatorShare, _reporterShare) = divideUpWinnings(_market, _outcome, _numberOfShares);

                // always destroy shares as it gives a minor gas refund and is good for the network
                _burn(_shareHolder, _tokenId, _numberOfShares, bytes(""), false);
                logTradingProceedsClaimed(_market, _outcome, _shareHolder, _numberOfShares, _shareHolderShare, _creatorShare.add(_reporterShare));

                if (_proceeds > 0) {
                    _market.getUniverse().withdraw(address(this), _shareHolderShare.add(_reporterShare), address(_market));
                    distributeProceeds(_market, _shareHolder, _shareHolderShare, _creatorShare, _reporterShare, _fingerprint);
                }
                _outcomeFees[_outcome] = _creatorShare.add(_reporterShare);
            }
        }

        assertBalances(_market);
        return _outcomeFees;
    }

    function distributeProceeds(IMarket _market, address _shareHolder, uint256 _shareHolderShare, uint256 _creatorShare, uint256 _reporterShare, bytes32 _fingerprint) private {
        if (_shareHolderShare > 0) {
            require(cash.transfer(_shareHolder, _shareHolderShare));
        }
        if (_creatorShare > 0) {
            _market.recordMarketCreatorFees(_creatorShare, _shareHolder, _fingerprint);
        }
        if (_reporterShare > 0) {
            require(cash.transfer(address(_market.getUniverse().getOrCreateNextDisputeWindow(false)), _reporterShare));
        }
    }

    function logTradingProceedsClaimed(IMarket _market, uint256 _outcome, address _sender, uint256 _numShares, uint256 _numPayoutTokens, uint256 _fees) private {
        augur.logTradingProceedsClaimed(_market.getUniverse(), _sender, address(_market), _outcome, _numShares, _numPayoutTokens, _fees);
    }

    function divideUpWinnings(IMarket _market, uint256 _outcome, uint256 _numberOfShares) public returns (uint256 _proceeds, uint256 _shareHolderShare, uint256 _creatorShare, uint256 _reporterShare) {
        _proceeds = calculateProceeds(_market, _outcome, _numberOfShares);
        _creatorShare = calculateCreatorFee(_market, _proceeds);
        _reporterShare = calculateReportingFee(_market, _proceeds);
        _shareHolderShare = _proceeds.sub(_creatorShare).sub(_reporterShare);
        return (_proceeds, _shareHolderShare, _creatorShare, _reporterShare);
    }

    function calculateProceeds(IMarket _market, uint256 _outcome, uint256 _numberOfShares) public view returns (uint256) {
        uint256 _payoutNumerator = _market.getWinningPayoutNumerator(_outcome);
        return _numberOfShares.mul(_payoutNumerator);
    }

    function calculateReportingFee(IMarket _market, uint256 _amount) public returns (uint256) {
        uint256 _reportingFeeDivisor = _market.getUniverse().getOrCacheReportingFeeDivisor();
        return _amount.div(_reportingFeeDivisor);
    }

    function calculateCreatorFee(IMarket _market, uint256 _amount) public view returns (uint256) {
        return _market.deriveMarketCreatorFeeAmount(_amount);
    }

    function getTypeName() public view returns(bytes32) {
        return "ShareToken";
    }

    /**
     * @return The market associated with this Share Token ID
     */
    function getMarket(uint256 _tokenId) external view returns(IMarket) {
        (address _market, uint256 _outcome) = TokenId.unpackTokenId(_tokenId);
        return IMarket(_market);
    }

    /**
     * @return The outcome associated with this Share Token ID
     */
    function getOutcome(uint256 _tokenId) external view returns(uint256) {
        (address _market, uint256 _outcome) = TokenId.unpackTokenId(_tokenId);
        return _outcome;
    }

    function totalSupplyForMarketOutcome(IMarket _market, uint256 _outcome) public view returns (uint256) {
        uint256 _tokenId = TokenId.getTokenId(_market, _outcome);
        return totalSupply(_tokenId);
    }

    function balanceOfMarketOutcome(IMarket _market, uint256 _outcome, address _account) public view returns (uint256) {
        uint256 _tokenId = TokenId.getTokenId(_market, _outcome);
        return balanceOf(_account, _tokenId);
    }

    function lowestBalanceOfMarketOutcomes(IMarket _market, uint256[] memory _outcomes, address _account) public view returns (uint256) {
        uint256 _lowest = SafeMathUint256.getUint256Max();
        for (uint256 _i = 0; _i < _outcomes.length; ++_i) {
            uint256 _tokenId = TokenId.getTokenId(_market, _outcomes[_i]);
            _lowest = balanceOf(_account, _tokenId).min(_lowest);
        }
        return _lowest;
    }

    function assertBalances(IMarket _market) public view {
        uint256 _expectedBalance = 0;
        uint256 _numTicks = _market.getNumTicks();
        uint256 _numOutcomes = _market.getNumberOfOutcomes();
        // Market Open Interest. If we're finalized we need actually calculate the value
        if (_market.isFinalized()) {
            for (uint8 i = 0; i < _numOutcomes; i++) {
                _expectedBalance = _expectedBalance.add(totalSupplyForMarketOutcome(_market, i).mul(_market.getWinningPayoutNumerator(i)));
            }
        } else {
            _expectedBalance = totalSupplyForMarketOutcome(_market, 0).mul(_numTicks);
        }

        assert(_market.getUniverse().marketBalance(address(_market)) >= _expectedBalance);
    }

    function getTokenId(IMarket _market, uint256 _outcome) public pure returns (uint256 _tokenId) {
        return TokenId.getTokenId(_market, _outcome);
    }

    function getTokenIds(IMarket _market, uint256[] memory _outcomes) public pure returns (uint256[] memory _tokenIds) {
        return TokenId.getTokenIds(_market, _outcomes);
    }

    function unpackTokenId(uint256 _tokenId) public pure returns (address _market, uint256 _outcome) {
        return TokenId.unpackTokenId(_tokenId);
    }

    function onTokenTransfer(uint256 _tokenId, address _from, address _to, uint256 _value) internal {
        (address _marketAddress, uint256 _outcome) = TokenId.unpackTokenId(_tokenId);
        augur.logShareTokensBalanceChanged(_from, IMarket(_marketAddress), _outcome, balanceOf(_from, _tokenId));
        augur.logShareTokensBalanceChanged(_to, IMarket(_marketAddress), _outcome, balanceOf(_to, _tokenId));
    }

    function onMint(uint256 _tokenId, address _target, uint256 _amount) internal {
        (address _marketAddress, uint256 _outcome) = TokenId.unpackTokenId(_tokenId);
        augur.logShareTokensBalanceChanged(_target, IMarket(_marketAddress), _outcome, balanceOf(_target, _tokenId));
    }

    function onBurn(uint256 _tokenId, address _target, uint256 _amount) internal {
        (address _marketAddress, uint256 _outcome) = TokenId.unpackTokenId(_tokenId);
        augur.logShareTokensBalanceChanged(_target, IMarket(_marketAddress), _outcome, balanceOf(_target, _tokenId));
    }
}

Settings
{
  "remappings": [
    "ROOT=/home/achapman/augur/packages/augur-core/src/contracts//"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200,
    "details": {
      "yul": true,
      "deduplicate": true,
      "cse": true,
      "constantOptimizer": true
    }
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"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":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"_balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"_operatorApprovals","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_supplys","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"contract IMarket","name":"_market","type":"address"}],"name":"assertBalances","outputs":[],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"augur","outputs":[{"internalType":"contract IAugur","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"contract IMarket","name":"_market","type":"address"},{"internalType":"uint256","name":"_outcome","type":"uint256"},{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOfMarketOutcome","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IMarket","name":"_market","type":"address"},{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"buyCompleteSets","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IMarket","name":"_market","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_longOutcome","type":"uint256"},{"internalType":"address","name":"_longRecipient","type":"address"},{"internalType":"address","name":"_shortRecipient","type":"address"}],"name":"buyCompleteSetsForTrade","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"contract IMarket","name":"_market","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"calculateCreatorFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"contract IMarket","name":"_market","type":"address"},{"internalType":"uint256","name":"_outcome","type":"uint256"},{"internalType":"uint256","name":"_numberOfShares","type":"uint256"}],"name":"calculateProceeds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IMarket","name":"_market","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"calculateReportingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"cash","outputs":[{"internalType":"contract ICash","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IMarket","name":"_market","type":"address"},{"internalType":"address","name":"_shareHolder","type":"address"},{"internalType":"bytes32","name":"_fingerprint","type":"bytes32"}],"name":"claimTradingProceeds","outputs":[{"internalType":"uint256[]","name":"_outcomeFees","type":"uint256[]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IMarket","name":"_market","type":"address"},{"internalType":"uint256","name":"_outcome","type":"uint256"},{"internalType":"uint256","name":"_numberOfShares","type":"uint256"}],"name":"divideUpWinnings","outputs":[{"internalType":"uint256","name":"_proceeds","type":"uint256"},{"internalType":"uint256","name":"_shareHolderShare","type":"uint256"},{"internalType":"uint256","name":"_creatorShare","type":"uint256"},{"internalType":"uint256","name":"_reporterShare","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getMarket","outputs":[{"internalType":"contract IMarket","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getOutcome","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"contract IMarket","name":"_market","type":"address"},{"internalType":"uint256","name":"_outcome","type":"uint256"}],"name":"getTokenId","outputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"contract IMarket","name":"_market","type":"address"},{"internalType":"uint256[]","name":"_outcomes","type":"uint256[]"}],"name":"getTokenIds","outputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"getTypeName","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IAugur","name":"_augur","type":"address"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IMarket","name":"_market","type":"address"},{"internalType":"uint256","name":"_numOutcomes","type":"uint256"},{"internalType":"uint256","name":"_numTicks","type":"uint256"}],"name":"initializeMarket","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"contract IMarket","name":"_market","type":"address"},{"internalType":"uint256[]","name":"_outcomes","type":"uint256[]"},{"internalType":"address","name":"_account","type":"address"}],"name":"lowestBalanceOfMarketOutcomes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IMarket","name":"_market","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"publicBuyCompleteSets","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IMarket","name":"_market","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"publicSellCompleteSets","outputs":[{"internalType":"uint256","name":"_creatorFee","type":"uint256"},{"internalType":"uint256","name":"_reportingFee","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","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":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IMarket","name":"_market","type":"address"},{"internalType":"address","name":"_holder","type":"address"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32","name":"_fingerprint","type":"bytes32"}],"name":"sellCompleteSets","outputs":[{"internalType":"uint256","name":"_creatorFee","type":"uint256"},{"internalType":"uint256","name":"_reportingFee","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IMarket","name":"_market","type":"address"},{"internalType":"uint256","name":"_outcome","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_shortParticipant","type":"address"},{"internalType":"address","name":"_longParticipant","type":"address"},{"internalType":"address","name":"_shortRecipient","type":"address"},{"internalType":"address","name":"_longRecipient","type":"address"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"address","name":"_sourceAccount","type":"address"},{"internalType":"bytes32","name":"_fingerprint","type":"bytes32"}],"name":"sellCompleteSetsForTrade","outputs":[{"internalType":"uint256","name":"_creatorFee","type":"uint256"},{"internalType":"uint256","name":"_reportingFee","type":"uint256"}],"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":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"contract IMarket","name":"_market","type":"address"},{"internalType":"uint256","name":"_outcome","type":"uint256"}],"name":"totalSupplyForMarketOutcome","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"unpackTokenId","outputs":[{"internalType":"address","name":"_market","type":"address"},{"internalType":"uint256","name":"_outcome","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_values","type":"uint256[]"}],"name":"unsafeBatchTransferFrom","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":"_id","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"unsafeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

60806040526000805460ff19908116909155600580549091169055620000356301ffc9a760e01b6001600160e01b036200005616565b62000050636cdb3d1360e11b6001600160e01b036200005616565b620000de565b6001600160e01b03198082161415620000b6576040805162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015290519081900360640190fd5b6001600160e01b0319166000908152600160208190526040909120805460ff19169091179055565b614fcc80620000ee6000396000f3fe608060405234801561001057600080fd5b50600436106102525760003560e01c8063a22cb46511610146578063e985e9c5116100c3578063f242432a11610087578063f242432a14610cc3578063f2dc826614610d56578063f32ef05114610d88578063f8a2167b14610da5578063fbc37ca914610e61578063fc25a4da14610e9d57610252565b8063e985e9c514610c0c578063eb44fdd314610c3a578063edc3bc3f14610c57578063ee89dab414610c85578063efd342c114610c8d57610252565b8063c4d66de81161010a578063c4d66de814610ada578063ca3a1e6914610b00578063cd57933514610bb1578063d64c62f314610bce578063db0a087c14610c0457610252565b8063a22cb46514610a01578063aa48db2014610a2f578063abb60c8014610a65578063ad16158e14610a91578063bd85b03914610abd57610252565b80634db3b9e3116101d4578063818944071161019857806381894407146109415780638c5e2f871461096d57806395d89b4114610999578063961be391146109a15780639f66cddf146109a957610252565b80634db3b9e3146106c05780634e1273f4146106e657806353b7a712146108595780635990fea6146108db5780637a0d8f8a1461091d57610252565b806329f99b9f1161021b57806329f99b9f146103b95780632eb2c2d6146103e55780633b48090e1461050e5780634028e8ea14610540578063431e88781461067c57610252565b8062fdd58e1461025757806301ffc9a71461029557806306065ced146102d057806306fdde03146102fc57806326afd2e814610379575b600080fd5b6102836004803603604081101561026d57600080fd5b506001600160a01b038135169060200135610ec9565b60408051918252519081900360200190f35b6102bc600480360360208110156102ab57600080fd5b50356001600160e01b031916610f3b565b604080519115158252519081900360200190f35b610283600480360360408110156102e657600080fd5b506001600160a01b038135169060200135610f5a565b610304610fd3565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561033e578181015183820152602001610326565b50505050905090810190601f16801561036b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103966004803603602081101561038f57600080fd5b5035610ff5565b604080516001600160a01b03909316835260208301919091528051918290030190f35b610283600480360360408110156103cf57600080fd5b506001600160a01b03813516906020013561100a565b61050c600480360360a08110156103fb57600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b81111561042e57600080fd5b82018360208201111561044057600080fd5b803590602001918460208302840111600160201b8311171561046157600080fd5b919390929091602081019035600160201b81111561047e57600080fd5b82018360208201111561049057600080fd5b803590602001918460208302840111600160201b831117156104b157600080fd5b919390929091602081019035600160201b8111156104ce57600080fd5b8201836020820111156104e057600080fd5b803590602001918460018302840111600160201b8311171561050157600080fd5b50909250905061101d565b005b61050c6004803603606081101561052457600080fd5b506001600160a01b0381351690602081013590604001356110cd565b61050c6004803603608081101561055657600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b81111561058957600080fd5b82018360208201111561059b57600080fd5b803590602001918460208302840111600160201b831117156105bc57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561060b57600080fd5b82018360208201111561061d57600080fd5b803590602001918460208302840111600160201b8311171561063e57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061116f945050505050565b6102bc600480360360a081101561069257600080fd5b506001600160a01b038135811691602081013591604082013591606081013582169160809091013516611193565b61050c600480360360208110156106d657600080fd5b50356001600160a01b03166115b1565b610809600480360360408110156106fc57600080fd5b810190602081018135600160201b81111561071657600080fd5b82018360208201111561072857600080fd5b803590602001918460208302840111600160201b8311171561074957600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561079857600080fd5b8201836020820111156107aa57600080fd5b803590602001918460208302840111600160201b831117156107cb57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506118b7945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561084557818101518382015260200161082d565b505050509050019250505060405180910390f35b6108c2600480360361014081101561087057600080fd5b506001600160a01b0381358116916020810135916040820135916060810135821691608082013581169160a081013582169160c082013581169160e08101359161010082013516906101200135611a1e565b6040805192835260208301919091528051918290030190f35b6108c2600480360360a08110156108f157600080fd5b506001600160a01b03813581169160208101358216916040820135169060608101359060800135611cc7565b610925611de3565b604080516001600160a01b039092168252519081900360200190f35b6102836004803603604081101561095757600080fd5b506001600160a01b038135169060200135611df2565b6102836004803603604081101561098357600080fd5b506001600160a01b038135169060200135611ee4565b610304611efc565b610925611f1d565b6109db600480360360608110156109bf57600080fd5b506001600160a01b038135169060208101359060400135611f2c565b604080519485526020850193909352838301919091526060830152519081900360800190f35b61050c60048036036040811015610a1757600080fd5b506001600160a01b0381351690602001351515611f82565b6102bc60048036036060811015610a4557600080fd5b506001600160a01b03813581169160208101359091169060400135612038565b6102bc60048036036040811015610a7b57600080fd5b506001600160a01b038135169060200135612050565b6108c260048036036040811015610aa757600080fd5b506001600160a01b03813516906020013561216d565b61028360048036036020811015610ad357600080fd5b5035612348565b61050c60048036036020811015610af057600080fd5b50356001600160a01b031661235a565b61080960048036036040811015610b1657600080fd5b6001600160a01b038235169190810190604081016020820135600160201b811115610b4057600080fd5b820183602082011115610b5257600080fd5b803590602001918460208302840111600160201b83111715610b7357600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061242a945050505050565b61028360048036036020811015610bc757600080fd5b5035612436565b61028360048036036060811015610be457600080fd5b506001600160a01b0381358116916020810135916040909101351661244d565b610283612466565b6102bc60048036036040811015610c2257600080fd5b506001600160a01b0381358116916020013516612477565b61092560048036036020811015610c5057600080fd5b50356124ba565b6102bc60048036036040811015610c6d57600080fd5b506001600160a01b03813581169160200135166124d1565b6102bc6124f1565b61080960048036036060811015610ca357600080fd5b506001600160a01b038135811691602081013590911690604001356124fa565b61050c600480360360a0811015610cd957600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b811115610d1857600080fd5b820183602082011115610d2a57600080fd5b803590602001918460018302840111600160201b83111715610d4b57600080fd5b509092509050612537565b61028360048036036060811015610d6c57600080fd5b506001600160a01b038135169060208101359060400135612585565b61028360048036036020811015610d9e57600080fd5b503561260a565b61028360048036036060811015610dbb57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b811115610de557600080fd5b820183602082011115610df757600080fd5b803590602001918460208302840111600160201b83111715610e1857600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550505090356001600160a01b0316915061261c9050565b61050c60048036036080811015610e7757600080fd5b506001600160a01b0381358116916020810135909116906040810135906060013561267b565b61028360048036036040811015610eb357600080fd5b50803590602001356001600160a01b0316612699565b60006001600160a01b038316610f105760405162461bcd60e51b815260040180806020018281038252602b815260200180614c5a602b913960400191505060405180910390fd5b5060008181526002602090815260408083206001600160a01b03861684529091529020545b92915050565b6001600160e01b03191660009081526001602052604090205460ff1690565b6000826001600160a01b031663f8c52125836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610fa057600080fd5b505afa158015610fb4573d6000803e3d6000fd5b505050506040513d6020811015610fca57600080fd5b50519392505050565b6040518060400160405280600681526020016553686172657360d01b81525081565b600080611001836126b6565b91509150915091565b600061101683836126c8565b9392505050565b6110c3888888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808c0282810182019093528b82529093508b92508a91829185019084908082843760009201919091525050604080516020601f8b01819004810282018101909252898152925089915088908190840183828082843760009201919091525060019250612715915050565b5050505050505050565b60075460408051638cfb8f2160e01b815233600482015290516001600160a01b0390921691638cfb8f2191602480820192602092909190829003018186803b15801561111857600080fd5b505afa15801561112c573d6000803e3d6000fd5b505050506040513d602081101561114257600080fd5b505161114d57600080fd5b6001600160a01b03909216600090815260066020526040902090815560010155565b61118d84848484604051806020016040528060008152506000612715565b50505050565b6001600160a01b038516600090815260066020526040812054806111f8576040805162461bcd60e51b8152602060048201526017602482015276125b9d985b1a590813585c9ad95d081c1c9bdd9a591959604a1b604482015290519081900360640190fd5b80851061120457600080fd5b6000876001600160a01b031663870c426d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561123f57600080fd5b505afa158015611253573d6000803e3d6000fd5b505050506040513d602081101561126957600080fd5b50516001600160a01b03891660009081526006602052604081206001015491925061129a898363ffffffff61281016565b60408051633d14d1b760e21b8152336004820152602481018390526001600160a01b038d8116604483015291519293509085169163f45346dc916064808201926020929091908290030181600087803b1580156112f657600080fd5b505af115801561130a573d6000803e3d6000fd5b505050506040513d602081101561132057600080fd5b505060408051638d4e408360e01b815290516001600160a01b038c1691638d4e4083916004808301926020929190829003018186803b15801561136257600080fd5b505afa158015611376573d6000803e3d6000fd5b505050506040513d602081101561138c57600080fd5b505161140557826001600160a01b031663ce483e88826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156113d857600080fd5b505af11580156113ec573d6000803e3d6000fd5b505050506040513d602081101561140257600080fd5b50505b5050606060018303604051908082528060200260200182016040528015611436578160200160208202803883390190505b509050606060018403604051908082528060200260200182016040528015611468578160200160208202803883390190505b5090506000805b600186038110156114cf5789821415611489576001909101905b6114938c836126c8565b84828151811061149f57fe5b6020026020010181815250508a8382815181106114b857fe5b60209081029190910101526001918201910161146f565b506114ed878484604051806020016040528060008152506000612837565b611513886114fb8d8c6126c8565b8c604051806020016040528060008152506000612b2a565b60075460408051630391719960e51b81526001600160a01b0387811660048301528e811660248301529151919092169163722e33209160448083019260209291908290030181600087803b15801561156a57600080fd5b505af115801561157e573d6000803e3d6000fd5b505050506040513d602081101561159457600080fd5b506115a090508b6115b1565b5060019a9950505050505050505050565b60008090506000826001600160a01b031663bad84c9e6040518163ffffffff1660e01b815260040160206040518083038186803b1580156115f157600080fd5b505afa158015611605573d6000803e3d6000fd5b505050506040513d602081101561161b57600080fd5b5051604080516309f396e360e21b815290519192506000916001600160a01b038616916327ce5b8c916004808301926020929190829003018186803b15801561166357600080fd5b505afa158015611677573d6000803e3d6000fd5b505050506040513d602081101561168d57600080fd5b505160408051638d4e408360e01b815290519192506001600160a01b03861691638d4e408391600480820192602092909190829003018186803b1580156116d357600080fd5b505afa1580156116e7573d6000803e3d6000fd5b505050506040513d60208110156116fd57600080fd5b5051156117c15760005b818160ff1610156117bb576117b16117a4866001600160a01b0316633c264820846040518263ffffffff1660e01b8152600401808260ff16815260200191505060206040518083038186803b15801561175f57600080fd5b505afa158015611773573d6000803e3d6000fd5b505050506040513d602081101561178957600080fd5b50516117988860ff8616611ee4565b9063ffffffff61281016565b859063ffffffff612c5b16565b9350600101611707565b506117d3565b6117d082611798866000611ee4565b92505b82846001600160a01b031663870c426d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561180d57600080fd5b505afa158015611821573d6000803e3d6000fd5b505050506040513d602081101561183757600080fd5b505160408051634b3971dd60e11b81526001600160a01b03888116600483015291519190921691639672e3ba916024808301926020929190829003018186803b15801561188357600080fd5b505afa158015611897573d6000803e3d6000fd5b505050506040513d60208110156118ad57600080fd5b5051101561118d57fe5b606081518351146118f95760405162461bcd60e51b8152600401808060200182810382526030815260200180614cd96030913960400191505060405180910390fd5b60608351604051908082528060200260200182016040528015611926578160200160208202803883390190505b50905060005b8451811015611a165760006001600160a01b031685828151811061194c57fe5b60200260200101516001600160a01b0316141561199a5760405162461bcd60e51b8152600401808060200182810382526034815260200180614d7b6034913960400191505060405180910390fd5b600260008583815181106119aa57fe5b6020026020010151815260200190815260200160002060008683815181106119ce57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054828281518110611a0357fe5b602090810291909101015260010161192c565b509392505050565b600080611a2b8933612477565b1515600114611a6b5760405162461bcd60e51b815260040180806020018281038252603c815260200180614d3f603c913960400191505060405180910390fd5b611a758833612477565b1515600114611ab55760405162461bcd60e51b815260040180806020018281038252603b815260200180614e7b603b913960400191505060405180910390fd5b611adc8989611ac48f8f61100a565b8d604051806020016040528060008152506000612c6d565b6000806000611aee8f8c8f8a8a612d77565b92509250925060008f6001600160a01b031663bad84c9e6040518163ffffffff1660e01b815260040160206040518083038186803b158015611b2f57600080fd5b505afa158015611b43573d6000803e3d6000fd5b505050506040513d6020811015611b5957600080fd5b5051611b6b858b63ffffffff61281016565b81611b7257fe5b6008546040805163a9059cbb60e01b81526001600160a01b038f811660048301529490930460248401819052905190945092169163a9059cbb916044808201926020929091908290030181600087803b158015611bce57600080fd5b505af1158015611be2573d6000803e3d6000fd5b505050506040513d6020811015611bf857600080fd5b5051611c0357600080fd5b6008546001600160a01b031663a9059cbb8c611c25878563ffffffff61340616565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611c7457600080fd5b505af1158015611c88573d6000803e3d6000fd5b505050506040513d6020811015611c9e57600080fd5b5051611ca957600080fd5b50611cb38f6115b1565b909e909d509b505050505050505050505050565b6000806001600160a01b038616331480611cec5750611ce68633612477565b15156001145b611d275760405162461bcd60e51b8152600401808060200182810382526035815260200180614f116035913960400191505060405180910390fd5b6000806000611d398a8a898c8a612d77565b6008546040805163a9059cbb60e01b81526001600160a01b038e81166004830152602482018790529151959850939650919450169163a9059cbb916044808201926020929091908290030181600087803b158015611d9657600080fd5b505af1158015611daa573d6000803e3d6000fd5b505050506040513d6020811015611dc057600080fd5b5051611dcb57600080fd5b611dd48a6115b1565b90999098509650505050505050565b6007546001600160a01b031681565b600080836001600160a01b031663870c426d6040518163ffffffff1660e01b815260040160206040518083038186803b158015611e2e57600080fd5b505afa158015611e42573d6000803e3d6000fd5b505050506040513d6020811015611e5857600080fd5b5051604080516347c9dfff60e11b815290516001600160a01b0390921691638f93bffe916004808201926020929091908290030181600087803b158015611e9e57600080fd5b505af1158015611eb2573d6000803e3d6000fd5b505050506040513d6020811015611ec857600080fd5b50519050611edc838263ffffffff61341b16565b949350505050565b600080611ef184846126c8565b9050611edc81612348565b60405180604001604052806005815260200164534841524560d81b81525081565b6008546001600160a01b031681565b600080600080611f3d878787612585565b9350611f498785610f5a565b9150611f558785611df2565b9050611f7781611f6b868563ffffffff61340616565b9063ffffffff61340616565b925093509350935093565b336001600160a01b0383161415611fca5760405162461bcd60e51b815260040180806020018281038252602c815260200180614cad602c913960400191505060405180910390fd5b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b6000612045848484613430565b506001949350505050565b600061205d833384613430565b50600760009054906101000a90046001600160a01b03166001600160a01b031663c509d0b2846001600160a01b031663870c426d6040518163ffffffff1660e01b815260040160206040518083038186803b1580156120bb57600080fd5b505afa1580156120cf573d6000803e3d6000fd5b505050506040513d60208110156120e557600080fd5b5051604080516001600160e01b031960e085901b1681526001600160a01b0392831660048201529187166024830152336044830152606482018690525160848083019260209291908290030181600087803b15801561214357600080fd5b505af1158015612157573d6000803e3d6000fd5b505050506040513d602081101561204557600080fd5b6000808080806121808733888185612d77565b6008546040805163a9059cbb60e01b81523360048201526024810186905290519497509295509093506001600160a01b03169163a9059cbb916044808201926020929091908290030181600087803b1580156121db57600080fd5b505af11580156121ef573d6000803e3d6000fd5b505050506040513d602081101561220557600080fd5b505161221057600080fd5b6000876001600160a01b031663870c426d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561224b57600080fd5b505afa15801561225f573d6000803e3d6000fd5b505050506040513d602081101561227557600080fd5b50516007549091506001600160a01b0316637920757e828a338b61229f898963ffffffff612c5b16565b604080516001600160e01b031960e089901b1681526001600160a01b039687166004820152948616602486015292909416604484015260648301526084820192909252905160a48083019260209291908290030181600087803b15801561230557600080fd5b505af1158015612319573d6000803e3d6000fd5b505050506040513d602081101561232f57600080fd5b5061233b9050886115b1565b5090969095509350505050565b60009081526003602052604090205490565b60005460ff161561236a57600080fd5b6123726137e1565b600780546001600160a01b0319166001600160a01b0383169081179091556040805163f39ec1f760e01b815263086c2e6d60e31b6004820152905163f39ec1f791602480820192602092909190829003018186803b1580156123d357600080fd5b505afa1580156123e7573d6000803e3d6000fd5b505050506040513d60208110156123fd57600080fd5b5051600880546001600160a01b0319166001600160a01b0392831617908190551661242757600080fd5b50565b60606110168383613800565b6000806000612444846126b6565b95945050505050565b60008061245a85856126c8565b90506124448382610ec9565b6929b430b932aa37b5b2b760b11b90565b60006001600160a01b0382163014806110165750506001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b60008060006124c8846126b6565b50949350505050565b600460209081526000928352604080842090915290825290205460ff1681565b60005460ff1690565b60055460609060ff161561250d57600080fd5b6005805460ff19166001179055612525848484613872565b6005805460ff19169055949350505050565b61257d8686868686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525060019250613c48915050565b505050505050565b600080846001600160a01b0316633c264820856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156125cc57600080fd5b505afa1580156125e0573d6000803e3d6000fd5b505050506040513d60208110156125f657600080fd5b50519050612444838263ffffffff61281016565b60036020526000908152604090205481565b600080612627613cf8565b905060005b84518110156124c85760006126548787848151811061264757fe5b60200260200101516126c8565b9050612670836126648784610ec9565b9063ffffffff613cfe16565b92505060010161262c565b61118d84848484604051806020016040528060008152506000613c48565b600260209081526000928352604080842090915290825290205481565b606081901c9160589190911c60ff1690565b6040805160609390931b6bffffffffffffffffffffffff191660208085019190915260f89290921b6001600160f81b03191660348401528051808403601501815260359093019052015190565b82518451146127555760405162461bcd60e51b815260040180806020018281038252602e815260200180614e18602e913960400191505060405180910390fd5b83516127605761257d565b6001600160a01b0385166127a55760405162461bcd60e51b8152600401808060200182810382526028815260200180614c856028913960400191505060405180910390fd5b6001600160a01b0386163314806127c757506127c18633612477565b15156001145b6128025760405162461bcd60e51b8152600401808060200182810382526037815260200180614de16037913960400191505060405180910390fd5b61257d868686868686613d15565b60008261281f57506000610f35565b8282028284828161282c57fe5b041461101657600080fd5b6001600160a01b03851661287c5760405162461bcd60e51b8152600401808060200182810382526027815260200180614eea6027913960400191505060405180910390fd5b82518451146128bc5760405162461bcd60e51b8152600401808060200182810382526035815260200180614e466035913960400191505060405180910390fd5b60005b8451811015612a3357612937600260008784815181106128db57fe5b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b031681526020019081526020016000205485838151811061292157fe5b6020026020010151612c5b90919063ffffffff16565b6002600087848151811061294757fe5b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b03168152602001908152602001600020819055506129d084828151811061299357fe5b6020026020010151600360008885815181106129ab57fe5b6020026020010151815260200190815260200160002054612c5b90919063ffffffff16565b600360008784815181106129e057fe5b6020026020010151815260200190815260200160002081905550612a2b858281518110612a0957fe5b602002602001015187868481518110612a1e57fe5b6020026020010151613ee6565b6001016128bf565b50846001600160a01b031660006001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015612aba578181015183820152602001612aa2565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015612af9578181015183820152602001612ae1565b5050505090500194505050505060405180910390a48015612b2357612b2333600087878787613fb7565b5050505050565b6001600160a01b038516612b6f5760405162461bcd60e51b8152600401808060200182810382526021815260200180614f466021913960400191505060405180910390fd5b60008481526002602090815260408083206001600160a01b0389168452909152902054612ba2908463ffffffff612c5b16565b60008581526002602090815260408083206001600160a01b038a168452825280832093909355868252600390522054612be1908463ffffffff612c5b16565b600085815260036020526040902055612bfb848685613ee6565b604080518581526020810185905281516001600160a01b0388169260009233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62929181900390910190a48015612b2357612b2333600087878787614194565b60008282018381101561101657600080fd5b60008481526002602090815260408083206001600160a01b038a168452909152902054612ca0908463ffffffff61340616565b60008581526002602090815260408083206001600160a01b038b81168552925280832093909355871681522054612cd79084612c5b565b60008581526002602090815260408083206001600160a01b038a168452909152902055612d06848787866142f6565b846001600160a01b0316866001600160a01b0316336001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051808381526020018281526020019250505060405180910390a4801561257d5761257d338787878787614194565b6001600160a01b038516600090815260066020526040812080546001909101548291829181612de7576040805162461bcd60e51b8152602060048201526017602482015276125b9d985b1a590813585c9ad95d081c1c9bdd9a591959604a1b604482015290519081900360640190fd5b606082604051908082528060200260200182016040528015612e13578160200160208202803883390190505b509050606083604051908082528060200260200182016040528015612e42578160200160208202803883390190505b50905060005b84811015612e9257612e5a8d826126c8565b838281518110612e6657fe5b6020026020010181815250508a828281518110612e7f57fe5b6020908102919091010152600101612e48565b50612eb08b8383604051806020016040528060008152506000614477565b50612ec39050888263ffffffff61281016565b945060008a6001600160a01b031663870c426d6040518163ffffffff1660e01b815260040160206040518083038186803b158015612f0057600080fd5b505afa158015612f14573d6000803e3d6000fd5b505050506040513d6020811015612f2a57600080fd5b505160408051638d4e408360e01b815290519192506001600160a01b038d1691638d4e408391600480820192602092909190829003018186803b158015612f7057600080fd5b505afa158015612f84573d6000803e3d6000fd5b505050506040513d6020811015612f9a57600080fd5b505161301357806001600160a01b031663b62418a1876040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015612fe657600080fd5b505af1158015612ffa573d6000803e3d6000fd5b505050506040513d602081101561301057600080fd5b50505b8a6001600160a01b031663f8c52125876040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561305757600080fd5b505afa15801561306b573d6000803e3d6000fd5b505050506040513d602081101561308157600080fd5b5051604080516347c9dfff60e11b815290519196506000916001600160a01b03841691638f93bffe91600480830192602092919082900301818787803b1580156130ca57600080fd5b505af11580156130de573d6000803e3d6000fd5b505050506040513d60208110156130f457600080fd5b50519050613108878263ffffffff61341b16565b945061311e85611f6b898963ffffffff61340616565b965085156131ad5760408051630d8f82e160e11b8152600481018890526001600160a01b038b81166024830152604482018b90529151918e1691631b1f05c2916064808201926020929091908290030181600087803b15801561318057600080fd5b505af1158015613194573d6000803e3d6000fd5b505050506040513d60208110156131aa57600080fd5b50505b6001600160a01b0382166369328dec306131cd8a8963ffffffff612c5b16565b8f6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001838152602001826001600160a01b03166001600160a01b031681526020019350505050602060405180830381600087803b15801561323657600080fd5b505af115801561324a573d6000803e3d6000fd5b505050506040513d602081101561326057600080fd5b50508415613370576008546040805163491ca79960e11b815260006004820181905291516001600160a01b039384169363a9059cbb93908716926392394f329260248083019360209383900390910190829087803b1580156132c157600080fd5b505af11580156132d5573d6000803e3d6000fd5b505050506040513d60208110156132eb57600080fd5b5051604080516001600160e01b031960e085901b1681526001600160a01b039092166004830152602482018990525160448083019260209291908290030181600087803b15801561333b57600080fd5b505af115801561334f573d6000803e3d6000fd5b505050506040513d602081101561336557600080fd5b505161337057600080fd5b60075460408051630391719960e51b81526001600160a01b0385811660048301528f811660248301529151919092169163722e33209160448083019260209291908290030181600087803b1580156133c757600080fd5b505af11580156133db573d6000803e3d6000fd5b505050506040513d60208110156133f157600080fd5b50969c959b5093995093975050505050505050565b60008282111561341557600080fd5b50900390565b60008082848161342757fe5b04949350505050565b6001600160a01b038316600090815260066020526040812080546001909101548161349c576040805162461bcd60e51b8152602060048201526017602482015276125b9d985b1a590813585c9ad95d081c1c9bdd9a591959604a1b604482015290519081900360640190fd5b6000866001600160a01b031663870c426d6040518163ffffffff1660e01b815260040160206040518083038186803b1580156134d757600080fd5b505afa1580156134eb573d6000803e3d6000fd5b505050506040513d602081101561350157600080fd5b505190506000613517868463ffffffff61281016565b60408051633d14d1b760e21b8152336004820152602481018390526001600160a01b038b8116604483015291519293509084169163f45346dc916064808201926020929091908290030181600087803b15801561357357600080fd5b505af1158015613587573d6000803e3d6000fd5b505050506040513d602081101561359d57600080fd5b50506040805185815260208681028201019091526060908580156135cb578160200160208202803883390190505b5090506060856040519080825280602002602001820160405280156135fa578160200160208202803883390190505b50905060005b8681101561364a576136128b826126c8565b83828151811061361e57fe5b6020026020010181815250508882828151811061363757fe5b6020908102919091010152600101613600565b50613668898383604051806020016040528060008152506000612837565b896001600160a01b0316638d4e40836040518163ffffffff1660e01b815260040160206040518083038186803b1580156136a157600080fd5b505afa1580156136b5573d6000803e3d6000fd5b505050506040513d60208110156136cb57600080fd5b505161374457836001600160a01b031663ce483e88846040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561371757600080fd5b505af115801561372b573d6000803e3d6000fd5b505050506040513d602081101561374157600080fd5b50505b60075460408051630391719960e51b81526001600160a01b0387811660048301528d811660248301529151919092169163722e33209160448083019260209291908290030181600087803b15801561379b57600080fd5b505af11580156137af573d6000803e3d6000fd5b505050506040513d60208110156137c557600080fd5b506137d190508a6115b1565b5060019998505050505050505050565b60005460ff16156137f157600080fd5b6000805460ff19166001179055565b6060815160405190808252806020026020018201604052801561382d578160200160208202803883390190505b50905060005b825181101561386b5761384c8484838151811061264757fe5b82828151811061385857fe5b6020908102919091010152600101613833565b5092915050565b6007546040805163e62b888960e01b81526001600160a01b0386811660048301529151606093929092169163e62b888991602480820192602092909190829003018186803b1580156138c357600080fd5b505afa1580156138d7573d6000803e3d6000fd5b505050506040513d60208110156138ed57600080fd5b50516138f857600080fd5b836001600160a01b0316638d4e40836040518163ffffffff1660e01b815260040160206040518083038186803b15801561393157600080fd5b505afa158015613945573d6000803e3d6000fd5b505050506040513d602081101561395b57600080fd5b50516139c957836001600160a01b0316634bb278f36040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561399c57600080fd5b505af11580156139b0573d6000803e3d6000fd5b505050506040513d60208110156139c657600080fd5b50505b604080516008808252610120820190925290602082016101008038833901905050905060005b846001600160a01b03166327ce5b8c6040518163ffffffff1660e01b815260040160206040518083038186803b158015613a2857600080fd5b505afa158015613a3c573d6000803e3d6000fd5b505050506040513d6020811015613a5257600080fd5b5051811015613c3e576000613a6886838761244d565b90508015613c35576000806000806000613a828b886126c8565b9050613a8f8b8888611f2c565b80955081965082975083985050505050613abc8a8288604051806020016040528060008152506000614741565b613ad98b888c8988613ad4898963ffffffff612c5b16565b614872565b8415613c07578a6001600160a01b031663870c426d6040518163ffffffff1660e01b815260040160206040518083038186803b158015613b1857600080fd5b505afa158015613b2c573d6000803e3d6000fd5b505050506040513d6020811015613b4257600080fd5b50516001600160a01b03166369328dec30613b63878663ffffffff612c5b16565b8e6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001838152602001826001600160a01b03166001600160a01b031681526020019350505050602060405180830381600087803b158015613bcc57600080fd5b505af1158015613be0573d6000803e3d6000fd5b505050506040513d6020811015613bf657600080fd5b50613c0790508b8b8686868e61496e565b613c17838363ffffffff612c5b16565b888881518110613c2357fe5b60200260200101818152505050505050505b506001016139ef565b50611016846115b1565b6001600160a01b038516613c8d5760405162461bcd60e51b8152600401808060200182810382526028815260200180614c856028913960400191505060405180910390fd5b6001600160a01b038616331480613caf5750613ca98633612477565b15156001145b613cea5760405162461bcd60e51b8152600401808060200182810382526037815260200180614de16037913960400191505060405180910390fd5b61257d868686868686612c6d565b60001990565b6000818311613d0e575081610f35565b5080610f35565b60005b8451811015613df8576000858281518110613d2f57fe5b602002602001015190506000858381518110613d4757fe5b60209081029190910181015160008481526002835260408082206001600160a01b038e1683529093529190912054909150613d88908263ffffffff61340616565b60008381526002602090815260408083206001600160a01b038e811685529252808320939093558a1681522054613dbf9082612c5b565b60008381526002602090815260408083206001600160a01b038d168452909152902055613dee828a8a846142f6565b5050600101613d18565b50846001600160a01b0316866001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015613e7e578181015183820152602001613e66565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015613ebd578181015183820152602001613ea5565b5050505090500194505050505060405180910390a4801561257d5761257d338787878787613fb7565b600080613ef2856126b6565b60075491935091506001600160a01b031663d015ddbd858484613f15838b610ec9565b6040518563ffffffff1660e01b815260040180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b03168152602001838152602001828152602001945050505050602060405180830381600087803b158015613f8457600080fd5b505af1158015613f98573d6000803e3d6000fd5b505050506040513d6020811015613fae57600080fd5b50505050505050565b613fc9846001600160a01b0316614c18565b1561257d5760405163bc197c8160e01b8082526001600160a01b0388811660048401908152888216602485015260a060448501908152875160a4860152875193949289169363bc197c81938c938c938b938b938b9392916064820191608481019160c4909101906020808a01910280838360005b8381101561405557818101518382015260200161403d565b50505050905001848103835286818151815260200191508051906020019060200280838360005b8381101561409457818101518382015260200161407c565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156140d05781810151838201526020016140b8565b50505050905090810190601f1680156140fd5780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600087803b15801561412257600080fd5b505af1158015614136573d6000803e3d6000fd5b505050506040513d602081101561414c57600080fd5b50516001600160e01b0319161461257d5760405162461bcd60e51b8152600401808060200182810382526036815260200180614d096036913960400191505060405180910390fd5b6141a6846001600160a01b0316614c18565b1561257d5760405163f23a6e6160e01b8082526001600160a01b03888116600484019081528882166024850152604484018790526064840186905260a060848501908152855160a4860152855193949289169363f23a6e61938c938c938b938b938b93929160c490910190602085019080838360005b8381101561423457818101518382015260200161421c565b50505050905090810190601f1680156142615780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b15801561428457600080fd5b505af1158015614298573d6000803e3d6000fd5b505050506040513d60208110156142ae57600080fd5b50516001600160e01b0319161461257d5760405162461bcd60e51b8152600401808060200182810382526031815260200180614f676031913960400191505060405180910390fd5b600080614302866126b6565b60075491935091506001600160a01b031663d015ddbd868484614325838c610ec9565b6040518563ffffffff1660e01b815260040180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b03168152602001838152602001828152602001945050505050602060405180830381600087803b15801561439457600080fd5b505af11580156143a8573d6000803e3d6000fd5b505050506040513d60208110156143be57600080fd5b50506007546001600160a01b031663d015ddbd8584846143de838c610ec9565b6040518563ffffffff1660e01b815260040180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b03168152602001838152602001828152602001945050505050602060405180830381600087803b15801561444d57600080fd5b505af1158015614461573d6000803e3d6000fd5b505050506040513d60208110156110c357600080fd5b6001600160a01b0385166144bc5760405162461bcd60e51b815260040180806020018281038252603b815260200180614c1f603b913960400191505060405180910390fd5b82518451146144fc5760405162461bcd60e51b8152600401808060200182810382526034815260200180614eb66034913960400191505060405180910390fd5b60005b84518110156146515761457784828151811061451757fe5b60200260200101516002600088858151811061452f57fe5b602002602001015181526020019081526020016000206000896001600160a01b03166001600160a01b031681526020019081526020016000205461340690919063ffffffff16565b6002600087848151811061458757fe5b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b03168152602001908152602001600020819055506146108482815181106145d357fe5b6020026020010151600360008885815181106145eb57fe5b602002602001015181526020019081526020016000205461340690919063ffffffff16565b6003600087848151811061462057fe5b6020026020010151815260200190815260200160002081905550614649858281518110612a0957fe5b6001016144ff565b5060006001600160a01b0316856001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156146d85781810151838201526020016146c0565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156147175781810151838201526020016146ff565b5050505090500194505050505060405180910390a48015612b2357612b2333866000878787613fb7565b6001600160a01b0385166147865760405162461bcd60e51b8152600401808060200182810382526032815260200180614daf6032913960400191505060405180910390fd5b60008481526002602090815260408083206001600160a01b03891684529091529020546147b9908463ffffffff61340616565b60008581526002602090815260408083206001600160a01b038a1684528252808320939093558682526003905220546147f8908463ffffffff61340616565b600085815260036020526040902055614812848685613ee6565b604080518581526020810185905281516000926001600160a01b0389169233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62929181900390910190a48015612b2357612b2333866000878787614194565b600760009054906101000a90046001600160a01b03166001600160a01b031663cec4ede1876001600160a01b031663870c426d6040518163ffffffff1660e01b815260040160206040518083038186803b1580156148cf57600080fd5b505afa1580156148e3573d6000803e3d6000fd5b505050506040513d60208110156148f957600080fd5b5051604080516001600160e01b031960e085901b1681526001600160a01b0392831660048201528289166024820152918a166044830152606482018990526084820187905260a4820186905260c482018590525160e48083019260209291908290030181600087803b15801561444d57600080fd5b83156149ff576008546040805163a9059cbb60e01b81526001600160a01b038881166004830152602482018890529151919092169163a9059cbb9160448083019260209291908290030181600087803b1580156149ca57600080fd5b505af11580156149de573d6000803e3d6000fd5b505050506040513d60208110156149f457600080fd5b50516149ff57600080fd5b8215614a8c5760408051630d8f82e160e11b8152600481018590526001600160a01b03878116602483015260448201849052915191881691631b1f05c2916064808201926020929091908290030181600087803b158015614a5f57600080fd5b505af1158015614a73573d6000803e3d6000fd5b505050506040513d6020811015614a8957600080fd5b50505b811561257d57600860009054906101000a90046001600160a01b03166001600160a01b031663a9059cbb876001600160a01b031663870c426d6040518163ffffffff1660e01b815260040160206040518083038186803b158015614aef57600080fd5b505afa158015614b03573d6000803e3d6000fd5b505050506040513d6020811015614b1957600080fd5b50516040805163491ca79960e11b815260006004820181905291516001600160a01b03909316926392394f3292602480840193602093929083900390910190829087803b158015614b6957600080fd5b505af1158015614b7d573d6000803e3d6000fd5b505050506040513d6020811015614b9357600080fd5b5051604080516001600160e01b031960e085901b1681526001600160a01b039092166004830152602482018690525160448083019260209291908290030181600087803b158015614be357600080fd5b505af1158015614bf7573d6000803e3d6000fd5b505050506040513d6020811015614c0d57600080fd5b505161257d57600080fd5b3b15159056fe455243313135353a20617474656d7074696e6720746f206275726e206261746368206f6620746f6b656e73206f6e207a65726f206163636f756e74455243313135353a2062616c616e636520717565727920666f7220746865207a65726f2061646472657373455243313135353a207461726765742061646472657373206d757374206265206e6f6e2d7a65726f455243313135353a2063616e6e6f742073657420617070726f76616c2073746174757320666f722073656c66455243313135353a206163636f756e747320616e6420494473206d75737420686176652073616d65206c656e67746873455243313135353a20676f7420756e6b6e6f776e2076616c75652066726f6d206f6e4552433131353542617463685265636569766564455243313135353a206e656564206f70657261746f7220617070726f76616c20746f206275726e2073686f7274206163636f756e7420736861726573455243313135353a20736f6d65206164647265737320696e2062617463682062616c616e6365207175657279206973207a65726f455243313135353a20617474656d7074696e6720746f206275726e20746f6b656e73206f6e207a65726f206163636f756e74455243313135353a206e656564206f70657261746f7220617070726f76616c20666f7220337264207061727479207472616e7366657273455243313135353a2049447320616e642076616c756573206d75737420686176652073616d65206c656e67746873455243313135353a206d696e7465642049447320616e642076616c756573206d75737420686176652073616d65206c656e67746873455243313135353a206e656564206f70657261746f7220617070726f76616c20746f206275726e206c6f6e67206163636f756e7420736861726573455243313135353a206275726e742049447320616e642076616c756573206d75737420686176652073616d65206c656e67746873455243313135353a206261746368206d696e7420746f20746865207a65726f2061646472657373455243313135353a206e656564206f70657261746f7220617070726f76616c20746f2073656c6c20636f6d706c6574652073657473455243313135353a206d696e7420746f20746865207a65726f2061646472657373455243313135353a20676f7420756e6b6e6f776e2076616c75652066726f6d206f6e455243313135355265636569766564a265627a7a72315820f1517c694c136a0789cb69bbf7224352f1f03735c41ddd65775f375b875759f464736f6c634300050f0032

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102525760003560e01c8063a22cb46511610146578063e985e9c5116100c3578063f242432a11610087578063f242432a14610cc3578063f2dc826614610d56578063f32ef05114610d88578063f8a2167b14610da5578063fbc37ca914610e61578063fc25a4da14610e9d57610252565b8063e985e9c514610c0c578063eb44fdd314610c3a578063edc3bc3f14610c57578063ee89dab414610c85578063efd342c114610c8d57610252565b8063c4d66de81161010a578063c4d66de814610ada578063ca3a1e6914610b00578063cd57933514610bb1578063d64c62f314610bce578063db0a087c14610c0457610252565b8063a22cb46514610a01578063aa48db2014610a2f578063abb60c8014610a65578063ad16158e14610a91578063bd85b03914610abd57610252565b80634db3b9e3116101d4578063818944071161019857806381894407146109415780638c5e2f871461096d57806395d89b4114610999578063961be391146109a15780639f66cddf146109a957610252565b80634db3b9e3146106c05780634e1273f4146106e657806353b7a712146108595780635990fea6146108db5780637a0d8f8a1461091d57610252565b806329f99b9f1161021b57806329f99b9f146103b95780632eb2c2d6146103e55780633b48090e1461050e5780634028e8ea14610540578063431e88781461067c57610252565b8062fdd58e1461025757806301ffc9a71461029557806306065ced146102d057806306fdde03146102fc57806326afd2e814610379575b600080fd5b6102836004803603604081101561026d57600080fd5b506001600160a01b038135169060200135610ec9565b60408051918252519081900360200190f35b6102bc600480360360208110156102ab57600080fd5b50356001600160e01b031916610f3b565b604080519115158252519081900360200190f35b610283600480360360408110156102e657600080fd5b506001600160a01b038135169060200135610f5a565b610304610fd3565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561033e578181015183820152602001610326565b50505050905090810190601f16801561036b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103966004803603602081101561038f57600080fd5b5035610ff5565b604080516001600160a01b03909316835260208301919091528051918290030190f35b610283600480360360408110156103cf57600080fd5b506001600160a01b03813516906020013561100a565b61050c600480360360a08110156103fb57600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b81111561042e57600080fd5b82018360208201111561044057600080fd5b803590602001918460208302840111600160201b8311171561046157600080fd5b919390929091602081019035600160201b81111561047e57600080fd5b82018360208201111561049057600080fd5b803590602001918460208302840111600160201b831117156104b157600080fd5b919390929091602081019035600160201b8111156104ce57600080fd5b8201836020820111156104e057600080fd5b803590602001918460018302840111600160201b8311171561050157600080fd5b50909250905061101d565b005b61050c6004803603606081101561052457600080fd5b506001600160a01b0381351690602081013590604001356110cd565b61050c6004803603608081101561055657600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b81111561058957600080fd5b82018360208201111561059b57600080fd5b803590602001918460208302840111600160201b831117156105bc57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561060b57600080fd5b82018360208201111561061d57600080fd5b803590602001918460208302840111600160201b8311171561063e57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061116f945050505050565b6102bc600480360360a081101561069257600080fd5b506001600160a01b038135811691602081013591604082013591606081013582169160809091013516611193565b61050c600480360360208110156106d657600080fd5b50356001600160a01b03166115b1565b610809600480360360408110156106fc57600080fd5b810190602081018135600160201b81111561071657600080fd5b82018360208201111561072857600080fd5b803590602001918460208302840111600160201b8311171561074957600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561079857600080fd5b8201836020820111156107aa57600080fd5b803590602001918460208302840111600160201b831117156107cb57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506118b7945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561084557818101518382015260200161082d565b505050509050019250505060405180910390f35b6108c2600480360361014081101561087057600080fd5b506001600160a01b0381358116916020810135916040820135916060810135821691608082013581169160a081013582169160c082013581169160e08101359161010082013516906101200135611a1e565b6040805192835260208301919091528051918290030190f35b6108c2600480360360a08110156108f157600080fd5b506001600160a01b03813581169160208101358216916040820135169060608101359060800135611cc7565b610925611de3565b604080516001600160a01b039092168252519081900360200190f35b6102836004803603604081101561095757600080fd5b506001600160a01b038135169060200135611df2565b6102836004803603604081101561098357600080fd5b506001600160a01b038135169060200135611ee4565b610304611efc565b610925611f1d565b6109db600480360360608110156109bf57600080fd5b506001600160a01b038135169060208101359060400135611f2c565b604080519485526020850193909352838301919091526060830152519081900360800190f35b61050c60048036036040811015610a1757600080fd5b506001600160a01b0381351690602001351515611f82565b6102bc60048036036060811015610a4557600080fd5b506001600160a01b03813581169160208101359091169060400135612038565b6102bc60048036036040811015610a7b57600080fd5b506001600160a01b038135169060200135612050565b6108c260048036036040811015610aa757600080fd5b506001600160a01b03813516906020013561216d565b61028360048036036020811015610ad357600080fd5b5035612348565b61050c60048036036020811015610af057600080fd5b50356001600160a01b031661235a565b61080960048036036040811015610b1657600080fd5b6001600160a01b038235169190810190604081016020820135600160201b811115610b4057600080fd5b820183602082011115610b5257600080fd5b803590602001918460208302840111600160201b83111715610b7357600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061242a945050505050565b61028360048036036020811015610bc757600080fd5b5035612436565b61028360048036036060811015610be457600080fd5b506001600160a01b0381358116916020810135916040909101351661244d565b610283612466565b6102bc60048036036040811015610c2257600080fd5b506001600160a01b0381358116916020013516612477565b61092560048036036020811015610c5057600080fd5b50356124ba565b6102bc60048036036040811015610c6d57600080fd5b506001600160a01b03813581169160200135166124d1565b6102bc6124f1565b61080960048036036060811015610ca357600080fd5b506001600160a01b038135811691602081013590911690604001356124fa565b61050c600480360360a0811015610cd957600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b811115610d1857600080fd5b820183602082011115610d2a57600080fd5b803590602001918460018302840111600160201b83111715610d4b57600080fd5b509092509050612537565b61028360048036036060811015610d6c57600080fd5b506001600160a01b038135169060208101359060400135612585565b61028360048036036020811015610d9e57600080fd5b503561260a565b61028360048036036060811015610dbb57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b811115610de557600080fd5b820183602082011115610df757600080fd5b803590602001918460208302840111600160201b83111715610e1857600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550505090356001600160a01b0316915061261c9050565b61050c60048036036080811015610e7757600080fd5b506001600160a01b0381358116916020810135909116906040810135906060013561267b565b61028360048036036040811015610eb357600080fd5b50803590602001356001600160a01b0316612699565b60006001600160a01b038316610f105760405162461bcd60e51b815260040180806020018281038252602b815260200180614c5a602b913960400191505060405180910390fd5b5060008181526002602090815260408083206001600160a01b03861684529091529020545b92915050565b6001600160e01b03191660009081526001602052604090205460ff1690565b6000826001600160a01b031663f8c52125836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610fa057600080fd5b505afa158015610fb4573d6000803e3d6000fd5b505050506040513d6020811015610fca57600080fd5b50519392505050565b6040518060400160405280600681526020016553686172657360d01b81525081565b600080611001836126b6565b91509150915091565b600061101683836126c8565b9392505050565b6110c3888888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808c0282810182019093528b82529093508b92508a91829185019084908082843760009201919091525050604080516020601f8b01819004810282018101909252898152925089915088908190840183828082843760009201919091525060019250612715915050565b5050505050505050565b60075460408051638cfb8f2160e01b815233600482015290516001600160a01b0390921691638cfb8f2191602480820192602092909190829003018186803b15801561111857600080fd5b505afa15801561112c573d6000803e3d6000fd5b505050506040513d602081101561114257600080fd5b505161114d57600080fd5b6001600160a01b03909216600090815260066020526040902090815560010155565b61118d84848484604051806020016040528060008152506000612715565b50505050565b6001600160a01b038516600090815260066020526040812054806111f8576040805162461bcd60e51b8152602060048201526017602482015276125b9d985b1a590813585c9ad95d081c1c9bdd9a591959604a1b604482015290519081900360640190fd5b80851061120457600080fd5b6000876001600160a01b031663870c426d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561123f57600080fd5b505afa158015611253573d6000803e3d6000fd5b505050506040513d602081101561126957600080fd5b50516001600160a01b03891660009081526006602052604081206001015491925061129a898363ffffffff61281016565b60408051633d14d1b760e21b8152336004820152602481018390526001600160a01b038d8116604483015291519293509085169163f45346dc916064808201926020929091908290030181600087803b1580156112f657600080fd5b505af115801561130a573d6000803e3d6000fd5b505050506040513d602081101561132057600080fd5b505060408051638d4e408360e01b815290516001600160a01b038c1691638d4e4083916004808301926020929190829003018186803b15801561136257600080fd5b505afa158015611376573d6000803e3d6000fd5b505050506040513d602081101561138c57600080fd5b505161140557826001600160a01b031663ce483e88826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156113d857600080fd5b505af11580156113ec573d6000803e3d6000fd5b505050506040513d602081101561140257600080fd5b50505b5050606060018303604051908082528060200260200182016040528015611436578160200160208202803883390190505b509050606060018403604051908082528060200260200182016040528015611468578160200160208202803883390190505b5090506000805b600186038110156114cf5789821415611489576001909101905b6114938c836126c8565b84828151811061149f57fe5b6020026020010181815250508a8382815181106114b857fe5b60209081029190910101526001918201910161146f565b506114ed878484604051806020016040528060008152506000612837565b611513886114fb8d8c6126c8565b8c604051806020016040528060008152506000612b2a565b60075460408051630391719960e51b81526001600160a01b0387811660048301528e811660248301529151919092169163722e33209160448083019260209291908290030181600087803b15801561156a57600080fd5b505af115801561157e573d6000803e3d6000fd5b505050506040513d602081101561159457600080fd5b506115a090508b6115b1565b5060019a9950505050505050505050565b60008090506000826001600160a01b031663bad84c9e6040518163ffffffff1660e01b815260040160206040518083038186803b1580156115f157600080fd5b505afa158015611605573d6000803e3d6000fd5b505050506040513d602081101561161b57600080fd5b5051604080516309f396e360e21b815290519192506000916001600160a01b038616916327ce5b8c916004808301926020929190829003018186803b15801561166357600080fd5b505afa158015611677573d6000803e3d6000fd5b505050506040513d602081101561168d57600080fd5b505160408051638d4e408360e01b815290519192506001600160a01b03861691638d4e408391600480820192602092909190829003018186803b1580156116d357600080fd5b505afa1580156116e7573d6000803e3d6000fd5b505050506040513d60208110156116fd57600080fd5b5051156117c15760005b818160ff1610156117bb576117b16117a4866001600160a01b0316633c264820846040518263ffffffff1660e01b8152600401808260ff16815260200191505060206040518083038186803b15801561175f57600080fd5b505afa158015611773573d6000803e3d6000fd5b505050506040513d602081101561178957600080fd5b50516117988860ff8616611ee4565b9063ffffffff61281016565b859063ffffffff612c5b16565b9350600101611707565b506117d3565b6117d082611798866000611ee4565b92505b82846001600160a01b031663870c426d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561180d57600080fd5b505afa158015611821573d6000803e3d6000fd5b505050506040513d602081101561183757600080fd5b505160408051634b3971dd60e11b81526001600160a01b03888116600483015291519190921691639672e3ba916024808301926020929190829003018186803b15801561188357600080fd5b505afa158015611897573d6000803e3d6000fd5b505050506040513d60208110156118ad57600080fd5b5051101561118d57fe5b606081518351146118f95760405162461bcd60e51b8152600401808060200182810382526030815260200180614cd96030913960400191505060405180910390fd5b60608351604051908082528060200260200182016040528015611926578160200160208202803883390190505b50905060005b8451811015611a165760006001600160a01b031685828151811061194c57fe5b60200260200101516001600160a01b0316141561199a5760405162461bcd60e51b8152600401808060200182810382526034815260200180614d7b6034913960400191505060405180910390fd5b600260008583815181106119aa57fe5b6020026020010151815260200190815260200160002060008683815181106119ce57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054828281518110611a0357fe5b602090810291909101015260010161192c565b509392505050565b600080611a2b8933612477565b1515600114611a6b5760405162461bcd60e51b815260040180806020018281038252603c815260200180614d3f603c913960400191505060405180910390fd5b611a758833612477565b1515600114611ab55760405162461bcd60e51b815260040180806020018281038252603b815260200180614e7b603b913960400191505060405180910390fd5b611adc8989611ac48f8f61100a565b8d604051806020016040528060008152506000612c6d565b6000806000611aee8f8c8f8a8a612d77565b92509250925060008f6001600160a01b031663bad84c9e6040518163ffffffff1660e01b815260040160206040518083038186803b158015611b2f57600080fd5b505afa158015611b43573d6000803e3d6000fd5b505050506040513d6020811015611b5957600080fd5b5051611b6b858b63ffffffff61281016565b81611b7257fe5b6008546040805163a9059cbb60e01b81526001600160a01b038f811660048301529490930460248401819052905190945092169163a9059cbb916044808201926020929091908290030181600087803b158015611bce57600080fd5b505af1158015611be2573d6000803e3d6000fd5b505050506040513d6020811015611bf857600080fd5b5051611c0357600080fd5b6008546001600160a01b031663a9059cbb8c611c25878563ffffffff61340616565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611c7457600080fd5b505af1158015611c88573d6000803e3d6000fd5b505050506040513d6020811015611c9e57600080fd5b5051611ca957600080fd5b50611cb38f6115b1565b909e909d509b505050505050505050505050565b6000806001600160a01b038616331480611cec5750611ce68633612477565b15156001145b611d275760405162461bcd60e51b8152600401808060200182810382526035815260200180614f116035913960400191505060405180910390fd5b6000806000611d398a8a898c8a612d77565b6008546040805163a9059cbb60e01b81526001600160a01b038e81166004830152602482018790529151959850939650919450169163a9059cbb916044808201926020929091908290030181600087803b158015611d9657600080fd5b505af1158015611daa573d6000803e3d6000fd5b505050506040513d6020811015611dc057600080fd5b5051611dcb57600080fd5b611dd48a6115b1565b90999098509650505050505050565b6007546001600160a01b031681565b600080836001600160a01b031663870c426d6040518163ffffffff1660e01b815260040160206040518083038186803b158015611e2e57600080fd5b505afa158015611e42573d6000803e3d6000fd5b505050506040513d6020811015611e5857600080fd5b5051604080516347c9dfff60e11b815290516001600160a01b0390921691638f93bffe916004808201926020929091908290030181600087803b158015611e9e57600080fd5b505af1158015611eb2573d6000803e3d6000fd5b505050506040513d6020811015611ec857600080fd5b50519050611edc838263ffffffff61341b16565b949350505050565b600080611ef184846126c8565b9050611edc81612348565b60405180604001604052806005815260200164534841524560d81b81525081565b6008546001600160a01b031681565b600080600080611f3d878787612585565b9350611f498785610f5a565b9150611f558785611df2565b9050611f7781611f6b868563ffffffff61340616565b9063ffffffff61340616565b925093509350935093565b336001600160a01b0383161415611fca5760405162461bcd60e51b815260040180806020018281038252602c815260200180614cad602c913960400191505060405180910390fd5b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b6000612045848484613430565b506001949350505050565b600061205d833384613430565b50600760009054906101000a90046001600160a01b03166001600160a01b031663c509d0b2846001600160a01b031663870c426d6040518163ffffffff1660e01b815260040160206040518083038186803b1580156120bb57600080fd5b505afa1580156120cf573d6000803e3d6000fd5b505050506040513d60208110156120e557600080fd5b5051604080516001600160e01b031960e085901b1681526001600160a01b0392831660048201529187166024830152336044830152606482018690525160848083019260209291908290030181600087803b15801561214357600080fd5b505af1158015612157573d6000803e3d6000fd5b505050506040513d602081101561204557600080fd5b6000808080806121808733888185612d77565b6008546040805163a9059cbb60e01b81523360048201526024810186905290519497509295509093506001600160a01b03169163a9059cbb916044808201926020929091908290030181600087803b1580156121db57600080fd5b505af11580156121ef573d6000803e3d6000fd5b505050506040513d602081101561220557600080fd5b505161221057600080fd5b6000876001600160a01b031663870c426d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561224b57600080fd5b505afa15801561225f573d6000803e3d6000fd5b505050506040513d602081101561227557600080fd5b50516007549091506001600160a01b0316637920757e828a338b61229f898963ffffffff612c5b16565b604080516001600160e01b031960e089901b1681526001600160a01b039687166004820152948616602486015292909416604484015260648301526084820192909252905160a48083019260209291908290030181600087803b15801561230557600080fd5b505af1158015612319573d6000803e3d6000fd5b505050506040513d602081101561232f57600080fd5b5061233b9050886115b1565b5090969095509350505050565b60009081526003602052604090205490565b60005460ff161561236a57600080fd5b6123726137e1565b600780546001600160a01b0319166001600160a01b0383169081179091556040805163f39ec1f760e01b815263086c2e6d60e31b6004820152905163f39ec1f791602480820192602092909190829003018186803b1580156123d357600080fd5b505afa1580156123e7573d6000803e3d6000fd5b505050506040513d60208110156123fd57600080fd5b5051600880546001600160a01b0319166001600160a01b0392831617908190551661242757600080fd5b50565b60606110168383613800565b6000806000612444846126b6565b95945050505050565b60008061245a85856126c8565b90506124448382610ec9565b6929b430b932aa37b5b2b760b11b90565b60006001600160a01b0382163014806110165750506001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b60008060006124c8846126b6565b50949350505050565b600460209081526000928352604080842090915290825290205460ff1681565b60005460ff1690565b60055460609060ff161561250d57600080fd5b6005805460ff19166001179055612525848484613872565b6005805460ff19169055949350505050565b61257d8686868686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525060019250613c48915050565b505050505050565b600080846001600160a01b0316633c264820856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156125cc57600080fd5b505afa1580156125e0573d6000803e3d6000fd5b505050506040513d60208110156125f657600080fd5b50519050612444838263ffffffff61281016565b60036020526000908152604090205481565b600080612627613cf8565b905060005b84518110156124c85760006126548787848151811061264757fe5b60200260200101516126c8565b9050612670836126648784610ec9565b9063ffffffff613cfe16565b92505060010161262c565b61118d84848484604051806020016040528060008152506000613c48565b600260209081526000928352604080842090915290825290205481565b606081901c9160589190911c60ff1690565b6040805160609390931b6bffffffffffffffffffffffff191660208085019190915260f89290921b6001600160f81b03191660348401528051808403601501815260359093019052015190565b82518451146127555760405162461bcd60e51b815260040180806020018281038252602e815260200180614e18602e913960400191505060405180910390fd5b83516127605761257d565b6001600160a01b0385166127a55760405162461bcd60e51b8152600401808060200182810382526028815260200180614c856028913960400191505060405180910390fd5b6001600160a01b0386163314806127c757506127c18633612477565b15156001145b6128025760405162461bcd60e51b8152600401808060200182810382526037815260200180614de16037913960400191505060405180910390fd5b61257d868686868686613d15565b60008261281f57506000610f35565b8282028284828161282c57fe5b041461101657600080fd5b6001600160a01b03851661287c5760405162461bcd60e51b8152600401808060200182810382526027815260200180614eea6027913960400191505060405180910390fd5b82518451146128bc5760405162461bcd60e51b8152600401808060200182810382526035815260200180614e466035913960400191505060405180910390fd5b60005b8451811015612a3357612937600260008784815181106128db57fe5b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b031681526020019081526020016000205485838151811061292157fe5b6020026020010151612c5b90919063ffffffff16565b6002600087848151811061294757fe5b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b03168152602001908152602001600020819055506129d084828151811061299357fe5b6020026020010151600360008885815181106129ab57fe5b6020026020010151815260200190815260200160002054612c5b90919063ffffffff16565b600360008784815181106129e057fe5b6020026020010151815260200190815260200160002081905550612a2b858281518110612a0957fe5b602002602001015187868481518110612a1e57fe5b6020026020010151613ee6565b6001016128bf565b50846001600160a01b031660006001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015612aba578181015183820152602001612aa2565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015612af9578181015183820152602001612ae1565b5050505090500194505050505060405180910390a48015612b2357612b2333600087878787613fb7565b5050505050565b6001600160a01b038516612b6f5760405162461bcd60e51b8152600401808060200182810382526021815260200180614f466021913960400191505060405180910390fd5b60008481526002602090815260408083206001600160a01b0389168452909152902054612ba2908463ffffffff612c5b16565b60008581526002602090815260408083206001600160a01b038a168452825280832093909355868252600390522054612be1908463ffffffff612c5b16565b600085815260036020526040902055612bfb848685613ee6565b604080518581526020810185905281516001600160a01b0388169260009233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62929181900390910190a48015612b2357612b2333600087878787614194565b60008282018381101561101657600080fd5b60008481526002602090815260408083206001600160a01b038a168452909152902054612ca0908463ffffffff61340616565b60008581526002602090815260408083206001600160a01b038b81168552925280832093909355871681522054612cd79084612c5b565b60008581526002602090815260408083206001600160a01b038a168452909152902055612d06848787866142f6565b846001600160a01b0316866001600160a01b0316336001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051808381526020018281526020019250505060405180910390a4801561257d5761257d338787878787614194565b6001600160a01b038516600090815260066020526040812080546001909101548291829181612de7576040805162461bcd60e51b8152602060048201526017602482015276125b9d985b1a590813585c9ad95d081c1c9bdd9a591959604a1b604482015290519081900360640190fd5b606082604051908082528060200260200182016040528015612e13578160200160208202803883390190505b509050606083604051908082528060200260200182016040528015612e42578160200160208202803883390190505b50905060005b84811015612e9257612e5a8d826126c8565b838281518110612e6657fe5b6020026020010181815250508a828281518110612e7f57fe5b6020908102919091010152600101612e48565b50612eb08b8383604051806020016040528060008152506000614477565b50612ec39050888263ffffffff61281016565b945060008a6001600160a01b031663870c426d6040518163ffffffff1660e01b815260040160206040518083038186803b158015612f0057600080fd5b505afa158015612f14573d6000803e3d6000fd5b505050506040513d6020811015612f2a57600080fd5b505160408051638d4e408360e01b815290519192506001600160a01b038d1691638d4e408391600480820192602092909190829003018186803b158015612f7057600080fd5b505afa158015612f84573d6000803e3d6000fd5b505050506040513d6020811015612f9a57600080fd5b505161301357806001600160a01b031663b62418a1876040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015612fe657600080fd5b505af1158015612ffa573d6000803e3d6000fd5b505050506040513d602081101561301057600080fd5b50505b8a6001600160a01b031663f8c52125876040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561305757600080fd5b505afa15801561306b573d6000803e3d6000fd5b505050506040513d602081101561308157600080fd5b5051604080516347c9dfff60e11b815290519196506000916001600160a01b03841691638f93bffe91600480830192602092919082900301818787803b1580156130ca57600080fd5b505af11580156130de573d6000803e3d6000fd5b505050506040513d60208110156130f457600080fd5b50519050613108878263ffffffff61341b16565b945061311e85611f6b898963ffffffff61340616565b965085156131ad5760408051630d8f82e160e11b8152600481018890526001600160a01b038b81166024830152604482018b90529151918e1691631b1f05c2916064808201926020929091908290030181600087803b15801561318057600080fd5b505af1158015613194573d6000803e3d6000fd5b505050506040513d60208110156131aa57600080fd5b50505b6001600160a01b0382166369328dec306131cd8a8963ffffffff612c5b16565b8f6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001838152602001826001600160a01b03166001600160a01b031681526020019350505050602060405180830381600087803b15801561323657600080fd5b505af115801561324a573d6000803e3d6000fd5b505050506040513d602081101561326057600080fd5b50508415613370576008546040805163491ca79960e11b815260006004820181905291516001600160a01b039384169363a9059cbb93908716926392394f329260248083019360209383900390910190829087803b1580156132c157600080fd5b505af11580156132d5573d6000803e3d6000fd5b505050506040513d60208110156132eb57600080fd5b5051604080516001600160e01b031960e085901b1681526001600160a01b039092166004830152602482018990525160448083019260209291908290030181600087803b15801561333b57600080fd5b505af115801561334f573d6000803e3d6000fd5b505050506040513d602081101561336557600080fd5b505161337057600080fd5b60075460408051630391719960e51b81526001600160a01b0385811660048301528f811660248301529151919092169163722e33209160448083019260209291908290030181600087803b1580156133c757600080fd5b505af11580156133db573d6000803e3d6000fd5b505050506040513d60208110156133f157600080fd5b50969c959b5093995093975050505050505050565b60008282111561341557600080fd5b50900390565b60008082848161342757fe5b04949350505050565b6001600160a01b038316600090815260066020526040812080546001909101548161349c576040805162461bcd60e51b8152602060048201526017602482015276125b9d985b1a590813585c9ad95d081c1c9bdd9a591959604a1b604482015290519081900360640190fd5b6000866001600160a01b031663870c426d6040518163ffffffff1660e01b815260040160206040518083038186803b1580156134d757600080fd5b505afa1580156134eb573d6000803e3d6000fd5b505050506040513d602081101561350157600080fd5b505190506000613517868463ffffffff61281016565b60408051633d14d1b760e21b8152336004820152602481018390526001600160a01b038b8116604483015291519293509084169163f45346dc916064808201926020929091908290030181600087803b15801561357357600080fd5b505af1158015613587573d6000803e3d6000fd5b505050506040513d602081101561359d57600080fd5b50506040805185815260208681028201019091526060908580156135cb578160200160208202803883390190505b5090506060856040519080825280602002602001820160405280156135fa578160200160208202803883390190505b50905060005b8681101561364a576136128b826126c8565b83828151811061361e57fe5b6020026020010181815250508882828151811061363757fe5b6020908102919091010152600101613600565b50613668898383604051806020016040528060008152506000612837565b896001600160a01b0316638d4e40836040518163ffffffff1660e01b815260040160206040518083038186803b1580156136a157600080fd5b505afa1580156136b5573d6000803e3d6000fd5b505050506040513d60208110156136cb57600080fd5b505161374457836001600160a01b031663ce483e88846040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561371757600080fd5b505af115801561372b573d6000803e3d6000fd5b505050506040513d602081101561374157600080fd5b50505b60075460408051630391719960e51b81526001600160a01b0387811660048301528d811660248301529151919092169163722e33209160448083019260209291908290030181600087803b15801561379b57600080fd5b505af11580156137af573d6000803e3d6000fd5b505050506040513d60208110156137c557600080fd5b506137d190508a6115b1565b5060019998505050505050505050565b60005460ff16156137f157600080fd5b6000805460ff19166001179055565b6060815160405190808252806020026020018201604052801561382d578160200160208202803883390190505b50905060005b825181101561386b5761384c8484838151811061264757fe5b82828151811061385857fe5b6020908102919091010152600101613833565b5092915050565b6007546040805163e62b888960e01b81526001600160a01b0386811660048301529151606093929092169163e62b888991602480820192602092909190829003018186803b1580156138c357600080fd5b505afa1580156138d7573d6000803e3d6000fd5b505050506040513d60208110156138ed57600080fd5b50516138f857600080fd5b836001600160a01b0316638d4e40836040518163ffffffff1660e01b815260040160206040518083038186803b15801561393157600080fd5b505afa158015613945573d6000803e3d6000fd5b505050506040513d602081101561395b57600080fd5b50516139c957836001600160a01b0316634bb278f36040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561399c57600080fd5b505af11580156139b0573d6000803e3d6000fd5b505050506040513d60208110156139c657600080fd5b50505b604080516008808252610120820190925290602082016101008038833901905050905060005b846001600160a01b03166327ce5b8c6040518163ffffffff1660e01b815260040160206040518083038186803b158015613a2857600080fd5b505afa158015613a3c573d6000803e3d6000fd5b505050506040513d6020811015613a5257600080fd5b5051811015613c3e576000613a6886838761244d565b90508015613c35576000806000806000613a828b886126c8565b9050613a8f8b8888611f2c565b80955081965082975083985050505050613abc8a8288604051806020016040528060008152506000614741565b613ad98b888c8988613ad4898963ffffffff612c5b16565b614872565b8415613c07578a6001600160a01b031663870c426d6040518163ffffffff1660e01b815260040160206040518083038186803b158015613b1857600080fd5b505afa158015613b2c573d6000803e3d6000fd5b505050506040513d6020811015613b4257600080fd5b50516001600160a01b03166369328dec30613b63878663ffffffff612c5b16565b8e6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001838152602001826001600160a01b03166001600160a01b031681526020019350505050602060405180830381600087803b158015613bcc57600080fd5b505af1158015613be0573d6000803e3d6000fd5b505050506040513d6020811015613bf657600080fd5b50613c0790508b8b8686868e61496e565b613c17838363ffffffff612c5b16565b888881518110613c2357fe5b60200260200101818152505050505050505b506001016139ef565b50611016846115b1565b6001600160a01b038516613c8d5760405162461bcd60e51b8152600401808060200182810382526028815260200180614c856028913960400191505060405180910390fd5b6001600160a01b038616331480613caf5750613ca98633612477565b15156001145b613cea5760405162461bcd60e51b8152600401808060200182810382526037815260200180614de16037913960400191505060405180910390fd5b61257d868686868686612c6d565b60001990565b6000818311613d0e575081610f35565b5080610f35565b60005b8451811015613df8576000858281518110613d2f57fe5b602002602001015190506000858381518110613d4757fe5b60209081029190910181015160008481526002835260408082206001600160a01b038e1683529093529190912054909150613d88908263ffffffff61340616565b60008381526002602090815260408083206001600160a01b038e811685529252808320939093558a1681522054613dbf9082612c5b565b60008381526002602090815260408083206001600160a01b038d168452909152902055613dee828a8a846142f6565b5050600101613d18565b50846001600160a01b0316866001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015613e7e578181015183820152602001613e66565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015613ebd578181015183820152602001613ea5565b5050505090500194505050505060405180910390a4801561257d5761257d338787878787613fb7565b600080613ef2856126b6565b60075491935091506001600160a01b031663d015ddbd858484613f15838b610ec9565b6040518563ffffffff1660e01b815260040180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b03168152602001838152602001828152602001945050505050602060405180830381600087803b158015613f8457600080fd5b505af1158015613f98573d6000803e3d6000fd5b505050506040513d6020811015613fae57600080fd5b50505050505050565b613fc9846001600160a01b0316614c18565b1561257d5760405163bc197c8160e01b8082526001600160a01b0388811660048401908152888216602485015260a060448501908152875160a4860152875193949289169363bc197c81938c938c938b938b938b9392916064820191608481019160c4909101906020808a01910280838360005b8381101561405557818101518382015260200161403d565b50505050905001848103835286818151815260200191508051906020019060200280838360005b8381101561409457818101518382015260200161407c565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156140d05781810151838201526020016140b8565b50505050905090810190601f1680156140fd5780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600087803b15801561412257600080fd5b505af1158015614136573d6000803e3d6000fd5b505050506040513d602081101561414c57600080fd5b50516001600160e01b0319161461257d5760405162461bcd60e51b8152600401808060200182810382526036815260200180614d096036913960400191505060405180910390fd5b6141a6846001600160a01b0316614c18565b1561257d5760405163f23a6e6160e01b8082526001600160a01b03888116600484019081528882166024850152604484018790526064840186905260a060848501908152855160a4860152855193949289169363f23a6e61938c938c938b938b938b93929160c490910190602085019080838360005b8381101561423457818101518382015260200161421c565b50505050905090810190601f1680156142615780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b15801561428457600080fd5b505af1158015614298573d6000803e3d6000fd5b505050506040513d60208110156142ae57600080fd5b50516001600160e01b0319161461257d5760405162461bcd60e51b8152600401808060200182810382526031815260200180614f676031913960400191505060405180910390fd5b600080614302866126b6565b60075491935091506001600160a01b031663d015ddbd868484614325838c610ec9565b6040518563ffffffff1660e01b815260040180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b03168152602001838152602001828152602001945050505050602060405180830381600087803b15801561439457600080fd5b505af11580156143a8573d6000803e3d6000fd5b505050506040513d60208110156143be57600080fd5b50506007546001600160a01b031663d015ddbd8584846143de838c610ec9565b6040518563ffffffff1660e01b815260040180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b03168152602001838152602001828152602001945050505050602060405180830381600087803b15801561444d57600080fd5b505af1158015614461573d6000803e3d6000fd5b505050506040513d60208110156110c357600080fd5b6001600160a01b0385166144bc5760405162461bcd60e51b815260040180806020018281038252603b815260200180614c1f603b913960400191505060405180910390fd5b82518451146144fc5760405162461bcd60e51b8152600401808060200182810382526034815260200180614eb66034913960400191505060405180910390fd5b60005b84518110156146515761457784828151811061451757fe5b60200260200101516002600088858151811061452f57fe5b602002602001015181526020019081526020016000206000896001600160a01b03166001600160a01b031681526020019081526020016000205461340690919063ffffffff16565b6002600087848151811061458757fe5b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b03168152602001908152602001600020819055506146108482815181106145d357fe5b6020026020010151600360008885815181106145eb57fe5b602002602001015181526020019081526020016000205461340690919063ffffffff16565b6003600087848151811061462057fe5b6020026020010151815260200190815260200160002081905550614649858281518110612a0957fe5b6001016144ff565b5060006001600160a01b0316856001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156146d85781810151838201526020016146c0565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156147175781810151838201526020016146ff565b5050505090500194505050505060405180910390a48015612b2357612b2333866000878787613fb7565b6001600160a01b0385166147865760405162461bcd60e51b8152600401808060200182810382526032815260200180614daf6032913960400191505060405180910390fd5b60008481526002602090815260408083206001600160a01b03891684529091529020546147b9908463ffffffff61340616565b60008581526002602090815260408083206001600160a01b038a1684528252808320939093558682526003905220546147f8908463ffffffff61340616565b600085815260036020526040902055614812848685613ee6565b604080518581526020810185905281516000926001600160a01b0389169233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62929181900390910190a48015612b2357612b2333866000878787614194565b600760009054906101000a90046001600160a01b03166001600160a01b031663cec4ede1876001600160a01b031663870c426d6040518163ffffffff1660e01b815260040160206040518083038186803b1580156148cf57600080fd5b505afa1580156148e3573d6000803e3d6000fd5b505050506040513d60208110156148f957600080fd5b5051604080516001600160e01b031960e085901b1681526001600160a01b0392831660048201528289166024820152918a166044830152606482018990526084820187905260a4820186905260c482018590525160e48083019260209291908290030181600087803b15801561444d57600080fd5b83156149ff576008546040805163a9059cbb60e01b81526001600160a01b038881166004830152602482018890529151919092169163a9059cbb9160448083019260209291908290030181600087803b1580156149ca57600080fd5b505af11580156149de573d6000803e3d6000fd5b505050506040513d60208110156149f457600080fd5b50516149ff57600080fd5b8215614a8c5760408051630d8f82e160e11b8152600481018590526001600160a01b03878116602483015260448201849052915191881691631b1f05c2916064808201926020929091908290030181600087803b158015614a5f57600080fd5b505af1158015614a73573d6000803e3d6000fd5b505050506040513d6020811015614a8957600080fd5b50505b811561257d57600860009054906101000a90046001600160a01b03166001600160a01b031663a9059cbb876001600160a01b031663870c426d6040518163ffffffff1660e01b815260040160206040518083038186803b158015614aef57600080fd5b505afa158015614b03573d6000803e3d6000fd5b505050506040513d6020811015614b1957600080fd5b50516040805163491ca79960e11b815260006004820181905291516001600160a01b03909316926392394f3292602480840193602093929083900390910190829087803b158015614b6957600080fd5b505af1158015614b7d573d6000803e3d6000fd5b505050506040513d6020811015614b9357600080fd5b5051604080516001600160e01b031960e085901b1681526001600160a01b039092166004830152602482018690525160448083019260209291908290030181600087803b158015614be357600080fd5b505af1158015614bf7573d6000803e3d6000fd5b505050506040513d6020811015614c0d57600080fd5b505161257d57600080fd5b3b15159056fe455243313135353a20617474656d7074696e6720746f206275726e206261746368206f6620746f6b656e73206f6e207a65726f206163636f756e74455243313135353a2062616c616e636520717565727920666f7220746865207a65726f2061646472657373455243313135353a207461726765742061646472657373206d757374206265206e6f6e2d7a65726f455243313135353a2063616e6e6f742073657420617070726f76616c2073746174757320666f722073656c66455243313135353a206163636f756e747320616e6420494473206d75737420686176652073616d65206c656e67746873455243313135353a20676f7420756e6b6e6f776e2076616c75652066726f6d206f6e4552433131353542617463685265636569766564455243313135353a206e656564206f70657261746f7220617070726f76616c20746f206275726e2073686f7274206163636f756e7420736861726573455243313135353a20736f6d65206164647265737320696e2062617463682062616c616e6365207175657279206973207a65726f455243313135353a20617474656d7074696e6720746f206275726e20746f6b656e73206f6e207a65726f206163636f756e74455243313135353a206e656564206f70657261746f7220617070726f76616c20666f7220337264207061727479207472616e7366657273455243313135353a2049447320616e642076616c756573206d75737420686176652073616d65206c656e67746873455243313135353a206d696e7465642049447320616e642076616c756573206d75737420686176652073616d65206c656e67746873455243313135353a206e656564206f70657261746f7220617070726f76616c20746f206275726e206c6f6e67206163636f756e7420736861726573455243313135353a206275726e742049447320616e642076616c756573206d75737420686176652073616d65206c656e67746873455243313135353a206261746368206d696e7420746f20746865207a65726f2061646472657373455243313135353a206e656564206f70657261746f7220617070726f76616c20746f2073656c6c20636f6d706c6574652073657473455243313135353a206d696e7420746f20746865207a65726f2061646472657373455243313135353a20676f7420756e6b6e6f776e2076616c75652066726f6d206f6e455243313135355265636569766564a265627a7a72315820f1517c694c136a0789cb69bbf7224352f1f03735c41ddd65775f375b875759f464736f6c634300050f0032

Deployed Bytecode Sourcemap

60103:20716:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;60103:20716:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21382:211;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;21382:211:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;8509:133;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8509:133:0;-1:-1:-1;;;;;;8509:133:0;;:::i;:::-;;;;;;;;;;;;;;;;;;76859:162;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;76859:162:0;;;;;;;;:::i;60194:38::-;;;:::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;60194:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79658:152;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;79658:152:0;;:::i;:::-;;;;-1:-1:-1;;;;;79658:152:0;;;;;;;;;;;;;;;;;;;;;79313:155;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;79313:155:0;;;;;;;;:::i;26338:266::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;26338:266:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;26338:266:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;26338:266: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;26338:266:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;26338:266:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;26338:266: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;26338:266:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;26338:266:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;26338:266: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;26338:266:0;;-1:-1:-1;26338:266:0;-1:-1:-1;26338:266:0;:::i;:::-;;62025:280;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;62025:280:0;;;;;;;;;;;;;:::i;61822:197::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;61822:197:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;61822:197:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;61822:197: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;61822:197:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;61822:197:0;;;;;;;;-1:-1:-1;61822:197:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;61822:197:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;61822:197: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;61822:197:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;61822:197:0;;-1:-1:-1;61822:197:0;;-1:-1:-1;;;;;61822:197:0:i;64923:1464::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;64923:1464:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;78555:752::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;78555:752:0;-1:-1:-1;;;;;78555:752:0;;:::i;22022:608::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22022:608:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;22022:608:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;22022:608: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;22022:608:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;22022:608:0;;;;;;;;-1:-1:-1;22022:608:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;22022:608:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;22022:608: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;22022:608:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;22022:608:0;;-1:-1:-1;22022:608:0;;-1:-1:-1;;;;;22022:608:0: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;22022:608:0;;;;;;;;;;;;;;;;;69485:1282;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;69485:1282:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;67832:616;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;67832:616:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;60415:19::-;;;:::i;:::-;;;;-1:-1:-1;;;;;60415:19:0;;;;;;;;;;;;;;76612:241;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;76612:241:0;;;;;;;;:::i;77657:213::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;77657:213:0;;;;;;;;:::i;60238:39::-;;;:::i;60440:17::-;;;:::i;75776:566::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;75776:566:0;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23108:287;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;23108:287:0;;;;;;;;;;:::i;63105:190::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;63105:190:0;;;;;;;;;;;;;;;;;:::i;62537:273::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;62537:273:0;;;;;;;;:::i;66712:574::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;66712:574:0;;;;;;;;:::i;21599:99::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21599:99:0;;:::i;60464:203::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;60464:203:0;-1:-1:-1;;;;;60464:203:0;;:::i;79474:178::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;79474:178:0;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;79474:178:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;79474:178: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;79474:178:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;79474:178:0;;-1:-1:-1;79474:178:0;;-1:-1:-1;;;;;79474:178:0:i;77471:180::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;77471:180:0;;:::i;77876:234::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;77876:234:0;;;;;;;;;;;;;;;;;:::i;77027:88::-;;;:::i;23676:178::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;23676:178:0;;;;;;;;;;:::i;77199:187::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;77199:187:0;;:::i;20584:71::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;20584:71:0;;;;;;;;;;:::i;9707:88::-;;;:::i;72906:242::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;72906:242:0;;;;;;;;;;;;;;;;;:::i;24408:230::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;24408:230:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;24408:230:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;24408:230: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;24408:230:0;;-1:-1:-1;24408:230:0;-1:-1:-1;24408:230:0;:::i;76348:258::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;76348:258:0;;;;;;;;;;;;;:::i;20483:44::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20483:44:0;;:::i;78116:433::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;78116:433:0;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;78116:433:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;78116:433: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;78116:433:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;78116:433:0;;-1:-1:-1;;;78116:433:0;;-1:-1:-1;;;;;78116:433:0;;-1:-1:-1;78116:433:0;;-1:-1:-1;78116:433:0:i;61147:165::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;61147:165:0;;;;;;;;;;;;;;;;;;;;;;:::i;20366:65::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20366:65:0;;;;;;-1:-1:-1;;;;;20366:65:0;;:::i;21382:211::-;21451:7;-1:-1:-1;;;;;21478:21:0;;21470:77;;;;-1:-1:-1;;;21470:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21564:13:0;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;21564:22:0;;;;;;;;;;21382:211;;;;;:::o;8509:133::-;-1:-1:-1;;;;;;8602:33:0;8579:4;8602:33;;;:20;:33;;;;;;;;;8509:133::o;76859:162::-;76943:7;76969;-1:-1:-1;;;;;76969:36:0;;77006:7;76969:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;76969:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;76969:45:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;76969:45:0;;76859:162;-1:-1:-1;;;76859:162:0:o;60194:38::-;;;;;;;;;;;;;;-1:-1:-1;;;60194:38:0;;;;:::o;79658:152::-;79720:15;79737:16;79772:31;79794:8;79772:21;:31::i;:::-;79765:38;;;;79658:152;;;:::o;79313:155::-;79389:16;79424:37;79443:7;79452:8;79424:18;:37::i;:::-;79417:44;79313:155;-1:-1:-1;;;79313:155:0:o;26338:266::-;26544:53;26563:4;26569:2;26573:3;;26544:53;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;;26544:53:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26578:6:0;;-1:-1:-1;26578:6:0;;;;26544:53;;;26578:6;;26544:53;26578:6;26544:53;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;;26544:53:0;;;;137:4:-1;26544:53:0;;;;;;;;;;;;;;;;;;-1:-1:-1;26586:4:0;;-1:-1:-1;26586:4:0;;;;26544:53;;26586:4;;;;26544:53;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;26592:4:0;;-1:-1:-1;26544:18:0;;-1:-1:-1;;26544:53:0:i;:::-;26338:266;;;;;;;;:::o;62025:280::-;62135:5;;:44;;;-1:-1:-1;;;62135:44:0;;62167:10;62135:44;;;;;;-1:-1:-1;;;;;62135:5:0;;;;:21;;:44;;;;;;;;;;;;;;;:5;:44;;;5:2:-1;;;;30:1;27;20:12;5:2;62135:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;62135:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;62135:44:0;62126:54;;;;;;-1:-1:-1;;;;;62190:25:0;;;;;;;:7;:25;;;;;:52;;;62252:34;;:46;62025:280::o;61822:197::-;61949:63;61968:5;61975:3;61980:4;61986:7;61995:9;;;;;;;;;;;;62006:5;61949:18;:63::i;:::-;61822:197;;;;:::o;64923:1464::-;-1:-1:-1;;;;;65118:25:0;;65079:4;65118:25;;;:7;:25;;;;;:37;65174:17;65166:53;;;;;-1:-1:-1;;;65166:53:0;;;;;;;;;;;;-1:-1:-1;;;65166:53:0;;;;;;;;;;;;;;;65252:12;65237;:27;65229:36;;;;;;65276:19;65298:7;-1:-1:-1;;;;;65298:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;65298:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;65298:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;65298:21:0;-1:-1:-1;;;;;65364:25:0;;65344:17;65364:25;;;:7;65298:21;65364:25;;;;:34;;;65298:21;;-1:-1:-1;65428:22:0;:7;65364:34;65428:22;:11;:22;:::i;:::-;65464:54;;;-1:-1:-1;;;65464:54:0;;65482:10;65464:54;;;;;;;;;;-1:-1:-1;;;;;65464:54:0;;;;;;;;;65412:38;;-1:-1:-1;65464:17:0;;;;;;:54;;;;;;;;;;;;;;;-1:-1:-1;65464:17:0;:54;;;5:2:-1;;;;30:1;27;20:12;5:2;65464:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;65464:54:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;65538:21:0;;;-1:-1:-1;;;65538:21:0;;;;-1:-1:-1;;;;;65538:19:0;;;;;:21;;;;;65464:54;;65538:21;;;;;;;:19;:21;;;5:2:-1;;;;30:1;27;20:12;5:2;65538:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;65538:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;65538:21:0;65533:99;;65579:9;-1:-1:-1;;;;;65579:31:0;;65611:5;65579:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;65579:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;65579:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;65533:99:0;64923:1464;;65652:26;65710:1;65695:12;:16;65681:31;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;65681:31:0;;65652:60;;65722:24;65778:1;65763:12;:16;65749:31;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;65749:31:0;-1:-1:-1;65722:58:0;-1:-1:-1;65790:16:0;;65821:273;65862:1;65847:12;:16;65842:2;:21;65821:273;;;65901:12;65889:8;:24;65885:73;;;65933:10;;;;;65885:73;65987:37;66006:7;66015:8;65987:18;:37::i;:::-;65971:9;65981:2;65971:13;;;;;;;;;;;;;:53;;;;;66052:7;66038;66046:2;66038:11;;;;;;;;;;;;;;;;;:21;66073:10;;;;;65865:4;65821:273;;;;66104:65;66115:15;66132:9;66143:7;66152:9;;;;;;;;;;;;66163:5;66104:10;:65::i;:::-;66179:91;66185:14;66201:41;66220:7;66229:12;66201:18;:41::i;:::-;66244:7;66253:9;;;;;;;;;;;;66264:5;66179;:91::i;:::-;66281:5;;:44;;;-1:-1:-1;;;66281:44:0;;-1:-1:-1;;;;;66281:44:0;;;;;;;;;;;;;;;;:5;;;;;:24;;:44;;;;;;;;;;;;;;:5;;:44;;;5:2:-1;;;;30:1;27;20:12;5:2;66281:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;66281:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;66336:23:0;;-1:-1:-1;66351:7:0;66336:14;:23::i;:::-;-1:-1:-1;66376:4:0;;64923:1464;-1:-1:-1;;;;;;;;;;64923:1464:0:o;78555:752::-;78618:24;78645:1;78618:28;;78656:17;78676:7;-1:-1:-1;;;;;78676:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;78676:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;78676:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;78676:21:0;78730:29;;;-1:-1:-1;;;78730:29:0;;;;78676:21;;-1:-1:-1;78707:20:0;;-1:-1:-1;;;;;78730:27:0;;;;;:29;;;;;78676:21;;78730:29;;;;;;;:27;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;78730:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;78730:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;78730:29:0;78862:21;;;-1:-1:-1;;;78862:21:0;;;;78730:29;;-1:-1:-1;;;;;;78862:19:0;;;;;:21;;;;;78730:29;;78862:21;;;;;;;;:19;:21;;;5:2:-1;;;;30:1;27;20:12;5:2;78862:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;78862:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;78862:21:0;78858:351;;;78904:7;78899:196;78921:12;78917:1;:16;;;78899:196;;;78977:103;78998:81;79042:7;-1:-1:-1;;;;;79042:33:0;;79076:1;79042:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;79042:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;79042:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;79042:36:0;78998:39;79026:7;78998:39;;;:27;:39::i;:::-;:43;:81;:43;:81;:::i;:::-;78977:16;;:103;:20;:103;:::i;:::-;78958:122;-1:-1:-1;78935:3:0;;78899:196;;;;78858:351;;;79144:54;79188:9;79144:39;79172:7;79181:1;79144:27;:39::i;:54::-;79125:73;;78858:351;79283:16;79226:7;-1:-1:-1;;;;;79226:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;79226:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;79226:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;79226:21:0;:53;;;-1:-1:-1;;;79226:53:0;;-1:-1:-1;;;;;79226:53:0;;;;;;;;;:35;;;;;;;:53;;;;;:21;;:53;;;;;;;:35;:53;;;5:2:-1;;;;30:1;27;20:12;5:2;79226:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;79226:53:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;79226:53:0;:73;;79219:81;;;22022:608;22162:16;22221:3;:10;22202:8;:15;:29;22194:90;;;;-1:-1:-1;;;22194:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22295:30;22342:8;:15;22328:30;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;22328:30:0;-1:-1:-1;22295:63:0;-1:-1:-1;22374:9:0;22369:224;22393:8;:15;22389:1;:19;22369:224;;;22460:1;-1:-1:-1;;;;;22437:25:0;:8;22446:1;22437:11;;;;;;;;;;;;;;-1:-1:-1;;;;;22437:25:0;;;22429:90;;;;-1:-1:-1;;;22429:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22552:9;:17;22562:3;22566:1;22562:6;;;;;;;;;;;;;;22552:17;;;;;;;;;;;:30;22570:8;22579:1;22570:11;;;;;;;;;;;;;;-1:-1:-1;;;;;22552:30:0;-1:-1:-1;;;;;22552:30:0;;;;;;;;;;;;;22533:13;22547:1;22533:16;;;;;;;;;;;;;;;;;:49;22410:3;;22369:224;;;-1:-1:-1;22610:13:0;22022:608;-1:-1:-1;;;22022:608:0:o;69485:1282::-;69753:19;69774:21;69815:47;69832:17;69851:10;69815:16;:47::i;:::-;:55;;69866:4;69815:55;69807:128;;;;-1:-1:-1;;;69807:128:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69953:46;69970:16;69988:10;69953:16;:46::i;:::-;:54;;70003:4;69953:54;69945:126;;;;-1:-1:-1;;;69945:126:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70082:116;70104:17;70123:16;70141:29;70152:7;70161:8;70141:10;:29::i;:::-;70172:7;70181:9;;;;;;;;;;;;70192:5;70082:21;:116::i;:::-;70292:15;70309:19;70330:21;70355:82;70372:7;70381:16;70399:7;70408:14;70424:12;70355:16;:82::i;:::-;70291:146;;;;;;70462:19;70506:7;-1:-1:-1;;;;;70506:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;70506:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;70506:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;70506:21:0;70484:19;:7;70496:6;70484:19;:11;:19;:::i;:::-;:43;;;;;70549:4;;:42;;;-1:-1:-1;;;70549:42:0;;-1:-1:-1;;;;;70549:42:0;;;;;;;70484:43;;;;70549:42;;;;;;;;70484:43;;-1:-1:-1;70549:4:0;;;:13;;:42;;;;;;;;;;;;;;;:4;;:42;;;5:2:-1;;;;30:1;27;20:12;5:2;70549:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;70549:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;70549:42:0;70541:51;;;;;;70614:4;;-1:-1:-1;;;;;70614:4:0;:13;70628:15;70645:24;:7;70657:11;70645:24;:11;:24;:::i;:::-;70614:56;;;;;;;;;;;;;-1:-1:-1;;;;;70614:56:0;-1:-1:-1;;;;;70614:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;70614:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;70614:56:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;70614:56:0;70606:65;;;;;;69485:1282;70692:23;70707:7;70692:14;:23::i;:::-;70733:11;;;;-1:-1:-1;69485:1282:0;-1:-1:-1;;;;;;;;;;;;69485:1282:0:o;67832:616::-;67969:19;;-1:-1:-1;;;;;68031:21:0;;68042:10;68031:21;;:70;;;68056:37;68073:7;68082:10;68056:16;:37::i;:::-;:45;;68097:4;68056:45;68031:70;68023:136;;;;-1:-1:-1;;;68023:136:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68179:15;68196:19;68217:21;68242:66;68259:7;68268;68277;68286;68295:12;68242:16;:66::i;:::-;68327:4;;:34;;;-1:-1:-1;;;68327:34:0;;-1:-1:-1;;;;;68327:34:0;;;;;;;;;;;;;;;68178:130;;-1:-1:-1;68178:130:0;;-1:-1:-1;68178:130:0;;-1:-1:-1;68327:4:0;;:13;;:34;;;;;;;;;;;;;;;:4;;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;68327:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;68327:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;68327:34:0;68319:43;;;;;;68373:23;68388:7;68373:14;:23::i;:::-;68414:11;;;;-1:-1:-1;67832:616:0;-1:-1:-1;;;;;;;67832:616:0:o;60415:19::-;;;-1:-1:-1;;;;;60415:19:0;;:::o;76612:241::-;76693:7;76712:28;76743:7;-1:-1:-1;;;;;76743:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;76743:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;76743:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;76743:21:0;:53;;;-1:-1:-1;;;76743:53:0;;;;-1:-1:-1;;;;;76743:51:0;;;;;;:53;;;;;:21;;:53;;;;;;;;;:51;:53;;;5:2:-1;;;;30:1;27;20:12;5:2;76743:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;76743:53:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;76743:53:0;;-1:-1:-1;76813:33:0;:7;76743:53;76813:33;:11;:33;:::i;:::-;76806:40;76612:241;-1:-1:-1;;;;76612:241:0:o;77657:213::-;77750:7;77769:16;77788:37;77807:7;77816:8;77788:18;:37::i;:::-;77769:56;;77842:21;77854:8;77842:11;:21::i;60238:39::-;;;;;;;;;;;;;;-1:-1:-1;;;60238:39:0;;;;:::o;60440:17::-;;;-1:-1:-1;;;;;60440:17:0;;:::o;75776:566::-;75878:17;75897:25;75924:21;75947:22;75993:53;76011:7;76020:8;76030:15;75993:17;:53::i;:::-;75981:65;;76072:39;76092:7;76101:9;76072:19;:39::i;:::-;76056:55;;76138:41;76160:7;76169:9;76138:21;:41::i;:::-;76121:58;-1:-1:-1;76209:48:0;76121:58;76209:28;:9;76223:13;76209:28;:13;:28;:::i;:::-;:32;:48;:32;:48;:::i;:::-;76189:68;-1:-1:-1;75776:566:0;;;;;;;:::o;23108:287::-;23195:10;-1:-1:-1;;;;;23195:22:0;;;;23187:79;;;;-1:-1:-1;;;23187:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23295:10;23276:30;;;;:18;:30;;;;;;;;-1:-1:-1;;;;;23276:40:0;;;;;;;;;;;;:51;;-1:-1:-1;;23276:51:0;;;;;;;;;;23342:46;;;;;;;23276:40;;23295:10;23342:46;;;;;;;;;;;23108:287;;:::o;63105:190::-;63200:4;63216:51;63240:7;63249:8;63259:7;63216:23;:51::i;:::-;-1:-1:-1;63284:4:0;;63105:190;-1:-1:-1;;;;63105:190:0:o;62537:273::-;62620:4;62636:53;62660:7;62669:10;62681:7;62636:23;:53::i;:::-;;62699:5;;;;;;;;;-1:-1:-1;;;;;62699:5:0;-1:-1:-1;;;;;62699:30:0;;62730:7;-1:-1:-1;;;;;62730:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;62730:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;62730:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;62730:21:0;62699:83;;;-1:-1:-1;;;;;;62699:83:0;;;;;;;-1:-1:-1;;;;;62699:83:0;;;;;;;;;;;;;;62762:10;62699:83;;;;;;;;;;;;;;;;62730:21;;62699:83;;;;;;;-1:-1:-1;62699:83:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;62699:83:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;62699:83:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;66712:574:0;66796:19;;;;;66914:70;66931:7;66940:10;66952:7;66940:10;66796:19;66914:16;:70::i;:::-;67003:4;;:34;;;-1:-1:-1;;;67003:34:0;;67017:10;67003:34;;;;;;;;;;;;66850:134;;-1:-1:-1;66850:134:0;;-1:-1:-1;66850:134:0;;-1:-1:-1;;;;;;67003:4:0;;:13;;:34;;;;;;;;;;;;;;;:4;;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;67003:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;67003:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;67003:34:0;66995:43;;;;;;67049:19;67071:7;-1:-1:-1;;;;;67071:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;67071:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;67071:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;67071:21:0;67102:5;;67071:21;;-1:-1:-1;;;;;;67102:5:0;:25;67071:21;67139:7;67148:10;67160:7;67169:30;:11;67185:13;67169:30;:15;:30;:::i;:::-;67102:98;;;-1:-1:-1;;;;;;67102:98:0;;;;;;;-1:-1:-1;;;;;67102:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;67102:98:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;67102:98:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;67102:98:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;67211:23:0;;-1:-1:-1;67226:7:0;67211:14;:23::i;:::-;-1:-1:-1;67252:11:0;;;;-1:-1:-1;66712:574:0;-1:-1:-1;;;;66712:574:0:o;21599:99::-;21653:7;21679:12;;;:8;:12;;;;;;;21599:99::o;60464:203::-;9574:11;;;;9573:12;9565:21;;;;;;60536:19;:17;:19::i;:::-;60565:5;:14;;-1:-1:-1;;;;;;60565:14:0;-1:-1:-1;;;;;60565:14:0;;;;;;;;60602:21;;;-1:-1:-1;;;60602:21:0;;-1:-1:-1;;;60602:21:0;;;;;;:13;;:21;;;;;;;;;;;;;;;60565:14;60602:21;;;5:2:-1;;;;30:1;27;20:12;5:2;60602:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;60602:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;60602:21:0;60589:4;:35;;-1:-1:-1;;;;;;60589:35:0;-1:-1:-1;;;;;60589:35:0;;;;;;;;60643:4;60635:25;;;;;;60464:203;:::o;79474:178::-;79561:26;79606:39;79626:7;79635:9;79606:19;:39::i;77471:180::-;77531:7;77551:15;77568:16;77588:31;77610:8;77588:21;:31::i;:::-;77550:69;77471:180;-1:-1:-1;;;;;77471:180:0:o;77876:234::-;77982:7;78001:16;78020:37;78039:7;78048:8;78020:18;:37::i;:::-;78001:56;;78074:29;78084:8;78094;78074:9;:29::i;77027:88::-;-1:-1:-1;;;77027:88:0;:::o;23676:178::-;23758:4;-1:-1:-1;;;;;23781:25:0;;23801:4;23781:25;;:66;;-1:-1:-1;;;;;;;23810:27:0;;;;;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;23676:178::o;77199:187::-;77258:7;77278:15;77295:16;77315:31;77337:8;77315:21;:31::i;:::-;-1:-1:-1;77277:69:0;77199:187;-1:-1:-1;;;;77199:187:0:o;20584:71::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;9707:88::-;9754:4;9777:11;;;9707:88;:::o;72906:242::-;10357:13;;73028:29;;10357:13;;10356:14;10348:23;;;;;;10381:13;:20;;-1:-1:-1;;10381:20:0;10397:4;10381:20;;;73076:65;73105:7;73114:12;73128;73076:28;:65::i;:::-;10422:13;:21;;-1:-1:-1;;10422:21:0;;;73069:72;72906:242;-1:-1:-1;;;;72906:242:0:o;24408:230::-;24585:46;24599:4;24605:2;24609;24613:5;24620:4;;24585:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;24626:4:0;;-1:-1:-1;24585:13:0;;-1:-1:-1;;24585:46:0:i;:::-;24408:230;;;;;;:::o;76348:258::-;76456:7;76475:24;76502:7;-1:-1:-1;;;;;76502:33:0;;76536:8;76502:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;76502:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;76502:43:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;76502:43:0;;-1:-1:-1;76562:37:0;:15;76502:43;76562:37;:19;:37;:::i;20483:44::-;;;;;;;;;;;;;:::o;78116:433::-;78239:7;78258:15;78276:31;:29;:31::i;:::-;78258:49;-1:-1:-1;78322:10:0;78317:202;78343:9;:16;78338:2;:21;78317:202;;;78381:16;78400:42;78419:7;78428:9;78438:2;78428:13;;;;;;;;;;;;;;78400:18;:42::i;:::-;78381:61;;78466:42;78500:7;78466:29;78476:8;78486;78466:9;:29::i;:::-;:33;:42;:33;:42;:::i;:::-;78456:52;-1:-1:-1;;78361:4:0;;78317:202;;61147:165;61249:56;61263:5;61270:3;61275;61280:6;61288:9;;;;;;;;;;;;61299:5;61249:13;:56::i;20366:65::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;11077:365::-;11224:2;11220:91;;;;11340:2;11336:90;;;;;;;11195:241::o;10477:277::-;10612:42;;;10583:26;10612:42;;;;-1:-1:-1;;10612:42:0;;;;;;;;;;;;;;-1:-1:-1;;;;;;10612:42:0;;;;;;;26:21:-1;;;22:32;;6:49;;10612:42:0;;;;;;10705:32;10699:39;;10673:75::o;26610:723::-;26861:6;:13;26847:3;:10;:27;26839:86;;;;-1:-1:-1;;;26839:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26939:10;;26935:52;;26970:7;;26935:52;-1:-1:-1;;;;;27004:16:0;;26996:69;;;;-1:-1:-1;;;26996:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27096:18:0;;27104:10;27096:18;;:64;;;27118:34;27135:4;27141:10;27118:16;:34::i;:::-;:42;;27156:4;27118:42;27096:64;27075:166;;;;-1:-1:-1;;;27075:166:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27252:74;27279:4;27285:2;27289:3;27294:6;27302:4;27308:17;27252:26;:74::i;11476:421::-;11534:7;11774:6;11770:45;;-1:-1:-1;11803:1:0;11796:8;;11770:45;11837:5;;;11841:1;11837;:5;:1;11860:5;;;;;:10;11852:19;;;;;29310:769;-1:-1:-1;;;;;29459:16:0;;29451:68;;;;-1:-1:-1;;;29451:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29551:6;:13;29537:3;:10;:27;29529:93;;;;-1:-1:-1;;;29529:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29638:6;29633:230;29654:3;:10;29650:1;:14;29633:230;;;29709:36;29723:9;:17;29733:3;29737:1;29733:6;;;;;;;;;;;;;;29723:17;;;;;;;;;;;:21;29741:2;-1:-1:-1;;;;;29723:21:0;-1:-1:-1;;;;;29723:21:0;;;;;;;;;;;;;29709:6;29716:1;29709:9;;;;;;;;;;;;;;:13;;:36;;;;:::i;:::-;29685:9;:17;29695:3;29699:1;29695:6;;;;;;;;;;;;;;29685:17;;;;;;;;;;;:21;29703:2;-1:-1:-1;;;;;29685:21:0;-1:-1:-1;;;;;29685:21:0;;;;;;;;;;;;:60;;;;29778:31;29799:6;29806:1;29799:9;;;;;;;;;;;;;;29778:8;:16;29787:3;29791:1;29787:6;;;;;;;;;;;;;;29778:16;;;;;;;;;;;;:20;;:31;;;;:::i;:::-;29759:8;:16;29768:3;29772:1;29768:6;;;;;;;;;;;;;;29759:16;;;;;;;;;;;:50;;;;29823:29;29830:3;29834:1;29830:6;;;;;;;;;;;;;;29838:2;29842:6;29849:1;29842:9;;;;;;;;;;;;;;29823:6;:29::i;:::-;29666:3;;29633:230;;;;29916:2;-1:-1:-1;;;;;29878:54:0;29912:1;-1:-1:-1;;;;;29878:54:0;29892:10;-1:-1:-1;;;;;29878:54:0;;29920:3;29925:6;29878:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;29878:54: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;29878:54:0;;;;;;;;;;;;;;;;;;;29947:17;29943:130;;;29980:82;30016:10;30036:1;30040:2;30044:3;30049:6;30057:4;29980:35;:82::i;:::-;29310:769;;;;;:::o;28429:525::-;-1:-1:-1;;;;;28553:16:0;;28545:62;;;;-1:-1:-1;;;28545:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28638:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;28638:17:0;;;;;;;;;;:28;;28660:5;28638:28;:21;:28;:::i;:::-;28618:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;28618:17:0;;;;;;;;;:48;;;;28691:12;;;:8;:12;;;;:23;;28708:5;28691:23;:16;:23;:::i;:::-;28676:12;;;;:8;:12;;;;;:38;28725:21;28685:2;28736;28740:5;28725:6;:21::i;:::-;28761:53;;;;;;;;;;;;;;-1:-1:-1;;;;;28761:53:0;;;28796:1;;28776:10;;28761:53;;;;;;;;;;;28829:17;28825:123;;;28862:75;28893:10;28913:1;28917:2;28921;28925:5;28932:4;28862:30;:75::i;12319:144::-;12377:7;12408:5;;;12431:6;;;;12423:15;;;;;25184:565;25418:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;25418:19:0;;;;;;;;;;:30;;25442:5;25418:30;:23;:30;:::i;:::-;25396:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;25396:19:0;;;;;;;;;;:52;;;;25478:17;;;;;;:28;;25500:5;25478:21;:28::i;:::-;25458:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;25458:17:0;;;;;;;;;:48;25517:36;25468:2;25537:4;25472:2;25547:5;25517:15;:36::i;:::-;25601:2;-1:-1:-1;;;;;25568:47:0;25595:4;-1:-1:-1;;;;;25568:47:0;25583:10;-1:-1:-1;;;;;25568:47:0;;25605:2;25609:5;25568:47;;;;;;;;;;;;;;;;;;;;;;;;25630:17;25626:117;;;25663:69;25694:10;25706:4;25712:2;25716;25720:5;25727:4;25663:30;:69::i;70773:1788::-;-1:-1:-1;;;;;71008:25:0;;70914:15;71008:25;;;:7;:25;;;;;:37;;71075:34;;;;;70914:15;;;;71128:17;71120:53;;;;;-1:-1:-1;;;71120:53:0;;;;;;;;;;;;-1:-1:-1;;;71120:53:0;;;;;;;;;;;;;;;71236:26;71279:12;71265:27;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;71265:27:0;;71236:56;;71306:24;71347:12;71333:27;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;71333:27:0;-1:-1:-1;71306:54:0;-1:-1:-1;71380:9:0;71375:159;71399:12;71395:1;:16;71375:159;;;71451:30;71470:7;71479:1;71451:18;:30::i;:::-;71436:9;71446:1;71436:12;;;;;;;;;;;;;:45;;;;;71512:7;71499;71507:1;71499:10;;;;;;;;;;;;;;;;;:20;71413:3;;71375:159;;;;71548:58;71559:8;71569:9;71580:7;71589:9;;;;;;;;;;;;71600:5;71548:10;:58::i;:::-;-1:-1:-1;71674:22:0;;-1:-1:-1;71674:7:0;71686:9;71674:22;:11;:22;:::i;:::-;71664:32;;71706:19;71728:7;-1:-1:-1;;;;;71728:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;71728:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;71728:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;71728:21:0;71765;;;-1:-1:-1;;;71765:21:0;;;;71728;;-1:-1:-1;;;;;;71765:19:0;;;;;:21;;;;;71728;;71765;;;;;;;;:19;:21;;;5:2:-1;;;;30:1;27;20:12;5:2;71765:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;71765:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;71765:21:0;71760:93;;71802:9;-1:-1:-1;;;;;71802:31:0;;71834:7;71802:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;71802:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;71802:40:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;71760:93:0;71877:7;-1:-1:-1;;;;;71877:36:0;;71914:7;71877:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;71877:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;71877:45:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;71877:45:0;71963:41;;;-1:-1:-1;;;71963:41:0;;;;71877:45;;-1:-1:-1;71932:28:0;;-1:-1:-1;;;;;71963:39:0;;;;;:41;;;;;71877:45;;71963:41;;;;;;;71932:28;71963:39;:41;;;5:2:-1;;;;30:1;27;20:12;5:2;71963:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;71963:41:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;71963:41:0;;-1:-1:-1;72030:33:0;:7;71963:41;72030:33;:11;:33;:::i;:::-;72014:49;-1:-1:-1;72083:43:0;72014:49;72083:24;:7;72095:11;72083:24;:11;:24;:::i;:43::-;72073:53;-1:-1:-1;72141:16:0;;72137:121;;72173:74;;;-1:-1:-1;;;72173:74:0;;;;;;;;-1:-1:-1;;;;;72173:74:0;;;;;;;;;;;;;;;:31;;;;;;:74;;;;;;;;;;;;;;;-1:-1:-1;72173:31:0;:74;;;5:2:-1;;;;30:1;27;20:12;5:2;72173:74:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;72173:74:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;72137:121:0;-1:-1:-1;;;;;72268:18:0;;;72295:4;72302:26;:7;72314:13;72302:26;:11;:26;:::i;:::-;72338:7;72268:79;;;;;;;;;;;;;-1:-1:-1;;;;;72268:79:0;-1:-1:-1;;;;;72268:79:0;;;;;;;;;;;-1:-1:-1;;;;;72268:79:0;-1:-1:-1;;;;;72268:79:0;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;72268:79:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;72268:79:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;72362:18:0;;72358:142;;72404:4;;72426:45;;;-1:-1:-1;;;72426:45:0;;72404:4;72426:45;;;;;;;;-1:-1:-1;;;;;72404:4:0;;;;:13;;72426:38;;;;;;:45;;;;;;;;;;;;;;;;:38;:45;;;5:2:-1;;;;30:1;27;20:12;5:2;72426:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;72426:45:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;72426:45:0;72404:84;;;-1:-1:-1;;;;;;72404:84:0;;;;;;;-1:-1:-1;;;;;72404:84:0;;;;;;;;;;;;;;;;;;;72426:45;;72404:84;;;;;;;-1:-1:-1;72404:84:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;72404:84:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;72404:84:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;72404:84:0;72396:93;;;;;;72510:5;;:44;;;-1:-1:-1;;;72510:44:0;;-1:-1:-1;;;;;72510:44:0;;;;;;;;;;;;;;;;:5;;;;;:24;;:44;;;;;;;;;;;;;;:5;;:44;;;5:2:-1;;;;30:1;27;20:12;5:2;72510:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;72510:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;70773:1788:0;;;;-1:-1:-1;70773:1788:0;;-1:-1:-1;70773:1788:0;;-1:-1:-1;;;;;;;;70773:1788:0:o;12192:121::-;12250:7;12282:1;12277;:6;;12269:15;;;;;;-1:-1:-1;12301:5:0;;;12192:121::o;11903:283::-;11961:7;12058:9;12074:1;12070;:5;;;;;;;11903:283;-1:-1:-1;;;;11903:283:0:o;63301:1055::-;-1:-1:-1;;;;;63443:25:0;;63404:4;63443:25;;;:7;:25;;;;;:37;;63510:34;;;;;63563:17;63555:53;;;;;-1:-1:-1;;;63555:53:0;;;;;;;;;;;;-1:-1:-1;;;63555:53:0;;;;;;;;;;;;;;;63619:19;63641:7;-1:-1:-1;;;;;63641:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;63641:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;63641:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;63641:21:0;;-1:-1:-1;63673:13:0;63689:22;:7;63701:9;63689:22;:11;:22;:::i;:::-;63721:54;;;-1:-1:-1;;;63721:54:0;;63739:10;63721:54;;;;;;;;;;-1:-1:-1;;;;;63721:54:0;;;;;;;;;63673:38;;-1:-1:-1;63721:17:0;;;;;;:54;;;;;;;;;;;;;;;-1:-1:-1;63721:17:0;:54;;;5:2:-1;;;;30:1;27;20:12;5:2;63721:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;63721:54:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;63815:27:0;;;;;;63721:54;63815:27;;;;;;;;;63786:26;;63829:12;63815:27;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;63815:27:0;;63786:56;;63852:24;63893:12;63879:27;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;63879:27:0;-1:-1:-1;63852:54:0;-1:-1:-1;63922:10:0;63917:153;63943:12;63938:2;:17;63917:153;;;63993:31;64012:7;64021:2;63993:18;:31::i;:::-;63977:9;63987:2;63977:13;;;;;;;;;;;;;:47;;;;;64052:7;64038;64046:2;64038:11;;;;;;;;;;;;;;;;;:21;63957:4;;63917:153;;;;64080:58;64091:8;64101:9;64112:7;64121:9;;;;;;;;;;;;64132:5;64080:10;:58::i;:::-;64154:7;-1:-1:-1;;;;;64154:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;64154:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;64154:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;64154:21:0;64149:91;;64191:9;-1:-1:-1;;;;;64191:31:0;;64223:5;64191:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;64191:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;64191:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;64149:91:0;64250:5;;:44;;;-1:-1:-1;;;64250:44:0;;-1:-1:-1;;;;;64250:44:0;;;;;;;;;;;;;;;;:5;;;;;:24;;:44;;;;;;;;;;;;;;:5;;:44;;;5:2:-1;;;;30:1;27;20:12;5:2;64250:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;64250:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;64305:23:0;;-1:-1:-1;64320:7:0;64305:14;:23::i;:::-;-1:-1:-1;64345:4:0;;63301:1055;-1:-1:-1;;;;;;;;;63301:1055:0:o;9610:91::-;9574:11;;;;9573:12;9565:21;;;;;;9676:11;:18;;-1:-1:-1;;9676:18:0;9690:4;9676:18;;;9610:91::o;10760:311::-;10849:26;10913:9;:16;10899:31;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;10899:31:0;-1:-1:-1;10887:43:0;-1:-1:-1;10945:10:0;10940:125;10966:9;:16;10961:2;:21;10940:125;;;11020:34;11031:7;11040:9;11050:2;11040:13;;;;;;;11020:34;11004:9;11014:2;11004:13;;;;;;;;;;;;;;;;;:50;10984:4;;10940:125;;;;10760:311;;;;:::o;73154:1714::-;73320:5;;:28;;;-1:-1:-1;;;73320:28:0;;-1:-1:-1;;;;;73320:28:0;;;;;;;;;73271:29;;73320:5;;;;;:19;;:28;;;;;;;;;;;;;;;:5;:28;;;5:2:-1;;;;30:1;27;20:12;5:2;73320:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;73320:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;73320:28:0;73312:37;;;;;;73364:7;-1:-1:-1;;;;;73364:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;73364:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;73364:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;73364:21:0;73359:71;;73401:7;-1:-1:-1;;;;;73401:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;73401:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;73401:18:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;73359:71:0;73454:16;;;73468:1;73454:16;;;;;;;;;;;;;17:15:-1;;105:10;73454:16:0;88:34:-1;136:17;;-1:-1;;73439:31:0;-1:-1:-1;73485:16:0;73480:1319;73518:7;-1:-1:-1;;;;;73518:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;73518:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;73518:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;73518:29:0;73507:40;;73480:1319;;;73575:23;73601:55;73624:7;73633:8;73643:12;73601:22;:55::i;:::-;73575:81;-1:-1:-1;73675:19:0;;73671:1118;;73714:17;73749:25;73792:21;73831:22;73871:16;73890:37;73909:7;73918:8;73890:18;:37::i;:::-;73871:56;;74009:52;74026:7;74035:8;74045:15;74009:16;:52::i;:::-;73945:116;;;;;;;;;;;;;;;;74180:64;74186:12;74200:8;74210:15;74227:9;;;;;;;;;;;;74238:5;74180;:64::i;:::-;74262:129;74288:7;74297:8;74307:12;74321:15;74338:17;74357:33;:13;74375:14;74357:33;:17;:33;:::i;:::-;74262:25;:129::i;:::-;74414:13;;74410:289;;74451:7;-1:-1:-1;;;;;74451:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;74451:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;74451:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;74451:21:0;-1:-1:-1;;;;;74451:30:0;;74490:4;74497:37;:17;74519:14;74497:37;:21;:37;:::i;:::-;74544:7;74451:102;;;;;;;;;;;;;-1:-1:-1;;;;;74451:102:0;-1:-1:-1;;;;;74451:102:0;;;;;;;;;;;-1:-1:-1;;;;;74451:102:0;-1:-1:-1;;;;;74451:102:0;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;74451:102:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;74451:102:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;74575:105:0;;-1:-1:-1;74594:7:0;74603:12;74617:17;74636:13;74651:14;74667:12;74575:18;:105::i;:::-;74741:33;:13;74759:14;74741:33;:17;:33;:::i;:::-;74716:12;74729:8;74716:22;;;;;;;;;;;;;:58;;;;;73671:1118;;;;;;-1:-1:-1;73549:10:0;;73480:1319;;;;74809:23;74824:7;74809:14;:23::i;24644:534::-;-1:-1:-1;;;;;24856:16:0;;24848:69;;;;-1:-1:-1;;;24848:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24948:18:0;;24956:10;24948:18;;:64;;;24970:34;24987:4;24993:10;24970:16;:34::i;:::-;:42;;25008:4;24970:42;24948:64;24927:166;;;;-1:-1:-1;;;24927:166:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25104:67;25126:4;25132:2;25136;25140:5;25147:4;25153:17;25104:21;:67::i;13212:171::-;-1:-1:-1;;13212:171:0;:::o;12469:167::-;12527:7;12555:1;12550;:6;12546:84;;-1:-1:-1;12579:1:0;12572:8;;12546:84;-1:-1:-1;12618:1:0;12611:8;;27339:744;27581:9;27576:303;27600:3;:10;27596:1;:14;27576:303;;;27631:10;27644:3;27648:1;27644:6;;;;;;;;;;;;;;27631:19;;27664:13;27680:6;27687:1;27680:9;;;;;;;;;;;;;;;;;;;27726:13;;;;:9;:13;;;;;;-1:-1:-1;;;;;27726:19:0;;;;;;;;;;;;27680:9;;-1:-1:-1;27726:30:0;;27680:9;27726:30;:23;:30;:::i;:::-;27704:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;27704:19:0;;;;;;;;;;:52;;;;27790:17;;;;;;:28;;27812:5;27790:21;:28::i;:::-;27770:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;27770:17:0;;;;;;;;;:48;27832:36;27780:2;27852:4;27784:2;27862:5;27832:15;:36::i;:::-;-1:-1:-1;;27612:3:0;;27576:303;;;;27926:2;-1:-1:-1;;;;;27894:48:0;27920:4;-1:-1:-1;;;;;27894:48:0;27908:10;-1:-1:-1;;;;;27894:48:0;;27930:3;27935:6;27894:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;27894:48: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;27894:48:0;;;;;;;;;;;;;;;;;;;27957:17;27953:124;;;27990:76;28026:10;28038:4;28044:2;28048:3;28053:6;28061:4;27990:35;:76::i;80235:288::-;80323:22;80347:16;80367:31;80389:8;80367:21;:31::i;:::-;80408:5;;80322:76;;-1:-1:-1;80322:76:0;-1:-1:-1;;;;;;80408:5:0;:34;80443:7;80322:76;;80487:28;80443:7;80506:8;80487:9;:28::i;:::-;80408:108;;;;;;;;;;;;;-1:-1:-1;;;;;80408:108:0;-1:-1:-1;;;;;80408:108:0;;;;;;-1:-1:-1;;;;;80408:108:0;-1:-1:-1;;;;;80408:108:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;80408:108:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;80408:108:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;;80235:288:0:o;32534:555::-;32778:11;:2;-1:-1:-1;;;;;32778:9:0;;:11::i;:::-;32774:309;;;32830:78;;-1:-1:-1;;;32830:78:0;;;-1:-1:-1;;;;;32830:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32932:52;;:43;;;;;;32874:8;;32884:4;;32890:3;;32895:6;;32903:4;;32830:78;;;;;;;;;;;;;;;;;;;;;;;;-1:-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;32830:78: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;32830:78: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;32830:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32830:78:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32830:78:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32830:78:0;-1:-1:-1;;;;;;32830:154:0;;32805:267;;;;-1:-1:-1;;;32805:267:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32015:513;32234:11;:2;-1:-1:-1;;;;;32234:9:0;;:11::i;:::-;32230:292;;;32286:71;;-1:-1:-1;;;32286:71:0;;;-1:-1:-1;;;;;32286:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32381:47;;:38;;;;;;32325:8;;32335:4;;32341:2;;32345:5;;32352:4;;32286:71;;;;;;;;;;;;;;-1:-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;32286:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32286:71:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32286:71:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32286:71:0;-1:-1:-1;;;;;;32286:142:0;;32261:250;;;;-1:-1:-1;;;32261:250:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79816:413;79923:22;79947:16;79967:31;79989:8;79967:21;:31::i;:::-;80008:5;;79922:76;;-1:-1:-1;79922:76:0;-1:-1:-1;;;;;;80008:5:0;:34;80043:5;79922:76;;80085:26;80043:5;80102:8;80085:9;:26::i;:::-;80008:104;;;;;;;;;;;;;-1:-1:-1;;;;;80008:104:0;-1:-1:-1;;;;;80008:104:0;;;;;;-1:-1:-1;;;;;80008:104:0;-1:-1:-1;;;;;80008:104:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;80008:104:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;80008:104:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;80122:5:0;;-1:-1:-1;;;;;80122:5:0;:34;80157:3;80170:14;80187:8;80197:24;80157:3;80212:8;80197:9;:24::i;:::-;80122:100;;;;;;;;;;;;;-1:-1:-1;;;;;80122:100:0;-1:-1:-1;;;;;80122:100:0;;;;;;-1:-1:-1;;;;;80122:100:0;-1:-1:-1;;;;;80122:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;80122:100:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;80122:100:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;31186:823:0;-1:-1:-1;;;;;31340:21:0;;31332:93;;;;-1:-1:-1;;;31332:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31457:6;:13;31443:3;:10;:27;31435:92;;;;-1:-1:-1;;;31435:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31543:6;31538:245;31559:3;:10;31555:1;:14;31538:245;;;31619:41;31650:6;31657:1;31650:9;;;;;;;;;;;;;;31619;:17;31629:3;31633:1;31629:6;;;;;;;;;;;;;;31619:17;;;;;;;;;;;:26;31637:7;-1:-1:-1;;;;;31619:26:0;-1:-1:-1;;;;;31619:26:0;;;;;;;;;;;;;:30;;:41;;;;:::i;:::-;31590:9;:17;31600:3;31604:1;31600:6;;;;;;;;;;;;;;31590:17;;;;;;;;;;;:26;31608:7;-1:-1:-1;;;;;31590:26:0;-1:-1:-1;;;;;31590:26:0;;;;;;;;;;;;:70;;;;31693:31;31714:6;31721:1;31714:9;;;;;;;;;;;;;;31693:8;:16;31702:3;31706:1;31702:6;;;;;;;;;;;;;;31693:16;;;;;;;;;;;;:20;;:31;;;;:::i;:::-;31674:8;:16;31683:3;31687:1;31683:6;;;;;;;;;;;;;;31674:16;;;;;;;;;;;:50;;;;31738:34;31745:3;31749:1;31745:6;;;;;;;31738:34;31571:3;;31538:245;;;;31841:1;-1:-1:-1;;;;;31798:59:0;31824:7;-1:-1:-1;;;;;31798:59:0;31812:10;-1:-1:-1;;;;;31798:59:0;;31845:3;31850:6;31798:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;31798:59: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;31798:59:0;;;;;;;;;;;;;;;;;;;31872:17;31868:135;;;31905:87;31941:10;31953:7;31970:1;31974:3;31979:6;31987:4;31905:35;:87::i;30338:576::-;-1:-1:-1;;;;;30467:21:0;;30459:84;;;;-1:-1:-1;;;30459:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30579:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;30579:22:0;;;;;;;;;;:33;;30606:5;30579:33;:26;:33;:::i;:::-;30554:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;30554:22:0;;;;;;;;;:58;;;;30637:12;;;:8;:12;;;;:23;;30654:5;30637:23;:16;:23;:::i;:::-;30622:12;;;;:8;:12;;;;;:38;30670:26;30631:2;30681:7;30690:5;30670:6;:26::i;:::-;30711:58;;;;;;;;;;;;;;30755:1;;-1:-1:-1;;;;;30711:58:0;;;30726:10;;30711:58;;;;;;;;;;;30784:17;30780:128;;;30817:80;30848:10;30860:7;30877:1;30881:2;30885:5;30892:4;30817:30;:80::i;75469:301::-;75635:5;;;;;;;;;-1:-1:-1;;;;;75635:5:0;-1:-1:-1;;;;;75635:31:0;;75667:7;-1:-1:-1;;;;;75667:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;75667:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;75667:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;75667:21:0;75635:128;;;-1:-1:-1;;;;;;75635:128:0;;;;;;;-1:-1:-1;;;;;75635:128:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75667:21;;75635:128;;;;;;;-1:-1:-1;75635:128:0;;;;5:2:-1;;;;30:1;27;20:12;74874:589:0;75059:21;;75055:107;;75104:4;;:46;;;-1:-1:-1;;;75104:46:0;;-1:-1:-1;;;;;75104:46:0;;;;;;;;;;;;;;;:4;;;;;:13;;:46;;;;;;;;;;;;;;:4;;:46;;;5:2:-1;;;;30:1;27;20:12;5:2;75104:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;75104:46:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;75104:46:0;75096:55;;;;;;75175:17;;75171:122;;75208:74;;;-1:-1:-1;;;75208:74:0;;;;;;;;-1:-1:-1;;;;;75208:74:0;;;;;;;;;;;;;;;:31;;;;;;:74;;;;;;;;;;;;;;;-1:-1:-1;75208:31:0;:74;;;5:2:-1;;;;30:1;27;20:12;5:2;75208:74:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;75208:74:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;75171:122:0;75306:18;;75302:155;;75348:4;;;;;;;;;-1:-1:-1;;;;;75348:4:0;-1:-1:-1;;;;;75348:13:0;;75370:7;-1:-1:-1;;;;;75370:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;75370:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;75370:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;75370:21:0;:57;;;-1:-1:-1;;;75370:57:0;;75421:5;75370:57;;;;;;;;-1:-1:-1;;;;;75370:50:0;;;;;;:57;;;;;:21;;:57;;;;;;;;;;;:50;:57;;;5:2:-1;;;;30:1;27;20:12;5:2;75370:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;75370:57:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;75370:57:0;75348:97;;;-1:-1:-1;;;;;;75348:97:0;;;;;;;-1:-1:-1;;;;;75348:97:0;;;;;;;;;;;;;;;;;;;75370:57;;75348:97;;;;;;;-1:-1:-1;75348:97:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;75348:97:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;75348:97:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;75348:97:0;75340:106;;;;;7195:168;7309:21;7348:8;;;7195:168::o

Swarm Source

bzzr://f1517c694c136a0789cb69bbf7224352f1f03735c41ddd65775f375b875759f4
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ 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.