ETH Price: $2,604.56 (-0.24%)

Contract

0x9e4799ff2023819b1272eee430eadf510eDF85f0
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Approval For...207569542024-09-15 15:36:3532 days ago1726414595IN
0x9e4799ff...10eDF85f0
0 ETH0.000084231.83037101
Set Approval For...205426092024-08-16 17:13:1162 days ago1723828391IN
0x9e4799ff...10eDF85f0
0 ETH0.000113172.45940472
Set Approval For...196451942024-04-13 7:33:47187 days ago1712993627IN
0x9e4799ff...10eDF85f0
0 ETH0.0002708811.23722848
Set Approval For...191165232024-01-30 3:04:59261 days ago1706583899IN
0x9e4799ff...10eDF85f0
0 ETH0.0003121912.95094801
Set Approval For...189699842024-01-09 14:24:47282 days ago1704810287IN
0x9e4799ff...10eDF85f0
0 ETH0.0005039919.30580307
Set Approval For...189699812024-01-09 14:24:11282 days ago1704810251IN
0x9e4799ff...10eDF85f0
0 ETH0.0004693819.47159552
Set Approval For...183973872023-10-21 8:06:59362 days ago1697875619IN
0x9e4799ff...10eDF85f0
0 ETH0.000343827.47161585
Set Approval For...179024032023-08-13 0:37:23431 days ago1691887043IN
0x9e4799ff...10eDF85f0
0 ETH0.000586112.73644753
Set Approval For...179022932023-08-13 0:15:23431 days ago1691885723IN
0x9e4799ff...10eDF85f0
0 ETH0.0006255913.59464722
Set Approval For...179022772023-08-13 0:12:11431 days ago1691885531IN
0x9e4799ff...10eDF85f0
0 ETH0.0005743612.48126944
Public Sell Comp...179019762023-08-12 23:11:47432 days ago1691881907IN
0x9e4799ff...10eDF85f0
0 ETH0.0003585611.79416867
Set Approval For...176309952023-07-05 23:37:11469 days ago1688600231IN
0x9e4799ff...10eDF85f0
0 ETH0.0021916647.62625986
Set Approval For...170112652023-04-09 14:15:11557 days ago1681049711IN
0x9e4799ff...10eDF85f0
0 ETH0.000493720.48050092
Set Approval For...168955212023-03-24 6:16:35573 days ago1679638595IN
0x9e4799ff...10eDF85f0
0 ETH0.0003511114.56554213
Set Approval For...168441342023-03-17 1:01:11580 days ago1679014871IN
0x9e4799ff...10eDF85f0
0 ETH0.0004373118.14148842
Set Approval For...168370382023-03-16 1:06:11581 days ago1678928771IN
0x9e4799ff...10eDF85f0
0 ETH0.0005469422.68931756
Set Approval For...166135082023-02-12 15:14:35613 days ago1676214875IN
0x9e4799ff...10eDF85f0
0 ETH0.0005654121.65857332
Set Approval For...166135032023-02-12 15:13:35613 days ago1676214815IN
0x9e4799ff...10eDF85f0
0 ETH0.0004722219.58968854
Set Approval For...165007112023-01-27 21:03:47629 days ago1674853427IN
0x9e4799ff...10eDF85f0
0 ETH0.0004954520.5530985
Set Approval For...162867152022-12-29 0:03:47658 days ago1672272227IN
0x9e4799ff...10eDF85f0
0 ETH0.0003956816.41442918
Set Approval For...162595832022-12-25 5:09:59662 days ago1671944999IN
0x9e4799ff...10eDF85f0
0 ETH0.000423149.19520995
Set Approval For...162547622022-12-24 13:02:23663 days ago1671886943IN
0x9e4799ff...10eDF85f0
0 ETH0.0003055212.67443708
Set Approval For...161955512022-12-16 6:45:23671 days ago1671173123IN
0x9e4799ff...10eDF85f0
0 ETH0.0003341213.86082391
Set Approval For...161058602022-12-03 17:45:11684 days ago1670089511IN
0x9e4799ff...10eDF85f0
0 ETH0.0002916712.09953531
Set Approval For...160576872022-11-27 0:18:23690 days ago1669508303IN
0x9e4799ff...10eDF85f0
0 ETH0.0005016510.90120033
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
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

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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