ETH Price: $2,451.99 (-1.12%)

Token

Draggable Aktionariat AG Shares (DAKS)
 

Overview

Max Total Supply

800,000 DAKS

Holders

408 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 0 Decimals)

Balance
3,820 DAKS

Value
$0.00
0xfa5921c6b7440e5c84d8c203c9cb564e29b5ee6a
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Aktionariat offers technical services to create, manage and trade security tokens in accordance with Swiss law.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
DraggableShares

Compiler Version
v0.8.1+commit.df193b15

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 1 of 6: DraggableShares.sol
/**
* SPDX-License-Identifier: LicenseRef-Aktionariat
*
* MIT License with Automated License Fee Payments
*
* Copyright (c) 2020 Aktionariat AG (aktionariat.com)
*
* Permission is hereby granted to any person obtaining a copy of this software
* and associated documentation files (the "Software"), to deal in the Software
* without restriction, including without limitation the rights to use, copy,
* modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* - The above copyright notice and this permission notice shall be included in
*   all copies or substantial portions of the Software.
* - All automated license fee payments integrated into this and related Software
*   are preserved.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
pragma solidity >=0.8;

import "./ERC20Recoverable.sol";
import "./ERC20Draggable.sol";

/**
 * @title Draggable CompanyName AG Shares
 * @author Luzius Meisser, [email protected]
 *
 * This is an ERC-20 token representing shares of CompanyName AG that are bound to
 * a shareholder agreement that can be found at the URL defined in the constant 'terms'.
 * The shareholder agreement is partially enforced through this smart contract. The agreement
 * is designed to facilitate a complete acquisition of the firm even if a minority of shareholders
 * disagree with the acquisition, to protect the interest of the minority shareholders by requiring
 * the acquirer to offer the same conditions to everyone when acquiring the company, and to
 * facilitate an update of the shareholder agreement even if a minority of the shareholders that
 * are bound to this agreement disagree. The name "draggable" stems from the convention of calling
 * the right to drag a minority along with a sale of the company "drag-along" rights. The name is
 * chosen to ensure that token holders are aware that they are bound to such an agreement.
 *
 * The percentage of token holders that must agree with an update of the terms is defined by the
 * constant UPDATE_QUORUM. The percentage of yes-votes that is needed to successfully complete an
 * acquisition is defined in the constant ACQUISITION_QUORUM. Note that the update quorum is based
 * on the total number of tokens in circulation. In contrast, the acquisition quorum is based on the
 * number of votes cast during the voting period, not taking into account those who did not bother
 * to vote.
 */

contract DraggableShares is ERC20Recoverable, ERC20Draggable {

    string public terms;

    /**
     * Designed to be used with the Crypto Franc as currency token. See also parent constructor.
     */
    constructor(string memory _terms, address offerFactory, address wrappedToken, uint256 quorum, uint256 votePeriod)
        ERC20Draggable(offerFactory, wrappedToken, quorum, votePeriod) {
        IRecoverable(wrappedToken).setRecoverable(false);
        terms = _terms; // to update the terms, migrate to a new contract. That way it is ensured that the terms can only be updated when the quorom agrees.
    }

    function transfer(address to, uint256 value) override(ERC20Recoverable, ERC20) public returns (bool) {
        return super.transfer(to, value);
    }

    function getClaimDeleter() public view override returns (address) {
        return IRecoverable(address(wrapped)).getClaimDeleter();
    }

    function getCollateralRate(address collateralType) public view override returns (uint256) {
        uint256 rate = super.getCollateralRate(collateralType);
        if (rate > 0) {
            return rate;
        } else if (collateralType == address(wrapped)) {
            return unwrapConversionFactor;
        } else {
            // If the wrapped contract allows for a specific collateral, we should too.
            // If the wrapped contract is not IRecoverable, we will fail here, but would fail anyway.
            return IRecoverable(address(wrapped)).getCollateralRate(collateralType) * unwrapConversionFactor;
        }
    }

}

abstract contract IRecoverable {
    function setRecoverable(bool) public virtual;
    function getCollateralRate(address) public virtual view returns (uint256);
    function getClaimDeleter() public virtual view returns (address);
}

File 2 of 6: ERC20.sol
// SPDX-License-Identifier: MIT
// Copied and adjusted from OpenZeppelin
// Adjustments:
// - modifications to support ERC-677
// - removed require messages to save space
// - removed unnecessary require statements
// - removed GSN Context
// - upgraded to 0.8 to drop SafeMath
// - let name() and symbol() be implemented by subclass

pragma solidity >=0.8;

import "./IERC20.sol";
import "./IERC677Receiver.sol";

/**
 * @dev Implementation of the `IERC20` interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using `_mint`.
 * For a generic mechanism see `ERC20Mintable`.
 *
 * *For a detailed writeup see our guide [How to implement supply
 * mechanisms](https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226).*
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an `Approval` event is emitted on calls to `transferFrom`.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard `decreaseAllowance` and `increaseAllowance`
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See `IERC20.approve`.
 */

abstract contract ERC20 is IERC20 {

    mapping (address => uint256) private _balances;

    mapping (address => mapping (address => uint256)) private _allowances;

    uint256 private _totalSupply;

    uint8 public override decimals;

    constructor(uint8 _decimals) {
        decimals = _decimals;
    }

    /**
     * @dev See `IERC20.totalSupply`.
     */
    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See `IERC20.balanceOf`.
     */
    function balanceOf(address account) public view override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See `IERC20.transfer`.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(msg.sender, recipient, amount);
        return true;
    }

    /**
     * @dev See `IERC20.allowance`.
     */
    function allowance(address owner, address spender) public view override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See `IERC20.approve`.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 value) public override returns (bool) {
        _approve(msg.sender, spender, value);
        return true;
    }

    /**
     * @dev See `IERC20.transferFrom`.
     *
     * Emits an `Approval` event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of `ERC20`;
     *
     * Requirements:
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `value`.
     * - the caller must have allowance for `sender`'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, msg.sender, _allowances[sender][msg.sender] - amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to `approve` that can be used as a mitigation for
     * problems described in `IERC20.approve`.
     *
     * Emits an `Approval` event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender] + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to `approve` that can be used as a mitigation for
     * problems described in `IERC20.approve`.
     *
     * Emits an `Approval` event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender] - subtractedValue);
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to `transfer`, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a `Transfer` event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(recipient != address(0));

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] -= amount;
        _balances[recipient] += amount;
        emit Transfer(sender, recipient, amount);
    }

    // ERC-677 functionality, can be useful for swapping and wrapping tokens
    function transferAndCall(address recipient, uint amount, bytes calldata data) public returns (bool) {
        bool success = transfer(recipient, amount);
        if (success){
            IERC677Receiver(recipient).onTokenTransfer(msg.sender, amount, data);
        }
        return success;
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a `Transfer` event with `from` set to the zero address.
     *
     * Requirements
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address recipient, uint256 amount) internal virtual {
        require(recipient != address(0));

        _beforeTokenTransfer(address(0), recipient, amount);

        _totalSupply += amount;
        _balances[recipient] += amount;
        emit Transfer(address(0), recipient, amount);
    }

     /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a `Transfer` event with `to` set to the zero address.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        _beforeTokenTransfer(account, address(0), amount);

        _totalSupply -= amount;
        _balances[account] -= amount;
        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens.
     *
     * This is internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an `Approval` event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 value) internal {
        _allowances[owner][spender] = value;
        emit Approval(owner, spender, value);
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be to transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) virtual internal;
}

File 3 of 6: ERC20Draggable.sol
/**
* SPDX-License-Identifier: LicenseRef-Aktionariat
*
* MIT License with Automated License Fee Payments
*
* Copyright (c) 2020 Aktionariat AG (aktionariat.com)
*
* Permission is hereby granted to any person obtaining a copy of this software
* and associated documentation files (the "Software"), to deal in the Software
* without restriction, including without limitation the rights to use, copy,
* modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* - The above copyright notice and this permission notice shall be included in
*   all copies or substantial portions of the Software.
* - All automated license fee payments integrated into this and related Software
*   are preserved.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
pragma solidity >=0.8;

/**
 * @title CompanyName Shareholder Agreement
 * @author Luzius Meisser, [email protected]
 * @dev These tokens are based on the ERC20 standard and the open-zeppelin library.
 *
 * This is an ERC-20 token representing shares of CompanyName AG that are bound to
 * a shareholder agreement that can be found at the URL defined in the constant 'terms'
 * of the 'DraggableCompanyNameShares' contract. The agreement is partially enforced
 * through the Swiss legal system, and partially enforced through this smart contract.
 * In particular, this smart contract implements a drag-along clause which allows the
 * majority of token holders to force the minority sell their shares along with them in
 * case of an acquisition. That's why the tokens are called "Draggable CompanyName AG Shares."
 */

import "./ERC20.sol";
import "./IERC20.sol";
import "./IERC677Receiver.sol";

contract ERC20Draggable is ERC20, IERC677Receiver {

    IERC20 public wrapped;                              // The wrapped contract
    IOfferFactory public factory;

    // If the wrapped tokens got replaced in an acquisition, unwrapping might yield many currency tokens
    uint256 public unwrapConversionFactor = 0;

    // The current acquisition attempt, if any. See initiateAcquisition to see the requirements to make a public offer.
    IOffer public offer;

    uint256 public quorum;
    uint256 public votePeriod;

    event MigrationSucceeded(address newContractAddress);

    constructor(
        address offerFactory,
        address wrappedToken,
        uint256 quorum_,
        uint256 votePeriod_
    ) ERC20(0) {
        factory = IOfferFactory(offerFactory);
        wrapped = IERC20(wrappedToken);
        quorum = quorum_;
        votePeriod = votePeriod_;
    }

    function name() public override view returns (string memory){
        if (isBinding()){
            return string(abi.encodePacked("Draggable ", wrapped.name()));
        } else {
            return string(abi.encodePacked("Wrapped ", wrapped.name()));
        }
    }

    function symbol() public override view returns (string memory){
        if (isBinding()){
            return string(abi.encodePacked("D", wrapped.symbol()));
        } else {
            return string(abi.encodePacked("W", wrapped.symbol()));
        }
    }

    function onTokenTransfer(address from, uint256 amount, bytes calldata) override public {
        require(msg.sender == address(wrapped));
        _mint(from, amount);
    }

    /** Increases the number of drag-along tokens. Requires minter to deposit an equal amount of share tokens */
    function wrap(address shareholder, uint256 amount) public {
        require(wrapped.transferFrom(msg.sender, address(this), amount));
        _mint(shareholder, amount);
    }

    /**
     * Indicates that the token holders are bound to the token terms and that:
     * - Conversions back to the wrapped token (unwrap) are not allowed
     * - The drag-along can be performed by making an according offer
     * - They can be migrated to a new version of this contract in accordance with the terms
     */
    function isBinding() public view returns (bool) {
        return unwrapConversionFactor == 0;
    }

    /**
     * Deactivates the drag-along mechanism and enables the unwrap function.
     */
    function deactivate(uint256 factor) internal {
        require(factor >= 1);
        unwrapConversionFactor = factor;
    }

    /** Decrease the number of drag-along tokens. The user gets back their shares in return */
    function unwrap(uint256 amount) public {
        require(!isBinding());
        unwrap(msg.sender, amount, unwrapConversionFactor);
    }
    
    function unwrap(address owner, uint256 amount, uint256 factor) internal {
        _burn(owner, amount);
        require(wrapped.transfer(owner, amount * factor));
    }

    /**
     * Burns both the token itself as well as the wrapped token!
     * If you want to get out of the shareholder agreement, use unwrap after it has been
     * deactivated by a majority vote or acquisition.
     *
     * Burning only works if wrapped token supports burning. Also, the exact meaning of this
     * operation might depend on the circumstances. Burning and reussing the wrapped token
     * does not free the sender from the legal obligations of the shareholder agreement.
     */
    function burn(uint256 amount) public {
        _burn(msg.sender, amount);
        uint256 factor = isBinding() ? 1 : unwrapConversionFactor;
        IBurnable(address(wrapped)).burn(amount * factor);
    }

    function makeAcquisitionOffer(bytes32 salt, uint256 pricePerShare, address currency) public payable {
        require(isBinding());
        address newOffer = factory.create{value: msg.value}(salt, msg.sender, pricePerShare, currency, quorum, votePeriod);
        if (offerExists()) {
            require(IOffer(newOffer).isWellFunded());
            offer.contest(newOffer);
        }
        offer = IOffer(newOffer);
    }

    function drag(address buyer, address currency) public {
        require(msg.sender == address(offer));
        unwrap(buyer, balanceOf(buyer), 1);
        replaceWrapped(currency, buyer);
    }

    function notifyOfferEnded() public {
        if (msg.sender == address(offer)){
            offer = IOffer(address(0));
        }
    }

    function replaceWrapped(address newWrapped, address oldWrappedDestination) internal {
        require(isBinding());
        // Free all old wrapped tokens we have
        require(wrapped.transfer(oldWrappedDestination, wrapped.balanceOf(address(this))));
        // Count the new wrapped tokens
        wrapped = IERC20(newWrapped);
        deactivate(wrapped.balanceOf(address(this)) / totalSupply());
    }

    function migrate() public {
        address successor = msg.sender;
        require(!offerExists()); // if you have 80%, you can easily cancel the offer first if necessary
        require(balanceOf(successor) * 10000 >= totalSupply() * 8000, "Quorum not reached");
        replaceWrapped(successor, successor);
        emit MigrationSucceeded(successor);
    }

    function _beforeTokenTransfer(address from, address to, uint256 amount) override internal {
        if (offerExists()) {
            offer.notifyMoved(from, to, amount);
        }
    }

    function offerExists() internal view returns (bool) {
        return address(offer) != address(0);
    }

}

