ETH Price: $3,120.23 (-0.58%)

Token

BLOCKS (BLOCKS)
 

Overview

Max Total Supply

6,338,034,232.087146944106655744 BLOCKS

Holders

4,169 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
19,348.951889731691654526 BLOCKS

Value
$0.00
0x45113C640d1fAA6e6efdA99f883b05cAF4B08c2A
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:
BLOCKS

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-07-11
*/

// SPDX-License-Identifier: MIT

/**
 ________  ___       ________  ________  ___  __    ________      
|\   __  \|\  \     |\   __  \|\   ____\|\  \|\  \ |\   ____\     
\ \  \|\ /\ \  \    \ \  \|\  \ \  \___|\ \  \/  /|\ \  \___|_    
 \ \   __  \ \  \    \ \  \\\  \ \  \    \ \   ___  \ \_____  \   
  \ \  \|\  \ \  \____\ \  \\\  \ \  \____\ \  \\ \  \|____|\  \  
   \ \_______\ \_______\ \_______\ \_______\ \__\\ \__\____\_\  \ 
    \|_______|\|_______|\|_______|\|_______|\|__| \|__|\_________\
                                                      \|_________|
https://blocks.io/
*/

pragma solidity >= 0.4.22 <0.9.0;

library console {
	address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);

	function _sendLogPayload(bytes memory payload) private view {
		uint256 payloadLength = payload.length;
		address consoleAddress = CONSOLE_ADDRESS;
		assembly {
			let payloadStart := add(payload, 32)
			let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)
		}
	}

	function log() internal view {
		_sendLogPayload(abi.encodeWithSignature("log()"));
	}

	function logInt(int p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(int)", p0));
	}

	function logUint(uint p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
	}

	function logString(string memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
	}

	function logBool(bool p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
	}

	function logAddress(address p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
	}

	function logBytes(bytes memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
	}

	function logBytes1(bytes1 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
	}

	function logBytes2(bytes2 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
	}

	function logBytes3(bytes3 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
	}

	function logBytes4(bytes4 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
	}

	function logBytes5(bytes5 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
	}

	function logBytes6(bytes6 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
	}

	function logBytes7(bytes7 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
	}

	function logBytes8(bytes8 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
	}

	function logBytes9(bytes9 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
	}

	function logBytes10(bytes10 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
	}

	function logBytes11(bytes11 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
	}

	function logBytes12(bytes12 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
	}

	function logBytes13(bytes13 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
	}

	function logBytes14(bytes14 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
	}

	function logBytes15(bytes15 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
	}

	function logBytes16(bytes16 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
	}

	function logBytes17(bytes17 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
	}

	function logBytes18(bytes18 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
	}

	function logBytes19(bytes19 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
	}

	function logBytes20(bytes20 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
	}

	function logBytes21(bytes21 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
	}

	function logBytes22(bytes22 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
	}

	function logBytes23(bytes23 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
	}

	function logBytes24(bytes24 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
	}

	function logBytes25(bytes25 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
	}

	function logBytes26(bytes26 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
	}

	function logBytes27(bytes27 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
	}

	function logBytes28(bytes28 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
	}

	function logBytes29(bytes29 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
	}

	function logBytes30(bytes30 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
	}

	function logBytes31(bytes31 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
	}

	function logBytes32(bytes32 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
	}

	function log(uint p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
	}

	function log(string memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
	}

	function log(bool p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
	}

	function log(address p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
	}

	function log(uint p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1));
	}

	function log(uint p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1));
	}

	function log(uint p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1));
	}

	function log(uint p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1));
	}

	function log(string memory p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1));
	}

	function log(string memory p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
	}

	function log(string memory p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
	}

	function log(string memory p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
	}

	function log(bool p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1));
	}

	function log(bool p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
	}

	function log(bool p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
	}

	function log(bool p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
	}

	function log(address p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1));
	}

	function log(address p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
	}

	function log(address p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
	}

	function log(address p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
	}

	function log(uint p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2));
	}

	function log(uint p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2));
	}

	function log(uint p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2));
	}

	function log(uint p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2));
	}

	function log(uint p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2));
	}

	function log(uint p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2));
	}

	function log(uint p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2));
	}

	function log(uint p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2));
	}

	function log(uint p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2));
	}

	function log(uint p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2));
	}

	function log(uint p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2));
	}

	function log(uint p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
	}

	function log(string memory p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2));
	}

	function log(string memory p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
	}

	function log(string memory p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
	}

	function log(string memory p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
	}

	function log(bool p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2));
	}

	function log(bool p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2));
	}

	function log(bool p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2));
	}

	function log(bool p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
	}

	function log(bool p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2));
	}

	function log(bool p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
	}

	function log(bool p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
	}

	function log(bool p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
	}

	function log(bool p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2));
	}

	function log(bool p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
	}

	function log(bool p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
	}

	function log(bool p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
	}

	function log(address p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2));
	}

	function log(address p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2));
	}

	function log(address p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2));
	}

	function log(address p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2));
	}

	function log(address p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2));
	}

	function log(address p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
	}

	function log(address p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
	}

	function log(address p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
	}

	function log(address p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2));
	}

	function log(address p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
	}

	function log(address p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
	}

	function log(address p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
	}

	function log(address p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2));
	}

	function log(address p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
	}

	function log(address p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
	}

	function log(address p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
	}

	function log(uint p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
	}

}

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC777Token standard as defined in the EIP.
 *
 * This contract uses the
 * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 registry standard] to let
 * token holders and recipients react to token movements by using setting implementers
 * for the associated interfaces in said registry. See {IERC1820Registry} and
 * {ERC1820Implementer}.
 */
