Contract 0xE1D7C7a4596B038CEd2A84bF65B8647271C53208 3

Token Contract 
 

Contract Overview

NFTY: NFTY Token
Balance:
0 Ether

EtherValue:
$0.00

Token:
 
Txn Hash
Method
Block
From
To
Value
0x31cd081a1de31bfada0295ca06bad7dd3adcf04c26738ca4bb5bb0fcf68e9ea4Transfer160953142022-12-02 6:25:1115 hrs 51 mins ago0x237b008e6472f65fd7a34d93ff265f47a2a0d8fb IN  NFTY: NFTY Token0 Ether0.0007931326
0x09977a6660db7408c47a7fb6c6534ec7ff58a2be654d6181b6b8ad5a39123cfdTransfer160952792022-12-02 6:18:1115 hrs 58 mins agoMultichain: Old BSC Bridge IN  NFTY: NFTY Token0 Ether0.00052976 10.11145117
0x0dfa7c87e315be8ae0dba6dd96eade1f84fba7dd2dc26b01a5dc4a2a1a513041Transfer160938322022-12-02 1:27:2320 hrs 49 mins ago0x81d6b81790e723971633785fe998a733e9a0150c IN  NFTY: NFTY Token0 Ether0.0004112713.48753743
0x018cf19f496543e29af49cf9ed4e624aaeb66393a57dd712695a039499270aa5Transfer160936462022-12-02 0:50:1121 hrs 26 mins agoMEXC: Mexc.com IN  NFTY: NFTY Token0 Ether0.0009014717.20205056
0x8767c31bdb1d3fdfd77e88f088ce85953c0c13d897608ea5eeb5ee190dc83018Transfer160935252022-12-02 0:25:4721 hrs 50 mins ago0x10f1c8e29797ab39cf8a7964e3e9cfd130452ff8 IN  NFTY: NFTY Token0 Ether0.00054102 11.36491784
0x5a4b5bd149fe336eb96e4154b29f0179432b488f4fb53fcc521ba56f90a01254Transfer160934882022-12-02 0:18:2321 hrs 58 mins ago0x5c0c0c72e3d44062df69ed6a4c0514f867c1d801 IN  NFTY: NFTY Token0 Ether0.00058903 11.24003514
0xde7d51011ec561e4d7726af8e1cf8d7ddee208f161e96e7bf37e8ca585222875Transfer160934272022-12-02 0:06:1122 hrs 10 mins ago0xe39a00f9fc4332441b3519daae2c35231d93725e IN  NFTY: NFTY Token0 Ether0.0003892412.75
0xec4613fc79d774b67ade354082641b1d5d2f95ff61e241e5d5c6f8c1c4e15fd9Transfer160934222022-12-02 0:05:1122 hrs 11 mins agoMultichain: Old BSC Bridge IN  NFTY: NFTY Token0 Ether0.00053863 10.27361654
0xa0dc11992468ae922cb42d455b5dcb580fe1bb0d5b5d6c5ff4380cf52d97830dApprove160919722022-12-01 19:14:111 day 3 hrs ago0x88f859db067c45b114897db6920f3e4a61a5ca66 IN  NFTY: NFTY Token0 Ether0.00065738 13.90964403
0x92ebb38e5734e41065476aa477a7cec0b44d69955d32a81f506842a53528bc9fTransfer160919222022-12-01 19:04:111 day 3 hrs agoMultichain: Old BSC Bridge IN  NFTY: NFTY Token0 Ether0.00081868 23.17306574
0xb16422a2afc31dce1abcc0a6332ccb8e4c47cccf5f4d2c20e93003822f4ca3cbTransfer160917812022-12-01 18:35:351 day 3 hrs ago0x186d2b4d6f46632b488838692ade780cfd72d31b IN  NFTY: NFTY Token0 Ether0.0005161 16.91194235
0xc026a3e9148f05022ae7d9d14277a1a137f4706ad9a1d49ffe11b8e7325780b8Transfer160917752022-12-01 18:34:231 day 3 hrs ago0x10f1c8e29797ab39cf8a7964e3e9cfd130452ff8 IN  NFTY: NFTY Token0 Ether0.00072854 15.3001155
0x99f59e98707a5980e36c6f11530360dbc45746c98ada9125b4672f76378f86d9Transfer160913622022-12-01 17:11:111 day 5 hrs ago0x5c0c0c72e3d44062df69ed6a4c0514f867c1d801 IN  NFTY: NFTY Token0 Ether0.0007636 21.63625349
0x34b34097df1fbc4d37c172424b34966967c5c7ebe6c07179da79056ddd262fffTransfer160901992022-12-01 13:17:111 day 8 hrs ago0x622661ab4b6ab93c659e751f47ebb0c6e6ad9f48 IN  NFTY: NFTY Token0 Ether0.0003389 11.10978917
0xe24e2cc26d1a0d08519ae121659a234d9c6c3f7d31714d9247f512031e308d81Transfer160901942022-12-01 13:16:111 day 9 hrs agoMultichain: Old BSC Bridge IN  NFTY: NFTY Token0 Ether0.00052613 10.03982111
0x3a22a5b551399ff5cc346f5ba41a9daa1363fa974fe2de98fec274f22f36946dTransfer160893792022-12-01 10:32:111 day 11 hrs agoMEXC: Mexc.com IN  NFTY: NFTY Token0 Ether0.0009959219
0x3027e24dee703641d2a0e46e4dcd0f82cf4c1bdbf1e05224bafb924007f567fbTransfer160879122022-12-01 5:37:351 day 16 hrs agoGate.io IN  NFTY: NFTY Token0 Ether0.00046826 13.25435075
0x5372e2d7e3f0b7570b3ec68c0430c77305b9e325c4820674799826fbca1d1e39Transfer160878582022-12-01 5:26:231 day 16 hrs ago0x46729bab21b2f43284f543d7e9ca14648fb77d25 IN  NFTY: NFTY Token0 Ether0.00035702 11.69453306
0xbd46bb0d78359500fd511bdfef20b29bd02d4d30161dac29c69677a0af96fba2Transfer160840012022-11-30 16:29:592 days 5 hrs ago0xcebda550ff74f50e2b4941b2824c99aff9bda3a6 IN  NFTY: NFTY Token0 Ether0.00064192 13.47756223
0xee7c15ddd0518ca7640b7845c6fd8ba45618df635d886ba77bf74a77504bbb09Transfer160815202022-11-30 8:10:112 days 14 hrs agoMEXC: Mexc.com IN  NFTY: NFTY Token0 Ether0.0010478620
0xfdb87348db0718c426632431dfa5bb537208bad1ba59c05ec9eb0845114f0010Transfer160809882022-11-30 6:22:472 days 15 hrs ago0xd359b81039240c01238ae7b32573e15a28a036fa IN  NFTY: NFTY Token0 Ether0.00055868 11.73870898
0xaa043aa12ad047d7ed0588bb8244423ee657aa0b0d8afa6a8d241389f6d1b9c4Transfer160802262022-11-30 3:49:352 days 18 hrs ago0xd8e957c3cae3a845e2369c2b1c041cf9172a82ed IN  NFTY: NFTY Token0 Ether0.00031829 10.43418249
0x1b704e1dbd0c357d472af13db7b62445c6a571184f01b15c55b3dabdff2d9ff4Approve160783332022-11-29 21:29:233 days 47 mins ago0xc6a3739695f0b65733261219128f96a7b8789994 IN  NFTY: NFTY Token0 Ether0.0006483213.71799548
0x463a5c911a3a39ee3ad933daba53f5e9f7c917bb34edd705498920975c2bcfefTransfer160772482022-11-29 17:50:233 days 4 hrs ago0x186d2b4d6f46632b488838692ade780cfd72d31b IN  NFTY: NFTY Token0 Ether0.00040476 13.26887035
0xa453b1c2e28eb08f7340c677afbd7410a371fcdf11db563e7195f0c709ca24caTransfer160772392022-11-29 17:48:353 days 4 hrs ago0x10f1c8e29797ab39cf8a7964e3e9cfd130452ff8 IN  NFTY: NFTY Token0 Ether0.00033709 11.05045601
[ Download CSV Export 

OVERVIEW

NFTY is a cross-chain Web 3.0 authentication layer used for subscription services, loyalty incentives, and access management. NFTY authenticates via Web 3.0 public key signing rather than Web 2.0 usernames and passwords, with the $NFTY Token powering the NFTY authentication layer.

View more zero value Internal Transactions in Advanced View mode
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
NFTY

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-09-26
*/

// SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.0;

//
//░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
//░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
//░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▒▒▒▒▓▒░░░░░░▒▓▓▓▓▒▒▒▒░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
//░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▒▓▓▓▓▓▓▓▓▓▓▒░░░░░░▓▓▓▓▓▓▓▓▓▓▒▒░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
//░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▒▓▓▓▓▓▓▓▓▓▓▓░░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░░░░░░░░░░░░░░░░░░░░
//░░░░░░░░░░░░░░░░░░░░░░▒▒▓▓▓░░░░░░░▒▓▓▓▓▓▓▓▓▓▓▒░░░░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░░░░░░░░░░░░░░░░░
//░░░░░░░░░░░░░░░░░░░░▒▓▓▓▓▓▓▓▒░░░░░░░▓▓▓▓▓▓▓▓▓▓▒░░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░░░░░░░░░░░░░░
//░░░░░░░░░░░░░░░░░░▒▓▓▓▓▓▓▓▓▓▓▓░░░░░░░▒▓▓▓▓▓▓▓▓▓▓░░░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░░░░░░░░░░░░
//░░░░░░░░░░░░░░░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░░▓▓▓▓▓▓▓▓▓▓▒░░░░░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░░░░░░░░░░░░░
//░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░▒▓▓▓▓▓▓▓▓▓▓▒░░░░░░▒▓▓▓▓▓▓▓▓▓▓▒░░░░░░░░░░░░░░░░░░░░
//░░░░░░░░░░░░░▒▓▒░░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░░▓▓▓▓▓▓▓▓▓▓▒░░░░░░░▓▓▓▓▓▓▓▓░░░░░░░▒▓▒░░░░░░░░░░░░
//░░░░░░░░░░░░▓▓▓▓▒░░░░░░░▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░▒▓▓▓▓▓▓▓▓▓▓▒░░░░░░▒▓▓▓▓▒░░░░░░░▓▓▓▓▒░░░░░░░░░░░
//░░░░░░░░░░░▓▓▓▓▓▓▓░░░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░░▓▓▓▓▓▓▓▓▓▓▓░░░░░░░▒▒░░░░░░░▒▓▓▓▓▓▓▓░░░░░░░░░░
//░░░░░░░░░░▓▓▓▓▓▓▓▓▓▒░░░░░░░▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░▒▓▓▓▓▓▓▓▓▓▓▒░░░░░░░░░░░░░▓▓▓▓▓▓▓▓▓▓░░░░░░░░░
//░░░░░░░░░▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░▒▓▓▓▓▓▓▓▓▓▓▓░░░░░░░░▒▓▓▓▓▓▓▓▓▓▓░░░░░░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░░░
//░░░░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░░▒▓▓▓▓▓▓▓▓▓░░░░░░░░░░▓▓▓▓▓▓▓▓▓░░░░░░░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░░
//░░░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░░▓▓▓▓▓▓▓▒░░░░░░░░░░░▒▓▓▓▓▓▓▓░░░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░
//░░░░░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░░░▒▒▒░░░░░░░░░░░░░░░░▒▒▒▒░░░░░░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░
//░░░░░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░░░░░░░░░░░▓▓▒░░░░░░░░░░░░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░▒░░░
//░░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░░░░░░░░▒▓▓▓▓▓▒░░░░░░░░░░░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░
//░░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░░░░░▓▓▓▓▓▓▓▓▓░░░░░░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░
//░░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░░░▒▓▓▓▓▓▓▓▓▓▒░░░░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░░░░
//░░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░░░░░▓▓▓▓▓▓▓▓▒░░░░░░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░
//░░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░░░░░░░░▒▓▓▓▓▓░░░░░░░░░░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░
//░░░░░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░░░░░░░░░░░▒▒▒░░░░░░░░░░░░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░▒░░░
//░░░░░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░░▒▓▓▓▒░░░░░░░░░░░░░░░▒▒▒▒▒░░░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░▒░░░
//░░░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░░▓▓▓▓▓▓▓▒░░░░░░░░░░░▓▓▓▓▓▓▓▓░░░░░░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░
//░░░░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░░░▒▓▓▓▓▓▓▓▓▓░░░░░░░░░▒▓▓▓▓▓▓▓▓▓▒░░░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░░
//░░░░░░░░░▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░░░░░▒▓▓▓▓▓▓▓▓▓▒░░░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░░▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░░░
//░░░░░░░░░░▓▓▓▓▓▓▓▓▓▒░░░░░░░░░░░░░░▓▓▓▓▓▓▓▓▓▓▒░░░░░░░▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░▒▓▓▓▓▓▓▓▓▓░░░░░░░░░
//░░░░░░░░░░░▓▓▓▓▓▓▓░░░░░░░▒▓▓▒░░░░░░▒▓▓▓▓▓▓▓▓▓▒░░░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░░▓▓▓▓▓▓▓░░░░░░░░░░
//░░░░░░░░░░░░▓▓▓▓▒░░░░░░░▓▓▓▓▓▓░░░░░░░▓▓▓▓▓▓▓▓▓▓▒░░░░░░░▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░▒▓▓▓▒░░░░░░░░░░░
//░░░░░░░░░░░░░▒▓░░░░░░░▒▓▓▓▓▓▓▓▓▒░░░░░░▒▓▓▓▓▓▓▓▓▓▓░░░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░▒▓▒░░░░░░░░░░░░
//░░░░░░░░░░░░░░░░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░▓▓▓▓▓▓▓▓▓▓▒░░░░░░░▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░░░░░░░░░░░░░░
//░░░░░░░░░░░░░░░░░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░▒▓▓▓▓▓▓▓▓▓▓░░░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░░░░░░░░░░░░░
//░░░░░░░░░░░░░░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░▓▓▓▓▓▓▓▓▓▓▒░░░░░░░▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░░░░░░░░░░░░
//░░░░░░░░░░░░░░░░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░▒▓▓▓▓▓▓▓▓▓▓░░░░░░░▒▓▓▓▓▓▓▓▒░░░░░░░░░░░░░░░░░░░
//░░░░░░░░░░░░░░░░░░░░░░▒▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░▓▓▓▓▓▓▓▓▓▓▒░░░░░░▒▓▓▓▒░░░░░░░░░░░░░░░░░░░░░░
//░░░░░░░░░░░░░░░░░░░░░░░░░▒▒▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░▒▓▓▓▓▓▓▓▓▓▓▒░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
//░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▒▒▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░▓▓▓▓▓▓▓▓▓▓▒░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
//░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▒▒▒▓▓▓▓▓▒░░░░░░▒▓▒▒▒▒░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
//░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
//         __ _         _       _
//  _ __  / _| |_ _   _| | __ _| |__  ___
// | '_ \| |_| __| | | | |/ _` | '_ \/ __|
// | | | |  _| |_| |_| | | (_| | |_) \__ \
// |_| |_|_|  \__|\__, |_|\__,_|_.__/|___/
//                |___/
//
// Name: NFTY Token
// Symbol: NFTY
// Decimals: 18
// Initial Supply: 509684123 NFTY
// Supply Limit:  1456240353 NFTY
// Emissions Limit: 88 NFTY per block

// File @openzeppelin/contracts/token/ERC20/[email protected]

/**
 * @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);
}


// File @openzeppelin/contracts/token/ERC20/extensions/[email protected]

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}


// File @openzeppelin/contracts/utils/[email protected]

/**
 * @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) {
        return msg.data;
    }
}


// File @openzeppelin/contracts/token/ERC20/[email protected]

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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

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

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

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

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

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

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

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

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

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

        return true;
    }

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

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

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

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

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

        _afterTokenTransfer(address(0), account, amount);
    }

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

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

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

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

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

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

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been 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 _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}


// File @openzeppelin/contracts/access/[email protected]

/**
 * @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() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

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


// File @openzeppelin/contracts/utils/math/[email protected]

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

abstract contract AuxContract is Ownable {
  function cron(address rewardTo) external virtual;
}

contract NFTY is ERC20, Ownable {
  using SafeMath for *;

  // constants
  uint8 constant private DECIMALS = 18;
  uint256 constant public SUPPLY_LIMIT   =       1456240353 * 10 ** DECIMALS;
  uint256 constant public INITIAL_SUPPLY =        509684123 * 10 ** DECIMALS;

  // amount of token per block (88 token max)
  uint256 constant public MAX_AMOUNT_PER_BLOCK =         88 * 10 ** DECIMALS;
  uint256 public amountMinedPerBlock =                  MAX_AMOUNT_PER_BLOCK;

  AuxContract auxContract;

  // wallets
  address public w1; address public w2; address public w3; address public w4;
  // ratios
  uint256 public r1; uint256 public r2; uint256 public r3; uint256 public r4;

  // state variables
  uint256 public lastBlockMined;
  bool public miningPaused;
  uint256 public amountBurned;

  event AlreadyMined(uint256 block);
  event Mined(uint256 block, uint256 amountMined, uint256 amountBurned, uint256 totalSupply, uint256 totalBurned);
  event EmissionsLowered(uint256 block, uint256 newAmountPerBlock);
  event Paused(uint256 block);
  event Unpaused(uint256 block);
  event AuthDelegated(address from, address to);
  event VoteDelegated(address from, address to);

  /// @dev Decimals override
  function decimals() public pure override returns (uint8){
    return DECIMALS;
  }

  /// @notice Burn an amount of tokens, and increment the global amountBurned variable
  function burn(uint256 amount) public {
      _burn(_msgSender(), amount);
      amountBurned += amount; // add this burnAmount to amountBurned total
  }

  /**
   * @notice
   * Constructor called on contract deployment
   * This function mints the initial supploy to the contract deployer.
   * This function also initializes miningPaused to True, and lastBlockMined to the current block
   */
  constructor() ERC20("NFTY Token", "NFTY") {
    _mint(msg.sender, INITIAL_SUPPLY); // initial supply
    lastBlockMined = block.number; // init block number
    miningPaused = true;
  }
  
  mapping (address=>address) public delegatedAuth;

  /// @notice Delegate wallet authentication to another address
  /// @param to The address to delegate authentication to
  function delegateAuth(address to) public {
    delegatedAuth[msg.sender] = to;
    emit AuthDelegated(msg.sender, to);
  }

  mapping (address=>address) public delegatedVote;

  /// @notice Delegate wallet voting to another address
  /// @param to The address to delegate authentication to
  function delegateVote(address to) public {
    delegatedVote[msg.sender] = to;
    emit VoteDelegated(msg.sender, to);
  }

  /**
   * @dev calculates & returns the TOTAL pending emission and its subsequent split,
   * based on the current stream ratios (r1,r2,r3,r4). 
   * These values are stored & returned as amt2mine,amt1,amt2,amt3,amt4,amt2burn
   * If any checks fail, returns all values as 0 - `(0,0,0,0,0,0)`
   */
  /**
   * @return six-element tuple of uint256's, which represent
   * 1. TOTAL amount to mine 
   * 2. amount for stream wallet 1
   * 3. amount for stream wallet 2
   * 4. amount for stream wallet 3
   * 5. amount for stream wallet 4
   * 6. amount to burn
   */
  function getAmounts() public view returns 
  (uint256, uint256, uint256, uint256, uint256, uint256) {
    // Check if miningPaused OR no difference between now and lastBlockMined 
    int256 since = int256(block.number) - int256(lastBlockMined);
    if (since <= 0 || miningPaused) {
      return (0,0,0,0,0,0);
    }
    // Determine current reward
    uint256 tReward = amountMinedPerBlock.mul(uint256(since));

    // Check if supply limit has been reached
    uint256 supply = totalSupply().add(amountBurned);
    if (SUPPLY_LIMIT <= supply) {
      return (0,0,0,0,0,0);
    }

    // Ensure correct amount should be mined
    // If full amount is over limit, only mine the spare change
    if (tReward.add(supply) > SUPPLY_LIMIT) {
      tReward = SUPPLY_LIMIT.sub(supply);
    }

    // Check if tReward is 0 at this point
    if (tReward == 0) {
      return (0,0,0,0,0,0);
    }

    // split the stream amounts
    uint256 amt1 = tReward.mul(r1).div(100);
    uint256 amt2 = tReward.mul(r2).div(100);
    uint256 amt3 = tReward.mul(r3).div(100);
    uint256 amt4 = tReward.mul(r4).div(100);
    uint256 summed = amt1.add(amt2).add(amt3).add(amt4);

    // Burn remainder
    uint256 burnAmount;
    if (summed != tReward) { 
      burnAmount = tReward.sub(summed);
    }

    // Verify splits add up
    require(tReward == burnAmount.add(amt1).add(amt2).add(amt3).add(amt4), "mismatch");
    return (tReward, amt1, amt2, amt3, amt4, burnAmount);
  }

  /// @dev This function calls mineTo, but with rewardTo set as zero-address 
  function mine() public {
    mineTo(address(0));
  }

  /**
   * @dev If miningPaused, this function does nothing
   * If tokens were already mined this block, this function does nothing
   * If amountBurned + totalSupply >= SUPPLY_LIMIT, this function does nothing.
   */
  /// @notice Create tokens and send down the pre-defined streams. 
  /// @param rewardTo Which address to send reward to for mining tokens
  function mineTo(address rewardTo) public {
    if (miningPaused) {
      return;
    }
    // only mine once per block, maximum.
    // don't revert, in case called via some downstream contract
    if (lastBlockMined >= block.number) {
      emit AlreadyMined(block.number);
      return;
    }

    // use getAmounts() to calculate splits
    (uint256 amt2mine, uint256 amount1, uint256 amount2, uint256 amount3, uint256 amount4, uint256 amt2burn) = getAmounts();
    if (amt2mine == 0) {
      return;
    }
    lastBlockMined = block.number;

    // transfer downstream if amount is not zero
    if (amount1 != 0) { _mint(w1, amount1); }
    if (amount2 != 0) { _mint(w2, amount2); }
    if (amount3 != 0) { _mint(w3, amount3); }
    if (amount4 != 0) { _mint(w4, amount4); }

    // There are tokens to burn, so add them to amt2burn
    // No point in burning then minting, so simply track these in global amountBurned variable
    if (amt2burn != 0) {
      amountBurned += amt2burn; 
    }
    emit Mined(block.number, amt2mine, amt2burn, totalSupply(), amountBurned);

    // Call auxiliary contract for reward, passing rewardTo address
    AuxContract aux = auxContract;
    if (address(aux) != address(0)) {
        try aux.cron(rewardTo) {} catch {}
    }
  }

  /// @notice Assign stream wallets for token emissions (available to contract owner only)
  /// @notice Order matters for these addresses, as they correspond to the matching numbered ratio
  /// @param a1 First stream address 
  /// @param a2 Second stream address
  /// @param a3 Third stream address
  /// @param a4 Fourth stream address
  function updateStreams(address a1, address a2, address a3, address a4) public onlyOwner {
    require(a1 != address(0), "address 1 cannot be zero address");
    w1 = a1; w2 = a2; w3 = a3; w4 = a4;
    // disable slot if zero address (will burn in 'mine' step)
    if (w2 == address(0)) { r2 = 0; }
    if (w3 == address(0)) { r3 = 0; }
    if (w4 == address(0)) { r4 = 0; }
  }


  /// @notice Assign stream ratios for token emissions (available to contract owner only)
  /// @notice Order matters for these ratios, as they correspond to the matching numbered wallet
  /// @param a1 First stream ratio
  /// @param a2 Second stream ratio
  /// @param a3 Third stream ratio
  /// @param a4 Fourth stream ratio
  function updateStreamRatios(uint256 a1, uint256  a2, uint256 a3, uint256 a4) public onlyOwner {
    require(a1.add(a2).add(a3).add(a4) <= 100, "parts exceed 100");
    if (w2 == address(0)){ require(a2 == 0, "cannot mint to zero address 2"); }
    if (w3 == address(0)){ require(a3 == 0, "cannot mint to zero address 3"); }
    if (w4 == address(0)){ require(a4 == 0, "cannot mint to zero address 4"); }
    r1 = a1; r2 = a2; r3 = a3; r4 = a4;
  }

  /// @notice Pause token emissions.
  /// @notice Mining pause does not gather reserves or burn, as lastBlockMined is reset on unpause
  function pauseEmissions() public onlyOwner {
    require(!miningPaused, "mining already paused");
    miningPaused = true;
    emit Paused(block.number);
  }

  /// @notice Unpause token emissions, 10 blocks after function call
  function unpauseEmissions() public onlyOwner {
    require(miningPaused, "mining not paused");
    lastBlockMined = block.number + 10; // re-enable after 10 blocks
    miningPaused = false;
    emit Unpaused(block.number + 10);
  }

  /// @notice Decrease token per block emissions
  /// @notice This function can only decrease emissions, not increase
  function decreaseEmissions(uint256 amount) public onlyOwner {
    require(amount >= 1 * 10**DECIMALS, "amount < one token");
    require(amount < amountMinedPerBlock, "amount >= current emission rate");
    amountMinedPerBlock = amount;
    emit EmissionsLowered(block.number, amount);
  }
  
  /// @notice Set a new AuxContract to be used for the reward mechanism in mineTo
  /// @param aux Contract address for new auxiliary contract
  function setContract(address aux) public onlyOwner {
    auxContract = AuxContract(aux);
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"block","type":"uint256"}],"name":"AlreadyMined","type":"event"},{"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":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"}],"name":"AuthDelegated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newAmountPerBlock","type":"uint256"}],"name":"EmissionsLowered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountMined","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountBurned","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalBurned","type":"uint256"}],"name":"Mined","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":false,"internalType":"uint256","name":"block","type":"uint256"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"block","type":"uint256"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"}],"name":"VoteDelegated","type":"event"},{"inputs":[],"name":"INITIAL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_AMOUNT_PER_BLOCK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SUPPLY_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"amountBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"amountMinedPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"decreaseEmissions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"delegateAuth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"delegateVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"delegatedAuth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"delegatedVote","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAmounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastBlockMined","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mine","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"rewardTo","type":"address"}],"name":"mineTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"miningPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseEmissions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"r1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"r2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"r3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"r4","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"aux","type":"address"}],"name":"setContract","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":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpauseEmissions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"a1","type":"uint256"},{"internalType":"uint256","name":"a2","type":"uint256"},{"internalType":"uint256","name":"a3","type":"uint256"},{"internalType":"uint256","name":"a4","type":"uint256"}],"name":"updateStreamRatios","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"a1","type":"address"},{"internalType":"address","name":"a2","type":"address"},{"internalType":"address","name":"a3","type":"address"},{"internalType":"address","name":"a4","type":"address"}],"name":"updateStreams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"w1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"w2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"w3","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"w4","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60806040526012600a6200001491906200058e565b6058620000229190620006cb565b6006553480156200003257600080fd5b506040518060400160405280600a81526020017f4e46545920546f6b656e000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4e465459000000000000000000000000000000000000000000000000000000008152508160039080519060200190620000b79291906200039e565b508060049080519060200190620000d09291906200039e565b505050620000f3620000e76200014d60201b60201c565b6200015560201b60201c565b62000125336012600a6200010891906200058e565b631e61299b620001199190620006cb565b6200021b60201b60201c565b436010819055506001601160006101000a81548160ff0219169083151502179055506200080d565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200028e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002859062000486565b60405180910390fd5b620002a2600083836200039460201b60201c565b8060026000828254620002b69190620004d6565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200030d9190620004d6565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620003749190620004a8565b60405180910390a362000390600083836200039960201b60201c565b5050565b505050565b505050565b828054620003ac9062000743565b90600052602060002090601f016020900481019282620003d057600085556200041c565b82601f10620003eb57805160ff19168380011785556200041c565b828001600101855582156200041c579182015b828111156200041b578251825591602001919060010190620003fe565b5b5090506200042b91906200042f565b5090565b5b808211156200044a57600081600090555060010162000430565b5090565b60006200045d601f83620004c5565b91506200046a82620007e4565b602082019050919050565b62000480816200072c565b82525050565b60006020820190508181036000830152620004a1816200044e565b9050919050565b6000602082019050620004bf600083018462000475565b92915050565b600082825260208201905092915050565b6000620004e3826200072c565b9150620004f0836200072c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000528576200052762000779565b5b828201905092915050565b6000808291508390505b600185111562000585578086048111156200055d576200055c62000779565b5b60018516156200056d5780820291505b80810290506200057d85620007d7565b94506200053d565b94509492505050565b60006200059b826200072c565b9150620005a88362000736565b9250620005d77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484620005df565b905092915050565b600082620005f15760019050620006c4565b81620006015760009050620006c4565b81600181146200061a576002811462000625576200065b565b6001915050620006c4565b60ff8411156200063a576200063962000779565b5b8360020a91508482111562000654576200065362000779565b5b50620006c4565b5060208310610133831016604e8410600b8410161715620006955782820a9050838111156200068f576200068e62000779565b5b620006c4565b620006a4848484600162000533565b92509050818404811115620006be57620006bd62000779565b5b81810290505b9392505050565b6000620006d8826200072c565b9150620006e5836200072c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000721576200072062000779565b5b828202905092915050565b6000819050919050565b600060ff82169050919050565b600060028204905060018216806200075c57607f821691505b60208210811415620007735762000772620007a8565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60008160011c9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b613e6c806200081d6000396000f3fe608060405234801561001057600080fd5b50600436106102695760003560e01c80637546fcb511610151578063a044c987116100c3578063c18b9c1311610087578063c18b9c13146106d9578063dd62ed3e14610709578063e640f64014610739578063ea32189c14610755578063ef8e293714610785578063f2fde38b146107a157610269565b8063a044c98714610621578063a457c2d71461063f578063a9059cbb1461066f578063b31e1d4d1461069f578063b90d5b99146106bb57610269565b806386e87ae01161011557806386e87ae0146105835780638bf6e410146105a15780638c63555c146105bf5780638da5cb5b146105db57806395d89b41146105f957806399f4b2511461061757610269565b80637546fcb5146104f157806375f890ab1461050f5780637bdb72371461052b5780637e44755b1461054957806381bb642d1461056757610269565b80633906f560116101ea5780635290d773116101ae5780635290d77314610455578063533d0bce146104735780636c33bced1461048f5780636ca5b5b01461049957806370a08231146104b7578063715018a6146104e757610269565b80633906f560146103be57806339509351146103dc5780633d370b4e1461040c57806342966c681461042f5780634b8a03e81461044b57610269565b806323b872dd1161023157806323b872dd146103165780632ff2e9dc14610346578063313ce56714610364578063355fc6c9146103825780633602deb2146103a057610269565b806303cf8a201461026e57806306fdde031461028c578063095ea7b3146102aa5780630bcbbd21146102da57806318160ddd146102f8575b600080fd5b6102766107bd565b6040516102839190613008565b60405180910390f35b6102946107e3565b6040516102a19190613067565b60405180910390f35b6102c460048036038101906102bf9190612bbd565b610875565b6040516102d1919061304c565b60405180910390f35b6102e2610893565b6040516102ef9190613349565b60405180910390f35b610300610899565b60405161030d9190613349565b60405180910390f35b610330600480360381019061032b9190612b6a565b6108a3565b60405161033d919061304c565b60405180910390f35b61034e61099b565b60405161035b9190613349565b60405180910390f35b61036c6109bb565b6040516103799190613441565b60405180910390f35b61038a6109c4565b6040516103979190613349565b60405180910390f35b6103a86109ca565b6040516103b59190613008565b60405180910390f35b6103c66109f0565b6040516103d39190613349565b60405180910390f35b6103f660048036038101906103f19190612bbd565b610a10565b604051610403919061304c565b60405180910390f35b610414610abc565b604051610426969594939291906133e0565b60405180910390f35b61044960048036038101906104449190612bfd565b610dd2565b005b610453610dff565b005b61045d610f3d565b60405161046a9190613349565b60405180910390f35b61048d60048036038101906104889190612a96565b610f43565b005b6104976111ed565b005b6104a161130d565b6040516104ae9190613349565b60405180910390f35b6104d160048036038101906104cc9190612a96565b611313565b6040516104de9190613349565b60405180910390f35b6104ef61135b565b005b6104f96113e3565b6040516105069190613349565b60405180910390f35b61052960048036038101906105249190612a96565b611400565b005b6105336114c0565b6040516105409190613349565b60405180910390f35b6105516114c6565b60405161055e9190613008565b60405180910390f35b610581600480360381019061057c9190612a96565b6114ec565b005b61058b6115a6565b604051610598919061304c565b60405180910390f35b6105a96115b9565b6040516105b69190613349565b60405180910390f35b6105d960048036038101906105d49190612c2a565b6115bf565b005b6105e36118a8565b6040516105f09190613008565b60405180910390f35b6106016118d2565b60405161060e9190613067565b60405180910390f35b61061f611964565b005b610629611970565b6040516106369190613008565b60405180910390f35b61065960048036038101906106549190612bbd565b611996565b604051610666919061304c565b60405180910390f35b61068960048036038101906106849190612bbd565b611a81565b604051610696919061304c565b60405180910390f35b6106b960048036038101906106b49190612a96565b611a9f565b005b6106c3611b59565b6040516106d09190613349565b60405180910390f35b6106f360048036038101906106ee9190612a96565b611b5f565b6040516107009190613008565b60405180910390f35b610723600480360381019061071e9190612ac3565b611b92565b6040516107309190613349565b60405180910390f35b610753600480360381019061074e9190612b03565b611c19565b005b61076f600480360381019061076a9190612a96565b611f2f565b60405161077c9190613008565b60405180910390f35b61079f600480360381019061079a9190612bfd565b611f62565b005b6107bb60048036038101906107b69190612a96565b6120c1565b005b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600380546107f290613824565b80601f016020809104026020016040519081016040528092919081815260200182805461081e90613824565b801561086b5780601f106108405761010080835404028352916020019161086b565b820191906000526020600020905b81548152906001019060200180831161084e57829003601f168201915b5050505050905090565b60006108896108826121b9565b84846121c1565b6001905092915050565b600d5481565b6000600254905090565b60006108b084848461238c565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006108fb6121b9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508281101561097b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097290613229565b60405180910390fd5b61098f856109876121b9565b8584036121c1565b60019150509392505050565b6012600a6109a99190613552565b631e61299b6109b89190613670565b81565b60006012905090565b60105481565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6012600a6109fe9190613552565b6356cc76e1610a0d9190613670565b81565b6000610ab2610a1d6121b9565b848460016000610a2b6121b9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610aad9190613478565b6121c1565b6001905092915050565b600080600080600080600060105443610ad591906136ca565b9050600081131580610af35750601160009054906101000a900460ff165b15610b135760008060008060008096509650965096509650965050610dca565b6000610b2a8260065461260d90919063ffffffff16565b90506000610b4a601254610b3c610899565b61262390919063ffffffff16565b9050806012600a610b5b9190613552565b6356cc76e1610b6a9190613670565b11610b8c57600080600080600080985098509850985098509850505050610dca565b6012600a610b9a9190613552565b6356cc76e1610ba99190613670565b610bbc828461262390919063ffffffff16565b1115610bf457610bf1816012600a610bd49190613552565b6356cc76e1610be39190613670565b61263990919063ffffffff16565b91505b6000821415610c1a57600080600080600080985098509850985098509850505050610dca565b6000610c446064610c36600c548661260d90919063ffffffff16565b61264f90919063ffffffff16565b90506000610c706064610c62600d548761260d90919063ffffffff16565b61264f90919063ffffffff16565b90506000610c9c6064610c8e600e548861260d90919063ffffffff16565b61264f90919063ffffffff16565b90506000610cc86064610cba600f548961260d90919063ffffffff16565b61264f90919063ffffffff16565b90506000610d0382610cf585610ce7888a61262390919063ffffffff16565b61262390919063ffffffff16565b61262390919063ffffffff16565b90506000878214610d2457610d21828961263990919063ffffffff16565b90505b610d6d83610d5f86610d5189610d438c8861262390919063ffffffff16565b61262390919063ffffffff16565b61262390919063ffffffff16565b61262390919063ffffffff16565b8814610dae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da590613209565b60405180910390fd5b8786868686859e509e509e509e509e509e505050505050505050505b909192939495565b610de3610ddd6121b9565b82612665565b8060126000828254610df59190613478565b9250508190555050565b610e076121b9565b73ffffffffffffffffffffffffffffffffffffffff16610e256118a8565b73ffffffffffffffffffffffffffffffffffffffff1614610e7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7290613249565b60405180910390fd5b601160009054906101000a900460ff16610eca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec190613169565b60405180910390fd5b600a43610ed79190613478565b6010819055506000601160006101000a81548160ff0219169083151502179055507f9dd715fed52c25e642f97653bb4c4339ad98fe6d6e130348be82ae5d86383a8c600a43610f269190613478565b604051610f339190613349565b60405180910390a1565b60125481565b601160009054906101000a900460ff1615610f5d576111ea565b4360105410610fa2577f51d2682485acc6068bd190da22f9954f8e19fe326f379c160cb532256ee9878343604051610f959190613349565b60405180910390a16111ea565b600080600080600080610fb3610abc565b9550955095509550955095506000861415610fd3575050505050506111ea565b436010819055506000851461100f5761100e600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168661283c565b5b6000841461104457611043600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168561283c565b5b6000831461107957611078600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168461283c565b5b600082146110ae576110ad600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168361283c565b5b600081146110d05780601260008282546110c89190613478565b925050819055505b7fd48591c0b38848057d65c072802d9172b5a51fd2c4ea6e6729276c0efe2399d54387836110fc610899565b60125460405161111095949392919061338d565b60405180910390a16000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146111e2578073ffffffffffffffffffffffffffffffffffffffff1663bd4f2391896040518263ffffffff1660e01b81526004016111ac9190613008565b600060405180830381600087803b1580156111c657600080fd5b505af19250505080156111d7575060015b6111e0576111e1565b5b5b505050505050505b50565b6111f56121b9565b73ffffffffffffffffffffffffffffffffffffffff166112136118a8565b73ffffffffffffffffffffffffffffffffffffffff1614611269576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126090613249565b60405180910390fd5b601160009054906101000a900460ff16156112b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b0906131c9565b60405180910390fd5b6001601160006101000a81548160ff0219169083151502179055507f32fb7c9891bc4f963c7de9f1186d2a7755c7d6e9f4604dabe1d8bb3027c2f49e436040516113039190613349565b60405180910390a1565b600c5481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6113636121b9565b73ffffffffffffffffffffffffffffffffffffffff166113816118a8565b73ffffffffffffffffffffffffffffffffffffffff16146113d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ce90613249565b60405180910390fd5b6113e1600061299c565b565b6012600a6113f19190613552565b60586113fd9190613670565b81565b6114086121b9565b73ffffffffffffffffffffffffffffffffffffffff166114266118a8565b73ffffffffffffffffffffffffffffffffffffffff161461147c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147390613249565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60065481565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b80601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f3eddc3ecdb7edab86ef5743e7e6ecf78dfbf01f8830eb26a8acdb522fb2bfc34338260405161159b929190613023565b60405180910390a150565b601160009054906101000a900460ff1681565b600e5481565b6115c76121b9565b73ffffffffffffffffffffffffffffffffffffffff166115e56118a8565b73ffffffffffffffffffffffffffffffffffffffff161461163b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163290613249565b60405180910390fd5b60646116748261166685611658888a61262390919063ffffffff16565b61262390919063ffffffff16565b61262390919063ffffffff16565b11156116b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ac906131e9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611750576000831461174f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174690613129565b60405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156117eb57600082146117ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e190613149565b60405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156118865760008114611885576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187c90613309565b60405180910390fd5b5b83600c8190555082600d8190555081600e8190555080600f8190555050505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546118e190613824565b80601f016020809104026020016040519081016040528092919081815260200182805461190d90613824565b801561195a5780601f1061192f5761010080835404028352916020019161195a565b820191906000526020600020905b81548152906001019060200180831161193d57829003601f168201915b5050505050905090565b61196e6000610f43565b565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600160006119a56121b9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611a62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a59906132e9565b60405180910390fd5b611a76611a6d6121b9565b858584036121c1565b600191505092915050565b6000611a95611a8e6121b9565b848461238c565b6001905092915050565b80601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fa0ff2fa6909fe4ddd94349fc9d8e2932f3dfe666216f3cc2aa3a72f5a03b655e3382604051611b4e929190613023565b60405180910390a150565b600f5481565b60136020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611c216121b9565b73ffffffffffffffffffffffffffffffffffffffff16611c3f6118a8565b73ffffffffffffffffffffffffffffffffffffffff1614611c95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8c90613249565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611d05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfc906131a9565b60405180910390fd5b83600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611e69576000600d819055505b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611ec9576000600e819055505b600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611f29576000600f819055505b50505050565b60146020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611f6a6121b9565b73ffffffffffffffffffffffffffffffffffffffff16611f886118a8565b73ffffffffffffffffffffffffffffffffffffffff1614611fde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd590613249565b60405180910390fd5b6012600a611fec9190613552565b6001611ff89190613670565b81101561203a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203190613089565b60405180910390fd5b600654811061207e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612075906132a9565b60405180910390fd5b806006819055507fa5359383b26e4fd2b6525f3aff6b32383b448d64ef960787d0f9a30e343e7c6643826040516120b6929190613364565b60405180910390a150565b6120c96121b9565b73ffffffffffffffffffffffffffffffffffffffff166120e76118a8565b73ffffffffffffffffffffffffffffffffffffffff161461213d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213490613249565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156121ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a4906130e9565b60405180910390fd5b6121b68161299c565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612231576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612228906132c9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229890613109565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161237f9190613349565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156123fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f390613289565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561246c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612463906130a9565b60405180910390fd5b612477838383612a62565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156124fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f490613189565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125909190613478565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516125f49190613349565b60405180910390a3612607848484612a67565b50505050565b6000818361261b9190613670565b905092915050565b600081836126319190613478565b905092915050565b60008183612647919061375e565b905092915050565b6000818361265d91906134ce565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126cc90613269565b60405180910390fd5b6126e182600083612a62565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612767576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275e906130c9565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546127be919061375e565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516128239190613349565b60405180910390a361283783600084612a67565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a390613329565b60405180910390fd5b6128b860008383612a62565b80600260008282546128ca9190613478565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461291f9190613478565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516129849190613349565b60405180910390a361299860008383612a67565b5050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b505050565b505050565b600081359050612a7b81613e08565b92915050565b600081359050612a9081613e1f565b92915050565b600060208284031215612aac57612aab6138e3565b5b6000612aba84828501612a6c565b91505092915050565b60008060408385031215612ada57612ad96138e3565b5b6000612ae885828601612a6c565b9250506020612af985828601612a6c565b9150509250929050565b60008060008060808587031215612b1d57612b1c6138e3565b5b6000612b2b87828801612a6c565b9450506020612b3c87828801612a6c565b9350506040612b4d87828801612a6c565b9250506060612b5e87828801612a6c565b91505092959194509250565b600080600060608486031215612b8357612b826138e3565b5b6000612b9186828701612a6c565b9350506020612ba286828701612a6c565b9250506040612bb386828701612a81565b9150509250925092565b60008060408385031215612bd457612bd36138e3565b5b6000612be285828601612a6c565b9250506020612bf385828601612a81565b9150509250929050565b600060208284031215612c1357612c126138e3565b5b6000612c2184828501612a81565b91505092915050565b60008060008060808587031215612c4457612c436138e3565b5b6000612c5287828801612a81565b9450506020612c6387828801612a81565b9350506040612c7487828801612a81565b9250506060612c8587828801612a81565b91505092959194509250565b612c9a81613792565b82525050565b612ca9816137a4565b82525050565b6000612cba8261345c565b612cc48185613467565b9350612cd48185602086016137f1565b612cdd816138e8565b840191505092915050565b6000612cf5601283613467565b9150612d0082613906565b602082019050919050565b6000612d18602383613467565b9150612d238261392f565b604082019050919050565b6000612d3b602283613467565b9150612d468261397e565b604082019050919050565b6000612d5e602683613467565b9150612d69826139cd565b604082019050919050565b6000612d81602283613467565b9150612d8c82613a1c565b604082019050919050565b6000612da4601d83613467565b9150612daf82613a6b565b602082019050919050565b6000612dc7601d83613467565b9150612dd282613a94565b602082019050919050565b6000612dea601183613467565b9150612df582613abd565b602082019050919050565b6000612e0d602683613467565b9150612e1882613ae6565b604082019050919050565b6000612e30602083613467565b9150612e3b82613b35565b602082019050919050565b6000612e53601583613467565b9150612e5e82613b5e565b602082019050919050565b6000612e76601083613467565b9150612e8182613b87565b602082019050919050565b6000612e99600883613467565b9150612ea482613bb0565b602082019050919050565b6000612ebc602883613467565b9150612ec782613bd9565b604082019050919050565b6000612edf602083613467565b9150612eea82613c28565b602082019050919050565b6000612f02602183613467565b9150612f0d82613c51565b604082019050919050565b6000612f25602583613467565b9150612f3082613ca0565b604082019050919050565b6000612f48601f83613467565b9150612f5382613cef565b602082019050919050565b6000612f6b602483613467565b9150612f7682613d18565b604082019050919050565b6000612f8e602583613467565b9150612f9982613d67565b604082019050919050565b6000612fb1601d83613467565b9150612fbc82613db6565b602082019050919050565b6000612fd4601f83613467565b9150612fdf82613ddf565b602082019050919050565b612ff3816137da565b82525050565b613002816137e4565b82525050565b600060208201905061301d6000830184612c91565b92915050565b60006040820190506130386000830185612c91565b6130456020830184612c91565b9392505050565b60006020820190506130616000830184612ca0565b92915050565b600060208201905081810360008301526130818184612caf565b905092915050565b600060208201905081810360008301526130a281612ce8565b9050919050565b600060208201905081810360008301526130c281612d0b565b9050919050565b600060208201905081810360008301526130e281612d2e565b9050919050565b6000602082019050818103600083015261310281612d51565b9050919050565b6000602082019050818103600083015261312281612d74565b9050919050565b6000602082019050818103600083015261314281612d97565b9050919050565b6000602082019050818103600083015261316281612dba565b9050919050565b6000602082019050818103600083015261318281612ddd565b9050919050565b600060208201905081810360008301526131a281612e00565b9050919050565b600060208201905081810360008301526131c281612e23565b9050919050565b600060208201905081810360008301526131e281612e46565b9050919050565b6000602082019050818103600083015261320281612e69565b9050919050565b6000602082019050818103600083015261322281612e8c565b9050919050565b6000602082019050818103600083015261324281612eaf565b9050919050565b6000602082019050818103600083015261326281612ed2565b9050919050565b6000602082019050818103600083015261328281612ef5565b9050919050565b600060208201905081810360008301526132a281612f18565b9050919050565b600060208201905081810360008301526132c281612f3b565b9050919050565b600060208201905081810360008301526132e281612f5e565b9050919050565b6000602082019050818103600083015261330281612f81565b9050919050565b6000602082019050818103600083015261332281612fa4565b9050919050565b6000602082019050818103600083015261334281612fc7565b9050919050565b600060208201905061335e6000830184612fea565b92915050565b60006040820190506133796000830185612fea565b6133866020830184612fea565b9392505050565b600060a0820190506133a26000830188612fea565b6133af6020830187612fea565b6133bc6040830186612fea565b6133c96060830185612fea565b6133d66080830184612fea565b9695505050505050565b600060c0820190506133f56000830189612fea565b6134026020830188612fea565b61340f6040830187612fea565b61341c6060830186612fea565b6134296080830185612fea565b61343660a0830184612fea565b979650505050505050565b60006020820190506134566000830184612ff9565b92915050565b600081519050919050565b600082825260208201905092915050565b6000613483826137da565b915061348e836137da565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156134c3576134c2613856565b5b828201905092915050565b60006134d9826137da565b91506134e4836137da565b9250826134f4576134f3613885565b5b828204905092915050565b6000808291508390505b60018511156135495780860481111561352557613524613856565b5b60018516156135345780820291505b8081029050613542856138f9565b9450613509565b94509492505050565b600061355d826137da565b9150613568836137e4565b92506135957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848461359d565b905092915050565b6000826135ad5760019050613669565b816135bb5760009050613669565b81600181146135d157600281146135db5761360a565b6001915050613669565b60ff8411156135ed576135ec613856565b5b8360020a91508482111561360457613603613856565b5b50613669565b5060208310610133831016604e8410600b841016171561363f5782820a90508381111561363a57613639613856565b5b613669565b61364c84848460016134ff565b9250905081840481111561366357613662613856565b5b81810290505b9392505050565b600061367b826137da565b9150613686836137da565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156136bf576136be613856565b5b828202905092915050565b60006136d5826137b0565b91506136e0836137b0565b9250827f80000000000000000000000000000000000000000000000000000000000000000182126000841215161561371b5761371a613856565b5b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01821360008412161561375357613752613856565b5b828203905092915050565b6000613769826137da565b9150613774836137da565b92508282101561378757613786613856565b5b828203905092915050565b600061379d826137ba565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b8381101561380f5780820151818401526020810190506137f4565b8381111561381e576000848401525b50505050565b6000600282049050600182168061383c57607f821691505b602082108114156138505761384f6138b4565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b7f616d6f756e74203c206f6e6520746f6b656e0000000000000000000000000000600082015250565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f63616e6e6f74206d696e7420746f207a65726f20616464726573732032000000600082015250565b7f63616e6e6f74206d696e7420746f207a65726f20616464726573732033000000600082015250565b7f6d696e696e67206e6f7420706175736564000000000000000000000000000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f6164647265737320312063616e6e6f74206265207a65726f2061646472657373600082015250565b7f6d696e696e6720616c7265616479207061757365640000000000000000000000600082015250565b7f7061727473206578636565642031303000000000000000000000000000000000600082015250565b7f6d69736d61746368000000000000000000000000000000000000000000000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f616d6f756e74203e3d2063757272656e7420656d697373696f6e207261746500600082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f63616e6e6f74206d696e7420746f207a65726f20616464726573732034000000600082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b613e1181613792565b8114613e1c57600080fd5b50565b613e28816137da565b8114613e3357600080fd5b5056fea26469706673582212206250ad630003e7455e55e8c56180a899b55e5a6579dee451e3a6e12adc60d61e64736f6c63430008070033