abstract contract IBurnable {
    function burn(uint256) virtual public;
}

abstract contract IOffer {
    function isWellFunded() virtual public returns (bool);
    function contest(address newOffer) virtual public;
    function notifyMoved(address from, address to, uint256 value) virtual public;
}

abstract contract IOfferFactory {
    function create(bytes32 salt, address buyer, uint256 pricePerShare, address currency, uint256 quorum, uint256 votePeriod) virtual public payable returns (address);
}

File 4 of 6: ERC20Recoverable.sol
/**
* SPDX-License-Identifier: LicenseRef-Aktionariat
*
* MIT License with Automated License Fee Payments
*
* Copyright (c) 2020 Aktionariat AG (aktionariat.com)
*
* Permission is hereby granted to any person obtaining a copy of this software
* and associated documentation files (the "Software"), to deal in the Software
* without restriction, including without limitation the rights to use, copy,
* modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* - The above copyright notice and this permission notice shall be included in
*   all copies or substantial portions of the Software.
* - All automated license fee payments integrated into this and related Software
*   are preserved.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
pragma solidity >=0.8;

import "./ERC20.sol";
import "./IERC20.sol";

/**
 * @title Recoverable
 * In case of tokens that represent real-world assets such as shares of a company, one needs a way
 * to handle lost private keys. With physical certificates, courts can declare share certificates as
 * invalid so the company can issue replacements. Here, we want a solution that does not depend on
 * third parties to resolve such cases. Instead, when someone has lost a private key, he can use the
 * declareLost function to post a deposit and claim that the shares assigned to a specific address are
 * lost. To prevent front running, a commit reveal scheme is used. If he actually is the owner of the shares,
 * he needs to wait for a certain period and can then reclaim the lost shares as well as the deposit.
 * If he is an attacker trying to claim shares belonging to someone else, he risks losing the deposit
 * as it can be claimed at anytime by the rightful owner.
 * Furthermore, if "getClaimDeleter" is defined in the subclass, the returned address is allowed to
 * delete claims, returning the collateral. This can help to prevent obvious cases of abuse of the claim
 * function.
 */

abstract contract ERC20Recoverable is ERC20 {

    // A struct that represents a claim made
    struct Claim {
        address claimant; // the person who created the claim
        uint256 collateral; // the amount of collateral deposited
        uint256 timestamp;  // the timestamp of the block in which the claim was made
        address currencyUsed; // The currency (XCHF) can be updated, we record the currency used for every request
    }

    uint256 public claimPeriod = 180 days; // Default of 180 days;

    mapping(address => Claim) public claims; // there can be at most one claim per address, here address is claimed address
    mapping(address => bool) public recoveryDisabled; // disable claimability (e.g. for long term storage)

    // ERC-20 token that can be used as collateral or 0x0 if disabled
    address public customCollateralAddress;
    uint256 public customCollateralRate;

    /**
     * Returns the collateral rate for the given collateral type and 0 if that type
     * of collateral is not accepted. By default, only the token itself is accepted at
     * a rate of 1:1.
     *
     * Subclasses should override this method if they want to add additional types of
     * collateral.
     */
    function getCollateralRate(address collateralType) public virtual view returns (uint256) {
        if (collateralType == address(this)) {
            return 1;
        } else if (collateralType == customCollateralAddress) {
            return customCollateralRate;
        } else {
            return 0;
        }
    }

    /**
     * Allows subclasses to set a custom collateral besides the token itself.
     * The collateral must be an ERC-20 token that returns true on successful transfers and
     * throws an exception or returns false on failure.
     * Also, do not forget to multiply the rate in accordance with the number of decimals of the collateral.
     * For example, rate should be 7*10**18 for 7 units of a collateral with 18 decimals.
     */
    function _setCustomClaimCollateral(address collateral, uint256 rate) internal {
        customCollateralAddress = collateral;
        if (customCollateralAddress == address(0)) {
            customCollateralRate = 0; // disabled
        } else {
            require(rate > 0, "Collateral rate can't be zero");
            customCollateralRate = rate;
        }
        emit CustomClaimCollateralChanged(collateral, rate);
    }

    function getClaimDeleter() virtual public view returns (address);

    /**
     * Allows subclasses to change the claim period, but not to fewer than 90 days.
     */
    function _setClaimPeriod(uint256 claimPeriodInDays) internal {
        require(claimPeriodInDays > 90, "Claim period must be at least 90 days"); // must be at least 90 days
        uint256 claimPeriodInSeconds = claimPeriodInDays * (1 days);
        claimPeriod = claimPeriodInSeconds;
        emit ClaimPeriodChanged(claimPeriod);
    }

    function setRecoverable(bool enabled) public {
        recoveryDisabled[msg.sender] = !enabled;
    }

    /**
     * Some users might want to disable claims for their address completely.
     * For example if they use a deep cold storage solution or paper wallet.
     */
    function isRecoveryEnabled(address target) public view returns (bool) {
        return !recoveryDisabled[target];
    }

    event ClaimMade(address indexed lostAddress, address indexed claimant, uint256 balance);
    event ClaimCleared(address indexed lostAddress, uint256 collateral);
    event ClaimDeleted(address indexed lostAddress, address indexed claimant, uint256 collateral);
    event ClaimResolved(address indexed lostAddress, address indexed claimant, uint256 collateral);
    event ClaimPeriodChanged(uint256 newClaimPeriodInDays);
    event CustomClaimCollateralChanged(address newCustomCollateralAddress, uint256 newCustomCollareralRate);

  /** Anyone can declare that the private key to a certain address was lost by calling declareLost
    * providing a deposit/collateral. There are three possibilities of what can happen with the claim:
    * 1) The claim period expires and the claimant can get the deposit and the shares back by calling recover
    * 2) The "lost" private key is used at any time to call clearClaim. In that case, the claim is deleted and
    *    the deposit sent to the shareholder (the owner of the private key). It is recommended to call recover
    *    whenever someone transfers funds to let claims be resolved automatically when the "lost" private key is
    *    used again.
    * 3) The owner deletes the claim and assigns the deposit to the claimant. This is intended to be used to resolve
    *    disputes. Generally, using this function implies that you have to trust the issuer of the tokens to handle
    *    the situation well. As a rule of thumb, the contract owner should assume the owner of the lost address to be the
    *    rightful owner of the deposit.
    * It is highly recommended that the owner observes the claims made and informs the owners of the claimed addresses
    * whenever a claim is made for their address (this of course is only possible if they are known to the owner, e.g.
    * through a shareholder register).
    */
    function declareLost(address collateralType, address lostAddress) public {
        require(isRecoveryEnabled(lostAddress), "Claims disabled for this address");
        uint256 collateralRate = getCollateralRate(collateralType);
        require(collateralRate > 0, "Unsupported collateral");
        address claimant = msg.sender;
        uint256 balance = balanceOf(lostAddress);
        uint256 collateral = balance * collateralRate;
        IERC20 currency = IERC20(collateralType);
        require(balance > 0, "Claimed address holds no shares");
        require(claims[lostAddress].collateral == 0, "Address already claimed");
        require(currency.transferFrom(claimant, address(this), collateral), "Collateral transfer failed");

        claims[lostAddress] = Claim({
            claimant: claimant,
            collateral: collateral,
            timestamp: block.timestamp,
            currencyUsed: collateralType
        });

        emit ClaimMade(lostAddress, claimant, balance);
    }

    function getClaimant(address lostAddress) public view returns (address) {
        return claims[lostAddress].claimant;
    }

    function getCollateral(address lostAddress) public view returns (uint256) {
        return claims[lostAddress].collateral;
    }

    function getCollateralType(address lostAddress) public view returns (address) {
        return claims[lostAddress].currencyUsed;
    }

    function getTimeStamp(address lostAddress) public view returns (uint256) {
        return claims[lostAddress].timestamp;
    }

    function transfer(address recipient, uint256 amount) override virtual public returns (bool) {
        require(super.transfer(recipient, amount), "Transfer failed");
        clearClaim();
        return true;
    }

    /**
     * Clears a claim after the key has been found again and assigns the collateral to the "lost" address.
     * This is the price an adverse claimer pays for filing a false claim and makes it risky to do so.
     */
    function clearClaim() public {
        if (claims[msg.sender].collateral != 0) {
            uint256 collateral = claims[msg.sender].collateral;
            IERC20 currency = IERC20(claims[msg.sender].currencyUsed);
            delete claims[msg.sender];
            require(currency.transfer(msg.sender, collateral), "Collateral transfer failed");
            emit ClaimCleared(msg.sender, collateral);
        }
    }

   /**
    * After the claim period has passed, the claimant can call this function to send the
    * tokens on the lost address as well as the collateral to himself.
    */
    function recover(address lostAddress) public {
        Claim memory claim = claims[lostAddress];
        uint256 collateral = claim.collateral;
        IERC20 currency = IERC20(claim.currencyUsed);
        require(collateral != 0, "No claim found");
        require(claim.claimant == msg.sender, "Only claimant can resolve claim");
        require(claim.timestamp + claimPeriod <= block.timestamp, "Claim period not over yet");
        address claimant = claim.claimant;
        delete claims[lostAddress];
        require(currency.transfer(claimant, collateral), "Collateral transfer failed");
        _transfer(lostAddress, claimant, balanceOf(lostAddress));
        emit ClaimResolved(lostAddress, claimant, collateral);
    }

    /**
     * This function is to be executed by the claim deleter only in case a dispute needs to be resolved manually.
     */
    function deleteClaim(address lostAddress) public {
        require(msg.sender == getClaimDeleter(), "You cannot delete claims");
        Claim memory claim = claims[lostAddress];
        IERC20 currency = IERC20(claim.currencyUsed);
        require(claim.collateral != 0, "No claim found");
        delete claims[lostAddress];
        require(currency.transfer(claim.claimant, claim.collateral), "Collateral transfer failed");
        emit ClaimDeleted(lostAddress, claim.claimant, claim.collateral);
    }

}

File 5 of 6: IERC20.sol
/**
* SPDX-License-Identifier: MIT
*
* Copyright (c) 2016-2019 zOS Global Limited
*
*/
pragma solidity >=0.8;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP. Does not include
 * the optional functions; to access them see `ERC20Detailed`.
 */

interface IERC20 {

    // Optional functions
    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function decimals() external view returns (uint8);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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

File 6 of 6: IERC677Receiver.sol
// SPDX-License-Identifier: MIT
// Copied from https://github.com/Uniswap/uniswap-v2-periphery/blob/master/contracts/UniswapV2Router02.sol
pragma solidity >=0.8;

interface IERC677Receiver {