interface IERC777 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the smallest part of the token that is not divisible. This
     * means all token operations (creation, movement and destruction) must have
     * amounts that are a multiple of this number.
     *
     * For most token contracts, this value will equal 1.
     */
    function granularity() external view returns (uint256);

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

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

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * If send or receive hooks are registered for the caller and `recipient`,
     * the corresponding functions will be called with `data` and empty
     * `operatorData`. See {IERC777Sender} and {IERC777Recipient}.
     *
     * Emits a {Sent} event.
     *
     * Requirements
     *
     * - the caller must have at least `amount` tokens.
     * - `recipient` cannot be the zero address.
     * - if `recipient` is a contract, it must implement the {IERC777Recipient}
     * interface.
     */
    function send(address recipient, uint256 amount, bytes calldata data) external;

    /**
     * @dev Destroys `amount` tokens from the caller's account, reducing the
     * total supply.
     *
     * If a send hook is registered for the caller, the corresponding function
     * will be called with `data` and empty `operatorData`. See {IERC777Sender}.
     *
     * Emits a {Burned} event.
     *
     * Requirements
     *
     * - the caller must have at least `amount` tokens.
     */
    function burn(uint256 amount, bytes calldata data) external;

    /**
     * @dev Returns true if an account is an operator of `tokenHolder`.
     * Operators can send and burn tokens on behalf of their owners. All
     * accounts are their own operator.
     *
     * See {operatorSend} and {operatorBurn}.
     */
    function isOperatorFor(address operator, address tokenHolder) external view returns (bool);

    /**
     * @dev Make an account an operator of the caller.
     *
     * See {isOperatorFor}.
     *
     * Emits an {AuthorizedOperator} event.
     *
     * Requirements
     *
     * - `operator` cannot be calling address.
     */
    function authorizeOperator(address operator) external;

    /**
     * @dev Revoke an account's operator status for the caller.
     *
     * See {isOperatorFor} and {defaultOperators}.
     *
     * Emits a {RevokedOperator} event.
     *
     * Requirements
     *
     * - `operator` cannot be calling address.
     */
    function revokeOperator(address operator) external;

    /**
     * @dev Returns the list of default operators. These accounts are operators
     * for all token holders, even if {authorizeOperator} was never called on
     * them.
     *
     * This list is immutable, but individual holders may revoke these via
     * {revokeOperator}, in which case {isOperatorFor} will return false.
     */
    function defaultOperators() external view returns (address[] memory);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient`. The caller must
     * be an operator of `sender`.
     *
     * If send or receive hooks are registered for `sender` and `recipient`,
     * the corresponding functions will be called with `data` and
     * `operatorData`. See {IERC777Sender} and {IERC777Recipient}.
     *
     * Emits a {Sent} event.
     *
     * Requirements
     *
     * - `sender` cannot be the zero address.
     * - `sender` must have at least `amount` tokens.
     * - the caller must be an operator for `sender`.
     * - `recipient` cannot be the zero address.
     * - if `recipient` is a contract, it must implement the {IERC777Recipient}
     * interface.
     */
    function operatorSend(
        address sender,
        address recipient,
        uint256 amount,
        bytes calldata data,
        bytes calldata operatorData
    ) external;

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the total supply.
     * The caller must be an operator of `account`.
     *
     * If a send hook is registered for `account`, the corresponding function
     * will be called with `data` and `operatorData`. See {IERC777Sender}.
     *
     * Emits a {Burned} event.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     * - the caller must be an operator for `account`.
     */
    function operatorBurn(
        address account,
        uint256 amount,
        bytes calldata data,
        bytes calldata operatorData
    ) external;

    event Sent(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256 amount,
        bytes data,
        bytes operatorData
    );

    event Minted(address indexed operator, address indexed to, uint256 amount, bytes data, bytes operatorData);

    event Burned(address indexed operator, address indexed from, uint256 amount, bytes data, bytes operatorData);

    event AuthorizedOperator(address indexed operator, address indexed tokenHolder);

    event RevokedOperator(address indexed operator, address indexed tokenHolder);
}

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC777TokensRecipient standard as defined in the EIP.
 *
 * Accounts can be notified of {IERC777} tokens being sent to them by having a
 * contract implement this interface (contract holders can be their own
 * implementer) and registering it on the
 * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry].
 *
 * See {IERC1820Registry} and {ERC1820Implementer}.
 */
interface IERC777Recipient {
    /**
     * @dev Called by an {IERC777} token contract whenever tokens are being
     * moved or created into a registered account (`to`). The type of operation
     * is conveyed by `from` being the zero address or not.
     *
     * This call occurs _after_ the token contract's state is updated, so
     * {IERC777-balanceOf}, etc., can be used to query the post-operation state.
     *
     * This function may revert to prevent the operation from being executed.
     */
    function tokensReceived(
        address operator,
        address from,
        address to,
        uint256 amount,
        bytes calldata userData,
        bytes calldata operatorData
    ) external;
}

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC777TokensSender standard as defined in the EIP.
 *
 * {IERC777} Token holders can be notified of operations performed on their
 * tokens by having a contract implement this interface (contract holders can be
 *  their own implementer) and registering it on the
 * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry].
 *
 * See {IERC1820Registry} and {ERC1820Implementer}.
 */
interface IERC777Sender {
    /**
     * @dev Called by an {IERC777} token contract whenever a registered holder's
     * (`from`) tokens are about to be moved or destroyed. The type of operation
     * is conveyed by `to` being the zero address or not.
     *
     * This call occurs _before_ the token contract's state is updated, so
     * {IERC777-balanceOf}, etc., can be used to query the pre-operation state.
     *
     * This function may revert to prevent the operation from being executed.
     */
    function tokensToSend(
        address operator,
        address from,
        address to,
        uint256 amount,
        bytes calldata userData,
        bytes calldata operatorData
    ) external;
}

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

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

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

pragma solidity ^0.8.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

pragma solidity ^0.8.0;

/**
 * @dev Interface of the global ERC1820 Registry, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1820[EIP]. Accounts may register
 * implementers for interfaces in this registry, as well as query support.
 *
 * Implementers may be shared by multiple accounts, and can also implement more
 * than a single interface for each account. Contracts can implement interfaces
 * for themselves, but externally-owned accounts (EOA) must delegate this to a
 * contract.
 *
 * {IERC165} interfaces can also be queried via the registry.
 *
 * For an in-depth explanation and source code analysis, see the EIP text.
 */
interface IERC1820Registry {
    /**
     * @dev Sets `newManager` as the manager for `account`. A manager of an
     * account is able to set interface implementers for it.
     *
     * By default, each account is its own manager. Passing a value of `0x0` in
     * `newManager` will reset the manager to this initial state.
     *
     * Emits a {ManagerChanged} event.
     *
     * Requirements:
     *
     * - the caller must be the current manager for `account`.
     */
    function setManager(address account, address newManager) external;

    /**
     * @dev Returns the manager for `account`.
     *
     * See {setManager}.
     */
    function getManager(address account) external view returns (address);

    /**
     * @dev Sets the `implementer` contract as ``account``'s implementer for
     * `interfaceHash`.
     *
     * `account` being the zero address is an alias for the caller's address.
     * The zero address can also be used in `implementer` to remove an old one.
     *
     * See {interfaceHash} to learn how these are created.
     *
     * Emits an {InterfaceImplementerSet} event.
     *
     * Requirements:
     *
     * - the caller must be the current manager for `account`.
     * - `interfaceHash` must not be an {IERC165} interface id (i.e. it must not
     * end in 28 zeroes).
     * - `implementer` must implement {IERC1820Implementer} and return true when
     * queried for support, unless `implementer` is the caller. See
     * {IERC1820Implementer-canImplementInterfaceForAddress}.
     */
    function setInterfaceImplementer(address account, bytes32 _interfaceHash, address implementer) external;

    /**
     * @dev Returns the implementer of `interfaceHash` for `account`. If no such
     * implementer is registered, returns the zero address.
     *
     * If `interfaceHash` is an {IERC165} interface id (i.e. it ends with 28
     * zeroes), `account` will be queried for support of it.
     *
     * `account` being the zero address is an alias for the caller's address.
     */
    function getInterfaceImplementer(address account, bytes32 _interfaceHash) external view returns (address);

    /**
     * @dev Returns the interface hash for an `interfaceName`, as defined in the
     * corresponding
     * https://eips.ethereum.org/EIPS/eip-1820#interface-name[section of the EIP].
     */
    function interfaceHash(string calldata interfaceName) external pure returns (bytes32);

    /**
     * @notice Updates the cache with whether the contract implements an ERC165 interface or not.
     * @param account Address of the contract for which to update the cache.
     * @param interfaceId ERC165 interface for which to update the cache.
     */
    function updateERC165Cache(address account, bytes4 interfaceId) external;

    /**
     * @notice Checks whether a contract implements an ERC165 interface or not.
     * If the result is not cached a direct lookup on the contract address is performed.
     * If the result is not cached or the cached value is out-of-date, the cache MUST be updated manually by calling
     * {updateERC165Cache} with the contract address.
     * @param account Address of the contract to check.
     * @param interfaceId ERC165 interface to check.
     * @return True if `account` implements `interfaceId`, false otherwise.
     */
    function implementsERC165Interface(address account, bytes4 interfaceId) external view returns (bool);

    /**
     * @notice Checks whether a contract implements an ERC165 interface or not without using nor updating the cache.
     * @param account Address of the contract to check.
     * @param interfaceId ERC165 interface to check.
     * @return True if `account` implements `interfaceId`, false otherwise.
     */
    function implementsERC165InterfaceNoCache(address account, bytes4 interfaceId) external view returns (bool);

    event InterfaceImplementerSet(address indexed account, bytes32 indexed interfaceHash, address indexed implementer);

    event ManagerChanged(address indexed account, address indexed newManager);
}

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor () {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // 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;
    }
}

pragma solidity ^0.8.0;

/**
 * @dev Implementation of the {IERC777} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 *
 * Support for ERC20 is included in this contract, as specified by the EIP: both
 * the ERC777 and ERC20 interfaces can be safely used when interacting with it.
 * Both {IERC777-Sent} and {IERC20-Transfer} events are emitted on token
 * movements.
 *
 * Additionally, the {IERC777-granularity} value is hard-coded to `1`, meaning that there
 * are no special restrictions in the amount of tokens that created, moved, or
 * destroyed. This makes integration with ERC20 applications seamless.
 */
contract ERC777 is Context, IERC777, IERC20, ReentrancyGuard {
    using Address for address;

    IERC1820Registry constant internal _ERC1820_REGISTRY = IERC1820Registry(0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24);

    mapping(address => uint256) private _balances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    bytes32 private constant _TOKENS_SENDER_INTERFACE_HASH = keccak256("ERC777TokensSender");
    bytes32 private constant _TOKENS_RECIPIENT_INTERFACE_HASH = keccak256("ERC777TokensRecipient");

    // This isn't ever read from - it's only used to respond to the defaultOperators query.
    address[] private _defaultOperatorsArray;

    // Immutable, but accounts may revoke them (tracked in __revokedDefaultOperators).
    mapping(address => bool) private _defaultOperators;

    // For each account, a mapping of its operators and revoked default operators.
    mapping(address => mapping(address => bool)) private _operators;
    mapping(address => mapping(address => bool)) private _revokedDefaultOperators;

    // ERC20-allowances
    mapping (address => mapping (address => uint256)) private _allowances;

    /**
     * @dev `defaultOperators` may be an empty array.
     */
    constructor(
        string memory name_,
        string memory symbol_,
        address[] memory defaultOperators_
    ) {
        _name = name_;
        _symbol = symbol_;

        _defaultOperatorsArray = defaultOperators_;
        for (uint256 i = 0; i < defaultOperators_.length; i++) {
            _defaultOperators[defaultOperators_[i]] = true;
        }

        // register interfaces
        _ERC1820_REGISTRY.setInterfaceImplementer(address(this), keccak256("ERC777Token"), address(this));
        _ERC1820_REGISTRY.setInterfaceImplementer(address(this), keccak256("ERC20Token"), address(this));
    }

    /**
     * @dev See {IERC777-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC777-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {ERC20-decimals}.
     *
     * Always returns 18, as per the
     * [ERC777 EIP](https://eips.ethereum.org/EIPS/eip-777#backward-compatibility).
     */
    function decimals() public pure virtual returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC777-granularity}.
     *
     * This implementation always returns `1`.
     */
    function granularity() public view virtual override returns (uint256) {
        return 1;
    }

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

    /**
     * @dev Returns the amount of tokens owned by an account (`tokenHolder`).
     */
    function balanceOf(address tokenHolder) public view virtual override(IERC20, IERC777) returns (uint256) {
        return _balances[tokenHolder];
    }

    /**
     * @dev See {IERC777-send}.
     *
     * Also emits a {IERC20-Transfer} event for ERC20 compatibility.
     */
    function send(address recipient, uint256 amount, bytes memory data) public virtual override  {
        _send(_msgSender(), recipient, amount, data, "", true);
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Unlike `send`, `recipient` is _not_ required to implement the {IERC777Recipient}
     * interface if it is a contract.
     *
     * Also emits a {Sent} event.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        require(recipient != address(0), "ERC777: transfer to the zero address");

        address from = _msgSender();

        _callTokensToSend(from, from, recipient, amount, "", "");

        _move(from, from, recipient, amount, "", "");

        _callTokensReceived(from, from, recipient, amount, "", "", false);

        return true;
    }

    /**
     * @dev See {IERC777-burn}.
     *
     * Also emits a {IERC20-Transfer} event for ERC20 compatibility.
     */
    function burn(uint256 amount, bytes memory data) public virtual override  {
        _burn(_msgSender(), amount, data, "");
    }

    /**
     * @dev See {IERC777-isOperatorFor}.
     */
    function isOperatorFor(address operator, address tokenHolder) public view virtual override returns (bool) {
        return operator == tokenHolder ||
            (_defaultOperators[operator] && !_revokedDefaultOperators[tokenHolder][operator]) ||
            _operators[tokenHolder][operator];
    }

    /**
     * @dev See {IERC777-authorizeOperator}.
     */
    function authorizeOperator(address operator) public virtual override  {
        require(_msgSender() != operator, "ERC777: authorizing self as operator");

        if (_defaultOperators[operator]) {
            delete _revokedDefaultOperators[_msgSender()][operator];
        } else {
            _operators[_msgSender()][operator] = true;
        }

        emit AuthorizedOperator(operator, _msgSender());
    }

    /**
     * @dev See {IERC777-revokeOperator}.
     */
    function revokeOperator(address operator) public virtual override  {
        require(operator != _msgSender(), "ERC777: revoking self as operator");

        if (_defaultOperators[operator]) {
            _revokedDefaultOperators[_msgSender()][operator] = true;
        } else {
            delete _operators[_msgSender()][operator];
        }

        emit RevokedOperator(operator, _msgSender());
    }

    /**
     * @dev See {IERC777-defaultOperators}.
     */
    function defaultOperators() public view virtual override returns (address[] memory) {
        return _defaultOperatorsArray;
    }

    /**
     * @dev See {IERC777-operatorSend}.
     *
     * Emits {Sent} and {IERC20-Transfer} events.
     */
    function operatorSend(
        address sender,
        address recipient,
        uint256 amount,
        bytes memory data,
        bytes memory operatorData
    )
        public
        virtual
        override
    {
        require(isOperatorFor(_msgSender(), sender), "ERC777: caller is not an operator for holder");
        _send(sender, recipient, amount, data, operatorData, true);
    }

    /**
     * @dev See {IERC777-operatorBurn}.
     *
     * Emits {Burned} and {IERC20-Transfer} events.
     */
    function operatorBurn(address account, uint256 amount, bytes memory data, bytes memory operatorData) public virtual override {
        require(isOperatorFor(_msgSender(), account), "ERC777: caller is not an operator for holder");
        _burn(account, amount, data, operatorData);
    }

    /**
     * @dev See {IERC20-allowance}.
     *
     * Note that operator and allowance concepts are orthogonal: operators may
     * not have allowance, and accounts with allowance may not be operators
     * themselves.
     */
    function allowance(address holder, address spender) public view virtual override returns (uint256) {
        return _allowances[holder][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Note that accounts cannot have allowance issued by their operators.
     */
    function approve(address spender, uint256 value) public virtual override returns (bool) {
        address holder = _msgSender();
        _approve(holder, spender, value);
        return true;
    }

   /**
    * @dev See {IERC20-transferFrom}.
    *
    * Note that operator and allowance concepts are orthogonal: operators cannot
    * call `transferFrom` (unless they have allowance), and accounts with
    * allowance cannot call `operatorSend` (unless they are operators).
    *
    * Emits {Sent}, {IERC20-Transfer} and {IERC20-Approval} events.
    */
    function transferFrom(address holder, address recipient, uint256 amount) public virtual override returns (bool) {
        require(recipient != address(0), "ERC777: transfer to the zero address");
        require(holder != address(0), "ERC777: transfer from the zero address");

        address spender = _msgSender();

        _callTokensToSend(spender, holder, recipient, amount, "", "");

        _move(spender, holder, recipient, amount, "", "");

        uint256 currentAllowance = _allowances[holder][spender];
        require(currentAllowance >= amount, "ERC777: transfer amount exceeds allowance");
        _approve(holder, spender, currentAllowance - amount);

        _callTokensReceived(spender, holder, recipient, amount, "", "", false);

        return true;
    }

    /**
     * @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * If a send hook is registered for `account`, the corresponding function
     * will be called with `operator`, `data` and `operatorData`.
     *
     * See {IERC777Sender} and {IERC777Recipient}.
     *
     * Emits {Minted} and {IERC20-Transfer} events.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - if `account` is a contract, it must implement the {IERC777Recipient}
     * interface.
     */
    function _mint(
        address account,
        uint256 amount,
        bytes memory userData,
        bytes memory operatorData
    )
        internal
        virtual
    {
        _mint(account, amount, userData, operatorData, true);
    }

    /**
     * @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * If `requireReceptionAck` is set to true, and if a send hook is
     * registered for `account`, the corresponding function will be called with
     * `operator`, `data` and `operatorData`.
     *
     * See {IERC777Sender} and {IERC777Recipient}.
     *
     * Emits {Minted} and {IERC20-Transfer} events.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - if `account` is a contract, it must implement the {IERC777Recipient}
     * interface.
     */
    function _mint(
        address account,
        uint256 amount,
        bytes memory userData,
        bytes memory operatorData,
        bool requireReceptionAck
    )
        internal
        virtual
    {
        require(account != address(0), "ERC777: mint to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), account, amount);

        // Update state variables
        _totalSupply += amount;
        _balances[account] += amount;

        _callTokensReceived(operator, address(0), account, amount, userData, operatorData, requireReceptionAck);

        emit Minted(operator, account, amount, userData, operatorData);
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Send tokens
     * @param from address token holder address
     * @param to address recipient address
     * @param amount uint256 amount of tokens to transfer
     * @param userData bytes extra information provided by the token holder (if any)
     * @param operatorData bytes extra information provided by the operator (if any)
     * @param requireReceptionAck if true, contract recipients are required to implement ERC777TokensRecipient
     */
    function _send(
        address from,
        address to,
        uint256 amount,
        bytes memory userData,
        bytes memory operatorData,
        bool requireReceptionAck
    )
        internal
        virtual
    {
        require(from != address(0), "ERC777: send from the zero address");
        require(to != address(0), "ERC777: send to the zero address");

        address operator = _msgSender();

        _callTokensToSend(operator, from, to, amount, userData, operatorData);

        _move(operator, from, to, amount, userData, operatorData);

        _callTokensReceived(operator, from, to, amount, userData, operatorData, requireReceptionAck);
    }

    /**
     * @dev Burn tokens
     * @param from address token holder address
     * @param amount uint256 amount of tokens to burn
     * @param data bytes extra information provided by the token holder
     * @param operatorData bytes extra information provided by the operator (if any)
     */
    function _burn(
        address from,
        uint256 amount,
        bytes memory data,
        bytes memory operatorData
    )
        internal
        virtual
    {
        require(from != address(0), "ERC777: burn from the zero address");

        address operator = _msgSender();

        _callTokensToSend(operator, from, address(0), amount, data, operatorData);

        _beforeTokenTransfer(operator, from, address(0), amount);

        // Update state variables
        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC777: burn amount exceeds balance");
        _balances[from] = fromBalance - amount;
        _totalSupply -= amount;

        emit Burned(operator, from, amount, data, operatorData);
        emit Transfer(from, address(0), amount);
    }

    function _move(
        address operator,
        address from,
        address to,
        uint256 amount,
        bytes memory userData,
        bytes memory operatorData
    )
        private
    {
        _beforeTokenTransfer(operator, from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC777: transfer amount exceeds balance");
        _balances[from] = fromBalance - amount;
        _balances[to] += amount;

        emit Sent(operator, from, to, amount, userData, operatorData);
        emit Transfer(from, to, amount);
    }

    /**
     * @dev See {ERC20-_approve}.
     *
     * Note that accounts cannot have allowance issued by their operators.
     */
    function _approve(address holder, address spender, uint256 value) internal {
        require(holder != address(0), "ERC777: approve from the zero address");
        require(spender != address(0), "ERC777: approve to the zero address");

        _allowances[holder][spender] = value;
        emit Approval(holder, spender, value);
    }

    /**
     * @dev Call from.tokensToSend() if the interface is registered
     * @param operator address operator requesting the transfer
     * @param from address token holder address
     * @param to address recipient address
     * @param amount uint256 amount of tokens to transfer
     * @param userData bytes extra information provided by the token holder (if any)
     * @param operatorData bytes extra information provided by the operator (if any)
     */
    function _callTokensToSend(
        address operator,
        address from,
        address to,
        uint256 amount,
        bytes memory userData,
        bytes memory operatorData
    )
        private nonReentrant
    {
        address implementer = _ERC1820_REGISTRY.getInterfaceImplementer(from, _TOKENS_SENDER_INTERFACE_HASH);
        if (implementer != address(0)) {
            IERC777Sender(implementer).tokensToSend(operator, from, to, amount, userData, operatorData);
        }
    }

    /**
     * @dev Call to.tokensReceived() if the interface is registered. Reverts if the recipient is a contract but
     * tokensReceived() was not registered for the recipient
     * @param operator address operator requesting the transfer
     * @param from address token holder address
     * @param to address recipient address
     * @param amount uint256 amount of tokens to transfer
     * @param userData bytes extra information provided by the token holder (if any)
     * @param operatorData bytes extra information provided by the operator (if any)
     * @param requireReceptionAck if true, contract recipients are required to implement ERC777TokensRecipient
     */
    function _callTokensReceived(
        address operator,
        address from,
        address to,
        uint256 amount,
        bytes memory userData,
        bytes memory operatorData,
        bool requireReceptionAck
    )
        private
    {
        address implementer = _ERC1820_REGISTRY.getInterfaceImplementer(to, _TOKENS_RECIPIENT_INTERFACE_HASH);
        if (implementer != address(0)) {
            IERC777Recipient(implementer).tokensReceived(operator, from, to, amount, userData, operatorData);
        } else if (requireReceptionAck) {
            require(!to.isContract(), "ERC777: token recipient contract has no implementer for ERC777TokensRecipient");
        }
    }

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

pragma solidity ^0.8.0;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

pragma solidity >=0.4.22 <0.9.0;


contract BLOCKS is ERC777, Ownable {

    constructor(
        string memory name,
        string memory symbol,
        address[] memory defaultOperators,
        uint256 initialSupply,
        address treasury
    ) ERC777(name, symbol, defaultOperators) Ownable(){
        _mint(treasury, initialSupply, "", "");
    }

    function release(address payable to, uint256 amount) public {
         require(msg.sender == owner());
         this.transfer(to, amount);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address[]","name":"defaultOperators","type":"address[]"},{"internalType":"uint256","name":"initialSupply","type":"uint256"},{"internalType":"address","name":"treasury","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"tokenHolder","type":"address"}],"name":"AuthorizedOperator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"Burned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"Minted","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":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"tokenHolder","type":"address"}],"name":"RevokedOperator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"Sent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"authorizeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenHolder","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"defaultOperators","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"granularity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"tokenHolder","type":"address"}],"name":"isOperatorFor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"operatorBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"operatorSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"revokeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"send","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","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":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040516200459d3803806200459d833981810160405281019062000037919062000a73565b848484600160008190555082600390805190602001906200005a929190620007c6565b50816004908051906020019062000073929190620007c6565b5080600590805190602001906200008c92919062000857565b5060005b81518110156200014957600160066000848481518110620000da577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080620001409062000fe9565b91505062000090565b50731820a4b7618bde71dce8cdc73aab6c95905fad2473ffffffffffffffffffffffffffffffffffffffff166329965a1d307fac7fbab5f54a3ca8194167523c6753bfeb96a445279294b6125b68cce2177054306040518463ffffffff1660e01b8152600401620001bd9392919062000d2c565b600060405180830381600087803b158015620001d857600080fd5b505af1158015620001ed573d6000803e3d6000fd5b50505050731820a4b7618bde71dce8cdc73aab6c95905fad2473ffffffffffffffffffffffffffffffffffffffff166329965a1d307faea199e31a596269b42cdafd93407f14436db6e4cad65417994c2eb37381e05a306040518463ffffffff1660e01b8152600401620002649392919062000d2c565b600060405180830381600087803b1580156200027f57600080fd5b505af115801562000294573d6000803e3d6000fd5b505050505050506000620002ad6200038960201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506200037e818360405180602001604052806000815250604051806020016040528060008152506200039160201b60201c565b505050505062001109565b600033905090565b620003a7848484846001620003ad60201b60201c565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141562000420576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004179062000d69565b60405180910390fd5b6000620004326200038960201b60201c565b9050620004498160008888620005af60201b60201c565b84600260008282546200045d919062000ed8565b9250508190555084600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620004b5919062000ed8565b92505081905550620004d48160008888888888620005b560201b60201c565b8573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f2fe5be0146f74c5bce36c0b80911af6c7d86ff27e89d5cfa61fc681327954e5d878787604051620005379392919062000dca565b60405180910390a38573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516200059f919062000dad565b60405180910390a3505050505050565b50505050565b6000731820a4b7618bde71dce8cdc73aab6c95905fad2473ffffffffffffffffffffffffffffffffffffffff1663aabbb8ca877fb281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b6040518363ffffffff1660e01b81526004016200062892919062000cff565b60206040518083038186803b1580156200064157600080fd5b505afa15801562000656573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200067c919062000a47565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161462000731578073ffffffffffffffffffffffffffffffffffffffff166223de298989898989896040518763ffffffff1660e01b8152600401620006f79695949392919062000c84565b600060405180830381600087803b1580156200071257600080fd5b505af115801562000727573d6000803e3d6000fd5b50505050620007a9565b8115620007a857620007648673ffffffffffffffffffffffffffffffffffffffff16620007b360201b620015bb1760201c565b15620007a7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200079e9062000d8b565b60405180910390fd5b5b5b5050505050505050565b600080823b905060008111915050919050565b828054620007d49062000fb3565b90600052602060002090601f016020900481019282620007f8576000855562000844565b82601f106200081357805160ff191683800117855562000844565b8280016001018555821562000844579182015b828111156200084357825182559160200191906001019062000826565b5b509050620008539190620008e6565b5090565b828054828255906000526020600020908101928215620008d3579160200282015b82811115620008d25782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019062000878565b5b509050620008e29190620008e6565b5090565b5b8082111562000901576000816000905550600101620008e7565b5090565b60006200091c620009168462000e49565b62000e15565b905080838252602082019050828560208602820111156200093c57600080fd5b60005b85811015620009705781620009558882620009bf565b8452602084019350602083019250506001810190506200093f565b5050509392505050565b6000620009916200098b8462000e78565b62000e15565b905082815260208101848484011115620009aa57600080fd5b620009b784828562000f7d565b509392505050565b600081519050620009d081620010d5565b92915050565b600082601f830112620009e857600080fd5b8151620009fa84826020860162000905565b91505092915050565b600082601f83011262000a1557600080fd5b815162000a278482602086016200097a565b91505092915050565b60008151905062000a4181620010ef565b92915050565b60006020828403121562000a5a57600080fd5b600062000a6a84828501620009bf565b91505092915050565b600080600080600060a0868803121562000a8c57600080fd5b600086015167ffffffffffffffff81111562000aa757600080fd5b62000ab58882890162000a03565b955050602086015167ffffffffffffffff81111562000ad357600080fd5b62000ae18882890162000a03565b945050604086015167ffffffffffffffff81111562000aff57600080fd5b62000b0d88828901620009d6565b935050606062000b208882890162000a30565b925050608062000b3388828901620009bf565b9150509295509295909350565b62000b4b8162000f35565b82525050565b62000b5c8162000f49565b82525050565b600062000b6f8262000eab565b62000b7b818562000eb6565b935062000b8d81856020860162000f7d565b62000b9881620010c4565b840191505092915050565b600062000bb260208362000ec7565b91507f4552433737373a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600062000bf4604d8362000ec7565b91507f4552433737373a20746f6b656e20726563697069656e7420636f6e747261637460008301527f20686173206e6f20696d706c656d656e74657220666f7220455243373737546f60208301527f6b656e73526563697069656e74000000000000000000000000000000000000006040830152606082019050919050565b62000c7e8162000f73565b82525050565b600060c08201905062000c9b600083018962000b40565b62000caa602083018862000b40565b62000cb9604083018762000b40565b62000cc8606083018662000c73565b818103608083015262000cdc818562000b62565b905081810360a083015262000cf2818462000b62565b9050979650505050505050565b600060408201905062000d16600083018562000b40565b62000d25602083018462000b51565b9392505050565b600060608201905062000d43600083018662000b40565b62000d52602083018562000b51565b62000d61604083018462000b40565b949350505050565b6000602082019050818103600083015262000d848162000ba3565b9050919050565b6000602082019050818103600083015262000da68162000be5565b9050919050565b600060208201905062000dc4600083018462000c73565b92915050565b600060608201905062000de1600083018662000c73565b818103602083015262000df5818562000b62565b9050818103604083015262000e0b818462000b62565b9050949350505050565b6000604051905081810181811067ffffffffffffffff8211171562000e3f5762000e3e62001095565b5b8060405250919050565b600067ffffffffffffffff82111562000e675762000e6662001095565b5b602082029050602081019050919050565b600067ffffffffffffffff82111562000e965762000e9562001095565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600062000ee58262000f73565b915062000ef28362000f73565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000f2a5762000f2962001037565b5b828201905092915050565b600062000f428262000f53565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562000f9d57808201518184015260208101905062000f80565b8381111562000fad576000848401525b50505050565b6000600282049050600182168062000fcc57607f821691505b6020821081141562000fe35762000fe262001066565b5b50919050565b600062000ff68262000f73565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156200102c576200102b62001037565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b620010e08162000f35565b8114620010ec57600080fd5b50565b620010fa8162000f73565b81146200110657600080fd5b50565b61348480620011196000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c80638da5cb5b116100b8578063d95b63711161007c578063d95b637114610353578063dd62ed3e14610383578063f2fde38b146103b3578063fad8b32a146103cf578063fc673c4f146103eb578063fe9d93031461040757610142565b80638da5cb5b146102af578063959b8c3f146102cd57806395d89b41146102e95780639bd9bbc614610307578063a9059cbb1461032357610142565b806323b872dd1161010a57806323b872dd146101ed578063313ce5671461021d578063556f0dc71461023b57806362ad1b831461025957806370a0823114610275578063715018a6146102a557610142565b80630357371d1461014757806306e485381461016357806306fdde0314610181578063095ea7b31461019f57806318160ddd146101cf575b600080fd5b610161600480360381019061015c919061221b565b610423565b005b61016b6104f4565b6040516101789190612de3565b60405180910390f35b610189610582565b6040516101969190612e20565b60405180910390f35b6101b960048036038101906101b49190612389565b610614565b6040516101c69190612e05565b60405180910390f35b6101d7610637565b6040516101e49190613062565b60405180910390f35b61020760048036038101906102029190612293565b610641565b6040516102149190612e05565b60405180910390f35b61022561089b565b60405161023291906130c2565b60405180910390f35b6102436108a4565b6040516102509190613062565b60405180910390f35b610273600480360381019061026e91906122e2565b6108ad565b005b61028f600480360381019061028a91906121c9565b610913565b60405161029c9190613062565b60405180910390f35b6102ad61095c565b005b6102b7610a99565b6040516102c49190612d07565b60405180910390f35b6102e760048036038101906102e291906121c9565b610ac3565b005b6102f1610d24565b6040516102fe9190612e20565b60405180910390f35b610321600480360381019061031c91906123c5565b610db6565b005b61033d60048036038101906103389190612389565b610de0565b60405161034a9190612e05565b60405180910390f35b61036d60048036038101906103689190612257565b610eee565b60405161037a9190612e05565b60405180910390f35b61039d60048036038101906103989190612257565b61109f565b6040516103aa9190613062565b60405180910390f35b6103cd60048036038101906103c891906121c9565b611126565b005b6103e960048036038101906103e491906121c9565b6112d2565b005b6104056004803603810190610400919061242c565b611533565b005b610421600480360381019061041c91906124e8565b611595565b005b61042b610a99565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461046257600080fd5b3073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b815260040161049d929190612d22565b602060405180830381600087803b1580156104b757600080fd5b505af11580156104cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104ef91906124bf565b505050565b6060600580548060200260200160405190810160405280929190818152602001828054801561057857602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161052e575b5050505050905090565b60606003805461059190613322565b80601f01602080910402602001604051908101604052809291908181526020018280546105bd90613322565b801561060a5780601f106105df5761010080835404028352916020019161060a565b820191906000526020600020905b8154815290600101906020018083116105ed57829003601f168201915b5050505050905090565b60008061061f6115ce565b905061062c8185856115d6565b600191505092915050565b6000600254905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156106b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106a990612f62565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415610722576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071990612fc2565b60405180910390fd5b600061072c6115ce565b905061075a8186868660405180602001604052806000815250604051806020016040528060008152506117a1565b61078681868686604051806020016040528060008152506040518060200160405280600081525061196d565b6000600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508381101561084a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084190612fa2565b60405180910390fd5b6108608683868461085b9190613205565b6115d6565b61088e8287878760405180602001604052806000815250604051806020016040528060008152506000611b93565b6001925050509392505050565b60006012905090565b60006001905090565b6108be6108b86115ce565b86610eee565b6108fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f490612f82565b60405180910390fd5b61090c85858585856001611d74565b5050505050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6109646115ce565b73ffffffffffffffffffffffffffffffffffffffff16610982610a99565b73ffffffffffffffffffffffffffffffffffffffff16146109d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cf90612f22565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8073ffffffffffffffffffffffffffffffffffffffff16610ae26115ce565b73ffffffffffffffffffffffffffffffffffffffff161415610b39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3090612ee2565b60405180910390fd5b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610c235760086000610b976115ce565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055610cc0565b600160076000610c316115ce565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b610cc86115ce565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167ff4caeb2d6ca8932a215a353d0703c326ec2d81fc68170f320eb2ab49e9df61f960405160405180910390a350565b606060048054610d3390613322565b80601f0160208091040260200160405190810160405280929190818152602001828054610d5f90613322565b8015610dac5780601f10610d8157610100808354040283529160200191610dac565b820191906000526020600020905b815481529060010190602001808311610d8f57829003601f168201915b5050505050905090565b610ddb610dc16115ce565b848484604051806020016040528060008152506001611d74565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4890612f62565b60405180910390fd5b6000610e5b6115ce565b9050610e898182868660405180602001604052806000815250604051806020016040528060008152506117a1565b610eb581828686604051806020016040528060008152506040518060200160405280600081525061196d565b610ee38182868660405180602001604052806000815250604051806020016040528060008152506000611b93565b600191505092915050565b60008173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806110065750600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156110055750600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b5b806110975750600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b905092915050565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61112e6115ce565b73ffffffffffffffffffffffffffffffffffffffff1661114c610a99565b73ffffffffffffffffffffffffffffffffffffffff16146111a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119990612f22565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611212576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120990612ea2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6112da6115ce565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611348576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133f90612f02565b60405180910390fd5b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561143b576001600860006113a86115ce565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506114cf565b600760006114476115ce565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690555b6114d76115ce565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f50546e66e5f44d728365dc3908c63bc5cfeeab470722c1677e3073a6ac294aa160405160405180910390a350565b61154461153e6115ce565b85610eee565b611583576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157a90612f82565b60405180910390fd5b61158f84848484611e94565b50505050565b6115b76115a06115ce565b838360405180602001604052806000815250611e94565b5050565b600080823b905060008111915050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611646576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163d90612e42565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ad90613042565b60405180910390fd5b80600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516117949190613062565b60405180910390a3505050565b600260005414156117e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117de90612fe2565b60405180910390fd5b60026000819055506000731820a4b7618bde71dce8cdc73aab6c95905fad2473ffffffffffffffffffffffffffffffffffffffff1663aabbb8ca877f29ddb589b1fb5fc7cf394961c1adf5f8c6454761adf795e67fe149f658abe8956040518363ffffffff1660e01b8152600401611860929190612dba565b60206040518083038186803b15801561187857600080fd5b505afa15801561188c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118b091906121f2565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461195c578073ffffffffffffffffffffffffffffffffffffffff166375ab97828888888888886040518763ffffffff1660e01b815260040161192996959493929190612d4b565b600060405180830381600087803b15801561194357600080fd5b505af1158015611957573d6000803e3d6000fd5b505050505b506001600081905550505050505050565b611979868686866120f2565b6000600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015611a00576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f790612e82565b60405180910390fd5b8381611a0c9190613205565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555083600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a9e91906131af565b925050819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f06b541ddaa720db2b10a4d0cdac39b8d360425fc073085fac19bc82614677987878787604051611b1d9392919061307d565b60405180910390a48473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611b829190613062565b60405180910390a350505050505050565b6000731820a4b7618bde71dce8cdc73aab6c95905fad2473ffffffffffffffffffffffffffffffffffffffff1663aabbb8ca877fb281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b6040518363ffffffff1660e01b8152600401611c04929190612dba565b60206040518083038186803b158015611c1c57600080fd5b505afa158015611c30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5491906121f2565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611d03578073ffffffffffffffffffffffffffffffffffffffff166223de298989898989896040518763ffffffff1660e01b8152600401611ccc96959493929190612d4b565b600060405180830381600087803b158015611ce657600080fd5b505af1158015611cfa573d6000803e3d6000fd5b50505050611d6a565b8115611d6957611d288673ffffffffffffffffffffffffffffffffffffffff166115bb565b15611d68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5f90612f42565b60405180910390fd5b5b5b5050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415611de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ddb90612e62565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611e54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4b90613022565b60405180910390fd5b6000611e5e6115ce565b9050611e6e8188888888886117a1565b611e7c81888888888861196d565b611e8b81888888888888611b93565b50505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611f04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611efb90612ec2565b60405180910390fd5b6000611f0e6115ce565b9050611f1f818660008787876117a1565b611f2c81866000876120f2565b6000600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905084811015611fb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611faa90613002565b60405180910390fd5b8481611fbf9190613205565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555084600260008282546120149190613205565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fa78a9be3a7b862d26933ad85fb11d80ef66b8f972d7cbba06621d583943a409887878760405161207c9392919061307d565b60405180910390a3600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516120e29190613062565b60405180910390a3505050505050565b50505050565b600061210b6121068461310e565b6130dd565b90508281526020810184848401111561212357600080fd5b61212e8482856132e0565b509392505050565b600081359050612145816133f2565b92915050565b60008151905061215a816133f2565b92915050565b60008135905061216f81613409565b92915050565b60008151905061218481613420565b92915050565b600082601f83011261219b57600080fd5b81356121ab8482602086016120f8565b91505092915050565b6000813590506121c381613437565b92915050565b6000602082840312156121db57600080fd5b60006121e984828501612136565b91505092915050565b60006020828403121561220457600080fd5b60006122128482850161214b565b91505092915050565b6000806040838503121561222e57600080fd5b600061223c85828601612160565b925050602061224d858286016121b4565b9150509250929050565b6000806040838503121561226a57600080fd5b600061227885828601612136565b925050602061228985828601612136565b9150509250929050565b6000806000606084860312156122a857600080fd5b60006122b686828701612136565b93505060206122c786828701612136565b92505060406122d8868287016121b4565b9150509250925092565b600080600080600060a086880312156122fa57600080fd5b600061230888828901612136565b955050602061231988828901612136565b945050604061232a888289016121b4565b935050606086013567ffffffffffffffff81111561234757600080fd5b6123538882890161218a565b925050608086013567ffffffffffffffff81111561237057600080fd5b61237c8882890161218a565b9150509295509295909350565b6000806040838503121561239c57600080fd5b60006123aa85828601612136565b92505060206123bb858286016121b4565b9150509250929050565b6000806000606084860312156123da57600080fd5b60006123e886828701612136565b93505060206123f9868287016121b4565b925050604084013567ffffffffffffffff81111561241657600080fd5b6124228682870161218a565b9150509250925092565b6000806000806080858703121561244257600080fd5b600061245087828801612136565b9450506020612461878288016121b4565b935050604085013567ffffffffffffffff81111561247e57600080fd5b61248a8782880161218a565b925050606085013567ffffffffffffffff8111156124a757600080fd5b6124b38782880161218a565b91505092959194509250565b6000602082840312156124d157600080fd5b60006124df84828501612175565b91505092915050565b600080604083850312156124fb57600080fd5b6000612509858286016121b4565b925050602083013567ffffffffffffffff81111561252657600080fd5b6125328582860161218a565b9150509250929050565b60006125488383612563565b60208301905092915050565b61255d816132aa565b82525050565b61256c81613239565b82525050565b61257b81613239565b82525050565b600061258c8261314e565b612596818561317c565b93506125a18361313e565b8060005b838110156125d25781516125b9888261253c565b97506125c48361316f565b9250506001810190506125a5565b5085935050505092915050565b6125e88161325d565b82525050565b6125f781613269565b82525050565b600061260882613159565b612612818561318d565b93506126228185602086016132ef565b61262b816133e1565b840191505092915050565b600061264182613164565b61264b818561319e565b935061265b8185602086016132ef565b612664816133e1565b840191505092915050565b600061267c60258361319e565b91507f4552433737373a20617070726f76652066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006126e260228361319e565b91507f4552433737373a2073656e642066726f6d20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061274860278361319e565b91507f4552433737373a207472616e7366657220616d6f756e7420657863656564732060008301527f62616c616e6365000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006127ae60268361319e565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061281460228361319e565b91507f4552433737373a206275726e2066726f6d20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061287a60248361319e565b91507f4552433737373a20617574686f72697a696e672073656c66206173206f70657260008301527f61746f72000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006128e060218361319e565b91507f4552433737373a207265766f6b696e672073656c66206173206f70657261746f60008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061294660208361319e565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000612986604d8361319e565b91507f4552433737373a20746f6b656e20726563697069656e7420636f6e747261637460008301527f20686173206e6f20696d706c656d656e74657220666f7220455243373737546f60208301527f6b656e73526563697069656e74000000000000000000000000000000000000006040830152606082019050919050565b6000612a1260248361319e565b91507f4552433737373a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612a78602c8361319e565b91507f4552433737373a2063616c6c6572206973206e6f7420616e206f70657261746f60008301527f7220666f7220686f6c64657200000000000000000000000000000000000000006020830152604082019050919050565b6000612ade60298361319e565b91507f4552433737373a207472616e7366657220616d6f756e7420657863656564732060008301527f616c6c6f77616e636500000000000000000000000000000000000000000000006020830152604082019050919050565b6000612b4460268361319e565b91507f4552433737373a207472616e736665722066726f6d20746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612baa601f8361319e565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b6000612bea60238361319e565b91507f4552433737373a206275726e20616d6f756e7420657863656564732062616c6160008301527f6e636500000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612c5060208361319e565b91507f4552433737373a2073656e6420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000612c9060238361319e565b91507f4552433737373a20617070726f766520746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b612cf281613293565b82525050565b612d018161329d565b82525050565b6000602082019050612d1c6000830184612572565b92915050565b6000604082019050612d376000830185612554565b612d446020830184612ce9565b9392505050565b600060c082019050612d606000830189612572565b612d6d6020830188612572565b612d7a6040830187612572565b612d876060830186612ce9565b8181036080830152612d9981856125fd565b905081810360a0830152612dad81846125fd565b9050979650505050505050565b6000604082019050612dcf6000830185612572565b612ddc60208301846125ee565b9392505050565b60006020820190508181036000830152612dfd8184612581565b905092915050565b6000602082019050612e1a60008301846125df565b92915050565b60006020820190508181036000830152612e3a8184612636565b905092915050565b60006020820190508181036000830152612e5b8161266f565b9050919050565b60006020820190508181036000830152612e7b816126d5565b9050919050565b60006020820190508181036000830152612e9b8161273b565b9050919050565b60006020820190508181036000830152612ebb816127a1565b9050919050565b60006020820190508181036000830152612edb81612807565b9050919050565b60006020820190508181036000830152612efb8161286d565b9050919050565b60006020820190508181036000830152612f1b816128d3565b9050919050565b60006020820190508181036000830152612f3b81612939565b9050919050565b60006020820190508181036000830152612f5b81612979565b9050919050565b60006020820190508181036000830152612f7b81612a05565b9050919050565b60006020820190508181036000830152612f9b81612a6b565b9050919050565b60006020820190508181036000830152612fbb81612ad1565b9050919050565b60006020820190508181036000830152612fdb81612b37565b9050919050565b60006020820190508181036000830152612ffb81612b9d565b9050919050565b6000602082019050818103600083015261301b81612bdd565b9050919050565b6000602082019050818103600083015261303b81612c43565b9050919050565b6000602082019050818103600083015261305b81612c83565b9050919050565b60006020820190506130776000830184612ce9565b92915050565b60006060820190506130926000830186612ce9565b81810360208301526130a481856125fd565b905081810360408301526130b881846125fd565b9050949350505050565b60006020820190506130d76000830184612cf8565b92915050565b6000604051905081810181811067ffffffffffffffff82111715613104576131036133b2565b5b8060405250919050565b600067ffffffffffffffff821115613129576131286133b2565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b60006131ba82613293565b91506131c583613293565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156131fa576131f9613354565b5b828201905092915050565b600061321082613293565b915061321b83613293565b92508282101561322e5761322d613354565b5b828203905092915050565b600061324482613273565b9050919050565b600061325682613273565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006132b5826132bc565b9050919050565b60006132c7826132ce565b9050919050565b60006132d982613273565b9050919050565b82818337600083830152505050565b60005b8381101561330d5780820151818401526020810190506132f2565b8381111561331c576000848401525b50505050565b6000600282049050600182168061333a57607f821691505b6020821081141561334e5761334d613383565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6133fb81613239565b811461340657600080fd5b50565b6134128161324b565b811461341d57600080fd5b50565b6134298161325d565b811461343457600080fd5b50565b61344081613293565b811461344b57600080fd5b5056fea2646970667358221220ccfdb130a73465a8e33910ee3a58690fac04cb0c98a2d11641fe611ab32d18f864736f6c6343000800003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000204fce5e3e25026110000000000000000000000000000000f0e3ea754d038b979cd0124e2f1a4bf44f32746a0000000000000000000000000000000000000000000000000000000000000006424c4f434b5300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006424c4f434b5300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101425760003560e01c80638da5cb5b116100b8578063d95b63711161007c578063d95b637114610353578063dd62ed3e14610383578063f2fde38b146103b3578063fad8b32a146103cf578063fc673c4f146103eb578063fe9d93031461040757610142565b80638da5cb5b146102af578063959b8c3f146102cd57806395d89b41146102e95780639bd9bbc614610307578063a9059cbb1461032357610142565b806323b872dd1161010a57806323b872dd146101ed578063313ce5671461021d578063556f0dc71461023b57806362ad1b831461025957806370a0823114610275578063715018a6146102a557610142565b80630357371d1461014757806306e485381461016357806306fdde0314610181578063095ea7b31461019f57806318160ddd146101cf575b600080fd5b610161600480360381019061015c919061221b565b610423565b005b61016b6104f4565b6040516101789190612de3565b60405180910390f35b610189610582565b6040516101969190612e20565b60405180910390f35b6101b960048036038101906101b49190612389565b610614565b6040516101c69190612e05565b60405180910390f35b6101d7610637565b6040516101e49190613062565b60405180910390f35b61020760048036038101906102029190612293565b610641565b6040516102149190612e05565b60405180910390f35b61022561089b565b60405161023291906130c2565b60405180910390f35b6102436108a4565b6040516102509190613062565b60405180910390f35b610273600480360381019061026e91906122e2565b6108ad565b005b61028f600480360381019061028a91906121c9565b610913565b60405161029c9190613062565b60405180910390f35b6102ad61095c565b005b6102b7610a99565b6040516102c49190612d07565b60405180910390f35b6102e760048036038101906102e291906121c9565b610ac3565b005b6102f1610d24565b6040516102fe9190612e20565b60405180910390f35b610321600480360381019061031c91906123c5565b610db6565b005b61033d60048036038101906103389190612389565b610de0565b60405161034a9190612e05565b60405180910390f35b61036d60048036038101906103689190612257565b610eee565b60405161037a9190612e05565b60405180910390f35b61039d60048036038101906103989190612257565b61109f565b6040516103aa9190613062565b60405180910390f35b6103cd60048036038101906103c891906121c9565b611126565b005b6103e960048036038101906103e491906121c9565b6112d2565b005b6104056004803603810190610400919061242c565b611533565b005b610421600480360381019061041c91906124e8565b611595565b005b61042b610a99565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461046257600080fd5b3073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b815260040161049d929190612d22565b602060405180830381600087803b1580156104b757600080fd5b505af11580156104cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104ef91906124bf565b505050565b6060600580548060200260200160405190810160405280929190818152602001828054801561057857602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161052e575b5050505050905090565b60606003805461059190613322565b80601f01602080910402602001604051908101604052809291908181526020018280546105bd90613322565b801561060a5780601f106105df5761010080835404028352916020019161060a565b820191906000526020600020905b8154815290600101906020018083116105ed57829003601f168201915b5050505050905090565b60008061061f6115ce565b905061062c8185856115d6565b600191505092915050565b6000600254905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156106b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106a990612f62565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415610722576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071990612fc2565b60405180910390fd5b600061072c6115ce565b905061075a8186868660405180602001604052806000815250604051806020016040528060008152506117a1565b61078681868686604051806020016040528060008152506040518060200160405280600081525061196d565b6000600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508381101561084a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084190612fa2565b60405180910390fd5b6108608683868461085b9190613205565b6115d6565b61088e8287878760405180602001604052806000815250604051806020016040528060008152506000611b93565b6001925050509392505050565b60006012905090565b60006001905090565b6108be6108b86115ce565b86610eee565b6108fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f490612f82565b60405180910390fd5b61090c85858585856001611d74565b5050505050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6109646115ce565b73ffffffffffffffffffffffffffffffffffffffff16610982610a99565b73ffffffffffffffffffffffffffffffffffffffff16146109d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cf90612f22565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8073ffffffffffffffffffffffffffffffffffffffff16610ae26115ce565b73ffffffffffffffffffffffffffffffffffffffff161415610b39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3090612ee2565b60405180910390fd5b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610c235760086000610b976115ce565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055610cc0565b600160076000610c316115ce565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b610cc86115ce565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167ff4caeb2d6ca8932a215a353d0703c326ec2d81fc68170f320eb2ab49e9df61f960405160405180910390a350565b606060048054610d3390613322565b80601f0160208091040260200160405190810160405280929190818152602001828054610d5f90613322565b8015610dac5780601f10610d8157610100808354040283529160200191610dac565b820191906000526020600020905b815481529060010190602001808311610d8f57829003601f168201915b5050505050905090565b610ddb610dc16115ce565b848484604051806020016040528060008152506001611d74565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4890612f62565b60405180910390fd5b6000610e5b6115ce565b9050610e898182868660405180602001604052806000815250604051806020016040528060008152506117a1565b610eb581828686604051806020016040528060008152506040518060200160405280600081525061196d565b610ee38182868660405180602001604052806000815250604051806020016040528060008152506000611b93565b600191505092915050565b60008173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806110065750600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156110055750600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b5b806110975750600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b905092915050565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61112e6115ce565b73ffffffffffffffffffffffffffffffffffffffff1661114c610a99565b73ffffffffffffffffffffffffffffffffffffffff16146111a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119990612f22565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611212576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120990612ea2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6112da6115ce565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611348576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133f90612f02565b60405180910390fd5b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561143b576001600860006113a86115ce565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506114cf565b600760006114476115ce565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690555b6114d76115ce565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f50546e66e5f44d728365dc3908c63bc5cfeeab470722c1677e3073a6ac294aa160405160405180910390a350565b61154461153e6115ce565b85610eee565b611583576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157a90612f82565b60405180910390fd5b61158f84848484611e94565b50505050565b6115b76115a06115ce565b838360405180602001604052806000815250611e94565b5050565b600080823b905060008111915050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611646576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163d90612e42565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ad90613042565b60405180910390fd5b80600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516117949190613062565b60405180910390a3505050565b600260005414156117e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117de90612fe2565b60405180910390fd5b60026000819055506000731820a4b7618bde71dce8cdc73aab6c95905fad2473ffffffffffffffffffffffffffffffffffffffff1663aabbb8ca877f29ddb589b1fb5fc7cf394961c1adf5f8c6454761adf795e67fe149f658abe8956040518363ffffffff1660e01b8152600401611860929190612dba565b60206040518083038186803b15801561187857600080fd5b505afa15801561188c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118b091906121f2565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461195c578073ffffffffffffffffffffffffffffffffffffffff166375ab97828888888888886040518763ffffffff1660e01b815260040161192996959493929190612d4b565b600060405180830381600087803b15801561194357600080fd5b505af1158015611957573d6000803e3d6000fd5b505050505b506001600081905550505050505050565b611979868686866120f2565b6000600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015611a00576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f790612e82565b60405180910390fd5b8381611a0c9190613205565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555083600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a9e91906131af565b925050819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f06b541ddaa720db2b10a4d0cdac39b8d360425fc073085fac19bc82614677987878787604051611b1d9392919061307d565b60405180910390a48473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611b829190613062565b60405180910390a350505050505050565b6000731820a4b7618bde71dce8cdc73aab6c95905fad2473ffffffffffffffffffffffffffffffffffffffff1663aabbb8ca877fb281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b6040518363ffffffff1660e01b8152600401611c04929190612dba565b60206040518083038186803b158015611c1c57600080fd5b505afa158015611c30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5491906121f2565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611d03578073ffffffffffffffffffffffffffffffffffffffff166223de298989898989896040518763ffffffff1660e01b8152600401611ccc96959493929190612d4b565b600060405180830381600087803b158015611ce657600080fd5b505af1158015611cfa573d6000803e3d6000fd5b50505050611d6a565b8115611d6957611d288673ffffffffffffffffffffffffffffffffffffffff166115bb565b15611d68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5f90612f42565b60405180910390fd5b5b5b5050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415611de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ddb90612e62565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611e54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4b90613022565b60405180910390fd5b6000611e5e6115ce565b9050611e6e8188888888886117a1565b611e7c81888888888861196d565b611e8b81888888888888611b93565b50505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611f04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611efb90612ec2565b60405180910390fd5b6000611f0e6115ce565b9050611f1f818660008787876117a1565b611f2c81866000876120f2565b6000600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905084811015611fb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611faa90613002565b60405180910390fd5b8481611fbf9190613205565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555084600260008282546120149190613205565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fa78a9be3a7b862d26933ad85fb11d80ef66b8f972d7cbba06621d583943a409887878760405161207c9392919061307d565b60405180910390a3600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516120e29190613062565b60405180910390a3505050505050565b50505050565b600061210b6121068461310e565b6130dd565b90508281526020810184848401111561212357600080fd5b61212e8482856132e0565b509392505050565b600081359050612145816133f2565b92915050565b60008151905061215a816133f2565b92915050565b60008135905061216f81613409565b92915050565b60008151905061218481613420565b92915050565b600082601f83011261219b57600080fd5b81356121ab8482602086016120f8565b91505092915050565b6000813590506121c381613437565b92915050565b6000602082840312156121db57600080fd5b60006121e984828501612136565b91505092915050565b60006020828403121561220457600080fd5b60006122128482850161214b565b91505092915050565b6000806040838503121561222e57600080fd5b600061223c85828601612160565b925050602061224d858286016121b4565b9150509250929050565b6000806040838503121561226a57600080fd5b600061227885828601612136565b925050602061228985828601612136565b9150509250929050565b6000806000606084860312156122a857600080fd5b60006122b686828701612136565b93505060206122c786828701612136565b92505060406122d8868287016121b4565b9150509250925092565b600080600080600060a086880312156122fa57600080fd5b600061230888828901612136565b955050602061231988828901612136565b945050604061232a888289016121b4565b935050606086013567ffffffffffffffff81111561234757600080fd5b6123538882890161218a565b925050608086013567ffffffffffffffff81111561237057600080fd5b61237c8882890161218a565b9150509295509295909350565b6000806040838503121561239c57600080fd5b60006123aa85828601612136565b92505060206123bb858286016121b4565b9150509250929050565b6000806000606084860312156123da57600080fd5b60006123e886828701612136565b93505060206123f9868287016121b4565b925050604084013567ffffffffffffffff81111561241657600080fd5b6124228682870161218a565b9150509250925092565b6000806000806080858703121561244257600080fd5b600061245087828801612136565b9450506020612461878288016121b4565b935050604085013567ffffffffffffffff81111561247e57600080fd5b61248a8782880161218a565b925050606085013567ffffffffffffffff8111156124a757600080fd5b6124b38782880161218a565b91505092959194509250565b6000602082840312156124d157600080fd5b60006124df84828501612175565b91505092915050565b600080604083850312156124fb57600080fd5b6000612509858286016121b4565b925050602083013567ffffffffffffffff81111561252657600080fd5b6125328582860161218a565b9150509250929050565b60006125488383612563565b60208301905092915050565b61255d816132aa565b82525050565b61256c81613239565b82525050565b61257b81613239565b82525050565b600061258c8261314e565b612596818561317c565b93506125a18361313e565b8060005b838110156125d25781516125b9888261253c565b97506125c48361316f565b9250506001810190506125a5565b5085935050505092915050565b6125e88161325d565b82525050565b6125f781613269565b82525050565b600061260882613159565b612612818561318d565b93506126228185602086016132ef565b61262b816133e1565b840191505092915050565b600061264182613164565b61264b818561319e565b935061265b8185602086016132ef565b612664816133e1565b840191505092915050565b600061267c60258361319e565b91507f4552433737373a20617070726f76652066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006126e260228361319e565b91507f4552433737373a2073656e642066726f6d20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061274860278361319e565b91507f4552433737373a207472616e7366657220616d6f756e7420657863656564732060008301527f62616c616e6365000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006127ae60268361319e565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061281460228361319e565b91507f4552433737373a206275726e2066726f6d20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061287a60248361319e565b91507f4552433737373a20617574686f72697a696e672073656c66206173206f70657260008301527f61746f72000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006128e060218361319e565b91507f4552433737373a207265766f6b696e672073656c66206173206f70657261746f60008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061294660208361319e565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000612986604d8361319e565b91507f4552433737373a20746f6b656e20726563697069656e7420636f6e747261637460008301527f20686173206e6f20696d706c656d656e74657220666f7220455243373737546f60208301527f6b656e73526563697069656e74000000000000000000000000000000000000006040830152606082019050919050565b6000612a1260248361319e565b91507f4552433737373a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612a78602c8361319e565b91507f4552433737373a2063616c6c6572206973206e6f7420616e206f70657261746f60008301527f7220666f7220686f6c64657200000000000000000000000000000000000000006020830152604082019050919050565b6000612ade60298361319e565b91507f4552433737373a207472616e7366657220616d6f756e7420657863656564732060008301527f616c6c6f77616e636500000000000000000000000000000000000000000000006020830152604082019050919050565b6000612b4460268361319e565b91507f4552433737373a207472616e736665722066726f6d20746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612baa601f8361319e565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b6000612bea60238361319e565b91507f4552433737373a206275726e20616d6f756e7420657863656564732062616c6160008301527f6e636500000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612c5060208361319e565b91507f4552433737373a2073656e6420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000612c9060238361319e565b91507f4552433737373a20617070726f766520746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b612cf281613293565b82525050565b612d018161329d565b82525050565b6000602082019050612d1c6000830184612572565b92915050565b6000604082019050612d376000830185612554565b612d446020830184612ce9565b9392505050565b600060c082019050612d606000830189612572565b612d6d6020830188612572565b612d7a6040830187612572565b612d876060830186612ce9565b8181036080830152612d9981856125fd565b905081810360a0830152612dad81846125fd565b9050979650505050505050565b6000604082019050612dcf6000830185612572565b612ddc60208301846125ee565b9392505050565b60006020820190508181036000830152612dfd8184612581565b905092915050565b6000602082019050612e1a60008301846125df565b92915050565b60006020820190508181036000830152612e3a8184612636565b905092915050565b60006020820190508181036000830152612e5b8161266f565b9050919050565b60006020820190508181036000830152612e7b816126d5565b9050919050565b60006020820190508181036000830152612e9b8161273b565b9050919050565b60006020820190508181036000830152612ebb816127a1565b9050919050565b60006020820190508181036000830152612edb81612807565b9050919050565b60006020820190508181036000830152612efb8161286d565b9050919050565b60006020820190508181036000830152612f1b816128d3565b9050919050565b60006020820190508181036000830152612f3b81612939565b9050919050565b60006020820190508181036000830152612f5b81612979565b9050919050565b60006020820190508181036000830152612f7b81612a05565b9050919050565b60006020820190508181036000830152612f9b81612a6b565b9050919050565b60006020820190508181036000830152612fbb81612ad1565b9050919050565b60006020820190508181036000830152612fdb81612b37565b9050919050565b60006020820190508181036000830152612ffb81612b9d565b9050919050565b6000602082019050818103600083015261301b81612bdd565b9050919050565b6000602082019050818103600083015261303b81612c43565b9050919050565b6000602082019050818103600083015261305b81612c83565b9050919050565b60006020820190506130776000830184612ce9565b92915050565b60006060820190506130926000830186612ce9565b81810360208301526130a481856125fd565b905081810360408301526130b881846125fd565b9050949350505050565b60006020820190506130d76000830184612cf8565b92915050565b6000604051905081810181811067ffffffffffffffff82111715613104576131036133b2565b5b8060405250919050565b600067ffffffffffffffff821115613129576131286133b2565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b60006131ba82613293565b91506131c583613293565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156131fa576131f9613354565b5b828201905092915050565b600061321082613293565b915061321b83613293565b92508282101561322e5761322d613354565b5b828203905092915050565b600061324482613273565b9050919050565b600061325682613273565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006132b5826132bc565b9050919050565b60006132c7826132ce565b9050919050565b60006132d982613273565b9050919050565b82818337600083830152505050565b60005b8381101561330d5780820151818401526020810190506132f2565b8381111561331c576000848401525b50505050565b6000600282049050600182168061333a57607f821691505b6020821081141561334e5761334d613383565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6133fb81613239565b811461340657600080fd5b50565b6134128161324b565b811461341d57600080fd5b50565b6134298161325d565b811461343457600080fd5b50565b61344081613293565b811461344b57600080fd5b5056fea2646970667358221220ccfdb130a73465a8e33910ee3a58690fac04cb0c98a2d11641fe611ab32d18f864736f6c63430008000033

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

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000204fce5e3e25026110000000000000000000000000000000f0e3ea754d038b979cd0124e2f1a4bf44f32746a0000000000000000000000000000000000000000000000000000000000000006424c4f434b5300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006424c4f434b5300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): BLOCKS
Arg [1] : symbol (string): BLOCKS

-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [3] : 0000000000000000000000000000000000000000204fce5e3e25026110000000
Arg [4] : 000000000000000000000000f0e3ea754d038b979cd0124e2f1a4bf44f32746a
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [6] : 424c4f434b530000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [8] : 424c4f434b530000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

112587:489:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;112926:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;98478:132;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;94588:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100107:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;95414:125;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100684:793;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;95045:84;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;95251:97;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;98736:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;95644:152;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;111995:148;;;:::i;:::-;;111344:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;97501:423;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;94749:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;95933:166;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;96340:451;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;97126:303;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;99809:153;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;112298:244;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;97993:414;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;99271:290;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;96928:130;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;112926:147;113020:7;:5;:7::i;:::-;113006:21;;:10;:21;;;112998:30;;;;;;113040:4;:13;;;113054:2;113058:6;113040:25;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;112926:147;;:::o;98478:132::-;98544:16;98580:22;98573:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;98478:132;:::o;94588:100::-;94642:13;94675:5;94668:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;94588:100;:::o;100107:201::-;100189:4;100206:14;100223:12;:10;:12::i;:::-;100206:29;;100246:32;100255:6;100263:7;100272:5;100246:8;:32::i;:::-;100296:4;100289:11;;;100107:201;;;;:::o;95414:125::-;95492:7;95519:12;;95512:19;;95414:125;:::o;100684:793::-;100790:4;100836:1;100815:23;;:9;:23;;;;100807:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;100916:1;100898:20;;:6;:20;;;;100890:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;100974:15;100992:12;:10;:12::i;:::-;100974:30;;101017:61;101035:7;101044:6;101052:9;101063:6;101017:61;;;;;;;;;;;;;;;;;;;;;;;;:17;:61::i;:::-;101091:49;101097:7;101106:6;101114:9;101125:6;101091:49;;;;;;;;;;;;;;;;;;;;;;;;:5;:49::i;:::-;101153:24;101180:11;:19;101192:6;101180:19;;;;;;;;;;;;;;;:28;101200:7;101180:28;;;;;;;;;;;;;;;;101153:55;;101247:6;101227:16;:26;;101219:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;101310:52;101319:6;101327:7;101355:6;101336:16;:25;;;;:::i;:::-;101310:8;:52::i;:::-;101375:70;101395:7;101404:6;101412:9;101423:6;101375:70;;;;;;;;;;;;;;;;;;;;;;;;101439:5;101375:19;:70::i;:::-;101465:4;101458:11;;;;100684:793;;;;;:::o;95045:84::-;95094:5;95119:2;95112:9;;95045:84;:::o;95251:97::-;95312:7;95339:1;95332:8;;95251:97;:::o;98736:407::-;98982:35;98996:12;:10;:12::i;:::-;99010:6;98982:13;:35::i;:::-;98974:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;99077:58;99083:6;99091:9;99102:6;99110:4;99116:12;99130:4;99077:5;:58::i;:::-;98736:407;;;;;:::o;95644:152::-;95739:7;95766:9;:22;95776:11;95766:22;;;;;;;;;;;;;;;;95759:29;;95644:152;;;:::o;111995:148::-;111575:12;:10;:12::i;:::-;111564:23;;:7;:5;:7::i;:::-;:23;;;111556:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;112102:1:::1;112065:40;;112086:6;;;;;;;;;;;112065:40;;;;;;;;;;;;112133:1;112116:6;;:19;;;;;;;;;;;;;;;;;;111995:148::o:0;111344:87::-;111390:7;111417:6;;;;;;;;;;;111410:13;;111344:87;:::o;97501:423::-;97606:8;97590:24;;:12;:10;:12::i;:::-;:24;;;;97582:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;97672:17;:27;97690:8;97672:27;;;;;;;;;;;;;;;;;;;;;;;;;97668:189;;;97723:24;:38;97748:12;:10;:12::i;:::-;97723:38;;;;;;;;;;;;;;;:48;97762:8;97723:48;;;;;;;;;;;;;;;;97716:55;;;;;;;;;;;97668:189;;;97841:4;97804:10;:24;97815:12;:10;:12::i;:::-;97804:24;;;;;;;;;;;;;;;:34;97829:8;97804:34;;;;;;;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;97668:189;97903:12;:10;:12::i;:::-;97874:42;;97893:8;97874:42;;;;;;;;;;;;97501:423;:::o;94749:104::-;94805:13;94838:7;94831:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;94749:104;:::o;95933:166::-;96037:54;96043:12;:10;:12::i;:::-;96057:9;96068:6;96076:4;96037:54;;;;;;;;;;;;96086:4;96037:5;:54::i;:::-;95933:166;;;:::o;96340:451::-;96426:4;96472:1;96451:23;;:9;:23;;;;96443:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;96528:12;96543;:10;:12::i;:::-;96528:27;;96568:56;96586:4;96592;96598:9;96609:6;96568:56;;;;;;;;;;;;;;;;;;;;;;;;:17;:56::i;:::-;96637:44;96643:4;96649;96655:9;96666:6;96637:44;;;;;;;;;;;;;;;;;;;;;;;;:5;:44::i;:::-;96694:65;96714:4;96720;96726:9;96737:6;96694:65;;;;;;;;;;;;;;;;;;;;;;;;96753:5;96694:19;:65::i;:::-;96779:4;96772:11;;;96340:451;;;;:::o;97126:303::-;97226:4;97262:11;97250:23;;:8;:23;;;:121;;;;97291:17;:27;97309:8;97291:27;;;;;;;;;;;;;;;;;;;;;;;;;:79;;;;;97323:24;:37;97348:11;97323:37;;;;;;;;;;;;;;;:47;97361:8;97323:47;;;;;;;;;;;;;;;;;;;;;;;;;97322:48;97291:79;97250:121;:171;;;;97388:10;:23;97399:11;97388:23;;;;;;;;;;;;;;;:33;97412:8;97388:33;;;;;;;;;;;;;;;;;;;;;;;;;97250:171;97243:178;;97126:303;;;;:::o;99809:153::-;99899:7;99926:11;:19;99938:6;99926:19;;;;;;;;;;;;;;;:28;99946:7;99926:28;;;;;;;;;;;;;;;;99919:35;;99809:153;;;;:::o;112298:244::-;111575:12;:10;:12::i;:::-;111564:23;;:7;:5;:7::i;:::-;:23;;;111556:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;112407:1:::1;112387:22;;:8;:22;;;;112379:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;112497:8;112468:38;;112489:6;;;;;;;;;;;112468:38;;;;;;;;;;;;112526:8;112517:6;;:17;;;;;;;;;;;;;;;;;;112298:244:::0;:::o;97993:414::-;98091:12;:10;:12::i;:::-;98079:24;;:8;:24;;;;98071:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;98158:17;:27;98176:8;98158:27;;;;;;;;;;;;;;;;;;;;;;;;;98154:189;;;98253:4;98202:24;:38;98227:12;:10;:12::i;:::-;98202:38;;;;;;;;;;;;;;;:48;98241:8;98202:48;;;;;;;;;;;;;;;;:55;;;;;;;;;;;;;;;;;;98154:189;;;98297:10;:24;98308:12;:10;:12::i;:::-;98297:24;;;;;;;;;;;;;;;:34;98322:8;98297:34;;;;;;;;;;;;;;;;98290:41;;;;;;;;;;;98154:189;98386:12;:10;:12::i;:::-;98360:39;;98376:8;98360:39;;;;;;;;;;;;97993:414;:::o;99271:290::-;99415:36;99429:12;:10;:12::i;:::-;99443:7;99415:13;:36::i;:::-;99407:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;99511:42;99517:7;99526:6;99534:4;99540:12;99511:5;:42::i;:::-;99271:290;;;;:::o;96928:130::-;97013:37;97019:12;:10;:12::i;:::-;97033:6;97041:4;97013:37;;;;;;;;;;;;:5;:37::i;:::-;96928:130;;:::o;76246:422::-;76306:4;76514:12;76625:7;76613:20;76605:28;;76659:1;76652:4;:8;76645:15;;;76246:422;;;:::o;84071:98::-;84124:7;84151:10;84144:17;;84071:98;:::o;106805:341::-;106917:1;106899:20;;:6;:20;;;;106891:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;106999:1;106980:21;;:7;:21;;;;106972:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;107085:5;107054:11;:19;107066:6;107054:19;;;;;;;;;;;;;;;:28;107074:7;107054:28;;;;;;;;;;;;;;;:36;;;;107123:7;107106:32;;107115:6;107106:32;;;107132:5;107106:32;;;;;;:::i;:::-;;;;;;;;106805:341;;;:::o;107630:511::-;90922:1;91519:7;;:19;;91511:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;90922:1;91652:7;:18;;;;107874:19:::1;92797:42;107896:41;;;107938:4;93055:31;107896:78;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;107874:100;;108012:1;107989:25;;:11;:25;;;107985:149;;108045:11;108031:39;;;108071:8;108081:4;108087:2;108091:6;108099:8;108109:12;108031:91;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;107985:149;91683:1;90878::::0;91831:7;:22;;;;107630:511;;;;;;:::o;106052:608::-;106271:48;106292:8;106302:4;106308:2;106312:6;106271:20;:48::i;:::-;106332:19;106354:9;:15;106364:4;106354:15;;;;;;;;;;;;;;;;106332:37;;106403:6;106388:11;:21;;106380:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;106496:6;106482:11;:20;;;;:::i;:::-;106464:9;:15;106474:4;106464:15;;;;;;;;;;;;;;;:38;;;;106530:6;106513:9;:13;106523:2;106513:13;;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;;;;;;;;106575:2;106554:56;;106569:4;106554:56;;106559:8;106554:56;;;106579:6;106587:8;106597:12;106554:56;;;;;;;;:::i;:::-;;;;;;;;106641:2;106626:26;;106635:4;106626:26;;;106645:6;106626:26;;;;;;:::i;:::-;;;;;;;;106052:608;;;;;;;:::o;108843:705::-;109111:19;92797:42;109133:41;;;109175:2;93153:34;109133:79;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;109111:101;;109250:1;109227:25;;:11;:25;;;109223:318;;109286:11;109269:44;;;109314:8;109324:4;109330:2;109334:6;109342:8;109352:12;109269:96;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;109223:318;;;109387:19;109383:158;;;109432:15;:2;:13;;;:15::i;:::-;109431:16;109423:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;109383:158;109223:318;108843:705;;;;;;;;:::o;104217:691::-;104486:1;104470:18;;:4;:18;;;;104462:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;104560:1;104546:16;;:2;:16;;;;104538:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;104612:16;104631:12;:10;:12::i;:::-;104612:31;;104656:69;104674:8;104684:4;104690:2;104694:6;104702:8;104712:12;104656:17;:69::i;:::-;104738:57;104744:8;104754:4;104760:2;104764:6;104772:8;104782:12;104738:5;:57::i;:::-;104808:92;104828:8;104838:4;104844:2;104848:6;104856:8;104866:12;104880:19;104808;:92::i;:::-;104217:691;;;;;;;:::o;105222:822::-;105431:1;105415:18;;:4;:18;;;;105407:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;105485:16;105504:12;:10;:12::i;:::-;105485:31;;105529:73;105547:8;105557:4;105571:1;105575:6;105583:4;105589:12;105529:17;:73::i;:::-;105615:56;105636:8;105646:4;105660:1;105664:6;105615:20;:56::i;:::-;105719:19;105741:9;:15;105751:4;105741:15;;;;;;;;;;;;;;;;105719:37;;105790:6;105775:11;:21;;105767:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;105879:6;105865:11;:20;;;;:::i;:::-;105847:9;:15;105857:4;105847:15;;;;;;;;;;;;;;;:38;;;;105912:6;105896:12;;:22;;;;;;;:::i;:::-;;;;;;;;105953:4;105936:50;;105943:8;105936:50;;;105959:6;105967:4;105973:12;105936:50;;;;;;;;:::i;:::-;;;;;;;;106025:1;106002:34;;106011:4;106002:34;;;106029:6;106002:34;;;;;;:::i;:::-;;;;;;;;105222:822;;;;;;:::o;110192:110::-;;;;;:::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:143::-;;588:6;582:13;573:22;;604:33;631:5;604:33;:::i;:::-;563:80;;;;:::o;649:155::-;;741:6;728:20;719:29;;757:41;792:5;757:41;:::i;:::-;709:95;;;;:::o;810:137::-;;895:6;889:13;880:22;;911:30;935:5;911:30;:::i;:::-;870:77;;;;:::o;966:271::-;;1070:3;1063:4;1055:6;1051:17;1047:27;1037:2;;1088:1;1085;1078:12;1037:2;1128:6;1115:20;1153:78;1227:3;1219:6;1212:4;1204:6;1200:17;1153:78;:::i;:::-;1144:87;;1027:210;;;;;:::o;1243:139::-;;1327:6;1314:20;1305:29;;1343:33;1370:5;1343:33;:::i;:::-;1295:87;;;;:::o;1388:262::-;;1496:2;1484:9;1475:7;1471:23;1467:32;1464:2;;;1512:1;1509;1502:12;1464:2;1555:1;1580:53;1625:7;1616:6;1605:9;1601:22;1580:53;:::i;:::-;1570:63;;1526:117;1454:196;;;;:::o;1656:284::-;;1775:2;1763:9;1754:7;1750:23;1746:32;1743:2;;;1791:1;1788;1781:12;1743:2;1834:1;1859:64;1915:7;1906:6;1895:9;1891:22;1859:64;:::i;:::-;1849:74;;1805:128;1733:207;;;;:::o;1946:423::-;;;2079:2;2067:9;2058:7;2054:23;2050:32;2047:2;;;2095:1;2092;2085:12;2047:2;2138:1;2163:61;2216:7;2207:6;2196:9;2192:22;2163:61;:::i;:::-;2153:71;;2109:125;2273:2;2299:53;2344:7;2335:6;2324:9;2320:22;2299:53;:::i;:::-;2289:63;;2244:118;2037:332;;;;;:::o;2375:407::-;;;2500:2;2488:9;2479:7;2475:23;2471:32;2468:2;;;2516:1;2513;2506:12;2468:2;2559:1;2584:53;2629:7;2620:6;2609:9;2605:22;2584:53;:::i;:::-;2574:63;;2530:117;2686:2;2712:53;2757:7;2748:6;2737:9;2733:22;2712:53;:::i;:::-;2702:63;;2657:118;2458:324;;;;;:::o;2788:552::-;;;;2930:2;2918:9;2909:7;2905:23;2901:32;2898:2;;;2946:1;2943;2936:12;2898:2;2989:1;3014:53;3059:7;3050:6;3039:9;3035:22;3014:53;:::i;:::-;3004:63;;2960:117;3116:2;3142:53;3187:7;3178:6;3167:9;3163:22;3142:53;:::i;:::-;3132:63;;3087:118;3244:2;3270:53;3315:7;3306:6;3295:9;3291:22;3270:53;:::i;:::-;3260:63;;3215:118;2888:452;;;;;:::o;3346:1066::-;;;;;;3540:3;3528:9;3519:7;3515:23;3511:33;3508:2;;;3557:1;3554;3547:12;3508:2;3600:1;3625:53;3670:7;3661:6;3650:9;3646:22;3625:53;:::i;:::-;3615:63;;3571:117;3727:2;3753:53;3798:7;3789:6;3778:9;3774:22;3753:53;:::i;:::-;3743:63;;3698:118;3855:2;3881:53;3926:7;3917:6;3906:9;3902:22;3881:53;:::i;:::-;3871:63;;3826:118;4011:2;4000:9;3996:18;3983:32;4042:18;4034:6;4031:30;4028:2;;;4074:1;4071;4064:12;4028:2;4102:62;4156:7;4147:6;4136:9;4132:22;4102:62;:::i;:::-;4092:72;;3954:220;4241:3;4230:9;4226:19;4213:33;4273:18;4265:6;4262:30;4259:2;;;4305:1;4302;4295:12;4259:2;4333:62;4387:7;4378:6;4367:9;4363:22;4333:62;:::i;:::-;4323:72;;4184:221;3498:914;;;;;;;;:::o;4418:407::-;;;4543:2;4531:9;4522:7;4518:23;4514:32;4511:2;;;4559:1;4556;4549:12;4511:2;4602:1;4627:53;4672:7;4663:6;4652:9;4648:22;4627:53;:::i;:::-;4617:63;;4573:117;4729:2;4755:53;4800:7;4791:6;4780:9;4776:22;4755:53;:::i;:::-;4745:63;;4700:118;4501:324;;;;;:::o;4831:663::-;;;;4982:2;4970:9;4961:7;4957:23;4953:32;4950:2;;;4998:1;4995;4988:12;4950:2;5041:1;5066:53;5111:7;5102:6;5091:9;5087:22;5066:53;:::i;:::-;5056:63;;5012:117;5168:2;5194:53;5239:7;5230:6;5219:9;5215:22;5194:53;:::i;:::-;5184:63;;5139:118;5324:2;5313:9;5309:18;5296:32;5355:18;5347:6;5344:30;5341:2;;;5387:1;5384;5377:12;5341:2;5415:62;5469:7;5460:6;5449:9;5445:22;5415:62;:::i;:::-;5405:72;;5267:220;4940:554;;;;;:::o;5500:920::-;;;;;5677:3;5665:9;5656:7;5652:23;5648:33;5645:2;;;5694:1;5691;5684:12;5645:2;5737:1;5762:53;5807:7;5798:6;5787:9;5783:22;5762:53;:::i;:::-;5752:63;;5708:117;5864:2;5890:53;5935:7;5926:6;5915:9;5911:22;5890:53;:::i;:::-;5880:63;;5835:118;6020:2;6009:9;6005:18;5992:32;6051:18;6043:6;6040:30;6037:2;;;6083:1;6080;6073:12;6037:2;6111:62;6165:7;6156:6;6145:9;6141:22;6111:62;:::i;:::-;6101:72;;5963:220;6250:2;6239:9;6235:18;6222:32;6281:18;6273:6;6270:30;6267:2;;;6313:1;6310;6303:12;6267:2;6341:62;6395:7;6386:6;6375:9;6371:22;6341:62;:::i;:::-;6331:72;;6193:220;5635:785;;;;;;;:::o;6426:278::-;;6542:2;6530:9;6521:7;6517:23;6513:32;6510:2;;;6558:1;6555;6548:12;6510:2;6601:1;6626:61;6679:7;6670:6;6659:9;6655:22;6626:61;:::i;:::-;6616:71;;6572:125;6500:204;;;;:::o;6710:518::-;;;6844:2;6832:9;6823:7;6819:23;6815:32;6812:2;;;6860:1;6857;6850:12;6812:2;6903:1;6928:53;6973:7;6964:6;6953:9;6949:22;6928:53;:::i;:::-;6918:63;;6874:117;7058:2;7047:9;7043:18;7030:32;7089:18;7081:6;7078:30;7075:2;;;7121:1;7118;7111:12;7075:2;7149:62;7203:7;7194:6;7183:9;7179:22;7149:62;:::i;:::-;7139:72;;7001:220;6802:426;;;;;:::o;7234:179::-;;7324:46;7366:3;7358:6;7324:46;:::i;:::-;7402:4;7397:3;7393:14;7379:28;;7314:99;;;;:::o;7419:147::-;7514:45;7553:5;7514:45;:::i;:::-;7509:3;7502:58;7492:74;;:::o;7572:108::-;7649:24;7667:5;7649:24;:::i;:::-;7644:3;7637:37;7627:53;;:::o;7686:118::-;7773:24;7791:5;7773:24;:::i;:::-;7768:3;7761:37;7751:53;;:::o;7840:732::-;;7988:54;8036:5;7988:54;:::i;:::-;8058:86;8137:6;8132:3;8058:86;:::i;:::-;8051:93;;8168:56;8218:5;8168:56;:::i;:::-;8247:7;8278:1;8263:284;8288:6;8285:1;8282:13;8263:284;;;8364:6;8358:13;8391:63;8450:3;8435:13;8391:63;:::i;:::-;8384:70;;8477:60;8530:6;8477:60;:::i;:::-;8467:70;;8323:224;8310:1;8307;8303:9;8298:14;;8263:284;;;8267:14;8563:3;8556:10;;7964:608;;;;;;;:::o;8578:109::-;8659:21;8674:5;8659:21;:::i;:::-;8654:3;8647:34;8637:50;;:::o;8693:118::-;8780:24;8798:5;8780:24;:::i;:::-;8775:3;8768:37;8758:53;;:::o;8817:360::-;;8931:38;8963:5;8931:38;:::i;:::-;8985:70;9048:6;9043:3;8985:70;:::i;:::-;8978:77;;9064:52;9109:6;9104:3;9097:4;9090:5;9086:16;9064:52;:::i;:::-;9141:29;9163:6;9141:29;:::i;:::-;9136:3;9132:39;9125:46;;8907:270;;;;;:::o;9183:364::-;;9299:39;9332:5;9299:39;:::i;:::-;9354:71;9418:6;9413:3;9354:71;:::i;:::-;9347:78;;9434:52;9479:6;9474:3;9467:4;9460:5;9456:16;9434:52;:::i;:::-;9511:29;9533:6;9511:29;:::i;:::-;9506:3;9502:39;9495:46;;9275:272;;;;;:::o;9553:369::-;;9716:67;9780:2;9775:3;9716:67;:::i;:::-;9709:74;;9813:34;9809:1;9804:3;9800:11;9793:55;9879:7;9874:2;9869:3;9865:12;9858:29;9913:2;9908:3;9904:12;9897:19;;9699:223;;;:::o;9928:366::-;;10091:67;10155:2;10150:3;10091:67;:::i;:::-;10084:74;;10188:34;10184:1;10179:3;10175:11;10168:55;10254:4;10249:2;10244:3;10240:12;10233:26;10285:2;10280:3;10276:12;10269:19;;10074:220;;;:::o;10300:371::-;;10463:67;10527:2;10522:3;10463:67;:::i;:::-;10456:74;;10560:34;10556:1;10551:3;10547:11;10540:55;10626:9;10621:2;10616:3;10612:12;10605:31;10662:2;10657:3;10653:12;10646:19;;10446:225;;;:::o;10677:370::-;;10840:67;10904:2;10899:3;10840:67;:::i;:::-;10833:74;;10937:34;10933:1;10928:3;10924:11;10917:55;11003:8;10998:2;10993:3;10989:12;10982:30;11038:2;11033:3;11029:12;11022:19;;10823:224;;;:::o;11053:366::-;;11216:67;11280:2;11275:3;11216:67;:::i;:::-;11209:74;;11313:34;11309:1;11304:3;11300:11;11293:55;11379:4;11374:2;11369:3;11365:12;11358:26;11410:2;11405:3;11401:12;11394:19;;11199:220;;;:::o;11425:368::-;;11588:67;11652:2;11647:3;11588:67;:::i;:::-;11581:74;;11685:34;11681:1;11676:3;11672:11;11665:55;11751:6;11746:2;11741:3;11737:12;11730:28;11784:2;11779:3;11775:12;11768:19;;11571:222;;;:::o;11799:365::-;;11962:67;12026:2;12021:3;11962:67;:::i;:::-;11955:74;;12059:34;12055:1;12050:3;12046:11;12039:55;12125:3;12120:2;12115:3;12111:12;12104:25;12155:2;12150:3;12146:12;12139:19;;11945:219;;;:::o;12170:330::-;;12333:67;12397:2;12392:3;12333:67;:::i;:::-;12326:74;;12430:34;12426:1;12421:3;12417:11;12410:55;12491:2;12486:3;12482:12;12475:19;;12316:184;;;:::o;12506:443::-;;12669:67;12733:2;12728:3;12669:67;:::i;:::-;12662:74;;12766:34;12762:1;12757:3;12753:11;12746:55;12832:34;12827:2;12822:3;12818:12;12811:56;12898:15;12893:2;12888:3;12884:12;12877:37;12940:2;12935:3;12931:12;12924:19;;12652:297;;;:::o;12955:368::-;;13118:67;13182:2;13177:3;13118:67;:::i;:::-;13111:74;;13215:34;13211:1;13206:3;13202:11;13195:55;13281:6;13276:2;13271:3;13267:12;13260:28;13314:2;13309:3;13305:12;13298:19;;13101:222;;;:::o;13329:376::-;;13492:67;13556:2;13551:3;13492:67;:::i;:::-;13485:74;;13589:34;13585:1;13580:3;13576:11;13569:55;13655:14;13650:2;13645:3;13641:12;13634:36;13696:2;13691:3;13687:12;13680:19;;13475:230;;;:::o;13711:373::-;;13874:67;13938:2;13933:3;13874:67;:::i;:::-;13867:74;;13971:34;13967:1;13962:3;13958:11;13951:55;14037:11;14032:2;14027:3;14023:12;14016:33;14075:2;14070:3;14066:12;14059:19;;13857:227;;;:::o;14090:370::-;;14253:67;14317:2;14312:3;14253:67;:::i;:::-;14246:74;;14350:34;14346:1;14341:3;14337:11;14330:55;14416:8;14411:2;14406:3;14402:12;14395:30;14451:2;14446:3;14442:12;14435:19;;14236:224;;;:::o;14466:329::-;;14629:67;14693:2;14688:3;14629:67;:::i;:::-;14622:74;;14726:33;14722:1;14717:3;14713:11;14706:54;14786:2;14781:3;14777:12;14770:19;;14612:183;;;:::o;14801:367::-;;14964:67;15028:2;15023:3;14964:67;:::i;:::-;14957:74;;15061:34;15057:1;15052:3;15048:11;15041:55;15127:5;15122:2;15117:3;15113:12;15106:27;15159:2;15154:3;15150:12;15143:19;;14947:221;;;:::o;15174:330::-;;15337:67;15401:2;15396:3;15337:67;:::i;:::-;15330:74;;15434:34;15430:1;15425:3;15421:11;15414:55;15495:2;15490:3;15486:12;15479:19;;15320:184;;;:::o;15510:367::-;;15673:67;15737:2;15732:3;15673:67;:::i;:::-;15666:74;;15770:34;15766:1;15761:3;15757:11;15750:55;15836:5;15831:2;15826:3;15822:12;15815:27;15868:2;15863:3;15859:12;15852:19;;15656:221;;;:::o;15883:118::-;15970:24;15988:5;15970:24;:::i;:::-;15965:3;15958:37;15948:53;;:::o;16007:112::-;16090:22;16106:5;16090:22;:::i;:::-;16085:3;16078:35;16068:51;;:::o;16125:222::-;;16256:2;16245:9;16241:18;16233:26;;16269:71;16337:1;16326:9;16322:17;16313:6;16269:71;:::i;:::-;16223:124;;;;:::o;16353:348::-;;16520:2;16509:9;16505:18;16497:26;;16533:79;16609:1;16598:9;16594:17;16585:6;16533:79;:::i;:::-;16622:72;16690:2;16679:9;16675:18;16666:6;16622:72;:::i;:::-;16487:214;;;;;:::o;16707:949::-;;17014:3;17003:9;16999:19;16991:27;;17028:71;17096:1;17085:9;17081:17;17072:6;17028:71;:::i;:::-;17109:72;17177:2;17166:9;17162:18;17153:6;17109:72;:::i;:::-;17191;17259:2;17248:9;17244:18;17235:6;17191:72;:::i;:::-;17273;17341:2;17330:9;17326:18;17317:6;17273:72;:::i;:::-;17393:9;17387:4;17383:20;17377:3;17366:9;17362:19;17355:49;17421:76;17492:4;17483:6;17421:76;:::i;:::-;17413:84;;17545:9;17539:4;17535:20;17529:3;17518:9;17514:19;17507:49;17573:76;17644:4;17635:6;17573:76;:::i;:::-;17565:84;;16981:675;;;;;;;;;:::o;17662:332::-;;17821:2;17810:9;17806:18;17798:26;;17834:71;17902:1;17891:9;17887:17;17878:6;17834:71;:::i;:::-;17915:72;17983:2;17972:9;17968:18;17959:6;17915:72;:::i;:::-;17788:206;;;;;:::o;18000:373::-;;18181:2;18170:9;18166:18;18158:26;;18230:9;18224:4;18220:20;18216:1;18205:9;18201:17;18194:47;18258:108;18361:4;18352:6;18258:108;:::i;:::-;18250:116;;18148:225;;;;:::o;18379:210::-;;18504:2;18493:9;18489:18;18481:26;;18517:65;18579:1;18568:9;18564:17;18555:6;18517:65;:::i;:::-;18471:118;;;;:::o;18595:313::-;;18746:2;18735:9;18731:18;18723:26;;18795:9;18789:4;18785:20;18781:1;18770:9;18766:17;18759:47;18823:78;18896:4;18887:6;18823:78;:::i;:::-;18815:86;;18713:195;;;;:::o;18914:419::-;;19118:2;19107:9;19103:18;19095:26;;19167:9;19161:4;19157:20;19153:1;19142:9;19138:17;19131:47;19195:131;19321:4;19195:131;:::i;:::-;19187:139;;19085:248;;;:::o;19339:419::-;;19543:2;19532:9;19528:18;19520:26;;19592:9;19586:4;19582:20;19578:1;19567:9;19563:17;19556:47;19620:131;19746:4;19620:131;:::i;:::-;19612:139;;19510:248;;;:::o;19764:419::-;;19968:2;19957:9;19953:18;19945:26;;20017:9;20011:4;20007:20;20003:1;19992:9;19988:17;19981:47;20045:131;20171:4;20045:131;:::i;:::-;20037:139;;19935:248;;;:::o;20189:419::-;;20393:2;20382:9;20378:18;20370:26;;20442:9;20436:4;20432:20;20428:1;20417:9;20413:17;20406:47;20470:131;20596:4;20470:131;:::i;:::-;20462:139;;20360:248;;;:::o;20614:419::-;;20818:2;20807:9;20803:18;20795:26;;20867:9;20861:4;20857:20;20853:1;20842:9;20838:17;20831:47;20895:131;21021:4;20895:131;:::i;:::-;20887:139;;20785:248;;;:::o;21039:419::-;;21243:2;21232:9;21228:18;21220:26;;21292:9;21286:4;21282:20;21278:1;21267:9;21263:17;21256:47;21320:131;21446:4;21320:131;:::i;:::-;21312:139;;21210:248;;;:::o;21464:419::-;;21668:2;21657:9;21653:18;21645:26;;21717:9;21711:4;21707:20;21703:1;21692:9;21688:17;21681:47;21745:131;21871:4;21745:131;:::i;:::-;21737:139;;21635:248;;;:::o;21889:419::-;;22093:2;22082:9;22078:18;22070:26;;22142:9;22136:4;22132:20;22128:1;22117:9;22113:17;22106:47;22170:131;22296:4;22170:131;:::i;:::-;22162:139;;22060:248;;;:::o;22314:419::-;;22518:2;22507:9;22503:18;22495:26;;22567:9;22561:4;22557:20;22553:1;22542:9;22538:17;22531:47;22595:131;22721:4;22595:131;:::i;:::-;22587:139;;22485:248;;;:::o;22739:419::-;;22943:2;22932:9;22928:18;22920:26;;22992:9;22986:4;22982:20;22978:1;22967:9;22963:17;22956:47;23020:131;23146:4;23020:131;:::i;:::-;23012:139;;22910:248;;;:::o;23164:419::-;;23368:2;23357:9;23353:18;23345:26;;23417:9;23411:4;23407:20;23403:1;23392:9;23388:17;23381:47;23445:131;23571:4;23445:131;:::i;:::-;23437:139;;23335:248;;;:::o;23589:419::-;;23793:2;23782:9;23778:18;23770:26;;23842:9;23836:4;23832:20;23828:1;23817:9;23813:17;23806:47;23870:131;23996:4;23870:131;:::i;:::-;23862:139;;23760:248;;;:::o;24014:419::-;;24218:2;24207:9;24203:18;24195:26;;24267:9;24261:4;24257:20;24253:1;24242:9;24238:17;24231:47;24295:131;24421:4;24295:131;:::i;:::-;24287:139;;24185:248;;;:::o;24439:419::-;;24643:2;24632:9;24628:18;24620:26;;24692:9;24686:4;24682:20;24678:1;24667:9;24663:17;24656:47;24720:131;24846:4;24720:131;:::i;:::-;24712:139;;24610:248;;;:::o;24864:419::-;;25068:2;25057:9;25053:18;25045:26;;25117:9;25111:4;25107:20;25103:1;25092:9;25088:17;25081:47;25145:131;25271:4;25145:131;:::i;:::-;25137:139;;25035:248;;;:::o;25289:419::-;;25493:2;25482:9;25478:18;25470:26;;25542:9;25536:4;25532:20;25528:1;25517:9;25513:17;25506:47;25570:131;25696:4;25570:131;:::i;:::-;25562:139;;25460:248;;;:::o;25714:419::-;;25918:2;25907:9;25903:18;25895:26;;25967:9;25961:4;25957:20;25953:1;25942:9;25938:17;25931:47;25995:131;26121:4;25995:131;:::i;:::-;25987:139;;25885:248;;;:::o;26139:222::-;;26270:2;26259:9;26255:18;26247:26;;26283:71;26351:1;26340:9;26336:17;26327:6;26283:71;:::i;:::-;26237:124;;;;:::o;26367:616::-;;26590:2;26579:9;26575:18;26567:26;;26603:71;26671:1;26660:9;26656:17;26647:6;26603:71;:::i;:::-;26721:9;26715:4;26711:20;26706:2;26695:9;26691:18;26684:48;26749:76;26820:4;26811:6;26749:76;:::i;:::-;26741:84;;26872:9;26866:4;26862:20;26857:2;26846:9;26842:18;26835:48;26900:76;26971:4;26962:6;26900:76;:::i;:::-;26892:84;;26557:426;;;;;;:::o;26989:214::-;;27116:2;27105:9;27101:18;27093:26;;27129:67;27193:1;27182:9;27178:17;27169:6;27129:67;:::i;:::-;27083:120;;;;:::o;27209:283::-;;27275:2;27269:9;27259:19;;27317:4;27309:6;27305:17;27424:6;27412:10;27409:22;27388:18;27376:10;27373:34;27370:62;27367:2;;;27435:18;;:::i;:::-;27367:2;27475:10;27471:2;27464:22;27249:243;;;;:::o;27498:331::-;;27649:18;27641:6;27638:30;27635:2;;;27671:18;;:::i;:::-;27635:2;27756:4;27752:9;27745:4;27737:6;27733:17;27729:33;27721:41;;27817:4;27811;27807:15;27799:23;;27564:265;;;:::o;27835:132::-;;27925:3;27917:11;;27955:4;27950:3;27946:14;27938:22;;27907:60;;;:::o;27973:114::-;;28074:5;28068:12;28058:22;;28047:40;;;:::o;28093:98::-;;28178:5;28172:12;28162:22;;28151:40;;;:::o;28197:99::-;;28283:5;28277:12;28267:22;;28256:40;;;:::o;28302:113::-;;28404:4;28399:3;28395:14;28387:22;;28377:38;;;:::o;28421:184::-;;28554:6;28549:3;28542:19;28594:4;28589:3;28585:14;28570:29;;28532:73;;;;:::o;28611:168::-;;28728:6;28723:3;28716:19;28768:4;28763:3;28759:14;28744:29;;28706:73;;;;:::o;28785:169::-;;28903:6;28898:3;28891:19;28943:4;28938:3;28934:14;28919:29;;28881:73;;;;:::o;28960:305::-;;29019:20;29037:1;29019:20;:::i;:::-;29014:25;;29053:20;29071:1;29053:20;:::i;:::-;29048:25;;29207:1;29139:66;29135:74;29132:1;29129:81;29126:2;;;29213:18;;:::i;:::-;29126:2;29257:1;29254;29250:9;29243:16;;29004:261;;;;:::o;29271:191::-;;29331:20;29349:1;29331:20;:::i;:::-;29326:25;;29365:20;29383:1;29365:20;:::i;:::-;29360:25;;29404:1;29401;29398:8;29395:2;;;29409:18;;:::i;:::-;29395:2;29454:1;29451;29447:9;29439:17;;29316:146;;;;:::o;29468:96::-;;29534:24;29552:5;29534:24;:::i;:::-;29523:35;;29513:51;;;:::o;29570:104::-;;29644:24;29662:5;29644:24;:::i;:::-;29633:35;;29623:51;;;:::o;29680:90::-;;29757:5;29750:13;29743:21;29732:32;;29722:48;;;:::o;29776:77::-;;29842:5;29831:16;;29821:32;;;:::o;29859:126::-;;29936:42;29929:5;29925:54;29914:65;;29904:81;;;:::o;29991:77::-;;30057:5;30046:16;;30036:32;;;:::o;30074:86::-;;30149:4;30142:5;30138:16;30127:27;;30117:43;;;:::o;30166:134::-;;30257:37;30288:5;30257:37;:::i;:::-;30244:50;;30234:66;;;:::o;30306:126::-;;30389:37;30420:5;30389:37;:::i;:::-;30376:50;;30366:66;;;:::o;30438:113::-;;30521:24;30539:5;30521:24;:::i;:::-;30508:37;;30498:53;;;:::o;30557:154::-;30641:6;30636:3;30631;30618:30;30703:1;30694:6;30689:3;30685:16;30678:27;30608:103;;;:::o;30717:307::-;30785:1;30795:113;30809:6;30806:1;30803:13;30795:113;;;30894:1;30889:3;30885:11;30879:18;30875:1;30870:3;30866:11;30859:39;30831:2;30828:1;30824:10;30819:15;;30795:113;;;30926:6;30923:1;30920:13;30917:2;;;31006:1;30997:6;30992:3;30988:16;30981:27;30917:2;30766:258;;;;:::o;31030:320::-;;31111:1;31105:4;31101:12;31091:22;;31158:1;31152:4;31148:12;31179:18;31169:2;;31235:4;31227:6;31223:17;31213:27;;31169:2;31297;31289:6;31286:14;31266:18;31263:38;31260:2;;;31316:18;;:::i;:::-;31260:2;31081:269;;;;:::o;31356:180::-;31404:77;31401:1;31394:88;31501:4;31498:1;31491:15;31525:4;31522:1;31515:15;31542:180;31590:77;31587:1;31580:88;31687:4;31684:1;31677:15;31711:4;31708:1;31701:15;31728:180;31776:77;31773:1;31766:88;31873:4;31870:1;31863:15;31897:4;31894:1;31887:15;31914:102;;32006:2;32002:7;31997:2;31990:5;31986:14;31982:28;31972:38;;31962:54;;;:::o;32022:122::-;32095:24;32113:5;32095:24;:::i;:::-;32088:5;32085:35;32075:2;;32134:1;32131;32124:12;32075:2;32065:79;:::o;32150:138::-;32231:32;32257:5;32231:32;:::i;:::-;32224:5;32221:43;32211:2;;32278:1;32275;32268:12;32211:2;32201:87;:::o;32294:116::-;32364:21;32379:5;32364:21;:::i;:::-;32357:5;32354:32;32344:2;;32400:1;32397;32390:12;32344:2;32334:76;:::o;32416:122::-;32489:24;32507:5;32489:24;:::i;:::-;32482:5;32479:35;32469:2;;32528:1;32525;32518:12;32469:2;32459:79;:::o

Swarm Source

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