ETH Price: $3,094.39 (+0.72%)
Gas: 5 Gwei

Token

Friendly Fractals (FRFRAC)
 

Overview

Max Total Supply

98 FRFRAC

Holders

75

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
2 FRFRAC
0x13d91d079129b94f37ac92185f7656d75774ce33
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
FriendlyFractals

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-08-30
*/

// SPDX-License-Identifier: MIT

pragma solidity 0.8.0;

library Address {
    function isContract(address account) internal view returns (bool) {
        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }
}

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

interface IERC165 {
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

abstract contract ERC165 is IERC165 {
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

interface IERC721 is IERC165 {
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    function balanceOf(address owner) external view returns (uint256 balance);
    function ownerOf(uint256 tokenId) external view returns (address owner);
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;
    function approve(address to, uint256 tokenId) external;
    function getApproved(uint256 tokenId) external view returns (address operator);
    function setApprovalForAll(address operator, bool _approved) external;
    function isApprovedForAll(address owner, address operator) external view returns (bool);
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

interface IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

interface IERC721Metadata is IERC721 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;

    string private _name;
    string private _symbol;
    mapping(uint256 => address) private _owners;
    mapping(address => uint256) private _balances;
    mapping(uint256 => address) private _tokenApprovals;
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        return "";
    }

    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

interface IERC721Enumerable is IERC721 {
    function totalSupply() external view returns (uint256);
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);
    function tokenByIndex(uint256 index) external view returns (uint256);
}

abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;
    mapping(uint256 => uint256) private _ownedTokensIndex;
    uint256[] private _allTokens;
    mapping(uint256 => uint256) private _allTokensIndex;

    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }

    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }
        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    constructor() {
        _setOwner(_msgSender());
    }

    function owner() public view virtual returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

abstract contract ReentrancyGuard {
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

        _;

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

contract FriendlyFractals is Ownable, ERC721("Friendly Fractals", "FRFRAC"), ERC721Enumerable, ReentrancyGuard {
	uint256 public curId = 0;
	uint256 public mintPrice = 0;
	mapping(uint256 => uint256) public tokenSeed;

	bytes private uriHead1 = "data:application/json;charset=utf-8,%7B%22name%22%3A%20%22Friendly%20Fractals%22%2C%22description%22%3A%20%22Fully%20on-chain%20generative%20fractal%20patterns%20based%20on%20the%20dragon%20curve.%22%2C%22image%22%3A%20%22data%3Aimage%2Fsvg%2Bxml%3Bcharset%3Dutf-8%2C%3Csvg%20width%3D'100%25'%20height%3D'100%25'%20viewBox%3D'0%200%20100000%20100000'%20style%3D'stroke-width%3A400%3B%20";
	bytes private uriHead2 = "%20background-color%3Argb(50%2C50%2C50)'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E";
	bytes private uriTail = "%3C%2Fsvg%3E%22%7D";

    constructor() {
        mint(); // tokenId 0 for deployer
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC721Enumerable)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }

    function mint() payable public nonReentrant {
    	require(curId < 300, "FriendlyFractals: Max 300 tokens");
    	require(msg.value >= mintPrice, "FriendlyFractals: Insufficient value to mint");

    	_safeMint(_msgSender(), curId);
    	// generate random seed
    	tokenSeed[curId] = uint256(keccak256(abi.encodePacked(curId, block.timestamp, blockhash(block.number - 1))));
    	curId += 1;

    	// refund value above mint price
    	if (msg.value > mintPrice) {
	    	address payable refundee = payable(_msgSender());
	    	refundee.transfer(msg.value - mintPrice);
    	}

    	mintPrice += 1e16;
    }

    function claim() public onlyOwner {
    	address payable sendee = payable(owner());
    	sendee.transfer(address(this).balance);
    }

    function contractURI() public view returns (string memory) {
        return tokenURI(0);
    }

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        return tokenSVGFromSeed(tokenSeed[tokenId]);
    }

    function tokenSVGFromSeed(uint256 seed) internal view returns (string memory) {
        uint256 numIterations = 8;

        // space to store the string format of x1, y1, x2, y2
        string[4] memory vars = ["1000000", "1000000", "1000000", "1000000"];

        // constants which affect the final outcome	
        seed = uint256(keccak256(abi.encodePacked(seed)));
        uint256 min_subiteration = 1 + seed % 2;

        // space for all the data to compute the fractal
        uint256[] memory data = new uint256[](2**(numIterations+1)-1);

        data[0]= compact(seed, 0, 0, 35000, 35000, 30000, 30000);
        for (uint256 i=0; i<2**numIterations-1; i++) {
            //generate both children
            data[2*i+1] = getChildData(data[i], true, min_subiteration);
            data[2*i+2] = getChildData(data[i], false, min_subiteration);
        }

        // generate result string
        // each line takes up to 84 characters.
        bytes memory result = new bytes(84*(2**numIterations)+550);
        bytes memory cur;
        assembly {
        	cur := add(result, 32) //offset length header
        } 
        uint256 totallen = 0;
    	uint256 linelen;


        // add head
    	(linelen, cur) = copyString(cur, uriHead1);
    	totallen += linelen;

        (linelen, cur) = copyString(cur, getColorString(seed));
    	totallen += linelen;

    	(linelen, cur) = copyString(cur, uriHead2);
    	totallen += linelen;

    	// add body
        for (uint256 i=2**numIterations-1; i<data.length; i++) {
        	bytes memory curLine = getCurLine(data, i, vars);
        	(linelen, cur) = copyString(cur, curLine);
        	totallen += linelen;
        }

        // add tail
    	(linelen, cur) = copyString(cur, uriTail);
    	totallen += linelen;

        // reassign total length
        assembly {
        	mstore(result, totallen)
        }

        return string(result);
    }

    function getChildData(uint256 data, bool leftChild, uint256 min_subiteration) internal view returns (uint256) {
    	uint256 seed;
    	uint256 subiteration;
    	uint256 curtype;
    	int256 x;
        int256 y;
        int256 dx;
        int256 dy;

        (seed, curtype, subiteration, x, y, dx, dy) = expand(data);
        // if subiteration 0, update type and subiteration
        if (subiteration == 0) {
        	seed = uint256(keccak256(abi.encodePacked(seed)));
        	subiteration = min_subiteration + seed % 4;

			seed = uint256(keccak256(abi.encodePacked(seed)));
        	curtype = seed % 9;
        }

		int256 sqrt2a = 14142;
		int256 sqrt2b = 10000;

		// rotate 45 degrees and scale by 1/sqrt(2). dx1,dy1 is for one direction of rotation, dx2,dy2 for the other
        // int256 dx1 = (dx * sqrt2b / sqrt2a - dy * sqrt2b / sqrt2a ) * sqrt2b / sqrt2a;
        // int256 dy1 = (dx * sqrt2b / sqrt2a + dy * sqrt2b / sqrt2a ) * sqrt2b / sqrt2a;
        // int256 dx2 = (dx * sqrt2b / sqrt2a + dy * sqrt2b / sqrt2a ) * sqrt2b / sqrt2a;
        // int256 dy2 =  (-dx * sqrt2b / sqrt2a + dy * sqrt2b / sqrt2a) * sqrt2b / sqrt2a;
        int256 dx1;
        int256 dy1;
        int256 dx2;
        int256 dy2;

        assembly {
        	dx1 := sdiv(mul(sub(sdiv(mul(dx, sqrt2b), sqrt2a),sdiv(mul(dy, sqrt2b),sqrt2a)),sqrt2b),sqrt2a)
        	dy1 := sdiv(mul(add(sdiv(mul(dx, sqrt2b), sqrt2a),sdiv(mul(dy, sqrt2b),sqrt2a)),sqrt2b),sqrt2a)
        	dx2 := sdiv(mul(add(sdiv(mul(dx, sqrt2b), sqrt2a),sdiv(mul(dy, sqrt2b),sqrt2a)),sqrt2b),sqrt2a)
        	dy2 := sdiv(mul(add(sdiv(mul(add(1,not(dx)), sqrt2b), sqrt2a),sdiv(mul(dy, sqrt2b),sqrt2a)),sqrt2b),sqrt2a)
        }


        // reuse x,y,dx,dy for return. Not enough local variables
        if (leftChild && (curtype == 3) || 
            !leftChild && (curtype == 0 || curtype == 4 || curtype == 8)) {
        	assembly {
        		x := add(x, dx)
        		y := add(y, dy)
        	}
        } else if (curtype == 6 || 
        		  !leftChild && (curtype == 1 || curtype == 3)) {
        	assembly {
        		x := add(x, dx1)
        		y := add(y, dy1)
        	}
        } else if (!leftChild && (curtype == 2 || curtype == 5 || curtype == 7)) {
        	assembly {
        		x := add(x, dx2)
        		y := add(y, dy2)
        	}
        }

        if (leftChild && (curtype == 0 || curtype == 1 || curtype == 4 || curtype == 5 || curtype == 7) ||
        	!leftChild && (curtype == 2 || curtype == 5)) {
        	dx = dx1;
        	dy = dy1;

        }  else if (leftChild && (curtype == 6) ||
        			!leftChild && (curtype == 3 || curtype == 4)) {
        	assembly {
        		dx := add(1, not(dx1))
        		dy := add(1, not(dy1))
        	}

        } else if (leftChild && (curtype == 2 || curtype == 8) || 
        		  !leftChild && (curtype == 1 || curtype == 6)) {
    		dx = dx2;
    		dy = dy2;

        } else if (leftChild && (curtype == 3) || 
        			!leftChild && (curtype == 0 || curtype == 7 || curtype == 8)) {
        	assembly {
        		dx := add(1, not(dx2))
        		dy := add(1, not(dy2))
        	}
        } 

    	return compact(seed, curtype, subiteration-1, x, y, dx, dy);
    }

    // compact variables into uint256
    function compact(uint256 seed, uint256 curtype, uint256 subiteration, int256 x, int256 y, int256 dx, int256 dy) internal pure returns (uint256) {
    	uint256 result = 0;
    	result |= uint256(dy & 0xffffffff);
    	result = result << 32;
    	result |= uint256(dx & 0xffffffff);
    	result = result << 32;
    	result |= uint256(y & 0xffffffff);
    	result = result << 32;
    	result |= uint256(x & 0xffffffff);
    	result = result << 32;
    	result |= uint256(subiteration & 0xffffffff);
    	result = result << 32;
    	result |= uint256(curtype & 0xffffffff);
    	result = result << 64;
    	result |= uint256(seed & 0xffffffffffffffff);

    	return result;
    }

    // expand variables from uint256
    function expand(uint256 vars) internal pure returns (uint256 seed, uint256 curtype, uint256 subiteration, int256 x, int256 y, int256 dx, int256 dy) {
    	seed = uint256(vars & 0xffffffffffffffff);
    	vars = vars >> 64;
    	curtype = uint256(vars & 0xffffffff);
    	vars = vars >> 32;
    	subiteration = uint256(vars & 0xffffffff);
    	vars = vars >> 32;
    	x = int256(int32(uint32(vars)));
    	vars = vars >> 32;
    	y = int256(int32(uint32(vars)));
    	vars = vars >> 32;
    	dx = int256(int32(uint32(vars)));
    	vars = vars >> 32;
    	dy = int256(int32(uint32(vars)));
    }

    function uintToString(uint v) public pure returns (string memory) {
        uint maxlength = 8;
        bytes memory reversed = new bytes(maxlength);
        uint i = 0;
        while (v != 0) {
            uint remainder = v % 10;
            v = v / 10;
            reversed[i++] = bytes1(uint8(48 + remainder));
        }
        bytes memory s = new bytes(i); // i + 1 is inefficient
        for (uint j = 0; j < i; j++) {
            s[j] = reversed[i - j - 1]; // to avoid the off-by-one error
        }
        string memory str = string(s);  // memory isn't implicitly convertible to storage
        return str;
    }

    function getColorString(uint256 seed) internal view returns (bytes memory) {
    	seed = uint256(keccak256(abi.encodePacked(seed)));
        uint256 color_h = 1 + seed % 359;
    	seed = uint256(keccak256(abi.encodePacked(seed)));
        uint256 color_s = 65 + seed % 22;
    	seed = uint256(keccak256(abi.encodePacked(seed)));
        uint256 color_l = 65 + seed % 22;

        return abi.encodePacked("stroke%3Ahsl(", uintToString(color_h), "%2C", uintToString(color_s), "%25%2C", uintToString(color_l), "%25)%3B");
    }

    // returns length of string copied and current position of pointer
    function copyString(bytes memory curPosition, bytes memory strToCopy) internal view returns (uint256 linelen, bytes memory resPosition) {
    	uint256 numloops = (strToCopy.length + 31) / 32;
    	linelen = strToCopy.length;
    	resPosition = curPosition;

    	// copy curLine into result
    	assembly {
	        for {  let j := 0 } lt(j, numloops) { j := add(1, j) } { mstore(add(resPosition, mul(32, j)), mload(add(strToCopy, mul(32, add(1, j))))) }
	        resPosition := add(resPosition, linelen)
	    }
    }

    // get svg line output from data
    function getCurLine(uint256[] memory data, uint256 index, string[4] memory vars) internal view returns (bytes memory) {      
      	uint256 remainder;
        int256 x;
        int256 y;
        int256 dx;
        int256 dy;
        (,,, x, y, dx, dy) = expand(data[index]);

    	uint256 curdigit;
    	uint256 numdigits;
    	string memory stringStart;

    	for (uint256 i=0; i<4; i++) {
    		curdigit = 0;
    		numdigits = 0;
	    	uint256 num;
	    	if (i == 0) {
	    		num = uint256(x);
	    	} else if (i == 1) {
	    		num = uint256(y);
	    	}  else if (i == 2) {
	    		num = uint256(x+dx);
	    	} else {
	    		num = uint256(y+dy);
	    	}

	    	assembly {
	    		stringStart := mload(add(vars, mul(32, i)))
	    	}

	    	uint256 numcopy = num;

	    	// count number of digits
	    	
	    	// while (numcopy > 0) {
	    	// 	numdigits += 1;
	    	// 	numcopy /= 10;
	    	// }
	    	assembly {
	    		for { } gt(numcopy, 0) { numcopy := div(numcopy, 10) } { numdigits := add(numdigits, 1) }
			}

			// convert integer into string format

			// assume number won't be 0, so only handle above 0 case
	        // while (num > 0) {
	        // 	remainder = ((num % 10) + 48);
	        // 	assembly {
	        // 		mstore8(add(stringStart, add(31, sub(numdigits,curdigit))), remainder)
	        // 	}
	        // 	num /= 10;
	        // 	curdigit += 1;
	        // }
	        assembly {
	        	for {} gt(num, 0) {num := div(num, 10)} {
	        		remainder := add(mod(num, 10),  48)
	        		mstore8(add(stringStart, add(31, sub(numdigits,curdigit))), remainder)
	        		curdigit := add(curdigit, 1)
	        	}
	        }

	        assembly {
	    		mstore(stringStart, curdigit)
	    	}
    	}

        return abi.encodePacked("%3Cline%20x1%3D'", vars[0] ,"'%20y1%3D'", vars[1], "'%20x2%3D'", vars[2], "'%20y2%3D'", vars[3], "'%20%2F%3E");

    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"curId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenSeed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","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":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"v","type":"uint256"}],"name":"uintToString","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"}]