Deployed ByteCode Sourcemap

37537:9358:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38088:17;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18287:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20454:169;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38180:17;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19407:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21105:492;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37737:74;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38782:84;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38264:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38126:17;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37658:74;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22006:215;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40756:1502;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;38960:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45988:236;;;:::i;:::-;;38327:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42769:1305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45751:161;;;:::i;:::-;;38161:17;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19578:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29872:94;;;:::i;:::-;;37865:74;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46798:94;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37944:74;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38069:17;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39743:125;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38298:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38199:17;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45154:453;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29221:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18506:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42343:54;;;:::i;:::-;;38107:17;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22724:413;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19918:175;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40044:125;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38218:17;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39565:47;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20156:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44427:384;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39874:47;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46351:294;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30121:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38088:17;;;;;;;;;;;;;:::o;18287:100::-;18341:13;18374:5;18367:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18287:100;:::o;20454:169::-;20537:4;20554:39;20563:12;:10;:12::i;:::-;20577:7;20586:6;20554:8;:39::i;:::-;20611:4;20604:11;;20454:169;;;;:::o;38180:17::-;;;;:::o;19407:108::-;19468:7;19495:12;;19488:19;;19407:108;:::o;21105:492::-;21245:4;21262:36;21272:6;21280:9;21291:6;21262:9;:36::i;:::-;21311:24;21338:11;:19;21350:6;21338:19;;;;;;;;;;;;;;;:33;21358:12;:10;:12::i;:::-;21338:33;;;;;;;;;;;;;;;;21311:60;;21410:6;21390:16;:26;;21382:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;21497:57;21506:6;21514:12;:10;:12::i;:::-;21547:6;21528:16;:25;21497:8;:57::i;:::-;21585:4;21578:11;;;21105:492;;;;;:::o;37737:74::-;37651:2;37797;:14;;;;:::i;:::-;37785:9;:26;;;;:::i;:::-;37737:74;:::o;38782:84::-;38832:5;37651:2;38845:15;;38782:84;:::o;38264:29::-;;;;:::o;38126:17::-;;;;;;;;;;;;;:::o;37658:74::-;37651:2;37718;:14;;;;:::i;:::-;37705:10;:27;;;;:::i;:::-;37658:74;:::o;22006:215::-;22094:4;22111:80;22120:12;:10;:12::i;:::-;22134:7;22180:10;22143:11;:25;22155:12;:10;:12::i;:::-;22143:25;;;;;;;;;;;;;;;:34;22169:7;22143:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;22111:8;:80::i;:::-;22209:4;22202:11;;22006:215;;;;:::o;40756:1502::-;40803:7;40812;40821;40830;40839;40848;40943:12;40988:14;;40965:12;40958:45;;;;:::i;:::-;40943:60;;41023:1;41014:5;:10;;:26;;;;41028:12;;;;;;;;;;;41014:26;41010:69;;;41059:1;41061;41063;41065;41067;41069;41051:20;;;;;;;;;;;;;;;41010:69;41118:15;41136:39;41168:5;41136:19;;:23;;:39;;;;:::i;:::-;41118:57;;41231:14;41248:31;41266:12;;41248:13;:11;:13::i;:::-;:17;;:31;;;;:::i;:::-;41231:48;;41306:6;37651:2;37718;:14;;;;:::i;:::-;37705:10;:27;;;;:::i;:::-;41290:22;41286:65;;41331:1;41333;41335;41337;41339;41341;41323:20;;;;;;;;;;;;;;;;;41286:65;37651:2;37718;:14;;;;:::i;:::-;37705:10;:27;;;;:::i;:::-;41474:19;41486:6;41474:7;:11;;:19;;;;:::i;:::-;:34;41470:91;;;41529:24;41546:6;37651:2;37718;:14;;;;:::i;:::-;37705:10;:27;;;;:::i;:::-;41529:16;;:24;;;;:::i;:::-;41519:34;;41470:91;41628:1;41617:7;:12;41613:55;;;41648:1;41650;41652;41654;41656;41658;41640:20;;;;;;;;;;;;;;;;;41613:55;41709:12;41724:24;41744:3;41724:15;41736:2;;41724:7;:11;;:15;;;;:::i;:::-;:19;;:24;;;;:::i;:::-;41709:39;;41755:12;41770:24;41790:3;41770:15;41782:2;;41770:7;:11;;:15;;;;:::i;:::-;:19;;:24;;;;:::i;:::-;41755:39;;41801:12;41816:24;41836:3;41816:15;41828:2;;41816:7;:11;;:15;;;;:::i;:::-;:19;;:24;;;;:::i;:::-;41801:39;;41847:12;41862:24;41882:3;41862:15;41874:2;;41862:7;:11;;:15;;;;:::i;:::-;:19;;:24;;;;:::i;:::-;41847:39;;41893:14;41910:34;41939:4;41910:24;41929:4;41910:14;41919:4;41910;:8;;:14;;;;:::i;:::-;:18;;:24;;;;:::i;:::-;:28;;:34;;;;:::i;:::-;41893:51;;41976:18;42015:7;42005:6;:17;42001:73;;42047:19;42059:6;42047:7;:11;;:19;;;;:::i;:::-;42034:32;;42001:73;42130:50;42175:4;42130:40;42165:4;42130:30;42155:4;42130:20;42145:4;42130:10;:14;;:20;;;;:::i;:::-;:24;;:30;;;;:::i;:::-;:34;;:40;;;;:::i;:::-;:44;;:50;;;;:::i;:::-;42119:7;:61;42111:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;42208:7;42217:4;42223;42229;42235;42241:10;42200:52;;;;;;;;;;;;;;;;;;;;;40756:1502;;;;;;;:::o;38960:155::-;39006:27;39012:12;:10;:12::i;:::-;39026:6;39006:5;:27::i;:::-;39058:6;39042:12;;:22;;;;;;;:::i;:::-;;;;;;;;38960:155;:::o;45988:236::-;29452:12;:10;:12::i;:::-;29441:23;;:7;:5;:7::i;:::-;:23;;;29433:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46048:12:::1;;;;;;;;;;;46040:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;46121:2;46106:12;:17;;;;:::i;:::-;46089:14;:34;;;;46174:5;46159:12;;:20;;;;;;;;;;;;;;;;;;46191:27;46215:2;46200:12;:17;;;;:::i;:::-;46191:27;;;;;;:::i;:::-;;;;;;;;45988:236::o:0;38327:27::-;;;;:::o;42769:1305::-;42821:12;;;;;;;;;;;42817:41;;;42844:7;;42817:41;42995:12;42977:14;;:30;42973:99;;43023:26;43036:12;43023:26;;;;;;:::i;:::-;;;;;;;;43058:7;;42973:99;43126:16;43144:15;43161;43178;43195;43212:16;43232:12;:10;:12::i;:::-;43125:119;;;;;;;;;;;;43267:1;43255:8;:13;43251:42;;;43279:7;;;;;;;;43251:42;43316:12;43299:14;:29;;;;43402:1;43391:7;:12;43387:41;;43407:18;43413:2;;;;;;;;;;;43417:7;43407:5;:18::i;:::-;43387:41;43449:1;43438:7;:12;43434:41;;43454:18;43460:2;;;;;;;;;;;43464:7;43454:5;:18::i;:::-;43434:41;43496:1;43485:7;:12;43481:41;;43501:18;43507:2;;;;;;;;;;;43511:7;43501:5;:18::i;:::-;43481:41;43543:1;43532:7;:12;43528:41;;43548:18;43554:2;;;;;;;;;;;43558:7;43548:5;:18::i;:::-;43528:41;43747:1;43735:8;:13;43731:61;;43775:8;43759:12;;:24;;;;;;;:::i;:::-;;;;;;;;43731:61;43803:68;43809:12;43823:8;43833;43843:13;:11;:13::i;:::-;43858:12;;43803:68;;;;;;;;;;:::i;:::-;;;;;;;;43949:15;43967:11;;;;;;;;;;;43949:29;;44013:1;43989:26;;43997:3;43989:26;;;43985:84;;44032:3;:8;;;44041;44032:18;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44028:34;;;;;;43985:84;42810:1264;;;;;;;42769:1305;;:::o;45751:161::-;29452:12;:10;:12::i;:::-;29441:23;;:7;:5;:7::i;:::-;:23;;;29433:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45810:12:::1;;;;;;;;;;;45809:13;45801:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;45870:4;45855:12;;:19;;;;;;;;;;;;;;;;;;45886:20;45893:12;45886:20;;;;;;:::i;:::-;;;;;;;;45751:161::o:0;38161:17::-;;;;:::o;19578:127::-;19652:7;19679:9;:18;19689:7;19679:18;;;;;;;;;;;;;;;;19672:25;;19578:127;;;:::o;29872:94::-;29452:12;:10;:12::i;:::-;29441:23;;:7;:5;:7::i;:::-;:23;;;29433:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29937:21:::1;29955:1;29937:9;:21::i;:::-;29872:94::o:0;37865:74::-;37651:2;37925;:14;;;;:::i;:::-;37920:2;:19;;;;:::i;:::-;37865:74;:::o;46798:94::-;29452:12;:10;:12::i;:::-;29441:23;;:7;:5;:7::i;:::-;:23;;;29433:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46882:3:::1;46856:11;;:30;;;;;;;;;;;;;;;;;;46798:94:::0;:::o;37944:74::-;;;;:::o;38069:17::-;;;;;;;;;;;;;:::o;39743:125::-;39819:2;39791:13;:25;39805:10;39791:25;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;39833:29;39847:10;39859:2;39833:29;;;;;;;:::i;:::-;;;;;;;;39743:125;:::o;38298:24::-;;;;;;;;;;;;;:::o;38199:17::-;;;;:::o;45154:453::-;29452:12;:10;:12::i;:::-;29441:23;;:7;:5;:7::i;:::-;:23;;;29433:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45293:3:::1;45263:26;45286:2;45263:18;45278:2;45263:10;45270:2;45263;:6;;:10;;;;:::i;:::-;:14;;:18;;;;:::i;:::-;:22;;:26;;;;:::i;:::-;:33;;45255:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;45342:1;45328:16;;:2;;;;;;;;;;;:16;;;45324:75;;;45361:1;45355:2;:7;45347:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;45324:75;45423:1;45409:16;;:2;;;;;;;;;;;:16;;;45405:75;;;45442:1;45436:2;:7;45428:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;45405:75;45504:1;45490:16;;:2;;;;;;;;;;;:16;;;45486:75;;;45523:1;45517:2;:7;45509:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;45486:75;45572:2;45567;:7;;;;45581:2;45576;:7;;;;45590:2;45585;:7;;;;45599:2;45594;:7;;;;45154:453:::0;;;;:::o;29221:87::-;29267:7;29294:6;;;;;;;;;;;29287:13;;29221:87;:::o;18506:104::-;18562:13;18595:7;18588:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18506:104;:::o;42343:54::-;42373:18;42388:1;42373:6;:18::i;:::-;42343:54::o;38107:17::-;;;;;;;;;;;;;:::o;22724:413::-;22817:4;22834:24;22861:11;:25;22873:12;:10;:12::i;:::-;22861:25;;;;;;;;;;;;;;;:34;22887:7;22861:34;;;;;;;;;;;;;;;;22834:61;;22934:15;22914:16;:35;;22906:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;23027:67;23036:12;:10;:12::i;:::-;23050:7;23078:15;23059:16;:34;23027:8;:67::i;:::-;23125:4;23118:11;;;22724:413;;;;:::o;19918:175::-;20004:4;20021:42;20031:12;:10;:12::i;:::-;20045:9;20056:6;20021:9;:42::i;:::-;20081:4;20074:11;;19918:175;;;;:::o;40044:125::-;40120:2;40092:13;:25;40106:10;40092:25;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;40134:29;40148:10;40160:2;40134:29;;;;;;;:::i;:::-;;;;;;;;40044:125;:::o;38218:17::-;;;;:::o;39565:47::-;;;;;;;;;;;;;;;;;;;;;;:::o;20156:151::-;20245:7;20272:11;:18;20284:5;20272:18;;;;;;;;;;;;;;;:27;20291:7;20272:27;;;;;;;;;;;;;;;;20265:34;;20156:151;;;;:::o;44427:384::-;29452:12;:10;:12::i;:::-;29441:23;;:7;:5;:7::i;:::-;:23;;;29433:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44544:1:::1;44530:16;;:2;:16;;;;44522:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;44595:2;44590;;:7;;;;;;;;;;;;;;;;;;44604:2;44599;;:7;;;;;;;;;;;;;;;;;;44613:2;44608;;:7;;;;;;;;;;;;;;;;;;44622:2;44617;;:7;;;;;;;;;;;;;;;;;;44713:1;44699:16;;:2;;;;;;;;;;;:16;;;44695:33;;;44724:1;44719:2;:6;;;;44695:33;44752:1;44738:16;;:2;;;;;;;;;;;:16;;;44734:33;;;44763:1;44758:2;:6;;;;44734:33;44791:1;44777:16;;:2;;;;;;;;;;;:16;;;44773:33;;;44802:1;44797:2;:6;;;;44773:33;44427:384:::0;;;;:::o;39874:47::-;;;;;;;;;;;;;;;;;;;;;;:::o;46351:294::-;29452:12;:10;:12::i;:::-;29441:23;;:7;:5;:7::i;:::-;:23;;;29433:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37651:2:::1;46440;:12;;;;:::i;:::-;46436:1;:16;;;;:::i;:::-;46426:6;:26;;46418:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;46499:19;;46490:6;:28;46482:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;46583:6;46561:19;:28;;;;46601:38;46618:12;46632:6;46601:38;;;;;;;:::i;:::-;;;;;;;;46351:294:::0;:::o;30121:192::-;29452:12;:10;:12::i;:::-;29441:23;;:7;:5;:7::i;:::-;:23;;;29433:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30230:1:::1;30210:22;;:8;:22;;;;30202:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30286:19;30296:8;30286:9;:19::i;:::-;30121:192:::0;:::o;16029:98::-;16082:7;16109:10;16102:17;;16029:98;:::o;26408:380::-;26561:1;26544:19;;:5;:19;;;;26536:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26642:1;26623:21;;:7;:21;;;;26615:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26726:6;26696:11;:18;26708:5;26696:18;;;;;;;;;;;;;;;:27;26715:7;26696:27;;;;;;;;;;;;;;;:36;;;;26764:7;26748:32;;26757:5;26748:32;;;26773:6;26748:32;;;;;;:::i;:::-;;;;;;;;26408:380;;;:::o;23627:733::-;23785:1;23767:20;;:6;:20;;;;23759:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;23869:1;23848:23;;:9;:23;;;;23840:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;23924:47;23945:6;23953:9;23964:6;23924:20;:47::i;:::-;23984:21;24008:9;:17;24018:6;24008:17;;;;;;;;;;;;;;;;23984:41;;24061:6;24044:13;:23;;24036:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;24182:6;24166:13;:22;24146:9;:17;24156:6;24146:17;;;;;;;;;;;;;;;:42;;;;24234:6;24210:9;:20;24220:9;24210:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;24275:9;24258:35;;24267:6;24258:35;;;24286:6;24258:35;;;;;;:::i;:::-;;;;;;;;24306:46;24326:6;24334:9;24345:6;24306:19;:46::i;:::-;23748:612;23627:733;;;:::o;34008:98::-;34066:7;34097:1;34093;:5;;;;:::i;:::-;34086:12;;34008:98;;;;:::o;33270:::-;33328:7;33359:1;33355;:5;;;;:::i;:::-;33348:12;;33270:98;;;;:::o;33651:::-;33709:7;33740:1;33736;:5;;;;:::i;:::-;33729:12;;33651:98;;;;:::o;34407:::-;34465:7;34496:1;34492;:5;;;;:::i;:::-;34485:12;;34407:98;;;;:::o;25379:591::-;25482:1;25463:21;;:7;:21;;;;25455:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;25535:49;25556:7;25573:1;25577:6;25535:20;:49::i;:::-;25597:22;25622:9;:18;25632:7;25622:18;;;;;;;;;;;;;;;;25597:43;;25677:6;25659:14;:24;;25651:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;25796:6;25779:14;:23;25758:9;:18;25768:7;25758:18;;;;;;;;;;;;;;;:44;;;;25840:6;25824:12;;:22;;;;;;;:::i;:::-;;;;;;;;25890:1;25864:37;;25873:7;25864:37;;;25894:6;25864:37;;;;;;:::i;:::-;;;;;;;;25914:48;25934:7;25951:1;25955:6;25914:19;:48::i;:::-;25444:526;25379:591;;:::o;24647:399::-;24750:1;24731:21;;:7;:21;;;;24723:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;24801:49;24830:1;24834:7;24843:6;24801:20;:49::i;:::-;24879:6;24863:12;;:22;;;;;;;:::i;:::-;;;;;;;;24918:6;24896:9;:18;24906:7;24896:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;24961:7;24940:37;;24957:1;24940:37;;;24970:6;24940:37;;;;;;:::i;:::-;;;;;;;;24990:48;25018:1;25022:7;25031:6;24990:19;:48::i;:::-;24647:399;;:::o;30321:173::-;30377:16;30396:6;;;;;;;;;;;30377:25;;30422:8;30413:6;;:17;;;;;;;;;;;;;;;;;;30477:8;30446:40;;30467:8;30446:40;;;;;;;;;;;;30366:128;30321:173;:::o;27388:125::-;;;;:::o;28117:124::-;;;;:::o;7:139:1:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;7:139;;;;:::o;152:::-;198:5;236:6;223:20;214:29;;252:33;279:5;252:33;:::i;:::-;152:139;;;;:::o;297:329::-;356:6;405:2;393:9;384:7;380:23;376:32;373:119;;;411:79;;:::i;:::-;373:119;531:1;556:53;601:7;592:6;581:9;577:22;556:53;:::i;:::-;546:63;;502:117;297:329;;;;:::o;632:474::-;700:6;708;757:2;745:9;736:7;732:23;728:32;725:119;;;763:79;;:::i;:::-;725:119;883:1;908:53;953:7;944:6;933:9;929:22;908:53;:::i;:::-;898:63;;854:117;1010:2;1036:53;1081:7;1072:6;1061:9;1057:22;1036:53;:::i;:::-;1026:63;;981:118;632:474;;;;;:::o;1112:765::-;1198:6;1206;1214;1222;1271:3;1259:9;1250:7;1246:23;1242:33;1239:120;;;1278:79;;:::i;:::-;1239:120;1398:1;1423:53;1468:7;1459:6;1448:9;1444:22;1423:53;:::i;:::-;1413:63;;1369:117;1525:2;1551:53;1596:7;1587:6;1576:9;1572:22;1551:53;:::i;:::-;1541:63;;1496:118;1653:2;1679:53;1724:7;1715:6;1704:9;1700:22;1679:53;:::i;:::-;1669:63;;1624:118;1781:2;1807:53;1852:7;1843:6;1832:9;1828:22;1807:53;:::i;:::-;1797:63;;1752:118;1112:765;;;;;;;:::o;1883:619::-;1960:6;1968;1976;2025:2;2013:9;2004:7;2000:23;1996:32;1993:119;;;2031:79;;:::i;:::-;1993:119;2151:1;2176:53;2221:7;2212:6;2201:9;2197:22;2176:53;:::i;:::-;2166:63;;2122:117;2278:2;2304:53;2349:7;2340:6;2329:9;2325:22;2304:53;:::i;:::-;2294:63;;2249:118;2406:2;2432:53;2477:7;2468:6;2457:9;2453:22;2432:53;:::i;:::-;2422:63;;2377:118;1883:619;;;;;:::o;2508:474::-;2576:6;2584;2633:2;2621:9;2612:7;2608:23;2604:32;2601:119;;;2639:79;;:::i;:::-;2601:119;2759:1;2784:53;2829:7;2820:6;2809:9;2805:22;2784:53;:::i;:::-;2774:63;;2730:117;2886:2;2912:53;2957:7;2948:6;2937:9;2933:22;2912:53;:::i;:::-;2902:63;;2857:118;2508:474;;;;;:::o;2988:329::-;3047:6;3096:2;3084:9;3075:7;3071:23;3067:32;3064:119;;;3102:79;;:::i;:::-;3064:119;3222:1;3247:53;3292:7;3283:6;3272:9;3268:22;3247:53;:::i;:::-;3237:63;;3193:117;2988:329;;;;:::o;3323:765::-;3409:6;3417;3425;3433;3482:3;3470:9;3461:7;3457:23;3453:33;3450:120;;;3489:79;;:::i;:::-;3450:120;3609:1;3634:53;3679:7;3670:6;3659:9;3655:22;3634:53;:::i;:::-;3624:63;;3580:117;3736:2;3762:53;3807:7;3798:6;3787:9;3783:22;3762:53;:::i;:::-;3752:63;;3707:118;3864:2;3890:53;3935:7;3926:6;3915:9;3911:22;3890:53;:::i;:::-;3880:63;;3835:118;3992:2;4018:53;4063:7;4054:6;4043:9;4039:22;4018:53;:::i;:::-;4008:63;;3963:118;3323:765;;;;;;;:::o;4094:118::-;4181:24;4199:5;4181:24;:::i;:::-;4176:3;4169:37;4094:118;;:::o;4218:109::-;4299:21;4314:5;4299:21;:::i;:::-;4294:3;4287:34;4218:109;;:::o;4333:364::-;4421:3;4449:39;4482:5;4449:39;:::i;:::-;4504:71;4568:6;4563:3;4504:71;:::i;:::-;4497:78;;4584:52;4629:6;4624:3;4617:4;4610:5;4606:16;4584:52;:::i;:::-;4661:29;4683:6;4661:29;:::i;:::-;4656:3;4652:39;4645:46;;4425:272;4333:364;;;;:::o;4703:366::-;4845:3;4866:67;4930:2;4925:3;4866:67;:::i;:::-;4859:74;;4942:93;5031:3;4942:93;:::i;:::-;5060:2;5055:3;5051:12;5044:19;;4703:366;;;:::o;5075:::-;5217:3;5238:67;5302:2;5297:3;5238:67;:::i;:::-;5231:74;;5314:93;5403:3;5314:93;:::i;:::-;5432:2;5427:3;5423:12;5416:19;;5075:366;;;:::o;5447:::-;5589:3;5610:67;5674:2;5669:3;5610:67;:::i;:::-;5603:74;;5686:93;5775:3;5686:93;:::i;:::-;5804:2;5799:3;5795:12;5788:19;;5447:366;;;:::o;5819:::-;5961:3;5982:67;6046:2;6041:3;5982:67;:::i;:::-;5975:74;;6058:93;6147:3;6058:93;:::i;:::-;6176:2;6171:3;6167:12;6160:19;;5819:366;;;:::o;6191:::-;6333:3;6354:67;6418:2;6413:3;6354:67;:::i;:::-;6347:74;;6430:93;6519:3;6430:93;:::i;:::-;6548:2;6543:3;6539:12;6532:19;;6191:366;;;:::o;6563:::-;6705:3;6726:67;6790:2;6785:3;6726:67;:::i;:::-;6719:74;;6802:93;6891:3;6802:93;:::i;:::-;6920:2;6915:3;6911:12;6904:19;;6563:366;;;:::o;6935:::-;7077:3;7098:67;7162:2;7157:3;7098:67;:::i;:::-;7091:74;;7174:93;7263:3;7174:93;:::i;:::-;7292:2;7287:3;7283:12;7276:19;;6935:366;;;:::o;7307:::-;7449:3;7470:67;7534:2;7529:3;7470:67;:::i;:::-;7463:74;;7546:93;7635:3;7546:93;:::i;:::-;7664:2;7659:3;7655:12;7648:19;;7307:366;;;:::o;7679:::-;7821:3;7842:67;7906:2;7901:3;7842:67;:::i;:::-;7835:74;;7918:93;8007:3;7918:93;:::i;:::-;8036:2;8031:3;8027:12;8020:19;;7679:366;;;:::o;8051:::-;8193:3;8214:67;8278:2;8273:3;8214:67;:::i;:::-;8207:74;;8290:93;8379:3;8290:93;:::i;:::-;8408:2;8403:3;8399:12;8392:19;;8051:366;;;:::o;8423:::-;8565:3;8586:67;8650:2;8645:3;8586:67;:::i;:::-;8579:74;;8662:93;8751:3;8662:93;:::i;:::-;8780:2;8775:3;8771:12;8764:19;;8423:366;;;:::o;8795:::-;8937:3;8958:67;9022:2;9017:3;8958:67;:::i;:::-;8951:74;;9034:93;9123:3;9034:93;:::i;:::-;9152:2;9147:3;9143:12;9136:19;;8795:366;;;:::o;9167:365::-;9309:3;9330:66;9394:1;9389:3;9330:66;:::i;:::-;9323:73;;9405:93;9494:3;9405:93;:::i;:::-;9523:2;9518:3;9514:12;9507:19;;9167:365;;;:::o;9538:366::-;9680:3;9701:67;9765:2;9760:3;9701:67;:::i;:::-;9694:74;;9777:93;9866:3;9777:93;:::i;:::-;9895:2;9890:3;9886:12;9879:19;;9538:366;;;:::o;9910:::-;10052:3;10073:67;10137:2;10132:3;10073:67;:::i;:::-;10066:74;;10149:93;10238:3;10149:93;:::i;:::-;10267:2;10262:3;10258:12;10251:19;;9910:366;;;:::o;10282:::-;10424:3;10445:67;10509:2;10504:3;10445:67;:::i;:::-;10438:74;;10521:93;10610:3;10521:93;:::i;:::-;10639:2;10634:3;10630:12;10623:19;;10282:366;;;:::o;10654:::-;10796:3;10817:67;10881:2;10876:3;10817:67;:::i;:::-;10810:74;;10893:93;10982:3;10893:93;:::i;:::-;11011:2;11006:3;11002:12;10995:19;;10654:366;;;:::o;11026:::-;11168:3;11189:67;11253:2;11248:3;11189:67;:::i;:::-;11182:74;;11265:93;11354:3;11265:93;:::i;:::-;11383:2;11378:3;11374:12;11367:19;;11026:366;;;:::o;11398:::-;11540:3;11561:67;11625:2;11620:3;11561:67;:::i;:::-;11554:74;;11637:93;11726:3;11637:93;:::i;:::-;11755:2;11750:3;11746:12;11739:19;;11398:366;;;:::o;11770:::-;11912:3;11933:67;11997:2;11992:3;11933:67;:::i;:::-;11926:74;;12009:93;12098:3;12009:93;:::i;:::-;12127:2;12122:3;12118:12;12111:19;;11770:366;;;:::o;12142:::-;12284:3;12305:67;12369:2;12364:3;12305:67;:::i;:::-;12298:74;;12381:93;12470:3;12381:93;:::i;:::-;12499:2;12494:3;12490:12;12483:19;;12142:366;;;:::o;12514:::-;12656:3;12677:67;12741:2;12736:3;12677:67;:::i;:::-;12670:74;;12753:93;12842:3;12753:93;:::i;:::-;12871:2;12866:3;12862:12;12855:19;;12514:366;;;:::o;12886:118::-;12973:24;12991:5;12973:24;:::i;:::-;12968:3;12961:37;12886:118;;:::o;13010:112::-;13093:22;13109:5;13093:22;:::i;:::-;13088:3;13081:35;13010:112;;:::o;13128:222::-;13221:4;13259:2;13248:9;13244:18;13236:26;;13272:71;13340:1;13329:9;13325:17;13316:6;13272:71;:::i;:::-;13128:222;;;;:::o;13356:332::-;13477:4;13515:2;13504:9;13500:18;13492:26;;13528:71;13596:1;13585:9;13581:17;13572:6;13528:71;:::i;:::-;13609:72;13677:2;13666:9;13662:18;13653:6;13609:72;:::i;:::-;13356:332;;;;;:::o;13694:210::-;13781:4;13819:2;13808:9;13804:18;13796:26;;13832:65;13894:1;13883:9;13879:17;13870:6;13832:65;:::i;:::-;13694:210;;;;:::o;13910:313::-;14023:4;14061:2;14050:9;14046:18;14038:26;;14110:9;14104:4;14100:20;14096:1;14085:9;14081:17;14074:47;14138:78;14211:4;14202:6;14138:78;:::i;:::-;14130:86;;13910:313;;;;:::o;14229:419::-;14395:4;14433:2;14422:9;14418:18;14410:26;;14482:9;14476:4;14472:20;14468:1;14457:9;14453:17;14446:47;14510:131;14636:4;14510:131;:::i;:::-;14502:139;;14229:419;;;:::o;14654:::-;14820:4;14858:2;14847:9;14843:18;14835:26;;14907:9;14901:4;14897:20;14893:1;14882:9;14878:17;14871:47;14935:131;15061:4;14935:131;:::i;:::-;14927:139;;14654:419;;;:::o;15079:::-;15245:4;15283:2;15272:9;15268:18;15260:26;;15332:9;15326:4;15322:20;15318:1;15307:9;15303:17;15296:47;15360:131;15486:4;15360:131;:::i;:::-;15352:139;;15079:419;;;:::o;15504:::-;15670:4;15708:2;15697:9;15693:18;15685:26;;15757:9;15751:4;15747:20;15743:1;15732:9;15728:17;15721:47;15785:131;15911:4;15785:131;:::i;:::-;15777:139;;15504:419;;;:::o;15929:::-;16095:4;16133:2;16122:9;16118:18;16110:26;;16182:9;16176:4;16172:20;16168:1;16157:9;16153:17;16146:47;16210:131;16336:4;16210:131;:::i;:::-;16202:139;;15929:419;;;:::o;16354:::-;16520:4;16558:2;16547:9;16543:18;16535:26;;16607:9;16601:4;16597:20;16593:1;16582:9;16578:17;16571:47;16635:131;16761:4;16635:131;:::i;:::-;16627:139;;16354:419;;;:::o;16779:::-;16945:4;16983:2;16972:9;16968:18;16960:26;;17032:9;17026:4;17022:20;17018:1;17007:9;17003:17;16996:47;17060:131;17186:4;17060:131;:::i;:::-;17052:139;;16779:419;;;:::o;17204:::-;17370:4;17408:2;17397:9;17393:18;17385:26;;17457:9;17451:4;17447:20;17443:1;17432:9;17428:17;17421:47;17485:131;17611:4;17485:131;:::i;:::-;17477:139;;17204:419;;;:::o;17629:::-;17795:4;17833:2;17822:9;17818:18;17810:26;;17882:9;17876:4;17872:20;17868:1;17857:9;17853:17;17846:47;17910:131;18036:4;17910:131;:::i;:::-;17902:139;;17629:419;;;:::o;18054:::-;18220:4;18258:2;18247:9;18243:18;18235:26;;18307:9;18301:4;18297:20;18293:1;18282:9;18278:17;18271:47;18335:131;18461:4;18335:131;:::i;:::-;18327:139;;18054:419;;;:::o;18479:::-;18645:4;18683:2;18672:9;18668:18;18660:26;;18732:9;18726:4;18722:20;18718:1;18707:9;18703:17;18696:47;18760:131;18886:4;18760:131;:::i;:::-;18752:139;;18479:419;;;:::o;18904:::-;19070:4;19108:2;19097:9;19093:18;19085:26;;19157:9;19151:4;19147:20;19143:1;19132:9;19128:17;19121:47;19185:131;19311:4;19185:131;:::i;:::-;19177:139;;18904:419;;;:::o;19329:::-;19495:4;19533:2;19522:9;19518:18;19510:26;;19582:9;19576:4;19572:20;19568:1;19557:9;19553:17;19546:47;19610:131;19736:4;19610:131;:::i;:::-;19602:139;;19329:419;;;:::o;19754:::-;19920:4;19958:2;19947:9;19943:18;19935:26;;20007:9;20001:4;19997:20;19993:1;19982:9;19978:17;19971:47;20035:131;20161:4;20035:131;:::i;:::-;20027:139;;19754:419;;;:::o;20179:::-;20345:4;20383:2;20372:9;20368:18;20360:26;;20432:9;20426:4;20422:20;20418:1;20407:9;20403:17;20396:47;20460:131;20586:4;20460:131;:::i;:::-;20452:139;;20179:419;;;:::o;20604:::-;20770:4;20808:2;20797:9;20793:18;20785:26;;20857:9;20851:4;20847:20;20843:1;20832:9;20828:17;20821:47;20885:131;21011:4;20885:131;:::i;:::-;20877:139;;20604:419;;;:::o;21029:::-;21195:4;21233:2;21222:9;21218:18;21210:26;;21282:9;21276:4;21272:20;21268:1;21257:9;21253:17;21246:47;21310:131;21436:4;21310:131;:::i;:::-;21302:139;;21029:419;;;:::o;21454:::-;21620:4;21658:2;21647:9;21643:18;21635:26;;21707:9;21701:4;21697:20;21693:1;21682:9;21678:17;21671:47;21735:131;21861:4;21735:131;:::i;:::-;21727:139;;21454:419;;;:::o;21879:::-;22045:4;22083:2;22072:9;22068:18;22060:26;;22132:9;22126:4;22122:20;22118:1;22107:9;22103:17;22096:47;22160:131;22286:4;22160:131;:::i;:::-;22152:139;;21879:419;;;:::o;22304:::-;22470:4;22508:2;22497:9;22493:18;22485:26;;22557:9;22551:4;22547:20;22543:1;22532:9;22528:17;22521:47;22585:131;22711:4;22585:131;:::i;:::-;22577:139;;22304:419;;;:::o;22729:::-;22895:4;22933:2;22922:9;22918:18;22910:26;;22982:9;22976:4;22972:20;22968:1;22957:9;22953:17;22946:47;23010:131;23136:4;23010:131;:::i;:::-;23002:139;;22729:419;;;:::o;23154:::-;23320:4;23358:2;23347:9;23343:18;23335:26;;23407:9;23401:4;23397:20;23393:1;23382:9;23378:17;23371:47;23435:131;23561:4;23435:131;:::i;:::-;23427:139;;23154:419;;;:::o;23579:222::-;23672:4;23710:2;23699:9;23695:18;23687:26;;23723:71;23791:1;23780:9;23776:17;23767:6;23723:71;:::i;:::-;23579:222;;;;:::o;23807:332::-;23928:4;23966:2;23955:9;23951:18;23943:26;;23979:71;24047:1;24036:9;24032:17;24023:6;23979:71;:::i;:::-;24060:72;24128:2;24117:9;24113:18;24104:6;24060:72;:::i;:::-;23807:332;;;;;:::o;24145:664::-;24350:4;24388:3;24377:9;24373:19;24365:27;;24402:71;24470:1;24459:9;24455:17;24446:6;24402:71;:::i;:::-;24483:72;24551:2;24540:9;24536:18;24527:6;24483:72;:::i;:::-;24565;24633:2;24622:9;24618:18;24609:6;24565:72;:::i;:::-;24647;24715:2;24704:9;24700:18;24691:6;24647:72;:::i;:::-;24729:73;24797:3;24786:9;24782:19;24773:6;24729:73;:::i;:::-;24145:664;;;;;;;;:::o;24815:775::-;25048:4;25086:3;25075:9;25071:19;25063:27;;25100:71;25168:1;25157:9;25153:17;25144:6;25100:71;:::i;:::-;25181:72;25249:2;25238:9;25234:18;25225:6;25181:72;:::i;:::-;25263;25331:2;25320:9;25316:18;25307:6;25263:72;:::i;:::-;25345;25413:2;25402:9;25398:18;25389:6;25345:72;:::i;:::-;25427:73;25495:3;25484:9;25480:19;25471:6;25427:73;:::i;:::-;25510;25578:3;25567:9;25563:19;25554:6;25510:73;:::i;:::-;24815:775;;;;;;;;;:::o;25596:214::-;25685:4;25723:2;25712:9;25708:18;25700:26;;25736:67;25800:1;25789:9;25785:17;25776:6;25736:67;:::i;:::-;25596:214;;;;:::o;25897:99::-;25949:6;25983:5;25977:12;25967:22;;25897:99;;;:::o;26002:169::-;26086:11;26120:6;26115:3;26108:19;26160:4;26155:3;26151:14;26136:29;;26002:169;;;;:::o;26177:305::-;26217:3;26236:20;26254:1;26236:20;:::i;:::-;26231:25;;26270:20;26288:1;26270:20;:::i;:::-;26265:25;;26424:1;26356:66;26352:74;26349:1;26346:81;26343:107;;;26430:18;;:::i;:::-;26343:107;26474:1;26471;26467:9;26460:16;;26177:305;;;;:::o;26488:185::-;26528:1;26545:20;26563:1;26545:20;:::i;:::-;26540:25;;26579:20;26597:1;26579:20;:::i;:::-;26574:25;;26618:1;26608:35;;26623:18;;:::i;:::-;26608:35;26665:1;26662;26658:9;26653:14;;26488:185;;;;:::o;26679:848::-;26740:5;26747:4;26771:6;26762:15;;26795:5;26786:14;;26809:712;26830:1;26820:8;26817:15;26809:712;;;26925:4;26920:3;26916:14;26910:4;26907:24;26904:50;;;26934:18;;:::i;:::-;26904:50;26984:1;26974:8;26970:16;26967:451;;;27399:4;27392:5;27388:16;27379:25;;26967:451;27449:4;27443;27439:15;27431:23;;27479:32;27502:8;27479:32;:::i;:::-;27467:44;;26809:712;;;26679:848;;;;;;;:::o;27533:281::-;27591:5;27615:23;27633:4;27615:23;:::i;:::-;27607:31;;27659:25;27675:8;27659:25;:::i;:::-;27647:37;;27703:104;27740:66;27730:8;27724:4;27703:104;:::i;:::-;27694:113;;27533:281;;;;:::o;27820:1073::-;27874:5;28065:8;28055:40;;28086:1;28077:10;;28088:5;;28055:40;28114:4;28104:36;;28131:1;28122:10;;28133:5;;28104:36;28200:4;28248:1;28243:27;;;;28284:1;28279:191;;;;28193:277;;28243:27;28261:1;28252:10;;28263:5;;;28279:191;28324:3;28314:8;28311:17;28308:43;;;28331:18;;:::i;:::-;28308:43;28380:8;28377:1;28373:16;28364:25;;28415:3;28408:5;28405:14;28402:40;;;28422:18;;:::i;:::-;28402:40;28455:5;;;28193:277;;28579:2;28569:8;28566:16;28560:3;28554:4;28551:13;28547:36;28529:2;28519:8;28516:16;28511:2;28505:4;28502:12;28498:35;28482:111;28479:246;;;28635:8;28629:4;28625:19;28616:28;;28670:3;28663:5;28660:14;28657:40;;;28677:18;;:::i;:::-;28657:40;28710:5;;28479:246;28750:42;28788:3;28778:8;28772:4;28769:1;28750:42;:::i;:::-;28735:57;;;;28824:4;28819:3;28815:14;28808:5;28805:25;28802:51;;;28833:18;;:::i;:::-;28802:51;28882:4;28875:5;28871:16;28862:25;;27820:1073;;;;;;:::o;28899:348::-;28939:7;28962:20;28980:1;28962:20;:::i;:::-;28957:25;;28996:20;29014:1;28996:20;:::i;:::-;28991:25;;29184:1;29116:66;29112:74;29109:1;29106:81;29101:1;29094:9;29087:17;29083:105;29080:131;;;29191:18;;:::i;:::-;29080:131;29239:1;29236;29232:9;29221:20;;28899:348;;;;:::o;29253:527::-;29292:4;29312:19;29329:1;29312:19;:::i;:::-;29307:24;;29345:19;29362:1;29345:19;:::i;:::-;29340:24;;29534:1;29466:66;29462:74;29459:1;29455:82;29450:1;29447;29443:9;29436:17;29432:106;29429:132;;;29541:18;;:::i;:::-;29429:132;29720:1;29652:66;29648:74;29645:1;29641:82;29637:1;29634;29630:9;29626:98;29623:124;;;29727:18;;:::i;:::-;29623:124;29772:1;29769;29765:9;29757:17;;29253:527;;;;:::o;29786:191::-;29826:4;29846:20;29864:1;29846:20;:::i;:::-;29841:25;;29880:20;29898:1;29880:20;:::i;:::-;29875:25;;29919:1;29916;29913:8;29910:34;;;29924:18;;:::i;:::-;29910:34;29969:1;29966;29962:9;29954:17;;29786:191;;;;:::o;29983:96::-;30020:7;30049:24;30067:5;30049:24;:::i;:::-;30038:35;;29983:96;;;:::o;30085:90::-;30119:7;30162:5;30155:13;30148:21;30137:32;;30085:90;;;:::o;30181:76::-;30217:7;30246:5;30235:16;;30181:76;;;:::o;30263:126::-;30300:7;30340:42;30333:5;30329:54;30318:65;;30263:126;;;:::o;30395:77::-;30432:7;30461:5;30450:16;;30395:77;;;:::o;30478:86::-;30513:7;30553:4;30546:5;30542:16;30531:27;;30478:86;;;:::o;30570:307::-;30638:1;30648:113;30662:6;30659:1;30656:13;30648:113;;;30747:1;30742:3;30738:11;30732:18;30728:1;30723:3;30719:11;30712:39;30684:2;30681:1;30677:10;30672:15;;30648:113;;;30779:6;30776:1;30773:13;30770:101;;;30859:1;30850:6;30845:3;30841:16;30834:27;30770:101;30619:258;30570:307;;;:::o;30883:320::-;30927:6;30964:1;30958:4;30954:12;30944:22;;31011:1;31005:4;31001:12;31032:18;31022:81;;31088:4;31080:6;31076:17;31066:27;;31022:81;31150:2;31142:6;31139:14;31119:18;31116:38;31113:84;;;31169:18;;:::i;:::-;31113:84;30934:269;30883:320;;;:::o;31209:180::-;31257:77;31254:1;31247:88;31354:4;31351:1;31344:15;31378:4;31375:1;31368:15;31395:180;31443:77;31440:1;31433:88;31540:4;31537:1;31530:15;31564:4;31561:1;31554:15;31581:180;31629:77;31626:1;31619:88;31726:4;31723:1;31716:15;31750:4;31747:1;31740:15;31890:117;31999:1;31996;31989:12;32013:102;32054:6;32105:2;32101:7;32096:2;32089:5;32085:14;32081:28;32071:38;;32013:102;;;:::o;32121:::-;32163:8;32210:5;32207:1;32203:13;32182:34;;32121:102;;;:::o;32229:168::-;32369:20;32365:1;32357:6;32353:14;32346:44;32229:168;:::o;32403:222::-;32543:34;32539:1;32531:6;32527:14;32520:58;32612:5;32607:2;32599:6;32595:15;32588:30;32403:222;:::o;32631:221::-;32771:34;32767:1;32759:6;32755:14;32748:58;32840:4;32835:2;32827:6;32823:15;32816:29;32631:221;:::o;32858:225::-;32998:34;32994:1;32986:6;32982:14;32975:58;33067:8;33062:2;33054:6;33050:15;33043:33;32858:225;:::o;33089:221::-;33229:34;33225:1;33217:6;33213:14;33206:58;33298:4;33293:2;33285:6;33281:15;33274:29;33089:221;:::o;33316:179::-;33456:31;33452:1;33444:6;33440:14;33433:55;33316:179;:::o;33501:::-;33641:31;33637:1;33629:6;33625:14;33618:55;33501:179;:::o;33686:167::-;33826:19;33822:1;33814:6;33810:14;33803:43;33686:167;:::o;33859:225::-;33999:34;33995:1;33987:6;33983:14;33976:58;34068:8;34063:2;34055:6;34051:15;34044:33;33859:225;:::o;34090:182::-;34230:34;34226:1;34218:6;34214:14;34207:58;34090:182;:::o;34278:171::-;34418:23;34414:1;34406:6;34402:14;34395:47;34278:171;:::o;34455:166::-;34595:18;34591:1;34583:6;34579:14;34572:42;34455:166;:::o;34627:158::-;34767:10;34763:1;34755:6;34751:14;34744:34;34627:158;:::o;34791:227::-;34931:34;34927:1;34919:6;34915:14;34908:58;35000:10;34995:2;34987:6;34983:15;34976:35;34791:227;:::o;35024:182::-;35164:34;35160:1;35152:6;35148:14;35141:58;35024:182;:::o;35212:220::-;35352:34;35348:1;35340:6;35336:14;35329:58;35421:3;35416:2;35408:6;35404:15;35397:28;35212:220;:::o;35438:224::-;35578:34;35574:1;35566:6;35562:14;35555:58;35647:7;35642:2;35634:6;35630:15;35623:32;35438:224;:::o;35668:181::-;35808:33;35804:1;35796:6;35792:14;35785:57;35668:181;:::o;35855:223::-;35995:34;35991:1;35983:6;35979:14;35972:58;36064:6;36059:2;36051:6;36047:15;36040:31;35855:223;:::o;36084:224::-;36224:34;36220:1;36212:6;36208:14;36201:58;36293:7;36288:2;36280:6;36276:15;36269:32;36084:224;:::o;36314:179::-;36454:31;36450:1;36442:6;36438:14;36431:55;36314:179;:::o;36499:181::-;36639:33;36635:1;36627:6;36623:14;36616:57;36499:181;:::o;36686:122::-;36759:24;36777:5;36759:24;:::i;:::-;36752:5;36749:35;36739:63;;36798:1;36795;36788:12;36739:63;36686:122;:::o;36814:::-;36887:24;36905:5;36887:24;:::i;:::-;36880:5;36877:35;36867:63;;36926:1;36923;36916:12;36867:63;36814:122;:::o

Swarm Source

ipfs://6250ad630003e7455e55e8c56180a899b55e5a6579dee451e3a6e12adc60d61e
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.

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