    function onTokenTransfer(address from, uint256 amount, bytes calldata data) external;

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_terms","type":"string"},{"internalType":"address","name":"offerFactory","type":"address"},{"internalType":"address","name":"wrappedToken","type":"address"},{"internalType":"uint256","name":"quorum","type":"uint256"},{"internalType":"uint256","name":"votePeriod","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"lostAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"collateral","type":"uint256"}],"name":"ClaimCleared","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"lostAddress","type":"address"},{"indexed":true,"internalType":"address","name":"claimant","type":"address"},{"indexed":false,"internalType":"uint256","name":"collateral","type":"uint256"}],"name":"ClaimDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"lostAddress","type":"address"},{"indexed":true,"internalType":"address","name":"claimant","type":"address"},{"indexed":false,"internalType":"uint256","name":"balance","type":"uint256"}],"name":"ClaimMade","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newClaimPeriodInDays","type":"uint256"}],"name":"ClaimPeriodChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"lostAddress","type":"address"},{"indexed":true,"internalType":"address","name":"claimant","type":"address"},{"indexed":false,"internalType":"uint256","name":"collateral","type":"uint256"}],"name":"ClaimResolved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newCustomCollateralAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"newCustomCollareralRate","type":"uint256"}],"name":"CustomClaimCollateralChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newContractAddress","type":"address"}],"name":"MigrationSucceeded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claims","outputs":[{"internalType":"address","name":"claimant","type":"address"},{"internalType":"uint256","name":"collateral","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"address","name":"currencyUsed","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"clearClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"customCollateralAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"customCollateralRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collateralType","type":"address"},{"internalType":"address","name":"lostAddress","type":"address"}],"name":"declareLost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lostAddress","type":"address"}],"name":"deleteClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"buyer","type":"address"},{"internalType":"address","name":"currency","type":"address"}],"name":"drag","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"contract IOfferFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimDeleter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lostAddress","type":"address"}],"name":"getClaimant","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lostAddress","type":"address"}],"name":"getCollateral","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collateralType","type":"address"}],"name":"getCollateralRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lostAddress","type":"address"}],"name":"getCollateralType","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lostAddress","type":"address"}],"name":"getTimeStamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isBinding","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"isRecoveryEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"uint256","name":"pricePerShare","type":"uint256"},{"internalType":"address","name":"currency","type":"address"}],"name":"makeAcquisitionOffer","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notifyOfferEnded","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"offer","outputs":[{"internalType":"contract IOffer","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onTokenTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"quorum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lostAddress","type":"address"}],"name":"recover","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"recoveryDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setRecoverable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"terms","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"transferAndCall","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unwrap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unwrapConversionFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"votePeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"shareholder","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"wrap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wrapped","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

608060405262ed4e006004556000600b553480156200001d57600080fd5b5060405162002bdf38038062002bdf8339810160408190526200004091620001be565b6003805460ff19169055600a80546001600160a01b038087166001600160a01b031992831617909255600980549286169290911682179055600d839055600e829055604051636427ed9760e01b8152636427ed9790620000a690600090600401620002ce565b600060405180830381600087803b158015620000c157600080fd5b505af1158015620000d6573d6000803e3d6000fd5b50508651620000ef9250600f91506020880190620000fb565b5050505050506200032c565b8280546200010990620002d9565b90600052602060002090601f0160209004810192826200012d576000855562000178565b82601f106200014857805160ff191683800117855562000178565b8280016001018555821562000178579182015b82811115620001785782518255916020019190600101906200015b565b50620001869291506200018a565b5090565b5b808211156200018657600081556001016200018b565b80516001600160a01b0381168114620001b957600080fd5b919050565b600080600080600060a08688031215620001d6578081fd5b85516001600160401b0380821115620001ed578283fd5b818801915088601f83011262000201578283fd5b81518181111562000216576200021662000316565b604051601f8201601f19908116603f0116810190838211818310171562000241576200024162000316565b81604052828152602093508b848487010111156200025d578586fd5b8591505b8282101562000280578482018401518183018501529083019062000261565b828211156200029157858484830101525b9850620002a3915050888201620001a1565b95505050620002b560408701620001a1565b6060870151608090970151959894975095949392505050565b901515815260200190565b600281046001821680620002ee57607f821691505b602082108114156200031057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b6128a3806200033c6000396000f3fe6080604052600436106102725760003560e01c806370a082311161014f578063a9059cbb116100c1578063d50256251161007a578063d5025625146106ed578063dcc7d4ad14610702578063dd62ed3e14610715578063de0e9a3e14610735578063eb470ebf14610755578063fcb79a7e1461077557610272565b8063a9059cbb14610633578063b40e80d114610653578063bf376c7a14610673578063c028df0614610693578063c45a0155146106a8578063c6788bdd146106bd57610272565b80639b56d6c9116101135780639b56d6c9146105895780639e4b5745146105a9578063a3ec1883146105be578063a457c2d7146105de578063a4c0ed36146105fe578063a78135871461061e57610272565b806370a082311461050a57806377e071ad1461052a5780637dc2cd981461054a5780638fd3ab801461055f57806395d89b411461057457610272565b8063313ce567116101e85780634000aea0116101ac5780634000aea01461046b57806342966c681461048b57806350e70d48146104ab57806360918117146104c05780636427ed97146104d55780636b03ed5f146104f557610272565b8063313ce567146103d457806332a7ae95146103f657806332bc320b14610416578063395093511461042b5780633bcc45ba1461044b57610272565b80631703a0181161023a5780631703a0181461033557806318160ddd1461034a5780631e3b9de51461035f57806323b872dd1461037f57806326773ddd1461039f5780632a0a4ed5146103bf57610272565b806306fdde03146102775780630832e470146102a2578063095ea7b3146102c45780630c6f0e5d146102f15780630cd865ec14610313575b600080fd5b34801561028357600080fd5b5061028c610795565b60405161029991906124d9565b60405180910390f35b3480156102ae57600080fd5b506102b76108f1565b6040516102999190612738565b3480156102d057600080fd5b506102e46102df366004612136565b6108f7565b6040516102999190612499565b3480156102fd57600080fd5b5061030661090d565b60405161029991906123d5565b34801561031f57600080fd5b5061033361032e366004612086565b61091c565b005b34801561034157600080fd5b506102b7610b2d565b34801561035657600080fd5b506102b7610b33565b34801561036b57600080fd5b5061030661037a366004612086565b610b39565b34801561038b57600080fd5b506102e461039a3660046120f6565b610b5a565b3480156103ab57600080fd5b506103336103ba3660046120be565b610bac565b3480156103cb57600080fd5b50610306610dca565b3480156103e057600080fd5b506103e9610e4c565b6040516102999190612741565b34801561040257600080fd5b50610333610411366004612086565b610e55565b34801561042257600080fd5b50610333611030565b34801561043757600080fd5b506102e4610446366004612136565b611056565b34801561045757600080fd5b50610306610466366004612086565b61108d565b34801561047757600080fd5b506102e4610486366004612161565b6110ae565b34801561049757600080fd5b506103336104a63660046122fe565b611131565b3480156104b757600080fd5b506103066111c4565b3480156104cc57600080fd5b506102b76111d3565b3480156104e157600080fd5b506103336104f03660046121e5565b6111d9565b34801561050157600080fd5b506103336111f8565b34801561051657600080fd5b506102b7610525366004612086565b611333565b34801561053657600080fd5b506102b7610545366004612086565b61134e565b34801561055657600080fd5b506102b7611424565b34801561056b57600080fd5b5061033361142a565b34801561058057600080fd5b5061028c6114c8565b34801561059557600080fd5b506102b76105a4366004612086565b61160b565b3480156105b557600080fd5b506102e4611629565b3480156105ca57600080fd5b506102e46105d9366004612086565b611630565b3480156105ea57600080fd5b506102e46105f9366004612136565b61164f565b34801561060a57600080fd5b50610333610619366004612161565b611686565b34801561062a57600080fd5b506102b76116ad565b34801561063f57600080fd5b506102e461064e366004612136565b6116b3565b34801561065f57600080fd5b506102e461066e366004612086565b6116c6565b34801561067f57600080fd5b5061033361068e366004612136565b6116db565b34801561069f57600080fd5b50610306611778565b3480156106b457600080fd5b50610306611787565b3480156106c957600080fd5b506106dd6106d8366004612086565b611796565b604051610299949392919061246e565b3480156106f957600080fd5b5061028c6117c8565b61033361071036600461221d565b611856565b34801561072157600080fd5b506102b76107303660046120be565b611a0d565b34801561074157600080fd5b506103336107503660046122fe565b611a38565b34801561076157600080fd5b506102b7610770366004612086565b611a5a565b34801561078157600080fd5b506103336107903660046120be565b611a78565b606061079f611629565b1561085457600960009054906101000a90046001600160a01b03166001600160a01b03166306fdde036040518163ffffffff1660e01b815260040160006040518083038186803b1580156107f257600080fd5b505afa158015610806573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261082e9190810190612255565b60405160200161083e9190612373565b60405160208183030381529060405290506108ee565b600960009054906101000a90046001600160a01b03166001600160a01b03166306fdde036040518163ffffffff1660e01b815260040160006040518083038186803b1580156108a257600080fd5b505afa1580156108b6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108de9190810190612255565b60405160200161083e91906123a5565b90565b600b5481565b6000610904338484611aad565b50600192915050565b6007546001600160a01b031681565b6001600160a01b03808216600090815260056020908152604091829020825160808101845281548516815260018201549281018390526002820154938101939093526003015490921660608201819052909190816109955760405162461bcd60e51b815260040161098c906125d3565b60405180910390fd5b82516001600160a01b031633146109be5760405162461bcd60e51b815260040161098c9061250c565b4260045484604001516109d1919061274f565b11156109ef5760405162461bcd60e51b815260040161098c90612543565b82516001600160a01b0380861660009081526005602052604080822080546001600160a01b0319908116825560018201849055600282019390935560030180549092169091555163a9059cbb60e01b81529083169063a9059cbb90610a5a908490879060040161240d565b602060405180830381600087803b158015610a7457600080fd5b505af1158015610a88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aac9190612201565b610ac85760405162461bcd60e51b815260040161098c906125fb565b610adb8582610ad688611333565b611b08565b806001600160a01b0316856001600160a01b03167f52a5c2b28bc6eb9712d0ced43463103b486b13ccc9cda499fd3b2d7b6a74a8ee85604051610b1e9190612738565b60405180910390a35050505050565b600d5481565b60025490565b6001600160a01b03808216600090815260056020526040902054165b919050565b6000610b67848484611b08565b6001600160a01b038416600090815260016020908152604080832033808552925290912054610ba2918691610b9d9086906127a6565b611aad565b5060019392505050565b610bb581611630565b610bd15760405162461bcd60e51b815260040161098c90612632565b6000610bdc8361134e565b905060008111610bfe5760405162461bcd60e51b815260040161098c906125a3565b336000610c0a84611333565b90506000610c188483612787565b90508582610c385760405162461bcd60e51b815260040161098c906126ca565b6001600160a01b03861660009081526005602052604090206001015415610c715760405162461bcd60e51b815260040161098c90612667565b6040516323b872dd60e01b81526001600160a01b038216906323b872dd90610ca1908790309087906004016123e9565b602060405180830381600087803b158015610cbb57600080fd5b505af1158015610ccf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf39190612201565b610d0f5760405162461bcd60e51b815260040161098c906125fb565b604080516080810182526001600160a01b038087168083526020808401878152428587019081528d8516606087019081528d86166000818152600590955293889020965187549087166001600160a01b0319918216178855925160018801559051600287015551600390950180549590941694169390931790915591517f1982ca8958fc8a8176cb52be509260f4bc5af7ce04e1533711793f1c56dd535990610db9908790612738565b60405180910390a350505050505050565b60095460408051632a0a4ed560e01b815290516000926001600160a01b031691632a0a4ed5916004808301926020929190829003018186803b158015610e0f57600080fd5b505afa158015610e23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4791906120a2565b905090565b60035460ff1681565b610e5d610dca565b6001600160a01b0316336001600160a01b031614610e8d5760405162461bcd60e51b815260040161098c90612701565b6001600160a01b038082166000908152600560209081526040918290208251608081018452815485168152600182015492810183905260028201549381019390935260030154909216606082018190529091610efb5760405162461bcd60e51b815260040161098c906125d3565b6001600160a01b03808416600090815260056020908152604080832080546001600160a01b031990811682556001820185905560028201949094556003018054909316909255845190850151915163a9059cbb60e01b81529284169263a9059cbb92610f6a929160040161240d565b602060405180830381600087803b158015610f8457600080fd5b505af1158015610f98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbc9190612201565b610fd85760405162461bcd60e51b815260040161098c906125fb565b81600001516001600160a01b0316836001600160a01b03167fbb036e629a9f4c0897ee5d48440dfdb36f7e772117723a2ed603a6514244c2d584602001516040516110239190612738565b60405180910390a3505050565b600c546001600160a01b031633141561105457600c80546001600160a01b03191690555b565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610904918590610b9d90869061274f565b6001600160a01b039081166000908152600560205260409020600301541690565b6000806110bb86866116b3565b9050801561112857604051635260769b60e11b81526001600160a01b0387169063a4c0ed36906110f5903390899089908990600401612426565b600060405180830381600087803b15801561110f57600080fd5b505af1158015611123573d6000803e3d6000fd5b505050505b95945050505050565b61113b3382611bc5565b6000611145611629565b61115157600b54611154565b60015b6009549091506001600160a01b03166342966c686111728385612787565b6040518263ffffffff1660e01b815260040161118e9190612738565b600060405180830381600087803b1580156111a857600080fd5b505af11580156111bc573d6000803e3d6000fd5b505050505050565b6009546001600160a01b031681565b60085481565b336000908152600660205260409020805460ff19169115919091179055565b3360009081526005602052604090206001015415611054573360008181526005602052604080822060018101805460038301805484546001600160a01b0319908116865593879055600290940195909555908216909355905163a9059cbb60e01b815291926001600160a01b0390911691829163a9059cbb916112809190869060040161240d565b602060405180830381600087803b15801561129a57600080fd5b505af11580156112ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112d29190612201565b6112ee5760405162461bcd60e51b815260040161098c906125fb565b336001600160a01b03167f203627483d943880619f4b7e0cca21dbefd6204b4d85b124eb99540e17ba86dd836040516113279190612738565b60405180910390a25050565b6001600160a01b031660009081526020819052604090205490565b60008061135a83611c5f565b90508015611369579050610b55565b6009546001600160a01b0384811691161415611389575050600b54610b55565b600b546009546040516377e071ad60e01b81526001600160a01b03909116906377e071ad906113bc9087906004016123d5565b60206040518083038186803b1580156113d457600080fd5b505afa1580156113e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140c9190612316565b6114169190612787565b915050610b55565b50919050565b60045481565b33611433611ca1565b1561143d57600080fd5b611445610b33565b61145190611f40612787565b61145a82611333565b61146690612710612787565b10156114845760405162461bcd60e51b815260040161098c9061269e565b61148e8182611cb2565b7f3b6b79a09e9fd230e8591b65c97236bf7df7a604edf733db0658e66b0e6eb2a9816040516114bd91906123d5565b60405180910390a150565b60606114d2611629565b1561157157600960009054906101000a90046001600160a01b03166001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b15801561152557600080fd5b505afa158015611539573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526115619190810190612255565b60405160200161083e919061232e565b600960009054906101000a90046001600160a01b03166001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b1580156115bf57600080fd5b505afa1580156115d3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526115fb9190810190612255565b60405160200161083e9190612357565b6001600160a01b031660009081526005602052604090206001015490565b600b541590565b6001600160a01b031660009081526006602052604090205460ff161590565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610904918590610b9d9086906127a6565b6009546001600160a01b0316331461169d57600080fd5b6116a78484611e7a565b50505050565b600e5481565b60006116bf8383611f1b565b9392505050565b60066020526000908152604090205460ff1681565b6009546040516323b872dd60e01b81526001600160a01b03909116906323b872dd9061170f903390309086906004016123e9565b602060405180830381600087803b15801561172957600080fd5b505af115801561173d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117619190612201565b61176a57600080fd5b6117748282611e7a565b5050565b600c546001600160a01b031681565b600a546001600160a01b031681565b60056020526000908152604090208054600182015460028301546003909301546001600160a01b039283169391921684565b600f80546117d5906127e9565b80601f0160208091040260200160405190810160405280929190818152602001828054611801906127e9565b801561184e5780601f106118235761010080835404028352916020019161184e565b820191906000526020600020905b81548152906001019060200180831161183157829003601f168201915b505050505081565b61185e611629565b61186757600080fd5b600a54600d54600e54604051634dc5e43160e01b81526000936001600160a01b031692634dc5e4319234926118a8928a9233928b928b9290916004016124a4565b6020604051808303818588803b1580156118c157600080fd5b505af11580156118d5573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906118fa91906120a2565b9050611904611ca1565b156119e857806001600160a01b0316633f5e3e7f6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561194457600080fd5b505af1158015611958573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061197c9190612201565b61198557600080fd5b600c546040516306a169ed60e01b81526001600160a01b03909116906306a169ed906119b59084906004016123d5565b600060405180830381600087803b1580156119cf57600080fd5b505af11580156119e3573d6000803e3d6000fd5b505050505b600c80546001600160a01b0319166001600160a01b0392909216919091179055505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b611a40611629565b15611a4a57600080fd5b611a573382600b54611f4b565b50565b6001600160a01b031660009081526005602052604090206002015490565b600c546001600160a01b03163314611a8f57600080fd5b611aa382611a9c84611333565b6001611f4b565b6117748183611cb2565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590611023908590612738565b6001600160a01b038216611b1b57600080fd5b611b26838383611fee565b6001600160a01b03831660009081526020819052604081208054839290611b4e9084906127a6565b90915550506001600160a01b03821660009081526020819052604081208054839290611b7b90849061274f565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516110239190612738565b611bd182600083611fee565b8060026000828254611be391906127a6565b90915550506001600160a01b03821660009081526020819052604081208054839290611c109084906127a6565b90915550506040516000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611c53908590612738565b60405180910390a35050565b60006001600160a01b038216301415611c7a57506001610b55565b6007546001600160a01b0383811691161415611c995750600854610b55565b506000610b55565b600c546001600160a01b0316151590565b611cba611629565b611cc357600080fd5b6009546040516370a0823160e01b81526001600160a01b039091169063a9059cbb90839083906370a0823190611cfd9030906004016123d5565b60206040518083038186803b158015611d1557600080fd5b505afa158015611d29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d4d9190612316565b6040518363ffffffff1660e01b8152600401611d6a92919061240d565b602060405180830381600087803b158015611d8457600080fd5b505af1158015611d98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dbc9190612201565b611dc557600080fd5b600980546001600160a01b0319166001600160a01b038416179055611774611deb610b33565b6009546040516370a0823160e01b81526001600160a01b03909116906370a0823190611e1b9030906004016123d5565b60206040518083038186803b158015611e3357600080fd5b505afa158015611e47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6b9190612316565b611e759190612767565b612066565b6001600160a01b038216611e8d57600080fd5b611e9960008383611fee565b8060026000828254611eab919061274f565b90915550506001600160a01b03821660009081526020819052604081208054839290611ed890849061274f565b90915550506040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611c53908590612738565b6000611f278383612079565b611f435760405162461bcd60e51b815260040161098c9061257a565b6109046111f8565b611f558383611bc5565b6009546001600160a01b031663a9059cbb84611f718486612787565b6040518363ffffffff1660e01b8152600401611f8e92919061240d565b602060405180830381600087803b158015611fa857600080fd5b505af1158015611fbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fe09190612201565b611fe957600080fd5b505050565b611ff6611ca1565b15611fe957600c5460405163e1a1810f60e01b81526001600160a01b039091169063e1a1810f9061202f908690869086906004016123e9565b600060405180830381600087803b15801561204957600080fd5b505af115801561205d573d6000803e3d6000fd5b50505050505050565b600181101561207457600080fd5b600b55565b6000610904338484611b08565b600060208284031215612097578081fd5b81356116bf8161284a565b6000602082840312156120b3578081fd5b81516116bf8161284a565b600080604083850312156120d0578081fd5b82356120db8161284a565b915060208301356120eb8161284a565b809150509250929050565b60008060006060848603121561210a578081fd5b83356121158161284a565b925060208401356121258161284a565b929592945050506040919091013590565b60008060408385031215612148578182fd5b82356121538161284a565b946020939093013593505050565b60008060008060608587031215612176578081fd5b84356121818161284a565b935060208501359250604085013567ffffffffffffffff808211156121a4578283fd5b818701915087601f8301126121b7578283fd5b8135818111156121c5578384fd5b8860208285010111156121d6578384fd5b95989497505060200194505050565b6000602082840312156121f6578081fd5b81356116bf8161285f565b600060208284031215612212578081fd5b81516116bf8161285f565b600080600060608486031215612231578283fd5b8335925060208401359150604084013561224a8161284a565b809150509250925092565b600060208284031215612266578081fd5b815167ffffffffffffffff8082111561227d578283fd5b818401915084601f830112612290578283fd5b8151818111156122a2576122a2612834565b604051601f8201601f19908116603f011681019083821181831017156122ca576122ca612834565b816040528281528760208487010111156122e2578586fd5b6122f38360208301602088016127bd565b979650505050505050565b60006020828403121561230f578081fd5b5035919050565b600060208284031215612327578081fd5b5051919050565b6000601160fa1b8252825161234a8160018501602087016127bd565b9190910160010192915050565b6000605760f81b8252825161234a8160018501602087016127bd565b6000690223930b3b3b0b13632960b51b8252825161239881600a8501602087016127bd565b91909101600a0192915050565b60006702bb930b83832b2160c51b825282516123c88160088501602087016127bd565b9190910160080192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0385168152602081018490526060604082018190528101829052600082846080840137818301608090810191909152601f909201601f191601019392505050565b6001600160a01b03948516815260208101939093526040830191909152909116606082015260800190565b901515815260200190565b9586526001600160a01b039485166020870152604086019390935292166060840152608083019190915260a082015260c00190565b60006020825282518060208401526124f88160408501602087016127bd565b601f01601f19169190910160400192915050565b6020808252601f908201527f4f6e6c7920636c61696d616e742063616e207265736f6c766520636c61696d00604082015260600190565b60208082526019908201527f436c61696d20706572696f64206e6f74206f7665722079657400000000000000604082015260600190565b6020808252600f908201526e151c985b9cd9995c8819985a5b1959608a1b604082015260600190565b602080825260169082015275155b9cdd5c1c1bdc9d19590818dbdb1b185d195c985b60521b604082015260600190565b6020808252600e908201526d139bc818db185a5b48199bdd5b9960921b604082015260600190565b6020808252601a908201527f436f6c6c61746572616c207472616e73666572206661696c6564000000000000604082015260600190565b6020808252818101527f436c61696d732064697361626c656420666f7220746869732061646472657373604082015260600190565b60208082526017908201527f4164647265737320616c726561647920636c61696d6564000000000000000000604082015260600190565b602080825260129082015271145d5bdc9d5b481b9bdd081c995858da195960721b604082015260600190565b6020808252601f908201527f436c61696d6564206164647265737320686f6c6473206e6f2073686172657300604082015260600190565b60208082526018908201527f596f752063616e6e6f742064656c65746520636c61696d730000000000000000604082015260600190565b90815260200190565b60ff91909116815260200190565b600082198211156127625761276261281e565b500190565b60008261278257634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156127a1576127a161281e565b500290565b6000828210156127b8576127b861281e565b500390565b60005b838110156127d85781810151838201526020016127c0565b838111156116a75750506000910152565b6002810460018216806127fd57607f821691505b6020821081141561141e57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611a5757600080fd5b8015158114611a5757600080fdfea2646970667358221220d0f14521c293fe962159c01fb4a60e9f1b718f0e199f1b629f370472c2098d9664736f6c6343000801003300000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000f9f92751f272f0872e2edb6a280b0990f3e2b8a3000000000000000000000000cb58ec733ab0d96216b048bf7c3209d6c184d7c30000000000000000000000000000000000000000000000000000000000001d4c00000000000000000000000000000000000000000000000000000000004f1a00000000000000000000000000000000000000000000000000000000000000005c647261672e616b74696f6e61726961742e636f6d3f7368613235363d3363323535326364333231623964666632623731376264303264383235303631306639313439613461336561653735633465343463356361643035323332623800000000

Deployed Bytecode

0x6080604052600436106102725760003560e01c806370a082311161014f578063a9059cbb116100c1578063d50256251161007a578063d5025625146106ed578063dcc7d4ad14610702578063dd62ed3e14610715578063de0e9a3e14610735578063eb470ebf14610755578063fcb79a7e1461077557610272565b8063a9059cbb14610633578063b40e80d114610653578063bf376c7a14610673578063c028df0614610693578063c45a0155146106a8578063c6788bdd146106bd57610272565b80639b56d6c9116101135780639b56d6c9146105895780639e4b5745146105a9578063a3ec1883146105be578063a457c2d7146105de578063a4c0ed36146105fe578063a78135871461061e57610272565b806370a082311461050a57806377e071ad1461052a5780637dc2cd981461054a5780638fd3ab801461055f57806395d89b411461057457610272565b8063313ce567116101e85780634000aea0116101ac5780634000aea01461046b57806342966c681461048b57806350e70d48146104ab57806360918117146104c05780636427ed97146104d55780636b03ed5f146104f557610272565b8063313ce567146103d457806332a7ae95146103f657806332bc320b14610416578063395093511461042b5780633bcc45ba1461044b57610272565b80631703a0181161023a5780631703a0181461033557806318160ddd1461034a5780631e3b9de51461035f57806323b872dd1461037f57806326773ddd1461039f5780632a0a4ed5146103bf57610272565b806306fdde03146102775780630832e470146102a2578063095ea7b3146102c45780630c6f0e5d146102f15780630cd865ec14610313575b600080fd5b34801561028357600080fd5b5061028c610795565b60405161029991906124d9565b60405180910390f35b3480156102ae57600080fd5b506102b76108f1565b6040516102999190612738565b3480156102d057600080fd5b506102e46102df366004612136565b6108f7565b6040516102999190612499565b3480156102fd57600080fd5b5061030661090d565b60405161029991906123d5565b34801561031f57600080fd5b5061033361032e366004612086565b61091c565b005b34801561034157600080fd5b506102b7610b2d565b34801561035657600080fd5b506102b7610b33565b34801561036b57600080fd5b5061030661037a366004612086565b610b39565b34801561038b57600080fd5b506102e461039a3660046120f6565b610b5a565b3480156103ab57600080fd5b506103336103ba3660046120be565b610bac565b3480156103cb57600080fd5b50610306610dca565b3480156103e057600080fd5b506103e9610e4c565b6040516102999190612741565b34801561040257600080fd5b50610333610411366004612086565b610e55565b34801561042257600080fd5b50610333611030565b34801561043757600080fd5b506102e4610446366004612136565b611056565b34801561045757600080fd5b50610306610466366004612086565b61108d565b34801561047757600080fd5b506102e4610486366004612161565b6110ae565b34801561049757600080fd5b506103336104a63660046122fe565b611131565b3480156104b757600080fd5b506103066111c4565b3480156104cc57600080fd5b506102b76111d3565b3480156104e157600080fd5b506103336104f03660046121e5565b6111d9565b34801561050157600080fd5b506103336111f8565b34801561051657600080fd5b506102b7610525366004612086565b611333565b34801561053657600080fd5b506102b7610545366004612086565b61134e565b34801561055657600080fd5b506102b7611424565b34801561056b57600080fd5b5061033361142a565b34801561058057600080fd5b5061028c6114c8565b34801561059557600080fd5b506102b76105a4366004612086565b61160b565b3480156105b557600080fd5b506102e4611629565b3480156105ca57600080fd5b506102e46105d9366004612086565b611630565b3480156105ea57600080fd5b506102e46105f9366004612136565b61164f565b34801561060a57600080fd5b50610333610619366004612161565b611686565b34801561062a57600080fd5b506102b76116ad565b34801561063f57600080fd5b506102e461064e366004612136565b6116b3565b34801561065f57600080fd5b506102e461066e366004612086565b6116c6565b34801561067f57600080fd5b5061033361068e366004612136565b6116db565b34801561069f57600080fd5b50610306611778565b3480156106b457600080fd5b50610306611787565b3480156106c957600080fd5b506106dd6106d8366004612086565b611796565b604051610299949392919061246e565b3480156106f957600080fd5b5061028c6117c8565b61033361071036600461221d565b611856565b34801561072157600080fd5b506102b76107303660046120be565b611a0d565b34801561074157600080fd5b506103336107503660046122fe565b611a38565b34801561076157600080fd5b506102b7610770366004612086565b611a5a565b34801561078157600080fd5b506103336107903660046120be565b611a78565b606061079f611629565b1561085457600960009054906101000a90046001600160a01b03166001600160a01b03166306fdde036040518163ffffffff1660e01b815260040160006040518083038186803b1580156107f257600080fd5b505afa158015610806573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261082e9190810190612255565b60405160200161083e9190612373565b60405160208183030381529060405290506108ee565b600960009054906101000a90046001600160a01b03166001600160a01b03166306fdde036040518163ffffffff1660e01b815260040160006040518083038186803b1580156108a257600080fd5b505afa1580156108b6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108de9190810190612255565b60405160200161083e91906123a5565b90565b600b5481565b6000610904338484611aad565b50600192915050565b6007546001600160a01b031681565b6001600160a01b03808216600090815260056020908152604091829020825160808101845281548516815260018201549281018390526002820154938101939093526003015490921660608201819052909190816109955760405162461bcd60e51b815260040161098c906125d3565b60405180910390fd5b82516001600160a01b031633146109be5760405162461bcd60e51b815260040161098c9061250c565b4260045484604001516109d1919061274f565b11156109ef5760405162461bcd60e51b815260040161098c90612543565b82516001600160a01b0380861660009081526005602052604080822080546001600160a01b0319908116825560018201849055600282019390935560030180549092169091555163a9059cbb60e01b81529083169063a9059cbb90610a5a908490879060040161240d565b602060405180830381600087803b158015610a7457600080fd5b505af1158015610a88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aac9190612201565b610ac85760405162461bcd60e51b815260040161098c906125fb565b610adb8582610ad688611333565b611b08565b806001600160a01b0316856001600160a01b03167f52a5c2b28bc6eb9712d0ced43463103b486b13ccc9cda499fd3b2d7b6a74a8ee85604051610b1e9190612738565b60405180910390a35050505050565b600d5481565b60025490565b6001600160a01b03808216600090815260056020526040902054165b919050565b6000610b67848484611b08565b6001600160a01b038416600090815260016020908152604080832033808552925290912054610ba2918691610b9d9086906127a6565b611aad565b5060019392505050565b610bb581611630565b610bd15760405162461bcd60e51b815260040161098c90612632565b6000610bdc8361134e565b905060008111610bfe5760405162461bcd60e51b815260040161098c906125a3565b336000610c0a84611333565b90506000610c188483612787565b90508582610c385760405162461bcd60e51b815260040161098c906126ca565b6001600160a01b03861660009081526005602052604090206001015415610c715760405162461bcd60e51b815260040161098c90612667565b6040516323b872dd60e01b81526001600160a01b038216906323b872dd90610ca1908790309087906004016123e9565b602060405180830381600087803b158015610cbb57600080fd5b505af1158015610ccf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf39190612201565b610d0f5760405162461bcd60e51b815260040161098c906125fb565b604080516080810182526001600160a01b038087168083526020808401878152428587019081528d8516606087019081528d86166000818152600590955293889020965187549087166001600160a01b0319918216178855925160018801559051600287015551600390950180549590941694169390931790915591517f1982ca8958fc8a8176cb52be509260f4bc5af7ce04e1533711793f1c56dd535990610db9908790612738565b60405180910390a350505050505050565b60095460408051632a0a4ed560e01b815290516000926001600160a01b031691632a0a4ed5916004808301926020929190829003018186803b158015610e0f57600080fd5b505afa158015610e23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4791906120a2565b905090565b60035460ff1681565b610e5d610dca565b6001600160a01b0316336001600160a01b031614610e8d5760405162461bcd60e51b815260040161098c90612701565b6001600160a01b038082166000908152600560209081526040918290208251608081018452815485168152600182015492810183905260028201549381019390935260030154909216606082018190529091610efb5760405162461bcd60e51b815260040161098c906125d3565b6001600160a01b03808416600090815260056020908152604080832080546001600160a01b031990811682556001820185905560028201949094556003018054909316909255845190850151915163a9059cbb60e01b81529284169263a9059cbb92610f6a929160040161240d565b602060405180830381600087803b158015610f8457600080fd5b505af1158015610f98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbc9190612201565b610fd85760405162461bcd60e51b815260040161098c906125fb565b81600001516001600160a01b0316836001600160a01b03167fbb036e629a9f4c0897ee5d48440dfdb36f7e772117723a2ed603a6514244c2d584602001516040516110239190612738565b60405180910390a3505050565b600c546001600160a01b031633141561105457600c80546001600160a01b03191690555b565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610904918590610b9d90869061274f565b6001600160a01b039081166000908152600560205260409020600301541690565b6000806110bb86866116b3565b9050801561112857604051635260769b60e11b81526001600160a01b0387169063a4c0ed36906110f5903390899089908990600401612426565b600060405180830381600087803b15801561110f57600080fd5b505af1158015611123573d6000803e3d6000fd5b505050505b95945050505050565b61113b3382611bc5565b6000611145611629565b61115157600b54611154565b60015b6009549091506001600160a01b03166342966c686111728385612787565b6040518263ffffffff1660e01b815260040161118e9190612738565b600060405180830381600087803b1580156111a857600080fd5b505af11580156111bc573d6000803e3d6000fd5b505050505050565b6009546001600160a01b031681565b60085481565b336000908152600660205260409020805460ff19169115919091179055565b3360009081526005602052604090206001015415611054573360008181526005602052604080822060018101805460038301805484546001600160a01b0319908116865593879055600290940195909555908216909355905163a9059cbb60e01b815291926001600160a01b0390911691829163a9059cbb916112809190869060040161240d565b602060405180830381600087803b15801561129a57600080fd5b505af11580156112ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112d29190612201565b6112ee5760405162461bcd60e51b815260040161098c906125fb565b336001600160a01b03167f203627483d943880619f4b7e0cca21dbefd6204b4d85b124eb99540e17ba86dd836040516113279190612738565b60405180910390a25050565b6001600160a01b031660009081526020819052604090205490565b60008061135a83611c5f565b90508015611369579050610b55565b6009546001600160a01b0384811691161415611389575050600b54610b55565b600b546009546040516377e071ad60e01b81526001600160a01b03909116906377e071ad906113bc9087906004016123d5565b60206040518083038186803b1580156113d457600080fd5b505afa1580156113e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140c9190612316565b6114169190612787565b915050610b55565b50919050565b60045481565b33611433611ca1565b1561143d57600080fd5b611445610b33565b61145190611f40612787565b61145a82611333565b61146690612710612787565b10156114845760405162461bcd60e51b815260040161098c9061269e565b61148e8182611cb2565b7f3b6b79a09e9fd230e8591b65c97236bf7df7a604edf733db0658e66b0e6eb2a9816040516114bd91906123d5565b60405180910390a150565b60606114d2611629565b1561157157600960009054906101000a90046001600160a01b03166001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b15801561152557600080fd5b505afa158015611539573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526115619190810190612255565b60405160200161083e919061232e565b600960009054906101000a90046001600160a01b03166001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b1580156115bf57600080fd5b505afa1580156115d3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526115fb9190810190612255565b60405160200161083e9190612357565b6001600160a01b031660009081526005602052604090206001015490565b600b541590565b6001600160a01b031660009081526006602052604090205460ff161590565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610904918590610b9d9086906127a6565b6009546001600160a01b0316331461169d57600080fd5b6116a78484611e7a565b50505050565b600e5481565b60006116bf8383611f1b565b9392505050565b60066020526000908152604090205460ff1681565b6009546040516323b872dd60e01b81526001600160a01b03909116906323b872dd9061170f903390309086906004016123e9565b602060405180830381600087803b15801561172957600080fd5b505af115801561173d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117619190612201565b61176a57600080fd5b6117748282611e7a565b5050565b600c546001600160a01b031681565b600a546001600160a01b031681565b60056020526000908152604090208054600182015460028301546003909301546001600160a01b039283169391921684565b600f80546117d5906127e9565b80601f0160208091040260200160405190810160405280929190818152602001828054611801906127e9565b801561184e5780601f106118235761010080835404028352916020019161184e565b820191906000526020600020905b81548152906001019060200180831161183157829003601f168201915b505050505081565b61185e611629565b61186757600080fd5b600a54600d54600e54604051634dc5e43160e01b81526000936001600160a01b031692634dc5e4319234926118a8928a9233928b928b9290916004016124a4565b6020604051808303818588803b1580156118c157600080fd5b505af11580156118d5573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906118fa91906120a2565b9050611904611ca1565b156119e857806001600160a01b0316633f5e3e7f6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561194457600080fd5b505af1158015611958573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061197c9190612201565b61198557600080fd5b600c546040516306a169ed60e01b81526001600160a01b03909116906306a169ed906119b59084906004016123d5565b600060405180830381600087803b1580156119cf57600080fd5b505af11580156119e3573d6000803e3d6000fd5b505050505b600c80546001600160a01b0319166001600160a01b0392909216919091179055505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b611a40611629565b15611a4a57600080fd5b611a573382600b54611f4b565b50565b6001600160a01b031660009081526005602052604090206002015490565b600c546001600160a01b03163314611a8f57600080fd5b611aa382611a9c84611333565b6001611f4b565b6117748183611cb2565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590611023908590612738565b6001600160a01b038216611b1b57600080fd5b611b26838383611fee565b6001600160a01b03831660009081526020819052604081208054839290611b4e9084906127a6565b90915550506001600160a01b03821660009081526020819052604081208054839290611b7b90849061274f565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516110239190612738565b611bd182600083611fee565b8060026000828254611be391906127a6565b90915550506001600160a01b03821660009081526020819052604081208054839290611c109084906127a6565b90915550506040516000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611c53908590612738565b60405180910390a35050565b60006001600160a01b038216301415611c7a57506001610b55565b6007546001600160a01b0383811691161415611c995750600854610b55565b506000610b55565b600c546001600160a01b0316151590565b611cba611629565b611cc357600080fd5b6009546040516370a0823160e01b81526001600160a01b039091169063a9059cbb90839083906370a0823190611cfd9030906004016123d5565b60206040518083038186803b158015611d1557600080fd5b505afa158015611d29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d4d9190612316565b6040518363ffffffff1660e01b8152600401611d6a92919061240d565b602060405180830381600087803b158015611d8457600080fd5b505af1158015611d98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dbc9190612201565b611dc557600080fd5b600980546001600160a01b0319166001600160a01b038416179055611774611deb610b33565b6009546040516370a0823160e01b81526001600160a01b03909116906370a0823190611e1b9030906004016123d5565b60206040518083038186803b158015611e3357600080fd5b505afa158015611e47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6b9190612316565b611e759190612767565b612066565b6001600160a01b038216611e8d57600080fd5b611e9960008383611fee565b8060026000828254611eab919061274f565b90915550506001600160a01b03821660009081526020819052604081208054839290611ed890849061274f565b90915550506040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611c53908590612738565b6000611f278383612079565b611f435760405162461bcd60e51b815260040161098c9061257a565b6109046111f8565b611f558383611bc5565b6009546001600160a01b031663a9059cbb84611f718486612787565b6040518363ffffffff1660e01b8152600401611f8e92919061240d565b602060405180830381600087803b158015611fa857600080fd5b505af1158015611fbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fe09190612201565b611fe957600080fd5b505050565b611ff6611ca1565b15611fe957600c5460405163e1a1810f60e01b81526001600160a01b039091169063e1a1810f9061202f908690869086906004016123e9565b600060405180830381600087803b15801561204957600080fd5b505af115801561205d573d6000803e3d6000fd5b50505050505050565b600181101561207457600080fd5b600b55565b6000610904338484611b08565b600060208284031215612097578081fd5b81356116bf8161284a565b6000602082840312156120b3578081fd5b81516116bf8161284a565b600080604083850312156120d0578081fd5b82356120db8161284a565b915060208301356120eb8161284a565b809150509250929050565b60008060006060848603121561210a578081fd5b83356121158161284a565b925060208401356121258161284a565b929592945050506040919091013590565b60008060408385031215612148578182fd5b82356121538161284a565b946020939093013593505050565b60008060008060608587031215612176578081fd5b84356121818161284a565b935060208501359250604085013567ffffffffffffffff808211156121a4578283fd5b818701915087601f8301126121b7578283fd5b8135818111156121c5578384fd5b8860208285010111156121d6578384fd5b95989497505060200194505050565b6000602082840312156121f6578081fd5b81356116bf8161285f565b600060208284031215612212578081fd5b81516116bf8161285f565b600080600060608486031215612231578283fd5b8335925060208401359150604084013561224a8161284a565b809150509250925092565b600060208284031215612266578081fd5b815167ffffffffffffffff8082111561227d578283fd5b818401915084601f830112612290578283fd5b8151818111156122a2576122a2612834565b604051601f8201601f19908116603f011681019083821181831017156122ca576122ca612834565b816040528281528760208487010111156122e2578586fd5b6122f38360208301602088016127bd565b979650505050505050565b60006020828403121561230f578081fd5b5035919050565b600060208284031215612327578081fd5b5051919050565b6000601160fa1b8252825161234a8160018501602087016127bd565b9190910160010192915050565b6000605760f81b8252825161234a8160018501602087016127bd565b6000690223930b3b3b0b13632960b51b8252825161239881600a8501602087016127bd565b91909101600a0192915050565b60006702bb930b83832b2160c51b825282516123c88160088501602087016127bd565b9190910160080192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0385168152602081018490526060604082018190528101829052600082846080840137818301608090810191909152601f909201601f191601019392505050565b6001600160a01b03948516815260208101939093526040830191909152909116606082015260800190565b901515815260200190565b9586526001600160a01b039485166020870152604086019390935292166060840152608083019190915260a082015260c00190565b60006020825282518060208401526124f88160408501602087016127bd565b601f01601f19169190910160400192915050565b6020808252601f908201527f4f6e6c7920636c61696d616e742063616e207265736f6c766520636c61696d00604082015260600190565b60208082526019908201527f436c61696d20706572696f64206e6f74206f7665722079657400000000000000604082015260600190565b6020808252600f908201526e151c985b9cd9995c8819985a5b1959608a1b604082015260600190565b602080825260169082015275155b9cdd5c1c1bdc9d19590818dbdb1b185d195c985b60521b604082015260600190565b6020808252600e908201526d139bc818db185a5b48199bdd5b9960921b604082015260600190565b6020808252601a908201527f436f6c6c61746572616c207472616e73666572206661696c6564000000000000604082015260600190565b6020808252818101527f436c61696d732064697361626c656420666f7220746869732061646472657373604082015260600190565b60208082526017908201527f4164647265737320616c726561647920636c61696d6564000000000000000000604082015260600190565b602080825260129082015271145d5bdc9d5b481b9bdd081c995858da195960721b604082015260600190565b6020808252601f908201527f436c61696d6564206164647265737320686f6c6473206e6f2073686172657300604082015260600190565b60208082526018908201527f596f752063616e6e6f742064656c65746520636c61696d730000000000000000604082015260600190565b90815260200190565b60ff91909116815260200190565b600082198211156127625761276261281e565b500190565b60008261278257634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156127a1576127a161281e565b500290565b6000828210156127b8576127b861281e565b500390565b60005b838110156127d85781810151838201526020016127c0565b838111156116a75750506000910152565b6002810460018216806127fd57607f821691505b6020821081141561141e57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611a5757600080fd5b8015158114611a5757600080fdfea2646970667358221220d0f14521c293fe962159c01fb4a60e9f1b718f0e199f1b629f370472c2098d9664736f6c63430008010033

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

00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000f9f92751f272f0872e2edb6a280b0990f3e2b8a3000000000000000000000000cb58ec733ab0d96216b048bf7c3209d6c184d7c30000000000000000000000000000000000000000000000000000000000001d4c00000000000000000000000000000000000000000000000000000000004f1a00000000000000000000000000000000000000000000000000000000000000005c647261672e616b74696f6e61726961742e636f6d3f7368613235363d3363323535326364333231623964666632623731376264303264383235303631306639313439613461336561653735633465343463356361643035323332623800000000

-----Decoded View---------------
Arg [0] : _terms (string): drag.aktionariat.com?sha256=3c2552cd321b9dff2b717bd02d8250610f9149a4a3eae75c4e44c5cad05232b8
Arg [1] : offerFactory (address): 0xf9f92751F272f0872e2EDb6a280b0990F3e2b8A3
Arg [2] : wrappedToken (address): 0xcB58EC733Ab0d96216B048bf7C3209d6c184D7c3
Arg [3] : quorum (uint256): 7500
Arg [4] : votePeriod (uint256): 5184000

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 000000000000000000000000f9f92751f272f0872e2edb6a280b0990f3e2b8a3
Arg [2] : 000000000000000000000000cb58ec733ab0d96216b048bf7c3209d6c184d7c3
Arg [3] : 0000000000000000000000000000000000000000000000000000000000001d4c
Arg [4] : 00000000000000000000000000000000000000000000000000000000004f1a00
Arg [5] : 000000000000000000000000000000000000000000000000000000000000005c
Arg [6] : 647261672e616b74696f6e61726961742e636f6d3f7368613235363d33633235
Arg [7] : 3532636433323162396466663262373137626430326438323530363130663931
Arg [8] : 3439613461336561653735633465343463356361643035323332623800000000


Deployed Bytecode Sourcemap

3008:1594:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3178:274:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2543:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3010:157:1:-;;;;;;;;;;-1:-1:-1;3010:157:1;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3388:38:3:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;10525:741::-;;;;;;;;;;-1:-1:-1;10525:741:3;;;;;:::i;:::-;;:::i;:::-;;2742:21:2;;;;;;;;;;;;;:::i;1989:100:1:-;;;;;;;;;;;;;:::i;8905:126:3:-;;;;;;;;;;-1:-1:-1;8905:126:3;;;;;:::i;:::-;;:::i;3638:262:1:-;;;;;;;;;;-1:-1:-1;3638:262:1;;;;;:::i;:::-;;:::i;7877:1020:3:-;;;;;;;;;;-1:-1:-1;7877:1020:3;;;;;:::i;:::-;;:::i;3801:140:0:-;;;;;;;;;;;;;:::i;1817:30:1:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;11407:514:3:-;;;;;;;;;;-1:-1:-1;11407:514:3;;;;;:::i;:::-;;:::i;6693:139:2:-;;;;;;;;;;;;;:::i;4309:203:1:-;;;;;;;;;;-1:-1:-1;4309:203:1;;;;;:::i;:::-;;:::i;9177:136:3:-;;;;;;;;;;-1:-1:-1;9177:136:3;;;;;:::i;:::-;;:::i;6134:303:1:-;;;;;;;;;;-1:-1:-1;6134:303:1;;;;;:::i;:::-;;:::i;5830:209:2:-;;;;;;;;;;-1:-1:-1;5830:209:2;;;;;:::i;:::-;;:::i;2319:21::-;;;;;;;;;;;;;:::i;3433:35:3:-;;;;;;;;;;;;;:::i;5559:103::-;;;;;;;;;;-1:-1:-1;5559:103:3;;;;;:::i;:::-;;:::i;9912:427::-;;;;;;;;;;;;;:::i;2152:119:1:-;;;;;;;;;;-1:-1:-1;2152:119:1;;;;;:::i;:::-;;:::i;3949:648:0:-;;;;;;;;;;-1:-1:-1;3949:648:0;;;;;:::i;:::-;;:::i;3012:37:3:-;;;;;;;;;;;;;:::i;7263:366:2:-;;;;;;;;;;;;;:::i;3460:264::-;;;;;;;;;;;;;:::i;9039:130:3:-;;;;;;;;;;-1:-1:-1;9039:130:3;;;;;:::i;:::-;;:::i;4551:101:2:-;;;;;;;;;;;;;:::i;5844:121:3:-;;;;;;;;;;-1:-1:-1;5844:121:3;;;;;:::i;:::-;;:::i;5015:213:1:-;;;;;;;;;;-1:-1:-1;5015:213:1;;;;;:::i;:::-;;:::i;3732:175:2:-;;;;;;;;;;-1:-1:-1;3732:175:2;;;;;:::i;:::-;;:::i;2770:25::-;;;;;;;;;;;;;:::i;3641:152:0:-;;;;;;;;;;-1:-1:-1;3641:152:0;;;;;:::i;:::-;;:::i;3207:48:3:-;;;;;;;;;;-1:-1:-1;3207:48:3;;;;;:::i;:::-;;:::i;4029:178:2:-;;;;;;;;;;-1:-1:-1;4029:178:2;;;;;:::i;:::-;;:::i;2714:19::-;;;;;;;;;;;;;:::i;2400:28::-;;;;;;;;;;;;;:::i;3082:39:3:-;;;;;;;;;;-1:-1:-1;3082:39:3;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;3078:19:0:-;;;;;;;;;;;;;:::i;6047:433:2:-;;;;;;:::i;:::-;;:::i;2720:143:1:-;;;;;;;;;;-1:-1:-1;2720:143:1;;;;;:::i;:::-;;:::i;4986:140:2:-;;;;;;;;;;-1:-1:-1;4986:140:2;;;;;:::i;:::-;;:::i;9321:128:3:-;;;;;;;;;;-1:-1:-1;9321:128:3;;;;;:::i;:::-;;:::i;6488:197:2:-;;;;;;;;;;-1:-1:-1;6488:197:2;;;;;:::i;:::-;;:::i;3178:274::-;3224:13;3253:11;:9;:11::i;:::-;3249:196;;;3325:7;;;;;;;;;-1:-1:-1;;;;;3325:7:2;-1:-1:-1;;;;;3325:12:2;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3325:14:2;;;;;;;;;;;;:::i;:::-;3294:46;;;;;;;;:::i;:::-;;;;;;;;;;;;;3280:61;;;;3249:196;3417:7;;;;;;;;;-1:-1:-1;;;;;3417:7:2;-1:-1:-1;;;;;3417:12:2;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3417:14:2;;;;;;;;;;;;:::i;:::-;3388:44;;;;;;;;:::i;3249:196::-;3178:274;:::o;2543:41::-;;;;:::o;3010:157:1:-;3084:4;3101:36;3110:10;3122:7;3131:5;3101:8;:36::i;:::-;-1:-1:-1;3155:4:1;3010:157;;;;:::o;3388:38:3:-;;;-1:-1:-1;;;;;3388:38:3;;:::o;10525:741::-;-1:-1:-1;;;;;10602:19:3;;;10581:18;10602:19;;;:6;:19;;;;;;;;;10581:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10743:15;10735:42;;;;-1:-1:-1;;;10735:42:3;;;;;;;:::i;:::-;;;;;;;;;10796:14;;-1:-1:-1;;;;;10796:28:3;10814:10;10796:28;10788:72;;;;-1:-1:-1;;;10788:72:3;;;;;;;:::i;:::-;10912:15;10897:11;;10879:5;:15;;;:29;;;;:::i;:::-;:48;;10871:86;;;;-1:-1:-1;;;10871:86:3;;;;;;;:::i;:::-;10987:14;;-1:-1:-1;;;;;11019:19:3;;;10968:16;11019:19;;;:6;:19;;;;;;11012:26;;-1:-1:-1;;;;;;11012:26:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;11057:39;-1:-1:-1;;;11057:39:3;;:17;;;;;;:39;;10987:14;;11085:10;;11057:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11049:78;;;;-1:-1:-1;;;11049:78:3;;;;;;;:::i;:::-;11138:56;11148:11;11161:8;11171:22;11181:11;11171:9;:22::i;:::-;11138:9;:56::i;:::-;11237:8;-1:-1:-1;;;;;11210:48:3;11224:11;-1:-1:-1;;;;;11210:48:3;;11247:10;11210:48;;;;;;:::i;:::-;;;;;;;;10525:741;;;;;:::o;2742:21:2:-;;;;:::o;1989:100:1:-;2069:12;;1989:100;:::o;8905:126:3:-;-1:-1:-1;;;;;8995:19:3;;;8968:7;8995:19;;;:6;:19;;;;;:28;;8905:126;;;;:::o;3638:262:1:-;3736:4;3753:36;3763:6;3771:9;3782:6;3753:9;:36::i;:::-;-1:-1:-1;;;;;3829:19:1;;;;;;:11;:19;;;;;;;;3817:10;3829:31;;;;;;;;;3800:70;;3809:6;;3829:40;;3863:6;;3829:40;:::i;:::-;3800:8;:70::i;:::-;-1:-1:-1;3888:4:1;3638:262;;;;;:::o;7877:1020:3:-;7969:30;7987:11;7969:17;:30::i;:::-;7961:75;;;;-1:-1:-1;;;7961:75:3;;;;;;;:::i;:::-;8047:22;8072:33;8090:14;8072:17;:33::i;:::-;8047:58;;8141:1;8124:14;:18;8116:53;;;;-1:-1:-1;;;8116:53:3;;;;;;;:::i;:::-;8199:10;8180:16;8238:22;8248:11;8238:9;:22::i;:::-;8220:40;-1:-1:-1;8271:18:3;8292:24;8302:14;8220:40;8292:24;:::i;:::-;8271:45;-1:-1:-1;8352:14:3;8386:11;8378:55;;;;-1:-1:-1;;;8378:55:3;;;;;;;:::i;:::-;-1:-1:-1;;;;;8452:19:3;;;;;;:6;:19;;;;;:30;;;:35;8444:71;;;;-1:-1:-1;;;8444:71:3;;;;;;;:::i;:::-;8534:58;;-1:-1:-1;;;8534:58:3;;-1:-1:-1;;;;;8534:21:3;;;;;:58;;8556:8;;8574:4;;8581:10;;8534:58;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8526:97;;;;-1:-1:-1;;;8526:97:3;;;;;;;:::i;:::-;8658:172;;;;;;;;-1:-1:-1;;;;;8658:172:3;;;;;;;;;;;;;8760:15;8658:172;;;;;;;;;;;;;;;8636:19;;;-1:-1:-1;8636:19:3;;;:6;:19;;;;;;;:194;;;;;;;-1:-1:-1;;;;;;8636:194:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8848:41;;;;;;8881:7;;8848:41;:::i;:::-;;;;;;;;7877:1020;;;;;;;:::o;3801:140:0:-;3906:7;;3885:48;;;-1:-1:-1;;;3885:48:0;;;;3858:7;;-1:-1:-1;;;;;3906:7:0;;3885:46;;:48;;;;;;;;;;;;;;3906:7;3885:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3878:55;;3801:140;:::o;1817:30:1:-;;;;;;:::o;11407:514:3:-;11489:17;:15;:17::i;:::-;-1:-1:-1;;;;;11475:31:3;:10;-1:-1:-1;;;;;11475:31:3;;11467:68;;;;-1:-1:-1;;;11467:68:3;;;;;;;:::i;:::-;-1:-1:-1;;;;;11567:19:3;;;11546:18;11567:19;;;:6;:19;;;;;;;;;11546:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11652:48;;;;-1:-1:-1;;;11652:48:3;;;;;;;:::i;:::-;-1:-1:-1;;;;;11718:19:3;;;;;;;:6;:19;;;;;;;;11711:26;;-1:-1:-1;;;;;;11711:26:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;11774:14;;11790:16;;;;11756:51;;-1:-1:-1;;;11756:51:3;;:17;;;;;;:51;;11774:14;11756:51;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11748:90;;;;-1:-1:-1;;;11748:90:3;;;;;;;:::i;:::-;11880:5;:14;;;-1:-1:-1;;;;;11854:59:3;11867:11;-1:-1:-1;;;;;11854:59:3;;11896:5;:16;;;11854:59;;;;;;:::i;:::-;;;;;;;;11407:514;;;:::o;6693:139:2:-;6765:5;;-1:-1:-1;;;;;6765:5:2;6743:10;:28;6739:86;;;6787:5;:26;;-1:-1:-1;;;;;;6787:26:2;;;6739:86;6693:139::o;4309:203:1:-;4415:10;4389:4;4436:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;4436:32:1;;;;;;;;;;4389:4;;4406:76;;4427:7;;4436:45;;4471:10;;4436:45;:::i;9177:136:3:-;-1:-1:-1;;;;;9273:19:3;;;9246:7;9273:19;;;:6;:19;;;;;:32;;;;;9177:136::o;6134:303:1:-;6228:4;6245:12;6260:27;6269:9;6280:6;6260:8;:27::i;:::-;6245:42;;6302:7;6298:107;;;6325:68;;-1:-1:-1;;;6325:68:1;;-1:-1:-1;;;;;6325:42:1;;;;;:68;;6368:10;;6380:6;;6388:4;;;;6325:68;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6298:107;6422:7;6134:303;-1:-1:-1;;;;;6134:303:1:o;5830:209:2:-;5878:25;5884:10;5896:6;5878:5;:25::i;:::-;5914:14;5931:11;:9;:11::i;:::-;:40;;5949:22;;5931:40;;;5945:1;5931:40;6000:7;;5914:57;;-1:-1:-1;;;;;;6000:7:2;5982:32;6015:15;5914:57;6015:6;:15;:::i;:::-;5982:49;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5830:209;;:::o;2319:21::-;;;-1:-1:-1;;;;;2319:21:2;;:::o;3433:35:3:-;;;;:::o;5559:103::-;5632:10;5615:28;;;;:16;:28;;;;;:39;;-1:-1:-1;;5615:39:3;5646:8;;5615:39;;;;;;5559:103::o;9912:427::-;9963:10;9956:18;;;;:6;:18;;;;;:29;;;:34;9952:380;;10035:10;10007:18;10028;;;:6;:18;;;;;;:29;;;;;10097:31;;;;;10144:25;;-1:-1:-1;;;;;;10144:25:3;;;;;;;;;-1:-1:-1;10144:25:3;;;;;;;;;;;;;10192:41;;-1:-1:-1;;;10192:41:3;;10028:29;;-1:-1:-1;;;;;10097:31:3;;;;;;10192:17;;:41;;10035:10;10028:29;;10192:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10184:80;;;;-1:-1:-1;;;10184:80:3;;;;;;;:::i;:::-;10297:10;-1:-1:-1;;;;;10284:36:3;;10309:10;10284:36;;;;;;:::i;:::-;;;;;;;;9952:380;;9912:427::o;2152:119:1:-;-1:-1:-1;;;;;2245:18:1;2218:7;2245:18;;;;;;;;;;;;2152:119::o;3949:648:0:-;4030:7;4050:12;4065:39;4089:14;4065:23;:39::i;:::-;4050:54;-1:-1:-1;4119:8:0;;4115:475;;4151:4;-1:-1:-1;4144:11:0;;4115:475;4203:7;;-1:-1:-1;;;;;4177:34:0;;;4203:7;;4177:34;4173:417;;;-1:-1:-1;;4235:22:0;;4228:29;;4173:417;4556:22;;4510:7;;4489:64;;-1:-1:-1;;;4489:64:0;;-1:-1:-1;;;;;4510:7:0;;;;4489:48;;:64;;4538:14;;4489:64;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:89;;;;:::i;:::-;4482:96;;;;;4173:417;3949:648;;;;:::o;3012:37:3:-;;;;:::o;7263:366:2:-;7320:10;7350:13;:11;:13::i;:::-;7349:14;7341:23;;;;;;7486:13;:11;:13::i;:::-;:20;;7502:4;7486:20;:::i;:::-;7454;7464:9;7454;:20::i;:::-;:28;;7477:5;7454:28;:::i;:::-;:52;;7446:83;;;;-1:-1:-1;;;7446:83:2;;;;;;;:::i;:::-;7540:36;7555:9;7566;7540:14;:36::i;:::-;7592:29;7611:9;7592:29;;;;;;:::i;:::-;;;;;;;;7263:366;:::o;3460:264::-;3508:13;3537:11;:9;:11::i;:::-;3533:184;;;3600:7;;;;;;;;;-1:-1:-1;;;;;3600:7:2;-1:-1:-1;;;;;3600:14:2;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3600:16:2;;;;;;;;;;;;:::i;:::-;3578:39;;;;;;;;:::i;3533:184::-;3687:7;;;;;;;;;-1:-1:-1;;;;;3687:7:2;-1:-1:-1;;;;;3687:14:2;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3687:16:2;;;;;;;;;;;;:::i;:::-;3665:39;;;;;;;;:::i;9039:130:3:-;-1:-1:-1;;;;;9131:19:3;9104:7;9131:19;;;:6;:19;;;;;:30;;;;9039:130::o;4551:101:2:-;4617:22;;:27;4551:101;:::o;5844:121:3:-;-1:-1:-1;;;;;5933:24:3;5908:4;5933:24;;;:16;:24;;;;;;;;5932:25;;5844:121::o;5015:213:1:-;5126:10;5100:4;5147:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;5147:32:1;;;;;;;;;;5100:4;;5117:81;;5138:7;;5147:50;;5182:15;;5147:50;:::i;3732:175:2:-;3860:7;;-1:-1:-1;;;;;3860:7:2;3838:10;:30;3830:39;;;;;;3880:19;3886:4;3892:6;3880:5;:19::i;:::-;3732:175;;;;:::o;2770:25::-;;;;:::o;3641:152:0:-;3736:4;3760:25;3775:2;3779:5;3760:14;:25::i;:::-;3753:32;3641:152;-1:-1:-1;;;3641:152:0:o;3207:48:3:-;;;;;;;;;;;;;;;:::o;4029:178:2:-;4106:7;;:55;;-1:-1:-1;;;4106:55:2;;-1:-1:-1;;;;;4106:7:2;;;;:20;;:55;;4127:10;;4147:4;;4154:6;;4106:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4098:64;;;;;;4173:26;4179:11;4192:6;4173:5;:26::i;:::-;4029:178;;:::o;2714:19::-;;;-1:-1:-1;;;;;2714:19:2;;:::o;2400:28::-;;;-1:-1:-1;;;;;2400:28:2;;:::o;3082:39:3:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3082:39:3;;;;;;;;:::o;3078:19:0:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;6047:433:2:-;6166:11;:9;:11::i;:::-;6158:20;;;;;;6208:7;;6284:6;;6292:10;;6208:95;;-1:-1:-1;;;6208:95:2;;6189:16;;-1:-1:-1;;;;;6208:7:2;;:14;;6230:9;;6208:95;;6241:4;;6247:10;;6259:13;;6274:8;;6284:6;;6208:95;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6189:114;;6318:13;:11;:13::i;:::-;6314:124;;;6363:8;-1:-1:-1;;;;;6356:29:2;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6348:40;;;;;;6403:5;;:23;;-1:-1:-1;;;6403:23:2;;-1:-1:-1;;;;;6403:5:2;;;;:13;;:23;;6417:8;;6403:23;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6314:124;6448:5;:24;;-1:-1:-1;;;;;;6448:24:2;-1:-1:-1;;;;;6448:24:2;;;;;;;;;;-1:-1:-1;;;6047:433:2:o;2720:143:1:-;-1:-1:-1;;;;;2828:18:1;;;2801:7;2828:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;2720:143::o;4986:140:2:-;5045:11;:9;:11::i;:::-;5044:12;5036:21;;;;;;5068:50;5075:10;5087:6;5095:22;;5068:6;:50::i;:::-;4986:140;:::o;9321:128:3:-;-1:-1:-1;;;;;9412:19:3;9385:7;9412:19;;;:6;:19;;;;;:29;;;;9321:128::o;6488:197:2:-;6583:5;;-1:-1:-1;;;;;6583:5:2;6561:10;:28;6553:37;;;;;;6601:34;6608:5;6615:16;6625:5;6615:9;:16::i;:::-;6633:1;6601:6;:34::i;:::-;6646:31;6661:8;6671:5;6646:14;:31::i;8064:175:1:-;-1:-1:-1;;;;;8149:18:1;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;;:35;;;8200:31;;;;;8179:5;;8200:31;:::i;5718:330::-;-1:-1:-1;;;;;5824:23:1;;5816:32;;;;;;5861:47;5882:6;5890:9;5901:6;5861:20;:47::i;:::-;-1:-1:-1;;;;;5921:17:1;;:9;:17;;;;;;;;;;:27;;5942:6;;5921:9;:27;;5942:6;;5921:27;:::i;:::-;;;;-1:-1:-1;;;;;;;5959:20:1;;:9;:20;;;;;;;;;;:30;;5983:6;;5959:9;:30;;5983:6;;5959:30;:::i;:::-;;;;;;;;6022:9;-1:-1:-1;;;;;6005:35:1;6014:6;-1:-1:-1;;;;;6005:35:1;;6033:6;6005:35;;;;;;:::i;7364:260::-;7440:49;7461:7;7478:1;7482:6;7440:20;:49::i;:::-;7518:6;7502:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;7535:18:1;;:9;:18;;;;;;;;;;:28;;7557:6;;7535:9;:28;;7557:6;;7535:28;:::i;:::-;;;;-1:-1:-1;;7579:37:1;;7605:1;;-1:-1:-1;;;;;7579:37:1;;;;;;;7609:6;;7579:37;:::i;:::-;;;;;;;;7364:260;;:::o;3806:327:3:-;3886:7;-1:-1:-1;;;;;3910:31:3;;3936:4;3910:31;3906:220;;;-1:-1:-1;3965:1:3;3958:8;;3906:220;4006:23;;-1:-1:-1;;;;;3988:41:3;;;4006:23;;3988:41;3984:142;;;-1:-1:-1;4053:20:3;;4046:27;;3984:142;-1:-1:-1;4113:1:3;4106:8;;7834:106:2;7912:5;;-1:-1:-1;;;;;7912:5:2;7904:28;;7834:106;:::o;6840:415::-;6943:11;:9;:11::i;:::-;6935:20;;;;;;7022:7;;7062:32;;-1:-1:-1;;;7062:32:2;;-1:-1:-1;;;;;7022:7:2;;;;:16;;7039:21;;7022:7;;7062:17;;:32;;7088:4;;7062:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7022:73;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7014:82;;;;;;7148:7;:28;;-1:-1:-1;;;;;;7148:28:2;-1:-1:-1;;;;;7148:28:2;;;;;7187:60;7233:13;:11;:13::i;:::-;7198:7;;:32;;-1:-1:-1;;;7198:32:2;;-1:-1:-1;;;;;7198:7:2;;;;:17;;:32;;7224:4;;7198:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:48;;;;:::i;:::-;7187:10;:60::i;6718:313:1:-;-1:-1:-1;;;;;6804:23:1;;6796:32;;;;;;6841:51;6870:1;6874:9;6885:6;6841:20;:51::i;:::-;6921:6;6905:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;6938:20:1;;:9;:20;;;;;;;;;;:30;;6962:6;;6938:9;:30;;6962:6;;6938:30;:::i;:::-;;;;-1:-1:-1;;6984:39:1;;-1:-1:-1;;;;;6984:39:1;;;7001:1;;6984:39;;;;7016:6;;6984:39;:::i;9457:217:3:-;9543:4;9568:33;9583:9;9594:6;9568:14;:33::i;:::-;9560:61;;;;-1:-1:-1;;;9560:61:3;;;;;;;:::i;:::-;9632:12;:10;:12::i;5138:171:2:-;5221:20;5227:5;5234:6;5221:5;:20::i;:::-;5260:7;;-1:-1:-1;;;;;5260:7:2;:16;5277:5;5284:15;5293:6;5284;:15;:::i;:::-;5260:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5252:49;;;;;;5138:171;;;:::o;7637:189::-;7742:13;:11;:13::i;:::-;7738:81;;;7772:5;;:35;;-1:-1:-1;;;7772:35:2;;-1:-1:-1;;;;;7772:5:2;;;;:17;;:35;;7790:4;;7796:2;;7800:6;;7772:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7637:189;;;:::o;4756:126::-;4830:1;4820:6;:11;;4812:20;;;;;;4843:22;:31;4756:126::o;2484:173:1:-;2570:4;2587:40;2597:10;2609:9;2620:6;2587:9;:40::i;14:259:6:-;;126:2;114:9;105:7;101:23;97:32;94:2;;;147:6;139;132:22;94:2;191:9;178:23;210:33;237:5;210:33;:::i;278:263::-;;401:2;389:9;380:7;376:23;372:32;369:2;;;422:6;414;407:22;369:2;459:9;453:16;478:33;505:5;478:33;:::i;546:402::-;;;675:2;663:9;654:7;650:23;646:32;643:2;;;696:6;688;681:22;643:2;740:9;727:23;759:33;786:5;759:33;:::i;:::-;811:5;-1:-1:-1;868:2:6;853:18;;840:32;881:35;840:32;881:35;:::i;:::-;935:7;925:17;;;633:315;;;;;:::o;953:470::-;;;;1099:2;1087:9;1078:7;1074:23;1070:32;1067:2;;;1120:6;1112;1105:22;1067:2;1164:9;1151:23;1183:33;1210:5;1183:33;:::i;:::-;1235:5;-1:-1:-1;1292:2:6;1277:18;;1264:32;1305:35;1264:32;1305:35;:::i;:::-;1057:366;;1359:7;;-1:-1:-1;;;1413:2:6;1398:18;;;;1385:32;;1057:366::o;1428:327::-;;;1557:2;1545:9;1536:7;1532:23;1528:32;1525:2;;;1578:6;1570;1563:22;1525:2;1622:9;1609:23;1641:33;1668:5;1641:33;:::i;:::-;1693:5;1745:2;1730:18;;;;1717:32;;-1:-1:-1;;;1515:240:6:o;1760:846::-;;;;;1925:2;1913:9;1904:7;1900:23;1896:32;1893:2;;;1946:6;1938;1931:22;1893:2;1990:9;1977:23;2009:33;2036:5;2009:33;:::i;:::-;2061:5;-1:-1:-1;2113:2:6;2098:18;;2085:32;;-1:-1:-1;2168:2:6;2153:18;;2140:32;2191:18;2221:14;;;2218:2;;;2253:6;2245;2238:22;2218:2;2296:6;2285:9;2281:22;2271:32;;2341:7;2334:4;2330:2;2326:13;2322:27;2312:2;;2368:6;2360;2353:22;2312:2;2413;2400:16;2439:2;2431:6;2428:14;2425:2;;;2460:6;2452;2445:22;2425:2;2510:7;2505:2;2496:6;2492:2;2488:15;2484:24;2481:37;2478:2;;;2536:6;2528;2521:22;2478:2;1883:723;;;;-1:-1:-1;;2572:2:6;2564:11;;-1:-1:-1;;;1883:723:6:o;2611:253::-;;2720:2;2708:9;2699:7;2695:23;2691:32;2688:2;;;2741:6;2733;2726:22;2688:2;2785:9;2772:23;2804:30;2828:5;2804:30;:::i;2869:257::-;;2989:2;2977:9;2968:7;2964:23;2960:32;2957:2;;;3010:6;3002;2995:22;2957:2;3047:9;3041:16;3066:30;3090:5;3066:30;:::i;3131:395::-;;;;3277:2;3265:9;3256:7;3252:23;3248:32;3245:2;;;3298:6;3290;3283:22;3245:2;3339:9;3326:23;3316:33;;3396:2;3385:9;3381:18;3368:32;3358:42;;3450:2;3439:9;3435:18;3422:32;3463:33;3490:5;3463:33;:::i;:::-;3515:5;3505:15;;;3235:291;;;;;:::o;3531:924::-;;3664:2;3652:9;3643:7;3639:23;3635:32;3632:2;;;3685:6;3677;3670:22;3632:2;3723:9;3717:16;3752:18;3793:2;3785:6;3782:14;3779:2;;;3814:6;3806;3799:22;3779:2;3857:6;3846:9;3842:22;3832:32;;3902:7;3895:4;3891:2;3887:13;3883:27;3873:2;;3929:6;3921;3914:22;3873:2;3963;3957:9;3985:2;3981;3978:10;3975:2;;;3991:18;;:::i;:::-;4066:2;4060:9;4034:2;4120:13;;-1:-1:-1;;4116:22:6;;;4140:2;4112:31;4108:40;4096:53;;;4164:18;;;4184:22;;;4161:46;4158:2;;;4210:18;;:::i;:::-;4250:10;4246:2;4239:22;4285:2;4277:6;4270:18;4325:7;4320:2;4315;4311;4307:11;4303:20;4300:33;4297:2;;;4351:6;4343;4336:22;4297:2;4369:55;4421:2;4416;4408:6;4404:15;4399:2;4395;4391:11;4369:55;:::i;:::-;4443:6;3622:833;-1:-1:-1;;;;;;;3622:833:6:o;4460:190::-;;4572:2;4560:9;4551:7;4547:23;4543:32;4540:2;;;4593:6;4585;4578:22;4540:2;-1:-1:-1;4621:23:6;;4530:120;-1:-1:-1;4530:120:6:o;4655:194::-;;4778:2;4766:9;4757:7;4753:23;4749:32;4746:2;;;4799:6;4791;4784:22;4746:2;-1:-1:-1;4827:16:6;;4736:113;-1:-1:-1;4736:113:6:o;4854:418::-;;-1:-1:-1;;;5111:3:6;5104:16;5149:6;5143:13;5165:61;5219:6;5215:1;5210:3;5206:11;5199:4;5191:6;5187:17;5165:61;:::i;:::-;5246:16;;;;5264:1;5242:24;;5094:178;-1:-1:-1;;5094:178:6:o;5277:418::-;;-1:-1:-1;;;5534:3:6;5527:16;5572:6;5566:13;5588:61;5642:6;5638:1;5633:3;5629:11;5622:4;5614:6;5610:17;5588:61;:::i;5700:429::-;;-1:-1:-1;;;5957:3:6;5950:25;6004:6;5998:13;6020:62;6075:6;6070:2;6065:3;6061:12;6054:4;6046:6;6042:17;6020:62;:::i;:::-;6102:16;;;;6120:2;6098:25;;5940:189;-1:-1:-1;;5940:189:6:o;6134:425::-;;-1:-1:-1;;;6391:3:6;6384:23;6436:6;6430:13;6452:61;6506:6;6502:1;6497:3;6493:11;6486:4;6478:6;6474:17;6452:61;:::i;:::-;6533:16;;;;6551:1;6529:24;;6374:185;-1:-1:-1;;6374:185:6:o;6564:203::-;-1:-1:-1;;;;;6728:32:6;;;;6710:51;;6698:2;6683:18;;6665:102::o;6772:375::-;-1:-1:-1;;;;;7030:15:6;;;7012:34;;7082:15;;;;7077:2;7062:18;;7055:43;7129:2;7114:18;;7107:34;;;;6962:2;6947:18;;6929:218::o;7152:274::-;-1:-1:-1;;;;;7344:32:6;;;;7326:51;;7408:2;7393:18;;7386:34;7314:2;7299:18;;7281:145::o;7431:562::-;-1:-1:-1;;;;;7644:32:6;;7626:51;;7708:2;7693:18;;7686:34;;;7756:2;7751;7736:18;;7729:30;;;7775:18;;7768:34;;;7431:562;7795:6;7845;7839:3;7824:19;;7811:49;7880:22;;;7904:3;7876:32;;;7869:46;;;;7976:2;7955:15;;;-1:-1:-1;;7951:29:6;7936:45;7932:55;;7616:377;-1:-1:-1;;;7616:377:6:o;7998:447::-;-1:-1:-1;;;;;8285:15:6;;;8267:34;;8332:2;8317:18;;8310:34;;;;8375:2;8360:18;;8353:34;;;;8423:15;;;8418:2;8403:18;;8396:43;8216:3;8201:19;;8183:262::o;8450:187::-;8615:14;;8608:22;8590:41;;8578:2;8563:18;;8545:92::o;8642:591::-;8929:25;;;-1:-1:-1;;;;;9028:15:6;;;9023:2;9008:18;;9001:43;9075:2;9060:18;;9053:34;;;;9123:15;;9118:2;9103:18;;9096:43;9170:3;9155:19;;9148:35;;;;8981:3;9199:19;;9192:35;8916:3;8901:19;;8883:350::o;9914:383::-;;10063:2;10052:9;10045:21;10095:6;10089:13;10138:6;10133:2;10122:9;10118:18;10111:34;10154:66;10213:6;10208:2;10197:9;10193:18;10188:2;10180:6;10176:15;10154:66;:::i;:::-;10281:2;10260:15;-1:-1:-1;;10256:29:6;10241:45;;;;10288:2;10237:54;;10035:262;-1:-1:-1;;10035:262:6:o;10302:355::-;10504:2;10486:21;;;10543:2;10523:18;;;10516:30;10582:33;10577:2;10562:18;;10555:61;10648:2;10633:18;;10476:181::o;10662:349::-;10864:2;10846:21;;;10903:2;10883:18;;;10876:30;10942:27;10937:2;10922:18;;10915:55;11002:2;10987:18;;10836:175::o;11016:339::-;11218:2;11200:21;;;11257:2;11237:18;;;11230:30;-1:-1:-1;;;11291:2:6;11276:18;;11269:45;11346:2;11331:18;;11190:165::o;11360:346::-;11562:2;11544:21;;;11601:2;11581:18;;;11574:30;-1:-1:-1;;;11635:2:6;11620:18;;11613:52;11697:2;11682:18;;11534:172::o;11711:338::-;11913:2;11895:21;;;11952:2;11932:18;;;11925:30;-1:-1:-1;;;11986:2:6;11971:18;;11964:44;12040:2;12025:18;;11885:164::o;12054:350::-;12256:2;12238:21;;;12295:2;12275:18;;;12268:30;12334:28;12329:2;12314:18;;12307:56;12395:2;12380:18;;12228:176::o;12409:356::-;12611:2;12593:21;;;12630:18;;;12623:30;12689:34;12684:2;12669:18;;12662:62;12756:2;12741:18;;12583:182::o;12770:347::-;12972:2;12954:21;;;13011:2;12991:18;;;12984:30;13050:25;13045:2;13030:18;;13023:53;13108:2;13093:18;;12944:173::o;13122:342::-;13324:2;13306:21;;;13363:2;13343:18;;;13336:30;-1:-1:-1;;;13397:2:6;13382:18;;13375:48;13455:2;13440:18;;13296:168::o;13469:355::-;13671:2;13653:21;;;13710:2;13690:18;;;13683:30;13749:33;13744:2;13729:18;;13722:61;13815:2;13800:18;;13643:181::o;13829:348::-;14031:2;14013:21;;;14070:2;14050:18;;;14043:30;14109:26;14104:2;14089:18;;14082:54;14168:2;14153:18;;14003:174::o;14182:177::-;14328:25;;;14316:2;14301:18;;14283:76::o;14364:184::-;14536:4;14524:17;;;;14506:36;;14494:2;14479:18;;14461:87::o;14553:128::-;;14624:1;14620:6;14617:1;14614:13;14611:2;;;14630:18;;:::i;:::-;-1:-1:-1;14666:9:6;;14601:80::o;14686:217::-;;14752:1;14742:2;;-1:-1:-1;;;14777:31:6;;14831:4;14828:1;14821:15;14859:4;14784:1;14849:15;14742:2;-1:-1:-1;14888:9:6;;14732:171::o;14908:168::-;;15014:1;15010;15006:6;15002:14;14999:1;14996:21;14991:1;14984:9;14977:17;14973:45;14970:2;;;15021:18;;:::i;:::-;-1:-1:-1;15061:9:6;;14960:116::o;15081:125::-;;15149:1;15146;15143:8;15140:2;;;15154:18;;:::i;:::-;-1:-1:-1;15191:9:6;;15130:76::o;15211:258::-;15283:1;15293:113;15307:6;15304:1;15301:13;15293:113;;;15383:11;;;15377:18;15364:11;;;15357:39;15329:2;15322:10;15293:113;;;15424:6;15421:1;15418:13;15415:2;;;-1:-1:-1;;15459:1:6;15441:16;;15434:27;15264:205::o;15474:380::-;15559:1;15549:12;;15606:1;15596:12;;;15617:2;;15671:4;15663:6;15659:17;15649:27;;15617:2;15724;15716:6;15713:14;15693:18;15690:38;15687:2;;;15770:10;15765:3;15761:20;15758:1;15751:31;15805:4;15802:1;15795:15;15833:4;15830:1;15823:15;15859:127;15920:10;15915:3;15911:20;15908:1;15901:31;15951:4;15948:1;15941:15;15975:4;15972:1;15965:15;15991:127;16052:10;16047:3;16043:20;16040:1;16033:31;16083:4;16080:1;16073:15;16107:4;16104:1;16097:15;16123:133;-1:-1:-1;;;;;16200:31:6;;16190:42;;16180:2;;16246:1;16243;16236:12;16261:120;16349:5;16342:13;16335:21;16328:5;16325:32;16315:2;;16371:1;16368;16361:12

Swarm Source

ipfs://d0f14521c293fe962159c01fb4a60e9f1b718f0e199f1b629f370472c2098d96
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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