60806040526000600c556000600d55604051806101c001604052806101828152602001620062ed6101829139600f90805190602001906200004292919062000f0b565b506040518060800160405280605c815260200162006291605c9139601090805190602001906200007492919062000f0b565b506040518060400160405280601281526020017f253343253246737667253345253232253744000000000000000000000000000081525060119080519060200190620000c292919062000f0b565b50348015620000d057600080fd5b506040518060400160405280601181526020017f467269656e646c79204672616374616c730000000000000000000000000000008152506040518060400160405280600681526020017f46524652414300000000000000000000000000000000000000000000000000008152506200015d62000151620001af60201b60201c565b620001b760201b60201c565b81600190805190602001906200017592919062000f9c565b5080600290805190602001906200018e92919062000f9c565b5050506001600b81905550620001a96200027b60201b60201c565b6200172f565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6002600b541415620002c4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002bb90620014cb565b60405180910390fd5b6002600b8190555061012c600c541062000315576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200030c9062001465565b60405180910390fd5b600d543410156200035d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003549062001443565b60405180910390fd5b6200038062000371620001af60201b60201c565b600c546200049a60201b60201c565b600c544260014362000393919062001577565b40604051602001620003a89392919062001368565b6040516020818303038152906040528051906020012060001c600e6000600c548152602001908152602001600020819055506001600c6000828254620003ef91906200151a565b92505081905550600d543411156200046e57600062000413620001af60201b60201c565b90508073ffffffffffffffffffffffffffffffffffffffff166108fc600d54346200043f919062001577565b9081150290604051600060405180830381858888f193505050501580156200046b573d6000803e3d6000fd5b50505b662386f26fc10000600d60008282546200048991906200151a565b925050819055506001600b81905550565b620004bc828260405180602001604052806000815250620004c060201b60201c565b5050565b620004d283836200052e60201b60201c565b620004e760008484846200071460201b60201c565b62000529576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200052090620013ff565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620005a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200059890620014a9565b60405180910390fd5b620005b281620008ce60201b60201c565b15620005f5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005ec9062001421565b60405180910390fd5b62000609600083836200093a60201b60201c565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200065b91906200151a565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000620007428473ffffffffffffffffffffffffffffffffffffffff166200095760201b620014781760201c565b15620008c1578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0262000774620001af60201b60201c565b8786866040518563ffffffff1660e01b8152600401620007989493929190620013ab565b602060405180830381600087803b158015620007b357600080fd5b505af1925050508015620007e757506040513d601f19601f82011682018060405250810190620007e4919062001063565b60015b62000870573d80600081146200081a576040519150601f19603f3d011682016040523d82523d6000602084013e6200081f565b606091505b5060008151141562000868576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200085f90620013ff565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050620008c6565b600190505b949350505050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b620009528383836200096a60201b6200148b1760201c565b505050565b600080823b905060008111915050919050565b6200098283838362000ab160201b6200159f1760201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415620009cf57620009c98162000ab660201b60201c565b62000a17565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161462000a165762000a15838262000aff60201b60201c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000a645762000a5e8162000c7c60201b60201c565b62000aac565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000aab5762000aaa828262000dc460201b60201c565b5b5b505050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600162000b198462000e5060201b62000d711760201c565b62000b25919062001577565b905060006008600084815260200190815260200160002054905081811462000c0b576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160098054905062000c92919062001577565b90506000600a600084815260200190815260200160002054905060006009838154811062000ce9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806009838154811062000d32577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a600085815260200190815260200160002060009055600980548062000da8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600062000ddc8362000e5060201b62000d711760201c565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000ec4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000ebb9062001487565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b82805462000f19906200165c565b90600052602060002090601f01602090048101928262000f3d576000855562000f89565b82601f1062000f5857805160ff191683800117855562000f89565b8280016001018555821562000f89579182015b8281111562000f8857825182559160200191906001019062000f6b565b5b50905062000f9891906200102d565b5090565b82805462000faa906200165c565b90600052602060002090601f01602090048101928262000fce57600085556200101a565b82601f1062000fe957805160ff19168380011785556200101a565b828001600101855582156200101a579182015b828111156200101957825182559160200191906001019062000ffc565b5b5090506200102991906200102d565b5090565b5b80821115620010485760008160009055506001016200102e565b5090565b6000815190506200105d8162001715565b92915050565b6000602082840312156200107657600080fd5b600062001086848285016200104c565b91505092915050565b6200109a81620015b2565b82525050565b620010b5620010af82620015c6565b62001692565b82525050565b6000620010c882620014ed565b620010d48185620014f8565b9350620010e681856020860162001626565b620010f18162001704565b840191505092915050565b60006200110b60328362001509565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600062001173601c8362001509565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000620011b5602c8362001509565b91507f467269656e646c794672616374616c733a20496e73756666696369656e74207660008301527f616c756520746f206d696e7400000000000000000000000000000000000000006020830152604082019050919050565b60006200121d60208362001509565b91507f467269656e646c794672616374616c733a204d61782033303020746f6b656e736000830152602082019050919050565b60006200125f602a8362001509565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000620012c760208362001509565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600062001309601f8362001509565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b62001347816200161c565b82525050565b620013626200135c826200161c565b6200169c565b82525050565b60006200137682866200134d565b6020820191506200138882856200134d565b6020820191506200139a8284620010a0565b602082019150819050949350505050565b6000608082019050620013c260008301876200108f565b620013d160208301866200108f565b620013e060408301856200133c565b8181036060830152620013f48184620010bb565b905095945050505050565b600060208201905081810360008301526200141a81620010fc565b9050919050565b600060208201905081810360008301526200143c8162001164565b9050919050565b600060208201905081810360008301526200145e81620011a6565b9050919050565b6000602082019050818103600083015262001480816200120e565b9050919050565b60006020820190508181036000830152620014a28162001250565b9050919050565b60006020820190508181036000830152620014c481620012b8565b9050919050565b60006020820190508181036000830152620014e681620012fa565b9050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600062001527826200161c565b915062001534836200161c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156200156c576200156b620016a6565b5b828201905092915050565b600062001584826200161c565b915062001591836200161c565b925082821015620015a757620015a6620016a6565b5b828203905092915050565b6000620015bf82620015fc565b9050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b838110156200164657808201518184015260208101905062001629565b8381111562001656576000848401525b50505050565b600060028204905060018216806200167557607f821691505b602082108114156200168c576200168b620016d5565b5b50919050565b6000819050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b6200172081620015d0565b81146200172c57600080fd5b50565b614b52806200173f6000396000f3fe60806040526004361061014b5760003560e01c80635f516836116100b6578063a22cb4651161006f578063a22cb46514610499578063b88d4fde146104c2578063c87b56dd146104eb578063e8a3d48514610528578063e939567914610553578063e985e9c5146105905761014b565b80635f516836146103615780636352211e1461039e5780636817c76c146103db57806370a08231146104065780638da5cb5b1461044357806395d89b411461046e5761014b565b806323b872dd1161010857806323b872dd146102535780632f745c591461027c57806342842e0e146102b95780634e71d92d146102e25780634f6ccce7146102f95780635b40a584146103365761014b565b806301ffc9a71461015057806306fdde031461018d578063081812fc146101b8578063095ea7b3146101f55780631249c58b1461021e57806318160ddd14610228575b600080fd5b34801561015c57600080fd5b5061017760048036038101906101729190613568565b6105cd565b60405161018491906141c6565b60405180910390f35b34801561019957600080fd5b506101a26105df565b6040516101af91906141e1565b60405180910390f35b3480156101c457600080fd5b506101df60048036038101906101da91906135ba565b610671565b6040516101ec919061415f565b60405180910390f35b34801561020157600080fd5b5061021c6004803603810190610217919061352c565b6106f6565b005b61022661080e565b005b34801561023457600080fd5b5061023d610a00565b60405161024a9190614483565b60405180910390f35b34801561025f57600080fd5b5061027a60048036038101906102759190613426565b610a0d565b005b34801561028857600080fd5b506102a3600480360381019061029e919061352c565b610a6d565b6040516102b09190614483565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db9190613426565b610b12565b005b3480156102ee57600080fd5b506102f7610b32565b005b34801561030557600080fd5b50610320600480360381019061031b91906135ba565b610c04565b60405161032d9190614483565b60405180910390f35b34801561034257600080fd5b5061034b610c9b565b6040516103589190614483565b60405180910390f35b34801561036d57600080fd5b50610388600480360381019061038391906135ba565b610ca1565b6040516103959190614483565b60405180910390f35b3480156103aa57600080fd5b506103c560048036038101906103c091906135ba565b610cb9565b6040516103d2919061415f565b60405180910390f35b3480156103e757600080fd5b506103f0610d6b565b6040516103fd9190614483565b60405180910390f35b34801561041257600080fd5b5061042d600480360381019061042891906133c1565b610d71565b60405161043a9190614483565b60405180910390f35b34801561044f57600080fd5b50610458610e29565b604051610465919061415f565b60405180910390f35b34801561047a57600080fd5b50610483610e52565b60405161049091906141e1565b60405180910390f35b3480156104a557600080fd5b506104c060048036038101906104bb91906134f0565b610ee4565b005b3480156104ce57600080fd5b506104e960048036038101906104e49190613475565b611065565b005b3480156104f757600080fd5b50610512600480360381019061050d91906135ba565b6110c7565b60405161051f91906141e1565b60405180910390f35b34801561053457600080fd5b5061053d611134565b60405161054a91906141e1565b60405180910390f35b34801561055f57600080fd5b5061057a600480360381019061057591906135ba565b611145565b60405161058791906141e1565b60405180910390f35b34801561059c57600080fd5b506105b760048036038101906105b291906133ea565b6113e4565b6040516105c491906141c6565b60405180910390f35b60006105d8826115a4565b9050919050565b6060600180546105ee90614926565b80601f016020809104026020016040519081016040528092919081815260200182805461061a90614926565b80156106675780601f1061063c57610100808354040283529160200191610667565b820191906000526020600020905b81548152906001019060200180831161064a57829003601f168201915b5050505050905090565b600061067c8261161e565b6106bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b290614383565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061070182610cb9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610772576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076990614403565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661079161168a565b73ffffffffffffffffffffffffffffffffffffffff1614806107c057506107bf816107ba61168a565b6113e4565b5b6107ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f690614303565b60405180910390fd5b6108098383611692565b505050565b6002600b541415610854576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084b90614463565b60405180910390fd5b6002600b8190555061012c600c54106108a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089990614283565b60405180910390fd5b600d543410156108e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108de90614263565b60405180910390fd5b6108fa6108f261168a565b600c5461174b565b600c544260014361090b9190614828565b4060405160200161091e93929190614122565b6040516020818303038152906040528051906020012060001c600e6000600c548152602001908152602001600020819055506001600c600082825461096391906145d6565b92505081905550600d543411156109d657600061097e61168a565b90508073ffffffffffffffffffffffffffffffffffffffff166108fc600d54346109a89190614828565b9081150290604051600060405180830381858888f193505050501580156109d3573d6000803e3d6000fd5b50505b662386f26fc10000600d60008282546109ef91906145d6565b925050819055506001600b81905550565b6000600980549050905090565b610a1e610a1861168a565b82611769565b610a5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5490614423565b60405180910390fd5b610a68838383611847565b505050565b6000610a7883610d71565b8210610ab9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab090614203565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610b2d83838360405180602001604052806000815250611065565b505050565b610b3a61168a565b73ffffffffffffffffffffffffffffffffffffffff16610b58610e29565b73ffffffffffffffffffffffffffffffffffffffff1614610bae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba5906143a3565b60405180910390fd5b6000610bb8610e29565b90508073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610c00573d6000803e3d6000fd5b5050565b6000610c0e610a00565b8210610c4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4690614443565b60405180910390fd5b60098281548110610c89577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b600c5481565b600e6020528060005260406000206000915090505481565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5990614343565b60405180910390fd5b80915050919050565b600d5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610de2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd990614323565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060028054610e6190614926565b80601f0160208091040260200160405190810160405280929190818152602001828054610e8d90614926565b8015610eda5780601f10610eaf57610100808354040283529160200191610eda565b820191906000526020600020905b815481529060010190602001808311610ebd57829003601f168201915b5050505050905090565b610eec61168a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f51906142c3565b60405180910390fd5b8060066000610f6761168a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661101461168a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161105991906141c6565b60405180910390a35050565b61107661107061168a565b83611769565b6110b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ac90614423565b60405180910390fd5b6110c184848484611aa3565b50505050565b60606110d28261161e565b611111576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611108906143e3565b60405180910390fd5b61112d600e600084815260200190815260200160002054611aff565b9050919050565b606061114060006110c7565b905090565b606060006008905060008167ffffffffffffffff81111561118f577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156111c15781602001600182028036833780820191505090505b50905060005b60008514611279576000600a866111de91906149b5565b9050600a866111ed919061462c565b95508060306111fc91906145d6565b60f81b83838061120b90614958565b945081518110611244577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350506111c7565b60008167ffffffffffffffff8111156112bb577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156112ed5781602001600182028036833780820191505090505b50905060005b828110156113d157836001828561130a9190614828565b6113149190614828565b8151811061134b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b82828151811061138f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806113c990614958565b9150506112f3565b5060008190508095505050505050919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600080823b905060008111915050919050565b61149683838361159f565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156114d9576114d48161220d565b611518565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611517576115168382612256565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561155b57611556816123c3565b61159a565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611599576115988282612506565b5b5b505050565b505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611617575061161682612585565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661170583610cb9565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611765828260405180602001604052806000815250612667565b5050565b60006117748261161e565b6117b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117aa906142e3565b60405180910390fd5b60006117be83610cb9565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061182d57508373ffffffffffffffffffffffffffffffffffffffff1661181584610671565b73ffffffffffffffffffffffffffffffffffffffff16145b8061183e575061183d81856113e4565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661186782610cb9565b73ffffffffffffffffffffffffffffffffffffffff16146118bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b4906143c3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561192d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611924906142a3565b60405180910390fd5b6119388383836126c2565b611943600082611692565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119939190614828565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119ea91906145d6565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611aae848484611847565b611aba848484846126d2565b611af9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af090614223565b60405180910390fd5b50505050565b6060600060089050600060405180608001604052806040518060400160405280600781526020017f313030303030300000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f313030303030300000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f313030303030300000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f3130303030303000000000000000000000000000000000000000000000000000815250815250905083604051602001611c119190614107565b6040516020818303038152906040528051906020012060001c93506000600285611c3b91906149b5565b6001611c4791906145d6565b9050600060018085611c5991906145d6565b6002611c6591906146b0565b611c6f9190614828565b67ffffffffffffffff811115611cae577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611cdc5781602001602082028036833780820191505090505b509050611cf3866000806188b88061753080612869565b81600081518110611d2d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505060005b6001856002611d4b91906146b0565b611d559190614828565b811015611ec157611da8828281518110611d98577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516001856128fa565b826001836002611db891906147ce565b611dc291906145d6565b81518110611df9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050611e51828281518110611e41577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516000856128fa565b826002836002611e6191906147ce565b611e6b91906145d6565b81518110611ea2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080611eb990614958565b915050611d3c565b506000610226856002611ed491906146b0565b6054611ee091906147ce565b611eea91906145d6565b67ffffffffffffffff811115611f29577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611f5b5781602001600182028036833780820191505090505b5090506060602082019050600080611ffd83600f8054611f7a90614926565b80601f0160208091040260200160405190810160405280929190818152602001828054611fa690614926565b8015611ff35780601f10611fc857610100808354040283529160200191611ff3565b820191906000526020600020905b815481529060010190602001808311611fd657829003601f168201915b5050505050612c42565b8094508192505050808261201191906145d6565b9150612025836120208c612ca0565b612c42565b8094508192505050808261203991906145d6565b91506120cf836010805461204c90614926565b80601f016020809104026020016040519081016040528092919081815260200182805461207890614926565b80156120c55780601f1061209a576101008083540402835291602001916120c5565b820191906000526020600020905b8154815290600101906020018083116120a857829003601f168201915b5050505050612c42565b809450819250505080826120e391906145d6565b9150600060018960026120f691906146b0565b6121009190614828565b90505b855181101561214f57600061211987838b612dc4565b90506121258582612c42565b8096508194505050828461213991906145d6565b935050808061214790614958565b915050612103565b506121e4836011805461216190614926565b80601f016020809104026020016040519081016040528092919081815260200182805461218d90614926565b80156121da5780601f106121af576101008083540402835291602001916121da565b820191906000526020600020905b8154815290600101906020018083116121bd57829003601f168201915b5050505050612c42565b809450819250505080826121f891906145d6565b91508184528398505050505050505050919050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161226384610d71565b61226d9190614828565b9050600060086000848152602001908152602001600020549050818114612352576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016009805490506123d79190614828565b90506000600a600084815260200190815260200160002054905060006009838154811061242d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060098381548110612475577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a60008581526020019081526020016000206000905560098054806124ea577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061251183610d71565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061265057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612660575061265f82613041565b5b9050919050565b61267183836130ab565b61267e60008484846126d2565b6126bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b490614223565b60405180910390fd5b505050565b6126cd83838361148b565b505050565b60006126f38473ffffffffffffffffffffffffffffffffffffffff16611478565b1561285c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261271c61168a565b8786866040518563ffffffff1660e01b815260040161273e949392919061417a565b602060405180830381600087803b15801561275857600080fd5b505af192505050801561278957506040513d601f19601f820116820180604052508101906127869190613591565b60015b61280c573d80600081146127b9576040519150601f19603f3d011682016040523d82523d6000602084013e6127be565b606091505b50600081511415612804576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127fb90614223565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612861565b600190505b949350505050565b6000806000905063ffffffff831681179050602081901b905063ffffffff841681179050602081901b905063ffffffff851681179050602081901b905063ffffffff861681179050602081901b905063ffffffff871681179050602081901b905063ffffffff881681179050604081901b905067ffffffffffffffff89168117905080915050979650505050505050565b60008060008060008060008061290f8b613279565b809750819850829950839a50849c50859b50869d505050505050505060008614156129b657866040516020016129459190614107565b6040516020818303038152906040528051906020012060001c965060048761296d91906149b5565b8961297891906145d6565b95508660405160200161298b9190614107565b6040516020818303038152906040528051906020012060001c96506009876129b391906149b5565b94505b600061373e905060006127109050600080600080858587878a020588888c02050302059350858587878a020588888c02050102059250858587878a020588888c02050102059150858587878a020588888c19600101020501020590508f8015612a1f575060038b145b80612a4a57508f158015612a49575060008b1480612a3d575060048b145b80612a48575060088b145b5b5b15612a5e57878a0199508689019850612acc565b60068b1480612a8257508f158015612a81575060018b1480612a80575060038b145b5b5b15612a9657838a0199508289019850612acb565b8f158015612aba575060028b1480612aae575060058b145b80612ab9575060078b145b5b15612aca57818a01995080890198505b5b5b8f8015612b05575060008b1480612ae3575060018b145b80612aee575060048b145b80612af9575060058b145b80612b04575060078b145b5b80612b2557508f158015612b24575060028b1480612b23575060058b145b5b5b15612b3557839750829650612c11565b8f8015612b42575060068b145b80612b6257508f158015612b61575060038b1480612b60575060048b145b5b5b15612b7a578319600101975082196001019650612c10565b8f8015612b92575060028b1480612b91575060088b145b5b80612bb257508f158015612bb1575060018b1480612bb0575060068b145b5b5b15612bc257819750809650612c0f565b8f8015612bcf575060038b145b80612bfa57508f158015612bf9575060008b1480612bed575060078b145b80612bf8575060088b145b5b5b15612c0e5781196001019750801960010196505b5b5b5b612c2c8d8c60018f612c239190614828565b8d8d8d8d612869565b9d50505050505050505050505050509392505050565b6000606060006020601f8551612c5891906145d6565b612c62919061462c565b90508351925084915060005b81811015612c92578060010160200285015181602002840152806001019050612c6e565b508282019150509250929050565b606081604051602001612cb39190614107565b6040516020818303038152906040528051906020012060001c9150600061016783612cde91906149b5565b6001612cea91906145d6565b905082604051602001612cfd9190614107565b6040516020818303038152906040528051906020012060001c92506000601684612d2791906149b5565b6041612d3391906145d6565b905083604051602001612d469190614107565b6040516020818303038152906040528051906020012060001c93506000601685612d7091906149b5565b6041612d7c91906145d6565b9050612d8783611145565b612d9083611145565b612d9983611145565b604051602001612dab93929190614035565b6040516020818303038152906040529350505050919050565b60606000806000806000612e17898981518110612e0a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151613279565b90919293949550909192939450909192935080945081955082965083975050505050600080606060005b6004811015612f11576000935060009250600080821415612e6457889050612ea2565b6001821415612e7557879050612ea1565b6002821415612e91578689612e8a9190614542565b9050612ea0565b8588612e9d9190614542565b90505b5b5b816020028c0151925060008190505b6000811115612ecb57600185019450600a81049050612eb1565b5b6000821115612ef9576030600a8306019a508a868603601f01850153600186019550600a82049150612ecc565b85845250508080612f0990614958565b915050612e41565b5089600060048110612f4c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201518a600160048110612f8b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201518b600260048110612fca577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201518c600360048110613009577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201516040516020016130219493929190614092565b604051602081830303815290604052985050505050505050509392505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561311b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161311290614363565b60405180910390fd5b6131248161161e565b15613164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315b90614243565b60405180910390fd5b613170600083836126c2565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131c091906145d6565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080600080600080600067ffffffffffffffff88169650604088901c975063ffffffff88169550602088901c975063ffffffff88169450602088901c97508760030b9350602088901c97508760030b9250602088901c97508760030b9150602088901c97508760030b9050919395979092949650565b60006133036132fe846144cf565b61449e565b90508281526020810184848401111561331b57600080fd5b6133268482856148e4565b509392505050565b60008135905061333d81614ac0565b92915050565b60008135905061335281614ad7565b92915050565b60008135905061336781614aee565b92915050565b60008151905061337c81614aee565b92915050565b600082601f83011261339357600080fd5b81356133a38482602086016132f0565b91505092915050565b6000813590506133bb81614b05565b92915050565b6000602082840312156133d357600080fd5b60006133e18482850161332e565b91505092915050565b600080604083850312156133fd57600080fd5b600061340b8582860161332e565b925050602061341c8582860161332e565b9150509250929050565b60008060006060848603121561343b57600080fd5b60006134498682870161332e565b935050602061345a8682870161332e565b925050604061346b868287016133ac565b9150509250925092565b6000806000806080858703121561348b57600080fd5b60006134998782880161332e565b94505060206134aa8782880161332e565b93505060406134bb878288016133ac565b925050606085013567ffffffffffffffff8111156134d857600080fd5b6134e487828801613382565b91505092959194509250565b6000806040838503121561350357600080fd5b60006135118582860161332e565b925050602061352285828601613343565b9150509250929050565b6000806040838503121561353f57600080fd5b600061354d8582860161332e565b925050602061355e858286016133ac565b9150509250929050565b60006020828403121561357a57600080fd5b600061358884828501613358565b91505092915050565b6000602082840312156135a357600080fd5b60006135b18482850161336d565b91505092915050565b6000602082840312156135cc57600080fd5b60006135da848285016133ac565b91505092915050565b6135ec8161485c565b82525050565b6135fb8161486e565b82525050565b61361261360d8261487a565b6149a1565b82525050565b6000613623826144ff565b61362d8185614515565b935061363d8185602086016148f3565b61364681614aa2565b840191505092915050565b600061365c8261450a565b6136668185614526565b93506136768185602086016148f3565b61367f81614aa2565b840191505092915050565b60006136958261450a565b61369f8185614537565b93506136af8185602086016148f3565b80840191505092915050565b60006136c8602b83614526565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b600061372e603283614526565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613794601c83614526565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006137d4602c83614526565b91507f467269656e646c794672616374616c733a20496e73756666696369656e74207660008301527f616c756520746f206d696e7400000000000000000000000000000000000000006020830152604082019050919050565b600061383a600a83614537565b91507f27253230793125334427000000000000000000000000000000000000000000006000830152600a82019050919050565b600061387a602083614526565b91507f467269656e646c794672616374616c733a204d61782033303020746f6b656e736000830152602082019050919050565b60006138ba602483614526565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613920601983614526565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613960600a83614537565b91507f27253230253246253345000000000000000000000000000000000000000000006000830152600a82019050919050565b60006139a0600a83614537565b91507f27253230793225334427000000000000000000000000000000000000000000006000830152600a82019050919050565b60006139e0602c83614526565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613a46603883614526565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613aac602a83614526565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b12600683614537565b91507f25323525324300000000000000000000000000000000000000000000000000006000830152600682019050919050565b6000613b52602983614526565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613bb8602083614526565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613bf8602c83614526565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613c5e602083614526565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613c9e602983614526565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d04602f83614526565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613d6a600d83614537565b91507f7374726f6b6525334168736c28000000000000000000000000000000000000006000830152600d82019050919050565b6000613daa602183614526565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e10600783614537565b91507f25323529253342000000000000000000000000000000000000000000000000006000830152600782019050919050565b6000613e50603183614526565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613eb6602c83614526565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000613f1c601083614537565b91507f2533436c696e65253230783125334427000000000000000000000000000000006000830152601082019050919050565b6000613f5c600a83614537565b91507f27253230783225334427000000000000000000000000000000000000000000006000830152600a82019050919050565b6000613f9c601f83614526565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b6000613fdc600383614537565b91507f25324300000000000000000000000000000000000000000000000000000000006000830152600382019050919050565b614018816148da565b82525050565b61402f61402a826148da565b6149ab565b82525050565b600061404082613d5d565b915061404c828661368a565b915061405782613fcf565b9150614063828561368a565b915061406e82613b05565b915061407a828461368a565b915061408582613e03565b9150819050949350505050565b600061409d82613f0f565b91506140a9828761368a565b91506140b48261382d565b91506140c0828661368a565b91506140cb82613f4f565b91506140d7828561368a565b91506140e282613993565b91506140ee828461368a565b91506140f982613953565b915081905095945050505050565b6000614113828461401e565b60208201915081905092915050565b600061412e828661401e565b60208201915061413e828561401e565b60208201915061414e8284613601565b602082019150819050949350505050565b600060208201905061417460008301846135e3565b92915050565b600060808201905061418f60008301876135e3565b61419c60208301866135e3565b6141a9604083018561400f565b81810360608301526141bb8184613618565b905095945050505050565b60006020820190506141db60008301846135f2565b92915050565b600060208201905081810360008301526141fb8184613651565b905092915050565b6000602082019050818103600083015261421c816136bb565b9050919050565b6000602082019050818103600083015261423c81613721565b9050919050565b6000602082019050818103600083015261425c81613787565b9050919050565b6000602082019050818103600083015261427c816137c7565b9050919050565b6000602082019050818103600083015261429c8161386d565b9050919050565b600060208201905081810360008301526142bc816138ad565b9050919050565b600060208201905081810360008301526142dc81613913565b9050919050565b600060208201905081810360008301526142fc816139d3565b9050919050565b6000602082019050818103600083015261431c81613a39565b9050919050565b6000602082019050818103600083015261433c81613a9f565b9050919050565b6000602082019050818103600083015261435c81613b45565b9050919050565b6000602082019050818103600083015261437c81613bab565b9050919050565b6000602082019050818103600083015261439c81613beb565b9050919050565b600060208201905081810360008301526143bc81613c51565b9050919050565b600060208201905081810360008301526143dc81613c91565b9050919050565b600060208201905081810360008301526143fc81613cf7565b9050919050565b6000602082019050818103600083015261441c81613d9d565b9050919050565b6000602082019050818103600083015261443c81613e43565b9050919050565b6000602082019050818103600083015261445c81613ea9565b9050919050565b6000602082019050818103600083015261447c81613f8f565b9050919050565b6000602082019050614498600083018461400f565b92915050565b6000604051905081810181811067ffffffffffffffff821117156144c5576144c4614a73565b5b8060405250919050565b600067ffffffffffffffff8211156144ea576144e9614a73565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061454d826148b0565b9150614558836148b0565b9250817f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03831360008312151615614593576145926149e6565b5b817f80000000000000000000000000000000000000000000000000000000000000000383126000831216156145cb576145ca6149e6565b5b828201905092915050565b60006145e1826148da565b91506145ec836148da565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614621576146206149e6565b5b828201905092915050565b6000614637826148da565b9150614642836148da565b92508261465257614651614a15565b5b828204905092915050565b6000808291508390505b60018511156146a757808604811115614683576146826149e6565b5b60018516156146925780820291505b80810290506146a085614ab3565b9450614667565b94509492505050565b60006146bb826148da565b91506146c6836148da565b92506146f37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846146fb565b905092915050565b60008261470b57600190506147c7565b8161471957600090506147c7565b816001811461472f576002811461473957614768565b60019150506147c7565b60ff84111561474b5761474a6149e6565b5b8360020a915084821115614762576147616149e6565b5b506147c7565b5060208310610133831016604e8410600b841016171561479d5782820a905083811115614798576147976149e6565b5b6147c7565b6147aa848484600161465d565b925090508184048111156147c1576147c06149e6565b5b81810290505b9392505050565b60006147d9826148da565b91506147e4836148da565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561481d5761481c6149e6565b5b828202905092915050565b6000614833826148da565b915061483e836148da565b925082821015614851576148506149e6565b5b828203905092915050565b6000614867826148ba565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156149115780820151818401526020810190506148f6565b83811115614920576000848401525b50505050565b6000600282049050600182168061493e57607f821691505b6020821081141561495257614951614a44565b5b50919050565b6000614963826148da565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614996576149956149e6565b5b600182019050919050565b6000819050919050565b6000819050919050565b60006149c0826148da565b91506149cb836148da565b9250826149db576149da614a15565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b614ac98161485c565b8114614ad457600080fd5b50565b614ae08161486e565b8114614aeb57600080fd5b50565b614af781614884565b8114614b0257600080fd5b50565b614b0e816148da565b8114614b1957600080fd5b5056fea2646970667358221220799284b389ca3ea803faff9564ff43f7baca5901e2b5feab5435e39f5a7732f964736f6c634300080000332532306261636b67726f756e642d636f6c6f72253341726762283530253243353025324335302927253230786d6c6e7325334427687474702533412532462532467777772e77332e6f72672532463230303025324673766727253345646174613a6170706c69636174696f6e2f6a736f6e3b636861727365743d7574662d382c2537422532326e616d65253232253341253230253232467269656e646c792532304672616374616c732532322532432532326465736372697074696f6e25323225334125323025323246756c6c792532306f6e2d636861696e25323067656e657261746976652532306672616374616c2532307061747465726e7325323062617365642532306f6e253230746865253230647261676f6e25323063757276652e253232253243253232696d61676525323225334125323025323264617461253341696d616765253246737667253242786d6c253342636861727365742533447574662d3825324325334373766725323077696474682533442731303025323527253230686569676874253344273130302532352725323076696577426f78253344273025323030253230313030303030253230313030303030272532307374796c65253344277374726f6b652d7769647468253341343030253342253230

Deployed Bytecode

0x60806040526004361061014b5760003560e01c80635f516836116100b6578063a22cb4651161006f578063a22cb46514610499578063b88d4fde146104c2578063c87b56dd146104eb578063e8a3d48514610528578063e939567914610553578063e985e9c5146105905761014b565b80635f516836146103615780636352211e1461039e5780636817c76c146103db57806370a08231146104065780638da5cb5b1461044357806395d89b411461046e5761014b565b806323b872dd1161010857806323b872dd146102535780632f745c591461027c57806342842e0e146102b95780634e71d92d146102e25780634f6ccce7146102f95780635b40a584146103365761014b565b806301ffc9a71461015057806306fdde031461018d578063081812fc146101b8578063095ea7b3146101f55780631249c58b1461021e57806318160ddd14610228575b600080fd5b34801561015c57600080fd5b5061017760048036038101906101729190613568565b6105cd565b60405161018491906141c6565b60405180910390f35b34801561019957600080fd5b506101a26105df565b6040516101af91906141e1565b60405180910390f35b3480156101c457600080fd5b506101df60048036038101906101da91906135ba565b610671565b6040516101ec919061415f565b60405180910390f35b34801561020157600080fd5b5061021c6004803603810190610217919061352c565b6106f6565b005b61022661080e565b005b34801561023457600080fd5b5061023d610a00565b60405161024a9190614483565b60405180910390f35b34801561025f57600080fd5b5061027a60048036038101906102759190613426565b610a0d565b005b34801561028857600080fd5b506102a3600480360381019061029e919061352c565b610a6d565b6040516102b09190614483565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db9190613426565b610b12565b005b3480156102ee57600080fd5b506102f7610b32565b005b34801561030557600080fd5b50610320600480360381019061031b91906135ba565b610c04565b60405161032d9190614483565b60405180910390f35b34801561034257600080fd5b5061034b610c9b565b6040516103589190614483565b60405180910390f35b34801561036d57600080fd5b50610388600480360381019061038391906135ba565b610ca1565b6040516103959190614483565b60405180910390f35b3480156103aa57600080fd5b506103c560048036038101906103c091906135ba565b610cb9565b6040516103d2919061415f565b60405180910390f35b3480156103e757600080fd5b506103f0610d6b565b6040516103fd9190614483565b60405180910390f35b34801561041257600080fd5b5061042d600480360381019061042891906133c1565b610d71565b60405161043a9190614483565b60405180910390f35b34801561044f57600080fd5b50610458610e29565b604051610465919061415f565b60405180910390f35b34801561047a57600080fd5b50610483610e52565b60405161049091906141e1565b60405180910390f35b3480156104a557600080fd5b506104c060048036038101906104bb91906134f0565b610ee4565b005b3480156104ce57600080fd5b506104e960048036038101906104e49190613475565b611065565b005b3480156104f757600080fd5b50610512600480360381019061050d91906135ba565b6110c7565b60405161051f91906141e1565b60405180910390f35b34801561053457600080fd5b5061053d611134565b60405161054a91906141e1565b60405180910390f35b34801561055f57600080fd5b5061057a600480360381019061057591906135ba565b611145565b60405161058791906141e1565b60405180910390f35b34801561059c57600080fd5b506105b760048036038101906105b291906133ea565b6113e4565b6040516105c491906141c6565b60405180910390f35b60006105d8826115a4565b9050919050565b6060600180546105ee90614926565b80601f016020809104026020016040519081016040528092919081815260200182805461061a90614926565b80156106675780601f1061063c57610100808354040283529160200191610667565b820191906000526020600020905b81548152906001019060200180831161064a57829003601f168201915b5050505050905090565b600061067c8261161e565b6106bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b290614383565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061070182610cb9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610772576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076990614403565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661079161168a565b73ffffffffffffffffffffffffffffffffffffffff1614806107c057506107bf816107ba61168a565b6113e4565b5b6107ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f690614303565b60405180910390fd5b6108098383611692565b505050565b6002600b541415610854576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084b90614463565b60405180910390fd5b6002600b8190555061012c600c54106108a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089990614283565b60405180910390fd5b600d543410156108e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108de90614263565b60405180910390fd5b6108fa6108f261168a565b600c5461174b565b600c544260014361090b9190614828565b4060405160200161091e93929190614122565b6040516020818303038152906040528051906020012060001c600e6000600c548152602001908152602001600020819055506001600c600082825461096391906145d6565b92505081905550600d543411156109d657600061097e61168a565b90508073ffffffffffffffffffffffffffffffffffffffff166108fc600d54346109a89190614828565b9081150290604051600060405180830381858888f193505050501580156109d3573d6000803e3d6000fd5b50505b662386f26fc10000600d60008282546109ef91906145d6565b925050819055506001600b81905550565b6000600980549050905090565b610a1e610a1861168a565b82611769565b610a5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5490614423565b60405180910390fd5b610a68838383611847565b505050565b6000610a7883610d71565b8210610ab9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab090614203565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610b2d83838360405180602001604052806000815250611065565b505050565b610b3a61168a565b73ffffffffffffffffffffffffffffffffffffffff16610b58610e29565b73ffffffffffffffffffffffffffffffffffffffff1614610bae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba5906143a3565b60405180910390fd5b6000610bb8610e29565b90508073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610c00573d6000803e3d6000fd5b5050565b6000610c0e610a00565b8210610c4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4690614443565b60405180910390fd5b60098281548110610c89577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b600c5481565b600e6020528060005260406000206000915090505481565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5990614343565b60405180910390fd5b80915050919050565b600d5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610de2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd990614323565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060028054610e6190614926565b80601f0160208091040260200160405190810160405280929190818152602001828054610e8d90614926565b8015610eda5780601f10610eaf57610100808354040283529160200191610eda565b820191906000526020600020905b815481529060010190602001808311610ebd57829003601f168201915b5050505050905090565b610eec61168a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f51906142c3565b60405180910390fd5b8060066000610f6761168a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661101461168a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161105991906141c6565b60405180910390a35050565b61107661107061168a565b83611769565b6110b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ac90614423565b60405180910390fd5b6110c184848484611aa3565b50505050565b60606110d28261161e565b611111576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611108906143e3565b60405180910390fd5b61112d600e600084815260200190815260200160002054611aff565b9050919050565b606061114060006110c7565b905090565b606060006008905060008167ffffffffffffffff81111561118f577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156111c15781602001600182028036833780820191505090505b50905060005b60008514611279576000600a866111de91906149b5565b9050600a866111ed919061462c565b95508060306111fc91906145d6565b60f81b83838061120b90614958565b945081518110611244577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350506111c7565b60008167ffffffffffffffff8111156112bb577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156112ed5781602001600182028036833780820191505090505b50905060005b828110156113d157836001828561130a9190614828565b6113149190614828565b8151811061134b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b82828151811061138f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806113c990614958565b9150506112f3565b5060008190508095505050505050919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600080823b905060008111915050919050565b61149683838361159f565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156114d9576114d48161220d565b611518565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611517576115168382612256565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561155b57611556816123c3565b61159a565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611599576115988282612506565b5b5b505050565b505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611617575061161682612585565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661170583610cb9565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611765828260405180602001604052806000815250612667565b5050565b60006117748261161e565b6117b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117aa906142e3565b60405180910390fd5b60006117be83610cb9565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061182d57508373ffffffffffffffffffffffffffffffffffffffff1661181584610671565b73ffffffffffffffffffffffffffffffffffffffff16145b8061183e575061183d81856113e4565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661186782610cb9565b73ffffffffffffffffffffffffffffffffffffffff16146118bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b4906143c3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561192d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611924906142a3565b60405180910390fd5b6119388383836126c2565b611943600082611692565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119939190614828565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119ea91906145d6565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611aae848484611847565b611aba848484846126d2565b611af9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af090614223565b60405180910390fd5b50505050565b6060600060089050600060405180608001604052806040518060400160405280600781526020017f313030303030300000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f313030303030300000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f313030303030300000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f3130303030303000000000000000000000000000000000000000000000000000815250815250905083604051602001611c119190614107565b6040516020818303038152906040528051906020012060001c93506000600285611c3b91906149b5565b6001611c4791906145d6565b9050600060018085611c5991906145d6565b6002611c6591906146b0565b611c6f9190614828565b67ffffffffffffffff811115611cae577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611cdc5781602001602082028036833780820191505090505b509050611cf3866000806188b88061753080612869565b81600081518110611d2d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505060005b6001856002611d4b91906146b0565b611d559190614828565b811015611ec157611da8828281518110611d98577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516001856128fa565b826001836002611db891906147ce565b611dc291906145d6565b81518110611df9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050611e51828281518110611e41577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516000856128fa565b826002836002611e6191906147ce565b611e6b91906145d6565b81518110611ea2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080611eb990614958565b915050611d3c565b506000610226856002611ed491906146b0565b6054611ee091906147ce565b611eea91906145d6565b67ffffffffffffffff811115611f29577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611f5b5781602001600182028036833780820191505090505b5090506060602082019050600080611ffd83600f8054611f7a90614926565b80601f0160208091040260200160405190810160405280929190818152602001828054611fa690614926565b8015611ff35780601f10611fc857610100808354040283529160200191611ff3565b820191906000526020600020905b815481529060010190602001808311611fd657829003601f168201915b5050505050612c42565b8094508192505050808261201191906145d6565b9150612025836120208c612ca0565b612c42565b8094508192505050808261203991906145d6565b91506120cf836010805461204c90614926565b80601f016020809104026020016040519081016040528092919081815260200182805461207890614926565b80156120c55780601f1061209a576101008083540402835291602001916120c5565b820191906000526020600020905b8154815290600101906020018083116120a857829003601f168201915b5050505050612c42565b809450819250505080826120e391906145d6565b9150600060018960026120f691906146b0565b6121009190614828565b90505b855181101561214f57600061211987838b612dc4565b90506121258582612c42565b8096508194505050828461213991906145d6565b935050808061214790614958565b915050612103565b506121e4836011805461216190614926565b80601f016020809104026020016040519081016040528092919081815260200182805461218d90614926565b80156121da5780601f106121af576101008083540402835291602001916121da565b820191906000526020600020905b8154815290600101906020018083116121bd57829003601f168201915b5050505050612c42565b809450819250505080826121f891906145d6565b91508184528398505050505050505050919050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161226384610d71565b61226d9190614828565b9050600060086000848152602001908152602001600020549050818114612352576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016009805490506123d79190614828565b90506000600a600084815260200190815260200160002054905060006009838154811061242d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060098381548110612475577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a60008581526020019081526020016000206000905560098054806124ea577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061251183610d71565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061265057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612660575061265f82613041565b5b9050919050565b61267183836130ab565b61267e60008484846126d2565b6126bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b490614223565b60405180910390fd5b505050565b6126cd83838361148b565b505050565b60006126f38473ffffffffffffffffffffffffffffffffffffffff16611478565b1561285c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261271c61168a565b8786866040518563ffffffff1660e01b815260040161273e949392919061417a565b602060405180830381600087803b15801561275857600080fd5b505af192505050801561278957506040513d601f19601f820116820180604052508101906127869190613591565b60015b61280c573d80600081146127b9576040519150601f19603f3d011682016040523d82523d6000602084013e6127be565b606091505b50600081511415612804576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127fb90614223565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612861565b600190505b949350505050565b6000806000905063ffffffff831681179050602081901b905063ffffffff841681179050602081901b905063ffffffff851681179050602081901b905063ffffffff861681179050602081901b905063ffffffff871681179050602081901b905063ffffffff881681179050604081901b905067ffffffffffffffff89168117905080915050979650505050505050565b60008060008060008060008061290f8b613279565b809750819850829950839a50849c50859b50869d505050505050505060008614156129b657866040516020016129459190614107565b6040516020818303038152906040528051906020012060001c965060048761296d91906149b5565b8961297891906145d6565b95508660405160200161298b9190614107565b6040516020818303038152906040528051906020012060001c96506009876129b391906149b5565b94505b600061373e905060006127109050600080600080858587878a020588888c02050302059350858587878a020588888c02050102059250858587878a020588888c02050102059150858587878a020588888c19600101020501020590508f8015612a1f575060038b145b80612a4a57508f158015612a49575060008b1480612a3d575060048b145b80612a48575060088b145b5b5b15612a5e57878a0199508689019850612acc565b60068b1480612a8257508f158015612a81575060018b1480612a80575060038b145b5b5b15612a9657838a0199508289019850612acb565b8f158015612aba575060028b1480612aae575060058b145b80612ab9575060078b145b5b15612aca57818a01995080890198505b5b5b8f8015612b05575060008b1480612ae3575060018b145b80612aee575060048b145b80612af9575060058b145b80612b04575060078b145b5b80612b2557508f158015612b24575060028b1480612b23575060058b145b5b5b15612b3557839750829650612c11565b8f8015612b42575060068b145b80612b6257508f158015612b61575060038b1480612b60575060048b145b5b5b15612b7a578319600101975082196001019650612c10565b8f8015612b92575060028b1480612b91575060088b145b5b80612bb257508f158015612bb1575060018b1480612bb0575060068b145b5b5b15612bc257819750809650612c0f565b8f8015612bcf575060038b145b80612bfa57508f158015612bf9575060008b1480612bed575060078b145b80612bf8575060088b145b5b5b15612c0e5781196001019750801960010196505b5b5b5b612c2c8d8c60018f612c239190614828565b8d8d8d8d612869565b9d50505050505050505050505050509392505050565b6000606060006020601f8551612c5891906145d6565b612c62919061462c565b90508351925084915060005b81811015612c92578060010160200285015181602002840152806001019050612c6e565b508282019150509250929050565b606081604051602001612cb39190614107565b6040516020818303038152906040528051906020012060001c9150600061016783612cde91906149b5565b6001612cea91906145d6565b905082604051602001612cfd9190614107565b6040516020818303038152906040528051906020012060001c92506000601684612d2791906149b5565b6041612d3391906145d6565b905083604051602001612d469190614107565b6040516020818303038152906040528051906020012060001c93506000601685612d7091906149b5565b6041612d7c91906145d6565b9050612d8783611145565b612d9083611145565b612d9983611145565b604051602001612dab93929190614035565b6040516020818303038152906040529350505050919050565b60606000806000806000612e17898981518110612e0a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151613279565b90919293949550909192939450909192935080945081955082965083975050505050600080606060005b6004811015612f11576000935060009250600080821415612e6457889050612ea2565b6001821415612e7557879050612ea1565b6002821415612e91578689612e8a9190614542565b9050612ea0565b8588612e9d9190614542565b90505b5b5b816020028c0151925060008190505b6000811115612ecb57600185019450600a81049050612eb1565b5b6000821115612ef9576030600a8306019a508a868603601f01850153600186019550600a82049150612ecc565b85845250508080612f0990614958565b915050612e41565b5089600060048110612f4c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201518a600160048110612f8b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201518b600260048110612fca577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201518c600360048110613009577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201516040516020016130219493929190614092565b604051602081830303815290604052985050505050505050509392505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561311b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161311290614363565b60405180910390fd5b6131248161161e565b15613164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315b90614243565b60405180910390fd5b613170600083836126c2565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131c091906145d6565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080600080600080600067ffffffffffffffff88169650604088901c975063ffffffff88169550602088901c975063ffffffff88169450602088901c97508760030b9350602088901c97508760030b9250602088901c97508760030b9150602088901c97508760030b9050919395979092949650565b60006133036132fe846144cf565b61449e565b90508281526020810184848401111561331b57600080fd5b6133268482856148e4565b509392505050565b60008135905061333d81614ac0565b92915050565b60008135905061335281614ad7565b92915050565b60008135905061336781614aee565b92915050565b60008151905061337c81614aee565b92915050565b600082601f83011261339357600080fd5b81356133a38482602086016132f0565b91505092915050565b6000813590506133bb81614b05565b92915050565b6000602082840312156133d357600080fd5b60006133e18482850161332e565b91505092915050565b600080604083850312156133fd57600080fd5b600061340b8582860161332e565b925050602061341c8582860161332e565b9150509250929050565b60008060006060848603121561343b57600080fd5b60006134498682870161332e565b935050602061345a8682870161332e565b925050604061346b868287016133ac565b9150509250925092565b6000806000806080858703121561348b57600080fd5b60006134998782880161332e565b94505060206134aa8782880161332e565b93505060406134bb878288016133ac565b925050606085013567ffffffffffffffff8111156134d857600080fd5b6134e487828801613382565b91505092959194509250565b6000806040838503121561350357600080fd5b60006135118582860161332e565b925050602061352285828601613343565b9150509250929050565b6000806040838503121561353f57600080fd5b600061354d8582860161332e565b925050602061355e858286016133ac565b9150509250929050565b60006020828403121561357a57600080fd5b600061358884828501613358565b91505092915050565b6000602082840312156135a357600080fd5b60006135b18482850161336d565b91505092915050565b6000602082840312156135cc57600080fd5b60006135da848285016133ac565b91505092915050565b6135ec8161485c565b82525050565b6135fb8161486e565b82525050565b61361261360d8261487a565b6149a1565b82525050565b6000613623826144ff565b61362d8185614515565b935061363d8185602086016148f3565b61364681614aa2565b840191505092915050565b600061365c8261450a565b6136668185614526565b93506136768185602086016148f3565b61367f81614aa2565b840191505092915050565b60006136958261450a565b61369f8185614537565b93506136af8185602086016148f3565b80840191505092915050565b60006136c8602b83614526565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b600061372e603283614526565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613794601c83614526565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006137d4602c83614526565b91507f467269656e646c794672616374616c733a20496e73756666696369656e74207660008301527f616c756520746f206d696e7400000000000000000000000000000000000000006020830152604082019050919050565b600061383a600a83614537565b91507f27253230793125334427000000000000000000000000000000000000000000006000830152600a82019050919050565b600061387a602083614526565b91507f467269656e646c794672616374616c733a204d61782033303020746f6b656e736000830152602082019050919050565b60006138ba602483614526565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613920601983614526565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613960600a83614537565b91507f27253230253246253345000000000000000000000000000000000000000000006000830152600a82019050919050565b60006139a0600a83614537565b91507f27253230793225334427000000000000000000000000000000000000000000006000830152600a82019050919050565b60006139e0602c83614526565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613a46603883614526565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613aac602a83614526565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b12600683614537565b91507f25323525324300000000000000000000000000000000000000000000000000006000830152600682019050919050565b6000613b52602983614526565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613bb8602083614526565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613bf8602c83614526565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613c5e602083614526565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613c9e602983614526565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d04602f83614526565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613d6a600d83614537565b91507f7374726f6b6525334168736c28000000000000000000000000000000000000006000830152600d82019050919050565b6000613daa602183614526565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e10600783614537565b91507f25323529253342000000000000000000000000000000000000000000000000006000830152600782019050919050565b6000613e50603183614526565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613eb6602c83614526565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000613f1c601083614537565b91507f2533436c696e65253230783125334427000000000000000000000000000000006000830152601082019050919050565b6000613f5c600a83614537565b91507f27253230783225334427000000000000000000000000000000000000000000006000830152600a82019050919050565b6000613f9c601f83614526565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b6000613fdc600383614537565b91507f25324300000000000000000000000000000000000000000000000000000000006000830152600382019050919050565b614018816148da565b82525050565b61402f61402a826148da565b6149ab565b82525050565b600061404082613d5d565b915061404c828661368a565b915061405782613fcf565b9150614063828561368a565b915061406e82613b05565b915061407a828461368a565b915061408582613e03565b9150819050949350505050565b600061409d82613f0f565b91506140a9828761368a565b91506140b48261382d565b91506140c0828661368a565b91506140cb82613f4f565b91506140d7828561368a565b91506140e282613993565b91506140ee828461368a565b91506140f982613953565b915081905095945050505050565b6000614113828461401e565b60208201915081905092915050565b600061412e828661401e565b60208201915061413e828561401e565b60208201915061414e8284613601565b602082019150819050949350505050565b600060208201905061417460008301846135e3565b92915050565b600060808201905061418f60008301876135e3565b61419c60208301866135e3565b6141a9604083018561400f565b81810360608301526141bb8184613618565b905095945050505050565b60006020820190506141db60008301846135f2565b92915050565b600060208201905081810360008301526141fb8184613651565b905092915050565b6000602082019050818103600083015261421c816136bb565b9050919050565b6000602082019050818103600083015261423c81613721565b9050919050565b6000602082019050818103600083015261425c81613787565b9050919050565b6000602082019050818103600083015261427c816137c7565b9050919050565b6000602082019050818103600083015261429c8161386d565b9050919050565b600060208201905081810360008301526142bc816138ad565b9050919050565b600060208201905081810360008301526142dc81613913565b9050919050565b600060208201905081810360008301526142fc816139d3565b9050919050565b6000602082019050818103600083015261431c81613a39565b9050919050565b6000602082019050818103600083015261433c81613a9f565b9050919050565b6000602082019050818103600083015261435c81613b45565b9050919050565b6000602082019050818103600083015261437c81613bab565b9050919050565b6000602082019050818103600083015261439c81613beb565b9050919050565b600060208201905081810360008301526143bc81613c51565b9050919050565b600060208201905081810360008301526143dc81613c91565b9050919050565b600060208201905081810360008301526143fc81613cf7565b9050919050565b6000602082019050818103600083015261441c81613d9d565b9050919050565b6000602082019050818103600083015261443c81613e43565b9050919050565b6000602082019050818103600083015261445c81613ea9565b9050919050565b6000602082019050818103600083015261447c81613f8f565b9050919050565b6000602082019050614498600083018461400f565b92915050565b6000604051905081810181811067ffffffffffffffff821117156144c5576144c4614a73565b5b8060405250919050565b600067ffffffffffffffff8211156144ea576144e9614a73565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061454d826148b0565b9150614558836148b0565b9250817f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03831360008312151615614593576145926149e6565b5b817f80000000000000000000000000000000000000000000000000000000000000000383126000831216156145cb576145ca6149e6565b5b828201905092915050565b60006145e1826148da565b91506145ec836148da565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614621576146206149e6565b5b828201905092915050565b6000614637826148da565b9150614642836148da565b92508261465257614651614a15565b5b828204905092915050565b6000808291508390505b60018511156146a757808604811115614683576146826149e6565b5b60018516156146925780820291505b80810290506146a085614ab3565b9450614667565b94509492505050565b60006146bb826148da565b91506146c6836148da565b92506146f37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846146fb565b905092915050565b60008261470b57600190506147c7565b8161471957600090506147c7565b816001811461472f576002811461473957614768565b60019150506147c7565b60ff84111561474b5761474a6149e6565b5b8360020a915084821115614762576147616149e6565b5b506147c7565b5060208310610133831016604e8410600b841016171561479d5782820a905083811115614798576147976149e6565b5b6147c7565b6147aa848484600161465d565b925090508184048111156147c1576147c06149e6565b5b81810290505b9392505050565b60006147d9826148da565b91506147e4836148da565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561481d5761481c6149e6565b5b828202905092915050565b6000614833826148da565b915061483e836148da565b925082821015614851576148506149e6565b5b828203905092915050565b6000614867826148ba565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156149115780820151818401526020810190506148f6565b83811115614920576000848401525b50505050565b6000600282049050600182168061493e57607f821691505b6020821081141561495257614951614a44565b5b50919050565b6000614963826148da565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614996576149956149e6565b5b600182019050919050565b6000819050919050565b6000819050919050565b60006149c0826148da565b91506149cb836148da565b9250826149db576149da614a15565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b614ac98161485c565b8114614ad457600080fd5b50565b614ae08161486e565b8114614aeb57600080fd5b50565b614af781614884565b8114614b0257600080fd5b50565b614b0e816148da565b8114614b1957600080fd5b5056fea2646970667358221220799284b389ca3ea803faff9564ff43f7baca5901e2b5feab5435e39f5a7732f964736f6c63430008000033

Deployed Bytecode Sourcemap

14750:12876:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15864:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3765:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4617:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4198:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16084:624;;;:::i;:::-;;10641:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5321:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10377:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5668:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16716:137;;;;;;;;;;;;;:::i;:::-;;10762:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14865:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14925:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3518:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14893:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3302:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13653:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3873:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4846:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5861:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16965:229;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16861:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23850:640;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5149:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15864:212;16003:4;16032:36;16056:11;16032:23;:36::i;:::-;16025:43;;15864:212;;;:::o;3765:100::-;3819:13;3852:5;3845:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3765:100;:::o;4617:221::-;4693:7;4721:16;4729:7;4721;:16::i;:::-;4713:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4806:15;:24;4822:7;4806:24;;;;;;;;;;;;;;;;;;;;;4799:31;;4617:221;;;:::o;4198:411::-;4279:13;4295:23;4310:7;4295:14;:23::i;:::-;4279:39;;4343:5;4337:11;;:2;:11;;;;4329:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;4437:5;4421:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;4446:37;4463:5;4470:12;:10;:12::i;:::-;4446:16;:37::i;:::-;4421:62;4399:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;4580:21;4589:2;4593:7;4580:8;:21::i;:::-;4198:411;;;:::o;16084:624::-;14181:1;14401:7;;:19;;14393:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;14181:1;14534:7;:18;;;;16152:3:::1;16144:5;;:11;16136:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;16221:9;;16208;:22;;16200:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;16289:30;16299:12;:10;:12::i;:::-;16313:5;;16289:9;:30::i;:::-;16411:5;;16418:15;16460:1;16445:12;:16;;;;:::i;:::-;16435:27;16394:69;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;16384:80;;;;;;16376:89;;16357:9;:16;16367:5;;16357:16;;;;;;;;;;;:108;;;;16482:1;16473:5;;:10;;;;;;;:::i;:::-;;;;;;;;16548:9;;16536;:21;16532:142;;;16568:24;16603:12;:10;:12::i;:::-;16568:48;;16625:8;:17;;:40;16655:9;;16643;:21;;;;:::i;:::-;16625:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;16532:142;;16696:4;16683:9;;:17;;;;;;;:::i;:::-;;;;;;;;14137:1:::0;14713:7;:22;;;;16084:624::o;10641:113::-;10702:7;10729:10;:17;;;;10722:24;;10641:113;:::o;5321:339::-;5516:41;5535:12;:10;:12::i;:::-;5549:7;5516:18;:41::i;:::-;5508:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5624:28;5634:4;5640:2;5644:7;5624:9;:28::i;:::-;5321:339;;;:::o;10377:256::-;10474:7;10510:23;10527:5;10510:16;:23::i;:::-;10502:5;:31;10494:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;10599:12;:19;10612:5;10599:19;;;;;;;;;;;;;;;:26;10619:5;10599:26;;;;;;;;;;;;10592:33;;10377:256;;;;:::o;5668:185::-;5806:39;5823:4;5829:2;5833:7;5806:39;;;;;;;;;;;;:16;:39::i;:::-;5668:185;;;:::o;16716:137::-;13799:12;:10;:12::i;:::-;13788:23;;:7;:5;:7::i;:::-;:23;;;13780:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;16758:22:::1;16791:7;:5;:7::i;:::-;16758:41;;16807:6;:15;;:38;16823:21;16807:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;13859:1;16716:137::o:0;10762:233::-;10837:7;10873:30;:28;:30::i;:::-;10865:5;:38;10857:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;10970:10;10981:5;10970:17;;;;;;;;;;;;;;;;;;;;;;;;10963:24;;10762:233;;;:::o;14865:24::-;;;;:::o;14925:44::-;;;;;;;;;;;;;;;;;:::o;3518:239::-;3590:7;3610:13;3626:7;:16;3634:7;3626:16;;;;;;;;;;;;;;;;;;;;;3610:32;;3678:1;3661:19;;:5;:19;;;;3653:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3744:5;3737:12;;;3518:239;;;:::o;14893:28::-;;;;:::o;3302:208::-;3374:7;3419:1;3402:19;;:5;:19;;;;3394:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;3486:9;:16;3496:5;3486:16;;;;;;;;;;;;;;;;3479:23;;3302:208;;;:::o;13653:87::-;13699:7;13726:6;;;;;;;;;;;13719:13;;13653:87;:::o;3873:104::-;3929:13;3962:7;3955:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3873:104;:::o;4846:295::-;4961:12;:10;:12::i;:::-;4949:24;;:8;:24;;;;4941:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;5061:8;5016:18;:32;5035:12;:10;:12::i;:::-;5016:32;;;;;;;;;;;;;;;:42;5049:8;5016:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;5114:8;5085:48;;5100:12;:10;:12::i;:::-;5085:48;;;5124:8;5085:48;;;;;;:::i;:::-;;;;;;;;4846:295;;:::o;5861:328::-;6036:41;6055:12;:10;:12::i;:::-;6069:7;6036:18;:41::i;:::-;6028:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;6142:39;6156:4;6162:2;6166:7;6175:5;6142:13;:39::i;:::-;5861:328;;;;:::o;16965:229::-;17030:13;17064:16;17072:7;17064;:16::i;:::-;17056:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;17150:36;17167:9;:18;17177:7;17167:18;;;;;;;;;;;;17150:16;:36::i;:::-;17143:43;;16965:229;;;:::o;16861:96::-;16905:13;16938:11;16947:1;16938:8;:11::i;:::-;16931:18;;16861:96;:::o;23850:640::-;23901:13;23927:14;23944:1;23927:18;;23956:21;23990:9;23980:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23956:44;;24011:6;24032:150;24044:1;24039;:6;24032:150;;24062:14;24083:2;24079:1;:6;;;;:::i;:::-;24062:23;;24108:2;24104:1;:6;;;;:::i;:::-;24100:10;;24159:9;24154:2;:14;;;;:::i;:::-;24141:29;;24125:8;24134:3;;;;;:::i;:::-;;;24125:13;;;;;;;;;;;;;;;;;;;:45;;;;;;;;;;;24032:150;;;;24192:14;24219:1;24209:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24192:29;;24261:6;24256:115;24277:1;24273;:5;24256:115;;;24307:8;24324:1;24320;24316;:5;;;;:::i;:::-;:9;;;;:::i;:::-;24307:19;;;;;;;;;;;;;;;;;;;;;;;;24300:1;24302;24300:4;;;;;;;;;;;;;;;;;;;:26;;;;;;;;;;;24280:3;;;;;:::i;:::-;;;;24256:115;;;;24381:17;24408:1;24381:29;;24479:3;24472:10;;;;;;;23850:640;;;:::o;5149:164::-;5246:4;5270:18;:25;5289:5;5270:25;;;;;;;;;;;;;;;:35;5296:8;5270:35;;;;;;;;;;;;;;;;;;;;;;;;;5263:42;;5149:164;;;;:::o;84:196::-;144:4;161:12;228:7;216:20;208:28;;271:1;264:4;:8;257:15;;;84:196;;;:::o;11003:589::-;11147:45;11174:4;11180:2;11184:7;11147:26;:45::i;:::-;11225:1;11209:18;;:4;:18;;;11205:187;;;11244:40;11276:7;11244:31;:40::i;:::-;11205:187;;;11314:2;11306:10;;:4;:10;;;11302:90;;11333:47;11366:4;11372:7;11333:32;:47::i;:::-;11302:90;11205:187;11420:1;11406:16;;:2;:16;;;11402:183;;;11439:45;11476:7;11439:36;:45::i;:::-;11402:183;;;11512:4;11506:10;;:2;:10;;;11502:83;;11533:40;11561:2;11565:7;11533:27;:40::i;:::-;11502:83;11402:183;11003:589;;;:::o;9423:126::-;;;;:::o;10145:224::-;10247:4;10286:35;10271:50;;;:11;:50;;;;:90;;;;10325:36;10349:11;10325:23;:36::i;:::-;10271:90;10264:97;;10145:224;;;:::o;6520:127::-;6585:4;6637:1;6609:30;;:7;:16;6617:7;6609:16;;;;;;;;;;;;;;;;;;;;;:30;;;;6602:37;;6520:127;;;:::o;320:98::-;373:7;400:10;393:17;;320:98;:::o;8434:174::-;8536:2;8509:15;:24;8525:7;8509:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;8592:7;8588:2;8554:46;;8563:23;8578:7;8563:14;:23::i;:::-;8554:46;;;;;;;;;;;;8434:174;;:::o;7011:110::-;7087:26;7097:2;7101:7;7087:26;;;;;;;;;;;;:9;:26::i;:::-;7011:110;;:::o;6655:348::-;6748:4;6773:16;6781:7;6773;:16::i;:::-;6765:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;6849:13;6865:23;6880:7;6865:14;:23::i;:::-;6849:39;;6918:5;6907:16;;:7;:16;;;:51;;;;6951:7;6927:31;;:20;6939:7;6927:11;:20::i;:::-;:31;;;6907:51;:87;;;;6962:32;6979:5;6986:7;6962:16;:32::i;:::-;6907:87;6899:96;;;6655:348;;;;:::o;7848:578::-;8007:4;7980:31;;:23;7995:7;7980:14;:23::i;:::-;:31;;;7972:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;8090:1;8076:16;;:2;:16;;;;8068:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;8146:39;8167:4;8173:2;8177:7;8146:20;:39::i;:::-;8250:29;8267:1;8271:7;8250:8;:29::i;:::-;8311:1;8292:9;:15;8302:4;8292:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;8340:1;8323:9;:13;8333:2;8323:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;8371:2;8352:7;:16;8360:7;8352:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;8410:7;8406:2;8391:27;;8400:4;8391:27;;;;;;;;;;;;7848:578;;;:::o;6197:315::-;6354:28;6364:4;6370:2;6374:7;6354:9;:28::i;:::-;6401:48;6424:4;6430:2;6434:7;6443:5;6401:22;:48::i;:::-;6393:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6197:315;;;;:::o;17202:1962::-;17265:13;17291:21;17315:1;17291:25;;17392:21;:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17569:4;17552:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;17542:33;;;;;;17534:42;;17527:49;;17587:24;17625:1;17618:4;:8;;;;:::i;:::-;17614:1;:12;;;;:::i;:::-;17587:39;;17697:21;17756:1;17753;17739:13;:15;;;;:::i;:::-;17735:1;:20;;;;:::i;:::-;:22;;;;:::i;:::-;17721:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17697:61;;17780:47;17788:4;17794:1;17797;17800:5;17807;17814;17821;17780:7;:47::i;:::-;17771:4;17776:1;17771:7;;;;;;;;;;;;;;;;;;;;;:56;;;;;17843:9;17838:244;17875:1;17861:13;17858:1;:16;;;;:::i;:::-;:18;;;;:::i;:::-;17856:1;:20;17838:244;;;17950:45;17963:4;17968:1;17963:7;;;;;;;;;;;;;;;;;;;;;;17972:4;17978:16;17950:12;:45::i;:::-;17936:4;17945:1;17943;17941;:3;;;;:::i;:::-;:5;;;;:::i;:::-;17936:11;;;;;;;;;;;;;;;;;;;;;:59;;;;;18024:46;18037:4;18042:1;18037:7;;;;;;;;;;;;;;;;;;;;;;18046:5;18053:16;18024:12;:46::i;:::-;18010:4;18019:1;18017;18015;:3;;;;:::i;:::-;:5;;;;:::i;:::-;18010:11;;;;;;;;;;;;;;;;;;;;;:60;;;;;17878:3;;;;;:::i;:::-;;;;17838:244;;;;18178:19;18232:3;18217:13;18214:1;:16;;;;:::i;:::-;18210:2;:21;;;;:::i;:::-;:25;;;;:::i;:::-;18200:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18178:58;;18247:16;18314:2;18306:6;18302:15;18295:22;;18362:16;18390:15;18455:25;18466:3;18471:8;18455:25;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:10;:25::i;:::-;18438:42;;;;;;;;18500:7;18488:19;;;;;:::i;:::-;;;18537:37;18548:3;18553:20;18568:4;18553:14;:20::i;:::-;18537:10;:37::i;:::-;18520:54;;;;;;;;18594:7;18582:19;;;;;:::i;:::-;;;18628:25;18639:3;18644:8;18628:25;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:10;:25::i;:::-;18611:42;;;;;;;;18673:7;18661:19;;;;;:::i;:::-;;;18716:9;18743:1;18729:13;18726:1;:16;;;;:::i;:::-;:18;;;;:::i;:::-;18716:28;;18711:211;18748:4;:11;18746:1;:13;18711:211;;;18778:20;18801:25;18812:4;18818:1;18821:4;18801:10;:25::i;:::-;18778:48;;18855:24;18866:3;18871:7;18855:10;:24::i;:::-;18838:41;;;;;;;;18903:7;18891:19;;;;;:::i;:::-;;;18711:211;18761:3;;;;;:::i;:::-;;;;18711:211;;;;18969:24;18980:3;18985:7;18969:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:10;:24::i;:::-;18952:41;;;;;;;;19013:7;19001:19;;;;;:::i;:::-;;;19103:8;19095:6;19088:24;19149:6;19135:21;;;;;;;;;;17202:1962;;;:::o;11829:164::-;11933:10;:17;;;;11906:15;:24;11922:7;11906:24;;;;;;;;;;;:44;;;;11961:10;11977:7;11961:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11829:164;:::o;12001:812::-;12093:22;12143:1;12118:22;12135:4;12118:16;:22::i;:::-;:26;;;;:::i;:::-;12093:51;;12155:18;12176:17;:26;12194:7;12176:26;;;;;;;;;;;;12155:47;;12323:14;12309:10;:28;12305:328;;12354:19;12376:12;:18;12389:4;12376:18;;;;;;;;;;;;;;;:34;12395:14;12376:34;;;;;;;;;;;;12354:56;;12460:11;12427:12;:18;12440:4;12427:18;;;;;;;;;;;;;;;:30;12446:10;12427:30;;;;;;;;;;;:44;;;;12577:10;12544:17;:30;12562:11;12544:30;;;;;;;;;;;:43;;;;12305:328;;12727:17;:26;12745:7;12727:26;;;;;;;;;;;12720:33;;;12771:12;:18;12784:4;12771:18;;;;;;;;;;;;;;;:34;12790:14;12771:34;;;;;;;;;;;12764:41;;;12001:812;;;;:::o;12821:594::-;12903:22;12948:1;12928:10;:17;;;;:21;;;;:::i;:::-;12903:46;;12960:18;12981:15;:24;12997:7;12981:24;;;;;;;;;;;;12960:45;;13018:19;13040:10;13051:14;13040:26;;;;;;;;;;;;;;;;;;;;;;;;13018:48;;13104:11;13079:10;13090;13079:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;13215:10;13184:15;:28;13200:11;13184:28;;;;;;;;;;;:41;;;;13356:15;:24;13372:7;13356:24;;;;;;;;;;;13349:31;;;13391:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12821:594;;;;:::o;11600:221::-;11685:14;11702:20;11719:2;11702:16;:20::i;:::-;11685:37;;11760:7;11733:12;:16;11746:2;11733:16;;;;;;;;;;;;;;;:24;11750:6;11733:24;;;;;;;;;;;:34;;;;11807:6;11778:17;:26;11796:7;11778:26;;;;;;;;;;;:35;;;;11600:221;;;:::o;2989:305::-;3091:4;3143:25;3128:40;;;:11;:40;;;;:105;;;;3200:33;3185:48;;;:11;:48;;;;3128:105;:158;;;;3250:36;3274:11;3250:23;:36::i;:::-;3128:158;3108:178;;2989:305;;;:::o;7129:321::-;7259:18;7265:2;7269:7;7259:5;:18::i;:::-;7310:54;7341:1;7345:2;7349:7;7358:5;7310:22;:54::i;:::-;7288:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;7129:321;;;:::o;15641:215::-;15803:45;15830:4;15836:2;15840:7;15803:26;:45::i;:::-;15641:215;;;:::o;8616:799::-;8771:4;8792:15;:2;:13;;;:15::i;:::-;8788:620;;;8844:2;8828:36;;;8865:12;:10;:12::i;:::-;8879:4;8885:7;8894:5;8828:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;8824:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9087:1;9070:6;:13;:18;9066:272;;;9113:60;;;;;;;;;;:::i;:::-;;;;;;;;9066:272;9288:6;9282:13;9273:6;9269:2;9265:15;9258:38;8824:529;8961:41;;;8951:51;;;:6;:51;;;;8944:58;;;;;8788:620;9392:4;9385:11;;8616:799;;;;;;;:::o;22498:692::-;22633:7;22650:14;22667:1;22650:18;;22699:10;22694:2;:15;22676:34;;;;22737:2;22727:6;:12;;22718:21;;22770:10;22765:2;:15;22747:34;;;;22808:2;22798:6;:12;;22789:21;;22840:10;22836:1;:14;22818:33;;;;22878:2;22868:6;:12;;22859:21;;22910:10;22906:1;:14;22888:33;;;;22948:2;22938:6;:12;;22929:21;;22991:10;22976:12;:25;22958:44;;;;23029:2;23019:6;:12;;23010:21;;23067:10;23057:7;:20;23039:39;;;;23105:2;23095:6;:12;;23086:21;;23140:18;23133:4;:25;23115:44;;;;23176:6;23169:13;;;22498:692;;;;;;;;;:::o;19172:3279::-;19273:7;19290:12;19310:20;19338:15;19361:8;19380;19399:9;19419;19487:12;19494:4;19487:6;:12::i;:::-;19441:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;19590:1;19574:12;:17;19570:237;;;19647:4;19630:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;19620:33;;;;;;19612:42;;19605:49;;19707:1;19700:4;:8;;;;:::i;:::-;19681:16;:27;;;;:::i;:::-;19666:42;;19758:4;19741:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;19731:33;;;;;;19723:42;;19716:49;;19794:1;19787:4;:8;;;;:::i;:::-;19777:18;;19570:237;19813:13;19829:5;19813:21;;19839:13;19855:5;19839:21;;20350:10;20371;20392;20413;20545:6;20537;20528;20520;20516:2;20512:15;20507:28;20499:6;20490;20486:2;20482:15;20477:29;20473:63;20469:75;20464:88;20457:95;;20651:6;20643;20634;20626;20622:2;20618:15;20613:28;20605:6;20596;20592:2;20588:15;20583:29;20579:63;20575:75;20570:88;20563:95;;20757:6;20749;20740;20732;20728:2;20724:15;20719:28;20711:6;20702;20698:2;20694:15;20689:29;20685:63;20681:75;20676:88;20669:95;;20875:6;20867;20858;20850;20846:2;20842:15;20837:28;20829:6;20820;20814:2;20810:7;20808:1;20804:14;20800:27;20795:41;20791:75;20787:87;20782:100;20775:107;;20978:9;:27;;;;;21003:1;20992:7;:12;20978:27;:105;;;;21024:9;21023:10;:60;;;;;21049:1;21038:7;:12;:28;;;;21065:1;21054:7;:12;21038:28;:44;;;;21081:1;21070:7;:12;21038:44;21023:60;20978:105;20974:570;;;21131:2;21128:1;21124:10;21119:15;;21158:2;21155:1;21151:10;21146:15;;21106:67;;;21205:1;21194:7;:12;:74;;;;21225:9;21224:10;:44;;;;;21250:1;21239:7;:12;:28;;;;21266:1;21255:7;:12;21239:28;21224:44;21194:74;21190:354;;;21316:3;21313:1;21309:11;21304:16;;21344:3;21341:1;21337:11;21332:16;;21291:69;;;21382:9;21381:10;:60;;;;;21407:1;21396:7;:12;:28;;;;21423:1;21412:7;:12;21396:28;:44;;;;21439:1;21428:7;:12;21396:44;21381:60;21377:167;;;21489:3;21486:1;21482:11;21477:16;;21517:3;21514:1;21510:11;21505:16;;21464:69;21190:354;20974:570;21560:9;:91;;;;;21585:1;21574:7;:12;:28;;;;21601:1;21590:7;:12;21574:28;:44;;;;21617:1;21606:7;:12;21574:44;:60;;;;21633:1;21622:7;:12;21574:60;:76;;;;21649:1;21638:7;:12;21574:76;21560:91;:149;;;;21666:9;21665:10;:44;;;;;21691:1;21680:7;:12;:28;;;;21707:1;21696:7;:12;21680:28;21665:44;21560:149;21556:818;;;21728:3;21723:8;;21748:3;21743:8;;21556:818;;;21776:9;:27;;;;;21801:1;21790:7;:12;21776:27;:87;;;;21820:9;21819:10;:44;;;;;21845:1;21834:7;:12;:28;;;;21861:1;21850:7;:12;21834:28;21819:44;21776:87;21772:602;;;21916:3;21912:8;21909:1;21905:16;21899:22;;21950:3;21946:8;21943:1;21939:16;21933:22;;21886:81;;;21990:9;:43;;;;;22015:1;22004:7;:12;:28;;;;22031:1;22020:7;:12;22004:28;21990:43;:105;;;;22052:9;22051:10;:44;;;;;22077:1;22066:7;:12;:28;;;;22093:1;22082:7;:12;22066:28;22051:44;21990:105;21986:388;;;22111:3;22106:8;;22128:3;22123:8;;21986:388;;;22155:9;:27;;;;;22180:1;22169:7;:12;22155:27;:104;;;;22200:9;22199:10;:60;;;;;22225:1;22214:7;:12;:28;;;;22241:1;22230:7;:12;22214:28;:44;;;;22257:1;22246:7;:12;22214:44;22199:60;22155:104;22151:223;;;22312:3;22308:8;22305:1;22301:16;22295:22;;22346:3;22342:8;22339:1;22335:16;22329:22;;22282:81;21986:388;21772:602;21556:818;22391:52;22399:4;22405:7;22427:1;22414:12;:14;;;;:::i;:::-;22430:1;22433;22436:2;22440;22391:7;:52::i;:::-;22384:59;;;;;;;;;;;;;;;19172:3279;;;;;:::o;25111:527::-;25204:15;25221:24;25255:16;25300:2;25294;25275:9;:16;:21;;;;:::i;:::-;25274:28;;;;:::i;:::-;25255:47;;25320:9;:16;25310:26;;25358:11;25344:25;;25450:1;25434:138;25460:8;25457:1;25454:15;25434:138;;;25564:1;25561;25557:9;25553:2;25549:18;25538:9;25534:34;25528:41;25523:1;25519:2;25515:10;25502:11;25498:28;25491:79;25484:1;25481;25477:9;25472:14;;25434:138;;;25438:15;25615:7;25602:11;25598:25;25583:40;;25422:209;;;;;;:::o;24498:533::-;24559:12;24623:4;24606:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;24596:33;;;;;;24588:42;;24581:49;;24641:15;24670:3;24663:4;:10;;;;:::i;:::-;24659:1;:14;;;;:::i;:::-;24641:32;;24723:4;24706:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;24696:33;;;;;;24688:42;;24681:49;;24741:15;24771:2;24764:4;:9;;;;:::i;:::-;24759:2;:14;;;;:::i;:::-;24741:32;;24823:4;24806:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;24796:33;;;;;;24788:42;;24781:49;;24841:15;24871:2;24864:4;:9;;;;:::i;:::-;24859:2;:14;;;;:::i;:::-;24841:32;;24927:21;24940:7;24927:12;:21::i;:::-;24957;24970:7;24957:12;:21::i;:::-;24990;25003:7;24990:12;:21::i;:::-;24893:130;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24886:137;;;;;24498:533;;;:::o;25684:1939::-;25788:12;25818:17;25846:8;25865;25884:9;25904;25945:19;25952:4;25957:5;25952:11;;;;;;;;;;;;;;;;;;;;;;25945:6;:19::i;:::-;25924:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25974:16;25998:17;26023:25;26063:9;26058:1408;26078:1;26076;:3;26058:1408;;;26106:1;26095:12;;26128:1;26116:13;;26138:11;26167:1;26162;:6;26158:205;;;26194:1;26180:16;;26158:205;;;26221:1;26216;:6;26212:151;;;26248:1;26234:16;;26212:151;;;26276:1;26271;:6;26267:96;;;26305:2;26303:1;:4;;;;:::i;:::-;26289:19;;26267:96;;;26350:2;26348:1;:4;;;;:::i;:::-;26334:19;;26267:96;26212:151;26158:205;26431:1;26427:2;26423:10;26417:4;26413:21;26407:28;26392:43;;26454:15;26472:3;26454:21;;26643:89;26663:1;26654:7;26651:14;26643:89;;;26728:1;26717:9;26713:17;26700:30;;26692:2;26683:7;26679:16;26668:27;;26643:89;;;27150:226;27165:1;27160:3;27157:10;27150:226;;;27236:2;27230;27225:3;27221:12;27217:22;27204:35;;27312:9;27299:8;27289:9;27285:23;27281:2;27277:32;27264:11;27260:50;27252:70;27361:1;27351:8;27347:16;27335:28;;27185:2;27180:3;27176:12;27169:19;;27150:226;;;27440:8;27427:11;27420:29;27410:48;;26081:3;;;;;:::i;:::-;;;;26058:1408;;;;27522:4;27527:1;27522:7;;;;;;;;;;;;;;;;;;;27545:4;27550:1;27545:7;;;;;;;;;;;;;;;;;;;27568:4;27573:1;27568:7;;;;;;;;;;;;;;;;;;;27591:4;27596:1;27591:7;;;;;;;;;;;;;;;;;;;27485:128;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27478:135;;;;;;;;;;25684:1939;;;;;:::o;685:157::-;770:4;809:25;794:40;;;:11;:40;;;;787:47;;685:157;;;:::o;7458:382::-;7552:1;7538:16;;:2;:16;;;;7530:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;7611:16;7619:7;7611;:16::i;:::-;7610:17;7602:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;7673:45;7702:1;7706:2;7710:7;7673:20;:45::i;:::-;7748:1;7731:9;:13;7741:2;7731:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;7779:2;7760:7;:16;7768:7;7760:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;7824:7;7820:2;7799:33;;7816:1;7799:33;;;;;;;;;;;;7458:382;;:::o;23236:606::-;23289:12;23303:15;23320:20;23342:8;23352;23362:9;23373;23414:18;23407:4;:25;23392:41;;23456:2;23448:4;:10;;23441:17;;23491:10;23484:4;:17;23466:36;;23525:2;23517:4;:10;;23510:17;;23565:10;23558:4;:17;23535:41;;23599:2;23591:4;:10;;23584:17;;23633:4;23613:27;;23609:31;;23663:2;23655:4;:10;;23648:17;;23697:4;23677:27;;23673:31;;23727:2;23719:4;:10;;23712:17;;23762:4;23742:27;;23737:32;;23792:2;23784:4;:10;;23777:17;;23827:4;23807:27;;23802:32;;23236:606;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:139::-;;439:6;426:20;417:29;;455:33;482:5;455:33;:::i;:::-;407:87;;;;:::o;500:133::-;;581:6;568:20;559:29;;597:30;621:5;597:30;:::i;:::-;549:84;;;;:::o;639:137::-;;722:6;709:20;700:29;;738:32;764:5;738:32;:::i;:::-;690:86;;;;:::o;782:141::-;;869:6;863:13;854:22;;885:32;911:5;885:32;:::i;:::-;844:79;;;;:::o;942:271::-;;1046:3;1039:4;1031:6;1027:17;1023:27;1013:2;;1064:1;1061;1054:12;1013:2;1104:6;1091:20;1129:78;1203:3;1195:6;1188:4;1180:6;1176:17;1129:78;:::i;:::-;1120:87;;1003:210;;;;;:::o;1219:139::-;;1303:6;1290:20;1281:29;;1319:33;1346:5;1319:33;:::i;:::-;1271:87;;;;:::o;1364:262::-;;1472:2;1460:9;1451:7;1447:23;1443:32;1440:2;;;1488:1;1485;1478:12;1440:2;1531:1;1556:53;1601:7;1592:6;1581:9;1577:22;1556:53;:::i;:::-;1546:63;;1502:117;1430:196;;;;:::o;1632:407::-;;;1757:2;1745:9;1736:7;1732:23;1728:32;1725:2;;;1773:1;1770;1763:12;1725:2;1816:1;1841:53;1886:7;1877:6;1866:9;1862:22;1841:53;:::i;:::-;1831:63;;1787:117;1943:2;1969:53;2014:7;2005:6;1994:9;1990:22;1969:53;:::i;:::-;1959:63;;1914:118;1715:324;;;;;:::o;2045:552::-;;;;2187:2;2175:9;2166:7;2162:23;2158:32;2155:2;;;2203:1;2200;2193:12;2155:2;2246:1;2271:53;2316:7;2307:6;2296:9;2292:22;2271:53;:::i;:::-;2261:63;;2217:117;2373:2;2399:53;2444:7;2435:6;2424:9;2420:22;2399:53;:::i;:::-;2389:63;;2344:118;2501:2;2527:53;2572:7;2563:6;2552:9;2548:22;2527:53;:::i;:::-;2517:63;;2472:118;2145:452;;;;;:::o;2603:809::-;;;;;2771:3;2759:9;2750:7;2746:23;2742:33;2739:2;;;2788:1;2785;2778:12;2739:2;2831:1;2856:53;2901:7;2892:6;2881:9;2877:22;2856:53;:::i;:::-;2846:63;;2802:117;2958:2;2984:53;3029:7;3020:6;3009:9;3005:22;2984:53;:::i;:::-;2974:63;;2929:118;3086:2;3112:53;3157:7;3148:6;3137:9;3133:22;3112:53;:::i;:::-;3102:63;;3057:118;3242:2;3231:9;3227:18;3214:32;3273:18;3265:6;3262:30;3259:2;;;3305:1;3302;3295:12;3259:2;3333:62;3387:7;3378:6;3367:9;3363:22;3333:62;:::i;:::-;3323:72;;3185:220;2729:683;;;;;;;:::o;3418:401::-;;;3540:2;3528:9;3519:7;3515:23;3511:32;3508:2;;;3556:1;3553;3546:12;3508:2;3599:1;3624:53;3669:7;3660:6;3649:9;3645:22;3624:53;:::i;:::-;3614:63;;3570:117;3726:2;3752:50;3794:7;3785:6;3774:9;3770:22;3752:50;:::i;:::-;3742:60;;3697:115;3498:321;;;;;:::o;3825:407::-;;;3950:2;3938:9;3929:7;3925:23;3921:32;3918:2;;;3966:1;3963;3956:12;3918:2;4009:1;4034:53;4079:7;4070:6;4059:9;4055:22;4034:53;:::i;:::-;4024:63;;3980:117;4136:2;4162:53;4207:7;4198:6;4187:9;4183:22;4162:53;:::i;:::-;4152:63;;4107:118;3908:324;;;;;:::o;4238:260::-;;4345:2;4333:9;4324:7;4320:23;4316:32;4313:2;;;4361:1;4358;4351:12;4313:2;4404:1;4429:52;4473:7;4464:6;4453:9;4449:22;4429:52;:::i;:::-;4419:62;;4375:116;4303:195;;;;:::o;4504:282::-;;4622:2;4610:9;4601:7;4597:23;4593:32;4590:2;;;4638:1;4635;4628:12;4590:2;4681:1;4706:63;4761:7;4752:6;4741:9;4737:22;4706:63;:::i;:::-;4696:73;;4652:127;4580:206;;;;:::o;4792:262::-;;4900:2;4888:9;4879:7;4875:23;4871:32;4868:2;;;4916:1;4913;4906:12;4868:2;4959:1;4984:53;5029:7;5020:6;5009:9;5005:22;4984:53;:::i;:::-;4974:63;;4930:117;4858:196;;;;:::o;5060:118::-;5147:24;5165:5;5147:24;:::i;:::-;5142:3;5135:37;5125:53;;:::o;5184:109::-;5265:21;5280:5;5265:21;:::i;:::-;5260:3;5253:34;5243:50;;:::o;5299:157::-;5404:45;5424:24;5442:5;5424:24;:::i;:::-;5404:45;:::i;:::-;5399:3;5392:58;5382:74;;:::o;5462:360::-;;5576:38;5608:5;5576:38;:::i;:::-;5630:70;5693:6;5688:3;5630:70;:::i;:::-;5623:77;;5709:52;5754:6;5749:3;5742:4;5735:5;5731:16;5709:52;:::i;:::-;5786:29;5808:6;5786:29;:::i;:::-;5781:3;5777:39;5770:46;;5552:270;;;;;:::o;5828:364::-;;5944:39;5977:5;5944:39;:::i;:::-;5999:71;6063:6;6058:3;5999:71;:::i;:::-;5992:78;;6079:52;6124:6;6119:3;6112:4;6105:5;6101:16;6079:52;:::i;:::-;6156:29;6178:6;6156:29;:::i;:::-;6151:3;6147:39;6140:46;;5920:272;;;;;:::o;6198:377::-;;6332:39;6365:5;6332:39;:::i;:::-;6387:89;6469:6;6464:3;6387:89;:::i;:::-;6380:96;;6485:52;6530:6;6525:3;6518:4;6511:5;6507:16;6485:52;:::i;:::-;6562:6;6557:3;6553:16;6546:23;;6308:267;;;;;:::o;6581:375::-;;6744:67;6808:2;6803:3;6744:67;:::i;:::-;6737:74;;6841:34;6837:1;6832:3;6828:11;6821:55;6907:13;6902:2;6897:3;6893:12;6886:35;6947:2;6942:3;6938:12;6931:19;;6727:229;;;:::o;6962:382::-;;7125:67;7189:2;7184:3;7125:67;:::i;:::-;7118:74;;7222:34;7218:1;7213:3;7209:11;7202:55;7288:20;7283:2;7278:3;7274:12;7267:42;7335:2;7330:3;7326:12;7319:19;;7108:236;;;:::o;7350:326::-;;7513:67;7577:2;7572:3;7513:67;:::i;:::-;7506:74;;7610:30;7606:1;7601:3;7597:11;7590:51;7667:2;7662:3;7658:12;7651:19;;7496:180;;;:::o;7682:376::-;;7845:67;7909:2;7904:3;7845:67;:::i;:::-;7838:74;;7942:34;7938:1;7933:3;7929:11;7922:55;8008:14;8003:2;7998:3;7994:12;7987:36;8049:2;8044:3;8040:12;8033:19;;7828:230;;;:::o;8064:344::-;;8245:85;8327:2;8322:3;8245:85;:::i;:::-;8238:92;;8360:12;8356:1;8351:3;8347:11;8340:33;8399:2;8394:3;8390:12;8383:19;;8228:180;;;:::o;8414:330::-;;8577:67;8641:2;8636:3;8577:67;:::i;:::-;8570:74;;8674:34;8670:1;8665:3;8661:11;8654:55;8735:2;8730:3;8726:12;8719:19;;8560:184;;;:::o;8750:368::-;;8913:67;8977:2;8972:3;8913:67;:::i;:::-;8906:74;;9010:34;9006:1;9001:3;8997:11;8990:55;9076:6;9071:2;9066:3;9062:12;9055:28;9109:2;9104:3;9100:12;9093:19;;8896:222;;;:::o;9124:323::-;;9287:67;9351:2;9346:3;9287:67;:::i;:::-;9280:74;;9384:27;9380:1;9375:3;9371:11;9364:48;9438:2;9433:3;9429:12;9422:19;;9270:177;;;:::o;9453:344::-;;9634:85;9716:2;9711:3;9634:85;:::i;:::-;9627:92;;9749:12;9745:1;9740:3;9736:11;9729:33;9788:2;9783:3;9779:12;9772:19;;9617:180;;;:::o;9803:344::-;;9984:85;10066:2;10061:3;9984:85;:::i;:::-;9977:92;;10099:12;10095:1;10090:3;10086:11;10079:33;10138:2;10133:3;10129:12;10122:19;;9967:180;;;:::o;10153:376::-;;10316:67;10380:2;10375:3;10316:67;:::i;:::-;10309:74;;10413:34;10409:1;10404:3;10400:11;10393:55;10479:14;10474:2;10469:3;10465:12;10458:36;10520:2;10515:3;10511:12;10504:19;;10299:230;;;:::o;10535:388::-;;10698:67;10762:2;10757:3;10698:67;:::i;:::-;10691:74;;10795:34;10791:1;10786:3;10782:11;10775:55;10861:26;10856:2;10851:3;10847:12;10840:48;10914:2;10909:3;10905:12;10898:19;;10681:242;;;:::o;10929:374::-;;11092:67;11156:2;11151:3;11092:67;:::i;:::-;11085:74;;11189:34;11185:1;11180:3;11176:11;11169:55;11255:12;11250:2;11245:3;11241:12;11234:34;11294:2;11289:3;11285:12;11278:19;;11075:228;;;:::o;11309:338::-;;11490:84;11572:1;11567:3;11490:84;:::i;:::-;11483:91;;11604:8;11600:1;11595:3;11591:11;11584:29;11639:1;11634:3;11630:11;11623:18;;11473:174;;;:::o;11653:373::-;;11816:67;11880:2;11875:3;11816:67;:::i;:::-;11809:74;;11913:34;11909:1;11904:3;11900:11;11893:55;11979:11;11974:2;11969:3;11965:12;11958:33;12017:2;12012:3;12008:12;12001:19;;11799:227;;;:::o;12032:330::-;;12195:67;12259:2;12254:3;12195:67;:::i;:::-;12188:74;;12292:34;12288:1;12283:3;12279:11;12272:55;12353:2;12348:3;12344:12;12337:19;;12178:184;;;:::o;12368:376::-;;12531:67;12595:2;12590:3;12531:67;:::i;:::-;12524:74;;12628:34;12624:1;12619:3;12615:11;12608:55;12694:14;12689:2;12684:3;12680:12;12673:36;12735:2;12730:3;12726:12;12719:19;;12514:230;;;:::o;12750:330::-;;12913:67;12977:2;12972:3;12913:67;:::i;:::-;12906:74;;13010:34;13006:1;13001:3;12997:11;12990:55;13071:2;13066:3;13062:12;13055:19;;12896:184;;;:::o;13086:373::-;;13249:67;13313:2;13308:3;13249:67;:::i;:::-;13242:74;;13346:34;13342:1;13337:3;13333:11;13326:55;13412:11;13407:2;13402:3;13398:12;13391:33;13450:2;13445:3;13441:12;13434:19;;13232:227;;;:::o;13465:379::-;;13628:67;13692:2;13687:3;13628:67;:::i;:::-;13621:74;;13725:34;13721:1;13716:3;13712:11;13705:55;13791:17;13786:2;13781:3;13777:12;13770:39;13835:2;13830:3;13826:12;13819:19;;13611:233;;;:::o;13850:355::-;;14031:85;14113:2;14108:3;14031:85;:::i;:::-;14024:92;;14146:15;14142:1;14137:3;14133:11;14126:36;14192:2;14187:3;14183:12;14176:19;;14014:191;;;:::o;14215:385::-;;14382:67;14446:2;14441:3;14382:67;:::i;:::-;14375:74;;14483:34;14479:1;14474:3;14470:11;14463:55;14553:3;14548:2;14543:3;14539:12;14532:25;14587:2;14582:3;14578:12;14571:19;;14361:239;;;:::o;14610:343::-;;14795:84;14877:1;14872:3;14795:84;:::i;:::-;14788:91;;14909:9;14905:1;14900:3;14896:11;14889:30;14945:1;14940:3;14936:11;14929:18;;14774:179;;;:::o;14959:381::-;;15122:67;15186:2;15181:3;15122:67;:::i;:::-;15115:74;;15219:34;15215:1;15210:3;15206:11;15199:55;15285:19;15280:2;15275:3;15271:12;15264:41;15331:2;15326:3;15322:12;15315:19;;15105:235;;;:::o;15346:376::-;;15509:67;15573:2;15568:3;15509:67;:::i;:::-;15502:74;;15606:34;15602:1;15597:3;15593:11;15586:55;15672:14;15667:2;15662:3;15658:12;15651:36;15713:2;15708:3;15704:12;15697:19;;15492:230;;;:::o;15728:350::-;;15909:85;15991:2;15986:3;15909:85;:::i;:::-;15902:92;;16024:18;16020:1;16015:3;16011:11;16004:39;16069:2;16064:3;16060:12;16053:19;;15892:186;;;:::o;16084:344::-;;16265:85;16347:2;16342:3;16265:85;:::i;:::-;16258:92;;16380:12;16376:1;16371:3;16367:11;16360:33;16419:2;16414:3;16410:12;16403:19;;16248:180;;;:::o;16434:329::-;;16597:67;16661:2;16656:3;16597:67;:::i;:::-;16590:74;;16694:33;16690:1;16685:3;16681:11;16674:54;16754:2;16749:3;16745:12;16738:19;;16580:183;;;:::o;16769:335::-;;16950:84;17032:1;17027:3;16950:84;:::i;:::-;16943:91;;17064:5;17060:1;17055:3;17051:11;17044:26;17096:1;17091:3;17087:11;17080:18;;16933:171;;;:::o;17110:118::-;17197:24;17215:5;17197:24;:::i;:::-;17192:3;17185:37;17175:53;;:::o;17234:157::-;17339:45;17359:24;17377:5;17359:24;:::i;:::-;17339:45;:::i;:::-;17334:3;17327:58;17317:74;;:::o;17397:1659::-;;18051:148;18195:3;18051:148;:::i;:::-;18044:155;;18216:95;18307:3;18298:6;18216:95;:::i;:::-;18209:102;;18328:148;18472:3;18328:148;:::i;:::-;18321:155;;18493:95;18584:3;18575:6;18493:95;:::i;:::-;18486:102;;18605:148;18749:3;18605:148;:::i;:::-;18598:155;;18770:95;18861:3;18852:6;18770:95;:::i;:::-;18763:102;;18882:148;19026:3;18882:148;:::i;:::-;18875:155;;19047:3;19040:10;;18033:1023;;;;;;:::o;19062:2085::-;;19865:148;20009:3;19865:148;:::i;:::-;19858:155;;20030:95;20121:3;20112:6;20030:95;:::i;:::-;20023:102;;20142:148;20286:3;20142:148;:::i;:::-;20135:155;;20307:95;20398:3;20389:6;20307:95;:::i;:::-;20300:102;;20419:148;20563:3;20419:148;:::i;:::-;20412:155;;20584:95;20675:3;20666:6;20584:95;:::i;:::-;20577:102;;20696:148;20840:3;20696:148;:::i;:::-;20689:155;;20861:95;20952:3;20943:6;20861:95;:::i;:::-;20854:102;;20973:148;21117:3;20973:148;:::i;:::-;20966:155;;21138:3;21131:10;;19847:1300;;;;;;;:::o;21153:256::-;;21280:75;21351:3;21342:6;21280:75;:::i;:::-;21380:2;21375:3;21371:12;21364:19;;21400:3;21393:10;;21269:140;;;;:::o;21415:538::-;;21598:75;21669:3;21660:6;21598:75;:::i;:::-;21698:2;21693:3;21689:12;21682:19;;21711:75;21782:3;21773:6;21711:75;:::i;:::-;21811:2;21806:3;21802:12;21795:19;;21824:75;21895:3;21886:6;21824:75;:::i;:::-;21924:2;21919:3;21915:12;21908:19;;21944:3;21937:10;;21587:366;;;;;;:::o;21959:222::-;;22090:2;22079:9;22075:18;22067:26;;22103:71;22171:1;22160:9;22156:17;22147:6;22103:71;:::i;:::-;22057:124;;;;:::o;22187:640::-;;22420:3;22409:9;22405:19;22397:27;;22434:71;22502:1;22491:9;22487:17;22478:6;22434:71;:::i;:::-;22515:72;22583:2;22572:9;22568:18;22559:6;22515:72;:::i;:::-;22597;22665:2;22654:9;22650:18;22641:6;22597:72;:::i;:::-;22716:9;22710:4;22706:20;22701:2;22690:9;22686:18;22679:48;22744:76;22815:4;22806:6;22744:76;:::i;:::-;22736:84;;22387:440;;;;;;;:::o;22833:210::-;;22958:2;22947:9;22943:18;22935:26;;22971:65;23033:1;23022:9;23018:17;23009:6;22971:65;:::i;:::-;22925:118;;;;:::o;23049:313::-;;23200:2;23189:9;23185:18;23177:26;;23249:9;23243:4;23239:20;23235:1;23224:9;23220:17;23213:47;23277:78;23350:4;23341:6;23277:78;:::i;:::-;23269:86;;23167:195;;;;:::o;23368:419::-;;23572:2;23561:9;23557:18;23549:26;;23621:9;23615:4;23611:20;23607:1;23596:9;23592:17;23585:47;23649:131;23775:4;23649:131;:::i;:::-;23641:139;;23539:248;;;:::o;23793:419::-;;23997:2;23986:9;23982:18;23974:26;;24046:9;24040:4;24036:20;24032:1;24021:9;24017:17;24010:47;24074:131;24200:4;24074:131;:::i;:::-;24066:139;;23964:248;;;:::o;24218:419::-;;24422:2;24411:9;24407:18;24399:26;;24471:9;24465:4;24461:20;24457:1;24446:9;24442:17;24435:47;24499:131;24625:4;24499:131;:::i;:::-;24491:139;;24389:248;;;:::o;24643:419::-;;24847:2;24836:9;24832:18;24824:26;;24896:9;24890:4;24886:20;24882:1;24871:9;24867:17;24860:47;24924:131;25050:4;24924:131;:::i;:::-;24916:139;;24814:248;;;:::o;25068:419::-;;25272:2;25261:9;25257:18;25249:26;;25321:9;25315:4;25311:20;25307:1;25296:9;25292:17;25285:47;25349:131;25475:4;25349:131;:::i;:::-;25341:139;;25239:248;;;:::o;25493:419::-;;25697:2;25686:9;25682:18;25674:26;;25746:9;25740:4;25736:20;25732:1;25721:9;25717:17;25710:47;25774:131;25900:4;25774:131;:::i;:::-;25766:139;;25664:248;;;:::o;25918:419::-;;26122:2;26111:9;26107:18;26099:26;;26171:9;26165:4;26161:20;26157:1;26146:9;26142:17;26135:47;26199:131;26325:4;26199:131;:::i;:::-;26191:139;;26089:248;;;:::o;26343:419::-;;26547:2;26536:9;26532:18;26524:26;;26596:9;26590:4;26586:20;26582:1;26571:9;26567:17;26560:47;26624:131;26750:4;26624:131;:::i;:::-;26616:139;;26514:248;;;:::o;26768:419::-;;26972:2;26961:9;26957:18;26949:26;;27021:9;27015:4;27011:20;27007:1;26996:9;26992:17;26985:47;27049:131;27175:4;27049:131;:::i;:::-;27041:139;;26939:248;;;:::o;27193:419::-;;27397:2;27386:9;27382:18;27374:26;;27446:9;27440:4;27436:20;27432:1;27421:9;27417:17;27410:47;27474:131;27600:4;27474:131;:::i;:::-;27466:139;;27364:248;;;:::o;27618:419::-;;27822:2;27811:9;27807:18;27799:26;;27871:9;27865:4;27861:20;27857:1;27846:9;27842:17;27835:47;27899:131;28025:4;27899:131;:::i;:::-;27891:139;;27789:248;;;:::o;28043:419::-;;28247:2;28236:9;28232:18;28224:26;;28296:9;28290:4;28286:20;28282:1;28271:9;28267:17;28260:47;28324:131;28450:4;28324:131;:::i;:::-;28316:139;;28214:248;;;:::o;28468:419::-;;28672:2;28661:9;28657:18;28649:26;;28721:9;28715:4;28711:20;28707:1;28696:9;28692:17;28685:47;28749:131;28875:4;28749:131;:::i;:::-;28741:139;;28639:248;;;:::o;28893:419::-;;29097:2;29086:9;29082:18;29074:26;;29146:9;29140:4;29136:20;29132:1;29121:9;29117:17;29110:47;29174:131;29300:4;29174:131;:::i;:::-;29166:139;;29064:248;;;:::o;29318:419::-;;29522:2;29511:9;29507:18;29499:26;;29571:9;29565:4;29561:20;29557:1;29546:9;29542:17;29535:47;29599:131;29725:4;29599:131;:::i;:::-;29591:139;;29489:248;;;:::o;29743:419::-;;29947:2;29936:9;29932:18;29924:26;;29996:9;29990:4;29986:20;29982:1;29971:9;29967:17;29960:47;30024:131;30150:4;30024:131;:::i;:::-;30016:139;;29914:248;;;:::o;30168:419::-;;30372:2;30361:9;30357:18;30349:26;;30421:9;30415:4;30411:20;30407:1;30396:9;30392:17;30385:47;30449:131;30575:4;30449:131;:::i;:::-;30441:139;;30339:248;;;:::o;30593:419::-;;30797:2;30786:9;30782:18;30774:26;;30846:9;30840:4;30836:20;30832:1;30821:9;30817:17;30810:47;30874:131;31000:4;30874:131;:::i;:::-;30866:139;;30764:248;;;:::o;31018:419::-;;31222:2;31211:9;31207:18;31199:26;;31271:9;31265:4;31261:20;31257:1;31246:9;31242:17;31235:47;31299:131;31425:4;31299:131;:::i;:::-;31291:139;;31189:248;;;:::o;31443:419::-;;31647:2;31636:9;31632:18;31624:26;;31696:9;31690:4;31686:20;31682:1;31671:9;31667:17;31660:47;31724:131;31850:4;31724:131;:::i;:::-;31716:139;;31614:248;;;:::o;31868:222::-;;31999:2;31988:9;31984:18;31976:26;;32012:71;32080:1;32069:9;32065:17;32056:6;32012:71;:::i;:::-;31966:124;;;;:::o;32096:283::-;;32162:2;32156:9;32146:19;;32204:4;32196:6;32192:17;32311:6;32299:10;32296:22;32275:18;32263:10;32260:34;32257:62;32254:2;;;32322:18;;:::i;:::-;32254:2;32362:10;32358:2;32351:22;32136:243;;;;:::o;32385:331::-;;32536:18;32528:6;32525:30;32522:2;;;32558:18;;:::i;:::-;32522:2;32643:4;32639:9;32632:4;32624:6;32620:17;32616:33;32608:41;;32704:4;32698;32694:15;32686:23;;32451:265;;;:::o;32722:98::-;;32807:5;32801:12;32791:22;;32780:40;;;:::o;32826:99::-;;32912:5;32906:12;32896:22;;32885:40;;;:::o;32931:168::-;;33048:6;33043:3;33036:19;33088:4;33083:3;33079:14;33064:29;;33026:73;;;;:::o;33105:169::-;;33223:6;33218:3;33211:19;33263:4;33258:3;33254:14;33239:29;;33201:73;;;;:::o;33280:148::-;;33419:3;33404:18;;33394:34;;;;:::o;33434:525::-;;33492:19;33509:1;33492:19;:::i;:::-;33487:24;;33525:19;33542:1;33525:19;:::i;:::-;33520:24;;33713:1;33645:66;33641:74;33638:1;33634:82;33629:1;33626;33622:9;33615:17;33611:106;33608:2;;;33720:18;;:::i;:::-;33608:2;33900:1;33832:66;33828:74;33825:1;33821:82;33817:1;33814;33810:9;33806:98;33803:2;;;33907:18;;:::i;:::-;33803:2;33951:1;33948;33944:9;33937:16;;33477:482;;;;:::o;33965:305::-;;34024:20;34042:1;34024:20;:::i;:::-;34019:25;;34058:20;34076:1;34058:20;:::i;:::-;34053:25;;34212:1;34144:66;34140:74;34137:1;34134:81;34131:2;;;34218:18;;:::i;:::-;34131:2;34262:1;34259;34255:9;34248:16;;34009:261;;;;:::o;34276:185::-;;34333:20;34351:1;34333:20;:::i;:::-;34328:25;;34367:20;34385:1;34367:20;:::i;:::-;34362:25;;34406:1;34396:2;;34411:18;;:::i;:::-;34396:2;34453:1;34450;34446:9;34441:14;;34318:143;;;;:::o;34467:848::-;;;34559:6;34550:15;;34583:5;34574:14;;34597:712;34618:1;34608:8;34605:15;34597:712;;;34713:4;34708:3;34704:14;34698:4;34695:24;34692:2;;;34722:18;;:::i;:::-;34692:2;34772:1;34762:8;34758:16;34755:2;;;35187:4;35180:5;35176:16;35167:25;;34755:2;35237:4;35231;35227:15;35219:23;;35267:32;35290:8;35267:32;:::i;:::-;35255:44;;34597:712;;;34540:775;;;;;;;:::o;35321:285::-;;35405:23;35423:4;35405:23;:::i;:::-;35397:31;;35449:27;35467:8;35449:27;:::i;:::-;35437:39;;35495:104;35532:66;35522:8;35516:4;35495:104;:::i;:::-;35486:113;;35387:219;;;;:::o;35612:1073::-;;35857:8;35847:2;;35878:1;35869:10;;35880:5;;35847:2;35906:4;35896:2;;35923:1;35914:10;;35925:5;;35896:2;35992:4;36040:1;36035:27;;;;36076:1;36071:191;;;;35985:277;;36035:27;36053:1;36044:10;;36055:5;;;36071:191;36116:3;36106:8;36103:17;36100:2;;;36123:18;;:::i;:::-;36100:2;36172:8;36169:1;36165:16;36156:25;;36207:3;36200:5;36197:14;36194:2;;;36214:18;;:::i;:::-;36194:2;36247:5;;;35985:277;;36371:2;36361:8;36358:16;36352:3;36346:4;36343:13;36339:36;36321:2;36311:8;36308:16;36303:2;36297:4;36294:12;36290:35;36274:111;36271:2;;;36427:8;36421:4;36417:19;36408:28;;36462:3;36455:5;36452:14;36449:2;;;36469:18;;:::i;:::-;36449:2;36502:5;;36271:2;36542:42;36580:3;36570:8;36564:4;36561:1;36542:42;:::i;:::-;36527:57;;;;36616:4;36611:3;36607:14;36600:5;36597:25;36594:2;;;36625:18;;:::i;:::-;36594:2;36674:4;36667:5;36663:16;36654:25;;35672:1013;;;;;;:::o;36691:348::-;;36754:20;36772:1;36754:20;:::i;:::-;36749:25;;36788:20;36806:1;36788:20;:::i;:::-;36783:25;;36976:1;36908:66;36904:74;36901:1;36898:81;36893:1;36886:9;36879:17;36875:105;36872:2;;;36983:18;;:::i;:::-;36872:2;37031:1;37028;37024:9;37013:20;;36739:300;;;;:::o;37045:191::-;;37105:20;37123:1;37105:20;:::i;:::-;37100:25;;37139:20;37157:1;37139:20;:::i;:::-;37134:25;;37178:1;37175;37172:8;37169:2;;;37183:18;;:::i;:::-;37169:2;37228:1;37225;37221:9;37213:17;;37090:146;;;;:::o;37242:96::-;;37308:24;37326:5;37308:24;:::i;:::-;37297:35;;37287:51;;;:::o;37344:90::-;;37421:5;37414:13;37407:21;37396:32;;37386:48;;;:::o;37440:77::-;;37506:5;37495:16;;37485:32;;;:::o;37523:149::-;;37599:66;37592:5;37588:78;37577:89;;37567:105;;;:::o;37678:76::-;;37743:5;37732:16;;37722:32;;;:::o;37760:126::-;;37837:42;37830:5;37826:54;37815:65;;37805:81;;;:::o;37892:77::-;;37958:5;37947:16;;37937:32;;;:::o;37975:154::-;38059:6;38054:3;38049;38036:30;38121:1;38112:6;38107:3;38103:16;38096:27;38026:103;;;:::o;38135:307::-;38203:1;38213:113;38227:6;38224:1;38221:13;38213:113;;;38312:1;38307:3;38303:11;38297:18;38293:1;38288:3;38284:11;38277:39;38249:2;38246:1;38242:10;38237:15;;38213:113;;;38344:6;38341:1;38338:13;38335:2;;;38424:1;38415:6;38410:3;38406:16;38399:27;38335:2;38184:258;;;;:::o;38448:320::-;;38529:1;38523:4;38519:12;38509:22;;38576:1;38570:4;38566:12;38597:18;38587:2;;38653:4;38645:6;38641:17;38631:27;;38587:2;38715;38707:6;38704:14;38684:18;38681:38;38678:2;;;38734:18;;:::i;:::-;38678:2;38499:269;;;;:::o;38774:233::-;;38836:24;38854:5;38836:24;:::i;:::-;38827:33;;38882:66;38875:5;38872:77;38869:2;;;38952:18;;:::i;:::-;38869:2;38999:1;38992:5;38988:13;38981:20;;38817:190;;;:::o;39013:79::-;;39081:5;39070:16;;39060:32;;;:::o;39098:79::-;;39166:5;39155:16;;39145:32;;;:::o;39183:176::-;;39232:20;39250:1;39232:20;:::i;:::-;39227:25;;39266:20;39284:1;39266:20;:::i;:::-;39261:25;;39305:1;39295:2;;39310:18;;:::i;:::-;39295:2;39351:1;39348;39344:9;39339:14;;39217:142;;;;:::o;39365:180::-;39413:77;39410:1;39403:88;39510:4;39507:1;39500:15;39534:4;39531:1;39524:15;39551:180;39599:77;39596:1;39589:88;39696:4;39693:1;39686:15;39720:4;39717:1;39710:15;39737:180;39785:77;39782:1;39775:88;39882:4;39879:1;39872:15;39906:4;39903:1;39896:15;39923:180;39971:77;39968:1;39961:88;40068:4;40065:1;40058:15;40092:4;40089:1;40082:15;40109:102;;40201:2;40197:7;40192:2;40185:5;40181:14;40177:28;40167:38;;40157:54;;;:::o;40217:102::-;;40306:5;40303:1;40299:13;40278:34;;40268:51;;;:::o;40325:122::-;40398:24;40416:5;40398:24;:::i;:::-;40391:5;40388:35;40378:2;;40437:1;40434;40427:12;40378:2;40368:79;:::o;40453:116::-;40523:21;40538:5;40523:21;:::i;:::-;40516:5;40513:32;40503:2;;40559:1;40556;40549:12;40503:2;40493:76;:::o;40575:120::-;40647:23;40664:5;40647:23;:::i;:::-;40640:5;40637:34;40627:2;;40685:1;40682;40675:12;40627:2;40617:78;:::o;40701:122::-;40774:24;40792:5;40774:24;:::i;:::-;40767:5;40764:35;40754:2;;40813:1;40810;40803:12;40754:2;40744:79;:::o

Swarm Source

ipfs://799284b389ca3ea803faff9564ff43f7baca5901e2b5feab5435e39f5a7732f9
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.