CELO Price: $0.11 (-1.90%)
Gas: 25 GWei

Contract

0xae18bE42eFDF44253F396D44A407aae9e8B65303

Overview

CELO Balance

Celo Mainnet LogoCelo Mainnet LogoCelo Mainnet Logo0 CELO

CELO Value

$0.00

More Info

Private Name Tags

Multichain Info

Transaction Hash
Block
From
To
Approve516354782025-11-19 7:10:3672 days ago1763536236IN
0xae18bE42...9e8B65303
0 CELO0.0016652925.001
Approve516354782025-11-19 7:10:3672 days ago1763536236IN
0xae18bE42...9e8B65303
0 CELO0.0015926125.001
Transfer514925502025-11-17 15:28:2874 days ago1763393308IN
0xae18bE42...9e8B65303
0 CELO0.0022415825.02886921
Transfer513094572025-11-15 12:36:5576 days ago1763210215IN
0xae18bE42...9e8B65303
0 CELO0.0018141425.001
Transfer513088872025-11-15 12:27:2576 days ago1763209645IN
0xae18bE42...9e8B65303
0 CELO0.0018192925.001
Transfer513088462025-11-15 12:26:4476 days ago1763209604IN
0xae18bE42...9e8B65303
0 CELO0.0018192925.001
Transfer513087452025-11-15 12:25:0376 days ago1763209503IN
0xae18bE42...9e8B65303
0 CELO0.0018241425.001
Transfer511331792025-11-13 11:38:5778 days ago1763033937IN
0xae18bE42...9e8B65303
0 CELO0.0018035425.001
Transfer498442032025-10-29 13:36:0193 days ago1761744961IN
0xae18bE42...9e8B65303
0 CELO0.0018186925.001
Transfer498441562025-10-29 13:35:1493 days ago1761744914IN
0xae18bE42...9e8B65303
0 CELO0.0018189925.001
Transfer498440992025-10-29 13:34:1793 days ago1761744857IN
0xae18bE42...9e8B65303
0 CELO0.003360925.001
Approve485345852025-10-14 9:49:03108 days ago1760435343IN
0xae18bE42...9e8B65303
0 CELO0.0016652925.001
Approve485345852025-10-14 9:49:03108 days ago1760435343IN
0xae18bE42...9e8B65303
0 CELO0.0015926125.001
Transfer485343542025-10-14 9:45:12108 days ago1760435112IN
0xae18bE42...9e8B65303
0 CELO0.0022310625.001
Transfer481897002025-10-10 10:00:58112 days ago1760090458IN
0xae18bE42...9e8B65303
0 CELO0.0018189925.001
Transfer481896182025-10-10 9:59:36112 days ago1760090376IN
0xae18bE42...9e8B65303
0 CELO0.0022413625.001
Transfer481196852025-10-09 14:34:03113 days ago1760020443IN
0xae18bE42...9e8B65303
0 CELO0.0018112725.001
Transfer480932972025-10-09 7:14:15113 days ago1759994055IN
0xae18bE42...9e8B65303
0 CELO0.0018292925.001
Transfer480833292025-10-09 4:28:07113 days ago1759984087IN
0xae18bE42...9e8B65303
0 CELO0.0018189925.001
Transfer480445232025-10-08 17:41:21114 days ago1759945281IN
0xae18bE42...9e8B65303
0 CELO0.0018138425.001
Transfer480440092025-10-08 17:32:47114 days ago1759944767IN
0xae18bE42...9e8B65303
0 CELO0.0018289925.001
Transfer480421322025-10-08 17:01:30114 days ago1759942890IN
0xae18bE42...9e8B65303
0 CELO0.0018009725.001
Transfer468834962025-09-25 7:10:54127 days ago1758784254IN
0xae18bE42...9e8B65303
0 CELO0.0018367225.001
Transfer468832172025-09-25 7:06:15127 days ago1758783975IN
0xae18bE42...9e8B65303
0 CELO0.0022410625.001
Transfer467367592025-09-23 14:25:17129 days ago1758637517IN
0xae18bE42...9e8B65303
0 CELO0.0018370225.001
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:

Cross-Chain Transactions
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0xcbaAdE6a...6CB083AF3
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
DemurrageTokenSingleNocap

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
No with 200 runs

Other Settings:
byzantium EvmVersion, GNU AGPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at celoscan.io on 2023-10-09
*/

pragma solidity >= 0.8.0;


/*
 * ABDK Math 64.64 Smart Contract Library.  Copyright © 2019 by ABDK Consulting.
 * Author: Mikhail Vladimirov <[email protected]>
 * License: BSD-4-Clause
 */
 
/**
 * Smart contract library of mathematical functions operating with signed
 * 64.64-bit fixed point numbers.  Signed 64.64-bit fixed point number is
 * basically a simple fraction whose numerator is signed 128-bit integer and
 * denominator is 2^64.  As long as denominator is always the same, there is no
 * need to store it, thus in Solidity signed 64.64-bit fixed point numbers are
 * represented by int128 type holding only the numerator.
 */
library ABDKMath64x64 {
  /*
   * Minimum value signed 64.64-bit fixed point number may have. 
   */
  int128 private constant MIN_64x64 = -0x80000000000000000000000000000000;

  /*
   * Maximum value signed 64.64-bit fixed point number may have. 
   */
  int128 private constant MAX_64x64 = 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;

  /**
   * Convert signed 256-bit integer number into signed 64.64-bit fixed point
   * number.  Revert on overflow.
   *
   * @param x signed 256-bit integer number
   * @return signed 64.64-bit fixed point number
   */
  function fromInt (int256 x) internal pure returns (int128) {
    unchecked {
      require (x >= -0x8000000000000000 && x <= 0x7FFFFFFFFFFFFFFF);
      return int128 (x << 64);
    }
  }

  /**
   * Convert signed 64.64 fixed point number into signed 64-bit integer number
   * rounding down.
   *
   * @param x signed 64.64-bit fixed point number
   * @return signed 64-bit integer number
   */
  function toInt (int128 x) internal pure returns (int64) {
    unchecked {
      return int64 (x >> 64);
    }
  }

  /**
   * Convert unsigned 256-bit integer number into signed 64.64-bit fixed point
   * number.  Revert on overflow.
   *
   * @param x unsigned 256-bit integer number
   * @return signed 64.64-bit fixed point number
   */
  function fromUInt (uint256 x) internal pure returns (int128) {
    unchecked {
      require (x <= 0x7FFFFFFFFFFFFFFF);
      return int128 (int256 (x << 64));
    }
  }

  /**
   * Convert signed 64.64 fixed point number into unsigned 64-bit integer
   * number rounding down.  Revert on underflow.
   *
   * @param x signed 64.64-bit fixed point number
   * @return unsigned 64-bit integer number
   */
  function toUInt (int128 x) internal pure returns (uint64) {
    unchecked {
      require (x >= 0);
      return uint64 (uint128 (x >> 64));
    }
  }

  /**
   * Convert signed 128.128 fixed point number into signed 64.64-bit fixed point
   * number rounding down.  Revert on overflow.
   *
   * @param x signed 128.128-bin fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function from128x128 (int256 x) internal pure returns (int128) {
    unchecked {
      int256 result = x >> 64;
      require (result >= MIN_64x64 && result <= MAX_64x64);
      return int128 (result);
    }
  }

  /**
   * Convert signed 64.64 fixed point number into signed 128.128 fixed point
   * number.
   *
   * @param x signed 64.64-bit fixed point number
   * @return signed 128.128 fixed point number
   */
  function to128x128 (int128 x) internal pure returns (int256) {
    unchecked {
      return int256 (x) << 64;
    }
  }

  /**
   * Calculate x + y.  Revert on overflow.
   *
   * @param x signed 64.64-bit fixed point number
   * @param y signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function add (int128 x, int128 y) internal pure returns (int128) {
    unchecked {
      int256 result = int256(x) + y;
      require (result >= MIN_64x64 && result <= MAX_64x64);
      return int128 (result);
    }
  }

  /**
   * Calculate x - y.  Revert on overflow.
   *
   * @param x signed 64.64-bit fixed point number
   * @param y signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function sub (int128 x, int128 y) internal pure returns (int128) {
    unchecked {
      int256 result = int256(x) - y;
      require (result >= MIN_64x64 && result <= MAX_64x64);
      return int128 (result);
    }
  }

  /**
   * Calculate x * y rounding down.  Revert on overflow.
   *
   * @param x signed 64.64-bit fixed point number
   * @param y signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function mul (int128 x, int128 y) internal pure returns (int128) {
    unchecked {
      int256 result = int256(x) * y >> 64;
      require (result >= MIN_64x64 && result <= MAX_64x64);
      return int128 (result);
    }
  }

  /**
   * Calculate x * y rounding towards zero, where x is signed 64.64 fixed point
   * number and y is signed 256-bit integer number.  Revert on overflow.
   *
   * @param x signed 64.64 fixed point number
   * @param y signed 256-bit integer number
   * @return signed 256-bit integer number
   */
  function muli (int128 x, int256 y) internal pure returns (int256) {
    unchecked {
      if (x == MIN_64x64) {
        require (y >= -0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF &&
          y <= 0x1000000000000000000000000000000000000000000000000);
        return -y << 63;
      } else {
        bool negativeResult = false;
        if (x < 0) {
          x = -x;
          negativeResult = true;
        }
        if (y < 0) {
          y = -y; // We rely on overflow behavior here
          negativeResult = !negativeResult;
        }
        uint256 absoluteResult = mulu (x, uint256 (y));
        if (negativeResult) {
          require (absoluteResult <=
            0x8000000000000000000000000000000000000000000000000000000000000000);
          return -int256 (absoluteResult); // We rely on overflow behavior here
        } else {
          require (absoluteResult <=
            0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF);
          return int256 (absoluteResult);
        }
      }
    }
  }

  /**
   * Calculate x * y rounding down, where x is signed 64.64 fixed point number
   * and y is unsigned 256-bit integer number.  Revert on overflow.
   *
   * @param x signed 64.64 fixed point number
   * @param y unsigned 256-bit integer number
   * @return unsigned 256-bit integer number
   */
  function mulu (int128 x, uint256 y) internal pure returns (uint256) {
    unchecked {
      if (y == 0) return 0;

      require (x >= 0);

      uint256 lo = (uint256 (int256 (x)) * (y & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)) >> 64;
      uint256 hi = uint256 (int256 (x)) * (y >> 128);

      require (hi <= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF);
      hi <<= 64;

      require (hi <=
        0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - lo);
      return hi + lo;
    }
  }

  /**
   * Calculate x / y rounding towards zero.  Revert on overflow or when y is
   * zero.
   *
   * @param x signed 64.64-bit fixed point number
   * @param y signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function div (int128 x, int128 y) internal pure returns (int128) {
    unchecked {
      require (y != 0);
      int256 result = (int256 (x) << 64) / y;
      require (result >= MIN_64x64 && result <= MAX_64x64);
      return int128 (result);
    }
  }

  /**
   * Calculate x / y rounding towards zero, where x and y are signed 256-bit
   * integer numbers.  Revert on overflow or when y is zero.
   *
   * @param x signed 256-bit integer number
   * @param y signed 256-bit integer number
   * @return signed 64.64-bit fixed point number
   */
  function divi (int256 x, int256 y) internal pure returns (int128) {
    unchecked {
      require (y != 0);

      bool negativeResult = false;
      if (x < 0) {
        x = -x; // We rely on overflow behavior here
        negativeResult = true;
      }
      if (y < 0) {
        y = -y; // We rely on overflow behavior here
        negativeResult = !negativeResult;
      }
      uint128 absoluteResult = divuu (uint256 (x), uint256 (y));
      if (negativeResult) {
        require (absoluteResult <= 0x80000000000000000000000000000000);
        return -int128 (absoluteResult); // We rely on overflow behavior here
      } else {
        require (absoluteResult <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF);
        return int128 (absoluteResult); // We rely on overflow behavior here
      }
    }
  }

  /**
   * Calculate x / y rounding towards zero, where x and y are unsigned 256-bit
   * integer numbers.  Revert on overflow or when y is zero.
   *
   * @param x unsigned 256-bit integer number
   * @param y unsigned 256-bit integer number
   * @return signed 64.64-bit fixed point number
   */
  function divu (uint256 x, uint256 y) internal pure returns (int128) {
    unchecked {
      require (y != 0);
      uint128 result = divuu (x, y);
      require (result <= uint128 (MAX_64x64));
      return int128 (result);
    }
  }

  /**
   * Calculate -x.  Revert on overflow.
   *
   * @param x signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function neg (int128 x) internal pure returns (int128) {
    unchecked {
      require (x != MIN_64x64);
      return -x;
    }
  }

  /**
   * Calculate |x|.  Revert on overflow.
   *
   * @param x signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function abs (int128 x) internal pure returns (int128) {
    unchecked {
      require (x != MIN_64x64);
      return x < 0 ? -x : x;
    }
  }

  /**
   * Calculate 1 / x rounding towards zero.  Revert on overflow or when x is
   * zero.
   *
   * @param x signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function inv (int128 x) internal pure returns (int128) {
    unchecked {
      require (x != 0);
      int256 result = int256 (0x100000000000000000000000000000000) / x;
      require (result >= MIN_64x64 && result <= MAX_64x64);
      return int128 (result);
    }
  }

  /**
   * Calculate arithmetics average of x and y, i.e. (x + y) / 2 rounding down.
   *
   * @param x signed 64.64-bit fixed point number
   * @param y signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function avg (int128 x, int128 y) internal pure returns (int128) {
    unchecked {
      return int128 ((int256 (x) + int256 (y)) >> 1);
    }
  }

  /**
   * Calculate geometric average of x and y, i.e. sqrt (x * y) rounding down.
   * Revert on overflow or in case x * y is negative.
   *
   * @param x signed 64.64-bit fixed point number
   * @param y signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function gavg (int128 x, int128 y) internal pure returns (int128) {
    unchecked {
      int256 m = int256 (x) * int256 (y);
      require (m >= 0);
      require (m <
          0x4000000000000000000000000000000000000000000000000000000000000000);
      return int128 (sqrtu (uint256 (m)));
    }
  }

  /**
   * Calculate x^y assuming 0^0 is 1, where x is signed 64.64 fixed point number
   * and y is unsigned 256-bit integer number.  Revert on overflow.
   *
   * @param x signed 64.64-bit fixed point number
   * @param y uint256 value
   * @return signed 64.64-bit fixed point number
   */
  function pow (int128 x, uint256 y) internal pure returns (int128) {
    unchecked {
      bool negative = x < 0 && y & 1 == 1;

      uint256 absX = uint128 (x < 0 ? -x : x);
      uint256 absResult;
      absResult = 0x100000000000000000000000000000000;

      if (absX <= 0x10000000000000000) {
        absX <<= 63;
        while (y != 0) {
          if (y & 0x1 != 0) {
            absResult = absResult * absX >> 127;
          }
          absX = absX * absX >> 127;

          if (y & 0x2 != 0) {
            absResult = absResult * absX >> 127;
          }
          absX = absX * absX >> 127;

          if (y & 0x4 != 0) {
            absResult = absResult * absX >> 127;
          }
          absX = absX * absX >> 127;

          if (y & 0x8 != 0) {
            absResult = absResult * absX >> 127;
          }
          absX = absX * absX >> 127;

          y >>= 4;
        }

        absResult >>= 64;
      } else {
        uint256 absXShift = 63;
        if (absX < 0x1000000000000000000000000) { absX <<= 32; absXShift -= 32; }
        if (absX < 0x10000000000000000000000000000) { absX <<= 16; absXShift -= 16; }
        if (absX < 0x1000000000000000000000000000000) { absX <<= 8; absXShift -= 8; }
        if (absX < 0x10000000000000000000000000000000) { absX <<= 4; absXShift -= 4; }
        if (absX < 0x40000000000000000000000000000000) { absX <<= 2; absXShift -= 2; }
        if (absX < 0x80000000000000000000000000000000) { absX <<= 1; absXShift -= 1; }

        uint256 resultShift = 0;
        while (y != 0) {
          require (absXShift < 64);

          if (y & 0x1 != 0) {
            absResult = absResult * absX >> 127;
            resultShift += absXShift;
            if (absResult > 0x100000000000000000000000000000000) {
              absResult >>= 1;
              resultShift += 1;
            }
          }
          absX = absX * absX >> 127;
          absXShift <<= 1;
          if (absX >= 0x100000000000000000000000000000000) {
              absX >>= 1;
              absXShift += 1;
          }

          y >>= 1;
        }

        require (resultShift < 64);
        absResult >>= 64 - resultShift;
      }
      int256 result = negative ? -int256 (absResult) : int256 (absResult);
      require (result >= MIN_64x64 && result <= MAX_64x64);
      return int128 (result);
    }
  }

  /**
   * Calculate sqrt (x) rounding down.  Revert if x < 0.
   *
   * @param x signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function sqrt (int128 x) internal pure returns (int128) {
    unchecked {
      require (x >= 0);
      return int128 (sqrtu (uint256 (int256 (x)) << 64));
    }
  }

  /**
   * Calculate binary logarithm of x.  Revert if x <= 0.
   *
   * @param x signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function log_2 (int128 x) internal pure returns (int128) {
    unchecked {
      require (x > 0);

      int256 msb = 0;
      int256 xc = x;
      if (xc >= 0x10000000000000000) { xc >>= 64; msb += 64; }
      if (xc >= 0x100000000) { xc >>= 32; msb += 32; }
      if (xc >= 0x10000) { xc >>= 16; msb += 16; }
      if (xc >= 0x100) { xc >>= 8; msb += 8; }
      if (xc >= 0x10) { xc >>= 4; msb += 4; }
      if (xc >= 0x4) { xc >>= 2; msb += 2; }
      if (xc >= 0x2) msb += 1;  // No need to shift xc anymore

      int256 result = msb - 64 << 64;
      uint256 ux = uint256 (int256 (x)) << uint256 (127 - msb);
      for (int256 bit = 0x8000000000000000; bit > 0; bit >>= 1) {
        ux *= ux;
        uint256 b = ux >> 255;
        ux >>= 127 + b;
        result += bit * int256 (b);
      }

      return int128 (result);
    }
  }

  /**
   * Calculate natural logarithm of x.  Revert if x <= 0.
   *
   * @param x signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function ln (int128 x) internal pure returns (int128) {
    unchecked {
      require (x > 0);

      return int128 (int256 (
          uint256 (int256 (log_2 (x))) * 0xB17217F7D1CF79ABC9E3B39803F2F6AF >> 128));
    }
  }

  /**
   * Calculate binary exponent of x.  Revert on overflow.
   *
   * @param x signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function exp_2 (int128 x) internal pure returns (int128) {
    unchecked {
      require (x < 0x400000000000000000); // Overflow

      if (x < -0x400000000000000000) return 0; // Underflow

      uint256 result = 0x80000000000000000000000000000000;

      if (x & 0x8000000000000000 > 0)
        result = result * 0x16A09E667F3BCC908B2FB1366EA957D3E >> 128;
      if (x & 0x4000000000000000 > 0)
        result = result * 0x1306FE0A31B7152DE8D5A46305C85EDEC >> 128;
      if (x & 0x2000000000000000 > 0)
        result = result * 0x1172B83C7D517ADCDF7C8C50EB14A791F >> 128;
      if (x & 0x1000000000000000 > 0)
        result = result * 0x10B5586CF9890F6298B92B71842A98363 >> 128;
      if (x & 0x800000000000000 > 0)
        result = result * 0x1059B0D31585743AE7C548EB68CA417FD >> 128;
      if (x & 0x400000000000000 > 0)
        result = result * 0x102C9A3E778060EE6F7CACA4F7A29BDE8 >> 128;
      if (x & 0x200000000000000 > 0)
        result = result * 0x10163DA9FB33356D84A66AE336DCDFA3F >> 128;
      if (x & 0x100000000000000 > 0)
        result = result * 0x100B1AFA5ABCBED6129AB13EC11DC9543 >> 128;
      if (x & 0x80000000000000 > 0)
        result = result * 0x10058C86DA1C09EA1FF19D294CF2F679B >> 128;
      if (x & 0x40000000000000 > 0)
        result = result * 0x1002C605E2E8CEC506D21BFC89A23A00F >> 128;
      if (x & 0x20000000000000 > 0)
        result = result * 0x100162F3904051FA128BCA9C55C31E5DF >> 128;
      if (x & 0x10000000000000 > 0)
        result = result * 0x1000B175EFFDC76BA38E31671CA939725 >> 128;
      if (x & 0x8000000000000 > 0)
        result = result * 0x100058BA01FB9F96D6CACD4B180917C3D >> 128;
      if (x & 0x4000000000000 > 0)
        result = result * 0x10002C5CC37DA9491D0985C348C68E7B3 >> 128;
      if (x & 0x2000000000000 > 0)
        result = result * 0x1000162E525EE054754457D5995292026 >> 128;
      if (x & 0x1000000000000 > 0)
        result = result * 0x10000B17255775C040618BF4A4ADE83FC >> 128;
      if (x & 0x800000000000 > 0)
        result = result * 0x1000058B91B5BC9AE2EED81E9B7D4CFAB >> 128;
      if (x & 0x400000000000 > 0)
        result = result * 0x100002C5C89D5EC6CA4D7C8ACC017B7C9 >> 128;
      if (x & 0x200000000000 > 0)
        result = result * 0x10000162E43F4F831060E02D839A9D16D >> 128;
      if (x & 0x100000000000 > 0)
        result = result * 0x100000B1721BCFC99D9F890EA06911763 >> 128;
      if (x & 0x80000000000 > 0)
        result = result * 0x10000058B90CF1E6D97F9CA14DBCC1628 >> 128;
      if (x & 0x40000000000 > 0)
        result = result * 0x1000002C5C863B73F016468F6BAC5CA2B >> 128;
      if (x & 0x20000000000 > 0)
        result = result * 0x100000162E430E5A18F6119E3C02282A5 >> 128;
      if (x & 0x10000000000 > 0)
        result = result * 0x1000000B1721835514B86E6D96EFD1BFE >> 128;
      if (x & 0x8000000000 > 0)
        result = result * 0x100000058B90C0B48C6BE5DF846C5B2EF >> 128;
      if (x & 0x4000000000 > 0)
        result = result * 0x10000002C5C8601CC6B9E94213C72737A >> 128;
      if (x & 0x2000000000 > 0)
        result = result * 0x1000000162E42FFF037DF38AA2B219F06 >> 128;
      if (x & 0x1000000000 > 0)
        result = result * 0x10000000B17217FBA9C739AA5819F44F9 >> 128;
      if (x & 0x800000000 > 0)
        result = result * 0x1000000058B90BFCDEE5ACD3C1CEDC823 >> 128;
      if (x & 0x400000000 > 0)
        result = result * 0x100000002C5C85FE31F35A6A30DA1BE50 >> 128;
      if (x & 0x200000000 > 0)
        result = result * 0x10000000162E42FF0999CE3541B9FFFCF >> 128;
      if (x & 0x100000000 > 0)
        result = result * 0x100000000B17217F80F4EF5AADDA45554 >> 128;
      if (x & 0x80000000 > 0)
        result = result * 0x10000000058B90BFBF8479BD5A81B51AD >> 128;
      if (x & 0x40000000 > 0)
        result = result * 0x1000000002C5C85FDF84BD62AE30A74CC >> 128;
      if (x & 0x20000000 > 0)
        result = result * 0x100000000162E42FEFB2FED257559BDAA >> 128;
      if (x & 0x10000000 > 0)
        result = result * 0x1000000000B17217F7D5A7716BBA4A9AE >> 128;
      if (x & 0x8000000 > 0)
        result = result * 0x100000000058B90BFBE9DDBAC5E109CCE >> 128;
      if (x & 0x4000000 > 0)
        result = result * 0x10000000002C5C85FDF4B15DE6F17EB0D >> 128;
      if (x & 0x2000000 > 0)
        result = result * 0x1000000000162E42FEFA494F1478FDE05 >> 128;
      if (x & 0x1000000 > 0)
        result = result * 0x10000000000B17217F7D20CF927C8E94C >> 128;
      if (x & 0x800000 > 0)
        result = result * 0x1000000000058B90BFBE8F71CB4E4B33D >> 128;
      if (x & 0x400000 > 0)
        result = result * 0x100000000002C5C85FDF477B662B26945 >> 128;
      if (x & 0x200000 > 0)
        result = result * 0x10000000000162E42FEFA3AE53369388C >> 128;
      if (x & 0x100000 > 0)
        result = result * 0x100000000000B17217F7D1D351A389D40 >> 128;
      if (x & 0x80000 > 0)
        result = result * 0x10000000000058B90BFBE8E8B2D3D4EDE >> 128;
      if (x & 0x40000 > 0)
        result = result * 0x1000000000002C5C85FDF4741BEA6E77E >> 128;
      if (x & 0x20000 > 0)
        result = result * 0x100000000000162E42FEFA39FE95583C2 >> 128;
      if (x & 0x10000 > 0)
        result = result * 0x1000000000000B17217F7D1CFB72B45E1 >> 128;
      if (x & 0x8000 > 0)
        result = result * 0x100000000000058B90BFBE8E7CC35C3F0 >> 128;
      if (x & 0x4000 > 0)
        result = result * 0x10000000000002C5C85FDF473E242EA38 >> 128;
      if (x & 0x2000 > 0)
        result = result * 0x1000000000000162E42FEFA39F02B772C >> 128;
      if (x & 0x1000 > 0)
        result = result * 0x10000000000000B17217F7D1CF7D83C1A >> 128;
      if (x & 0x800 > 0)
        result = result * 0x1000000000000058B90BFBE8E7BDCBE2E >> 128;
      if (x & 0x400 > 0)
        result = result * 0x100000000000002C5C85FDF473DEA871F >> 128;
      if (x & 0x200 > 0)
        result = result * 0x10000000000000162E42FEFA39EF44D91 >> 128;
      if (x & 0x100 > 0)
        result = result * 0x100000000000000B17217F7D1CF79E949 >> 128;
      if (x & 0x80 > 0)
        result = result * 0x10000000000000058B90BFBE8E7BCE544 >> 128;
      if (x & 0x40 > 0)
        result = result * 0x1000000000000002C5C85FDF473DE6ECA >> 128;
      if (x & 0x20 > 0)
        result = result * 0x100000000000000162E42FEFA39EF366F >> 128;
      if (x & 0x10 > 0)
        result = result * 0x1000000000000000B17217F7D1CF79AFA >> 128;
      if (x & 0x8 > 0)
        result = result * 0x100000000000000058B90BFBE8E7BCD6D >> 128;
      if (x & 0x4 > 0)
        result = result * 0x10000000000000002C5C85FDF473DE6B2 >> 128;
      if (x & 0x2 > 0)
        result = result * 0x1000000000000000162E42FEFA39EF358 >> 128;
      if (x & 0x1 > 0)
        result = result * 0x10000000000000000B17217F7D1CF79AB >> 128;

      result >>= uint256 (int256 (63 - (x >> 64)));
      require (result <= uint256 (int256 (MAX_64x64)));

      return int128 (int256 (result));
    }
  }

  /**
   * Calculate natural exponent of x.  Revert on overflow.
   *
   * @param x signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function exp (int128 x) internal pure returns (int128) {
    unchecked {
      require (x < 0x400000000000000000); // Overflow

      if (x < -0x400000000000000000) return 0; // Underflow

      return exp_2 (
          int128 (int256 (x) * 0x171547652B82FE1777D0FFDA0D23A7D12 >> 128));
    }
  }

  /**
   * Calculate x / y rounding towards zero, where x and y are unsigned 256-bit
   * integer numbers.  Revert on overflow or when y is zero.
   *
   * @param x unsigned 256-bit integer number
   * @param y unsigned 256-bit integer number
   * @return unsigned 64.64-bit fixed point number
   */
  function divuu (uint256 x, uint256 y) private pure returns (uint128) {
    unchecked {
      require (y != 0);

      uint256 result;

      if (x <= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
        result = (x << 64) / y;
      else {
        uint256 msb = 192;
        uint256 xc = x >> 192;
        if (xc >= 0x100000000) { xc >>= 32; msb += 32; }
        if (xc >= 0x10000) { xc >>= 16; msb += 16; }
        if (xc >= 0x100) { xc >>= 8; msb += 8; }
        if (xc >= 0x10) { xc >>= 4; msb += 4; }
        if (xc >= 0x4) { xc >>= 2; msb += 2; }
        if (xc >= 0x2) msb += 1;  // No need to shift xc anymore

        result = (x << 255 - msb) / ((y - 1 >> msb - 191) + 1);
        require (result <= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF);

        uint256 hi = result * (y >> 128);
        uint256 lo = result * (y & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF);

        uint256 xh = x >> 192;
        uint256 xl = x << 64;

        if (xl < lo) xh -= 1;
        xl -= lo; // We rely on overflow behavior here
        lo = hi << 128;
        if (xl < lo) xh -= 1;
        xl -= lo; // We rely on overflow behavior here

        assert (xh == hi >> 128);

        result += xl / y;
      }

      require (result <= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF);
      return uint128 (result);
    }
  }

  /**
   * Calculate sqrt (x) rounding down, where x is unsigned 256-bit integer
   * number.
   *
   * @param x unsigned 256-bit integer number
   * @return unsigned 128-bit integer number
   */
  function sqrtu (uint256 x) private pure returns (uint128) {
    unchecked {
      if (x == 0) return 0;
      else {
        uint256 xx = x;
        uint256 r = 1;
        if (xx >= 0x100000000000000000000000000000000) { xx >>= 128; r <<= 64; }
        if (xx >= 0x10000000000000000) { xx >>= 64; r <<= 32; }
        if (xx >= 0x100000000) { xx >>= 32; r <<= 16; }
        if (xx >= 0x10000) { xx >>= 16; r <<= 8; }
        if (xx >= 0x100) { xx >>= 8; r <<= 4; }
        if (xx >= 0x10) { xx >>= 4; r <<= 2; }
        if (xx >= 0x4) { r <<= 1; }
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1; // Seven iterations should be enough
        uint256 r1 = x / r;
        return uint128 (r < r1 ? r : r1);
      }
    }
  }
}

// SPDX-License-Identifier: AGPL-3.0-or-later
contract DemurrageTokenSingleNocap {

	uint256 constant VALUE_LIMIT = 1 << 63;

	struct redistributionItem {
		uint32 period;
		uint72 value;
		uint64 demurrage;
	}
	redistributionItem[] public redistributions;

	// Account balances
	mapping (address => uint256) account;
	
	// Cached demurrage amount, ppm with 38 digit resolution
	//uint128 public demurrageAmount;
	int128 public demurrageAmount;

	// Cached demurrage timestamp; the timestamp for which demurrageAmount was last calculated
	uint256 public demurrageTimestamp;

	// Implements EIP173
	address public owner;

	address newOwner;

	// Implements ERC20
	string public name;

	// Implements ERC20
	string public symbol;

	// Implements ERC20
	uint256 public immutable decimals;

	uint256 supply;

	// Last executed period
	uint256 public lastPeriod;

	// Last sink redistribution amount
	uint256 public totalSink;

	// Value of burnt tokens (burnt tokens do not decay)
	uint256 burned;

	// 128 bit resolution of the demurrage divisor
	// (this constant x 1000000 is contained within 128 bits)
	//uint256 constant nanoDivider = 100000000000000000000000000; // now nanodivider, 6 zeros less

	// remaining decimal positions of nanoDivider to reach 38, equals precision in growth and decay
	//uint256 constant growthResolutionFactor = 1000000000000;

	// demurrage decimal width; 38 places
	//uint256 public immutable resolutionFactor = nanoDivider * growthResolutionFactor; 

	// Timestamp of start of periods (time which contract constructor was called)
	uint256 public immutable periodStart;

	// Duration of a single redistribution period in seconds
	uint256 public immutable periodDuration;

	// Demurrage in ppm per minute
	//uint256 public immutable decayLevel;
	// 64x64
	int128 public immutable decayLevel;
		
	// Addresses allowed to mint new tokens
	mapping (address => bool) minter;

	// Storage for ERC20 approve/transferFrom methods
	mapping (address => mapping (address => uint256 ) ) public allowance; // holder -> spender -> amount (amount is subject to demurrage)

	// Address to send unallocated redistribution tokens
	address public sinkAddress; 

	// timestamp when token contract expires
	uint256 public expires;
	bool expired;

	// supply xap
	uint256 public maxSupply;

	// Implements ERC20
	event Transfer(address indexed _from, address indexed _to, uint256 _value);

	// Implements ERC20
	event Approval(address indexed _owner, address indexed _spender, uint256 _value);

	// Implements Minter
	event Mint(address indexed _minter, address indexed _beneficiary, uint256 _value);

	// New demurrage cache milestone calculated
	event Decayed(uint256 indexed _period, uint256 indexed _periodCount, int128 indexed _oldAmount, int128 _newAmount);

	// When a new period threshold has been crossed
	event Period(uint256 _period);

	// Redistribution applied on a single eligible account
	event Redistribution(address indexed _account, uint256 indexed _period, uint256 _value);

	// Temporary event used in development, will be removed on prod
	//event Debug(bytes32 _foo);
	event Debug(int128 indexed _foo, uint256 indexed _bar);

	// Implements Burn
	event Burn(address indexed _burner, uint256 _value);

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

	// Implements Expire
	event Expired(uint256 _timestamp);

	// Implements Expire
	event ExpiryChange(uint256 indexed _oldTimestamp, uint256 _newTimestamp);

	event Cap(uint256 indexed _oldCap, uint256 _newCap);

	// Implements Seal
	uint256 public sealState;
	uint8 constant WRITER_STATE = 1;
	uint8 constant SINK_STATE = 2;
	uint8 constant EXPIRY_STATE = 4;
	uint8 constant CAP_STATE = 8;
	// Implements Seal
	uint256 constant public maxSealState = 15;

	// Implements Seal
	event SealStateChange(bool indexed _final, uint256 _sealState);


	constructor(string memory _name, string memory _symbol, uint8 _decimals, int128 _decayLevel, uint256 _periodMinutes, address _defaultSinkAddress) {
		require(_decayLevel < (1 << 64));
		redistributionItem memory initialRedistribution;

		//require(ABDKMath64x64.toUInt(_decayLevel) == 0);

		// ACL setup
		owner = msg.sender;

		// ERC20 setup
		name = _name;
		symbol = _symbol;
		decimals = _decimals;

		// Demurrage setup
		demurrageTimestamp = block.timestamp;
		periodStart = demurrageTimestamp;
		periodDuration = _periodMinutes * 60;
		demurrageAmount = ABDKMath64x64.fromUInt(1);

		decayLevel = ABDKMath64x64.ln(_decayLevel);
		initialRedistribution = toRedistribution(0, demurrageAmount, 0, 1);
		redistributions.push(initialRedistribution);

		// Misc settings
		sinkAddress = _defaultSinkAddress;
	}

	function seal(uint256 _state) public returns(uint256) {
		require(_state < 16, 'ERR_INVALID_STATE');
		require(_state & sealState == 0, 'ERR_ALREADY_LOCKED');
		sealState |= _state;
		emit SealStateChange(sealState == maxSealState, sealState);
		return uint256(sealState);
	}

	function isSealed(uint256 _state) public view returns(bool) {
		require(_state < maxSealState);
		if (_state == 0) {
			return sealState == maxSealState;
		}
		return _state & sealState == _state;
	}

	// Set when token expires. 
	// Value is set it terms of redistribution periods.
	// Cannot be set to a time in the past.
	function setExpirePeriod(uint256 _expirePeriod) public {
		uint256 r;
		uint256 oldTimestamp;

		require(!isSealed(EXPIRY_STATE));
		require(!expired);
		require(msg.sender == owner);
		r = periodStart + (_expirePeriod * periodDuration);
		require(r > expires);
		oldTimestamp = expires;
		expires = r;
		emit ExpiryChange(oldTimestamp, expires);
	}

	// Change max token supply.
	// Can only increase supply cap, not decrease.
	function setMaxSupply(uint256 _cap) public {
		require(!isSealed(CAP_STATE));
		require(msg.sender == owner);
		require(_cap > totalSupply());
		emit Cap(maxSupply, _cap);
		maxSupply = _cap;
	}

	// Change sink address for redistribution
	function setSinkAddress(address _sinkAddress) public {
		require(!isSealed(SINK_STATE));
		require(msg.sender == owner);
		sinkAddress = _sinkAddress;
	}

	// Expire the contract if expire is set and we have gone over the threshold.
	// Finalizes demurrage up to the timestamp of the expiry. 
	// The first approve, transfer or transferFrom call that hits the ex == 2 will get the tx mined. but without the actual effect. Otherwise we would have to wait until an external egent called applyExpiry to get the correct final balance.
	// Implements Expire
	function applyExpiry() public returns(uint8) {
		if (expired) {
			return 1;
		}
		if (expires == 0) {
			return 0;
		}
		if (block.timestamp >= expires) {
			applyDemurrageLimited(expires - demurrageTimestamp / 60);
			expired = true;
			emit Expired(block.timestamp);
			changePeriod();
			return 2;
		}
		return 0;
	}

	// Given address will be allowed to call the mintTo() function
	// Implements Writer
	function addWriter(address _minter) public returns (bool) {
		require(!isSealed(WRITER_STATE));
		require(msg.sender == owner);
		minter[_minter] = true;
		return true;
	}

	// Given address will no longer be allowed to call the mintTo() function
	// Implements Writer
	function deleteWriter(address _minter) public returns (bool) {
		require(!isSealed(WRITER_STATE));
		require(msg.sender == owner || _minter == msg.sender);
		minter[_minter] = false;
		return true;
	}

	// Implements Writer
	function isWriter(address _minter) public view returns(bool) {
		return minter[_minter] || _minter == owner;
	}

	/// Implements ERC20
	function balanceOf(address _account) public view returns (uint256) {
		int128 baseBalance;
		int128 currentDemurragedAmount;
		uint256 periodCount;

		baseBalance = ABDKMath64x64.fromUInt(baseBalanceOf(_account));

		periodCount = getMinutesDelta(demurrageTimestamp);

		currentDemurragedAmount = ABDKMath64x64.mul(baseBalance, demurrageAmount);
		return decayBy(ABDKMath64x64.toUInt(currentDemurragedAmount), periodCount);
	}

	// Balance unmodified by demurrage
	function baseBalanceOf(address _account) public view returns (uint256) {
		return account[_account];
	}

	/// Increases base balance for a single account
	function increaseBaseBalance(address _account, uint256 _delta) private returns (bool) {
		uint256 oldBalance;
		uint256 workAccount;

		workAccount = uint256(account[_account]);
	
		if (_delta == 0) {
			return false;
		}

		oldBalance = baseBalanceOf(_account);
		account[_account] = oldBalance + _delta;
		return true;
	}

	/// Decreases base balance for a single account
	function decreaseBaseBalance(address _account, uint256 _delta) private returns (bool) {
		uint256 oldBalance;
		uint256 workAccount;

		workAccount = uint256(account[_account]);

		if (_delta == 0) {
			return false;
		}

		oldBalance = baseBalanceOf(_account);	
		require(oldBalance >= _delta, 'ERR_OVERSPEND'); // overspend guard
		account[_account] = oldBalance - _delta;
		return true;
	}

	// Send full balance of one account to another
	function sweep(address _account) public returns (uint256) {
		uint256 v;

		v = account[msg.sender];
		account[msg.sender] = 0;
		account[_account] += v;
		emit Transfer(msg.sender, _account, v);
		return v;
	}

	// Creates new tokens out of thin air, and allocates them to the given address
	// Triggers tax
	// Implements Minter
	function mintTo(address _beneficiary, uint256 _amount) public returns (bool) {
		uint256 baseAmount;

		require(applyExpiry() == 0);
		require(minter[msg.sender] || msg.sender == owner, 'ERR_ACCESS');

		changePeriod();
		if (maxSupply > 0) {
			require(supply + _amount <= maxSupply);
		}
		supply += _amount;

		baseAmount = toBaseAmount(_amount);
		increaseBaseBalance(_beneficiary, baseAmount);
		emit Mint(msg.sender, _beneficiary, _amount);
		saveRedistributionSupply();
		return true;
	}

	// Implements Minter
	function mint(address _beneficiary, uint256 _amount, bytes calldata _data) public {
		_data;
		mintTo(_beneficiary, _amount);
	}

	// Implements Minter
	function safeMint(address _beneficiary, uint256 _amount, bytes calldata _data) public {
		_data;
		mintTo(_beneficiary, _amount);
	}

	// Deserializes the redistribution word
	function toRedistribution(uint256 _participants, int128 _demurrageModifier, uint256 _value, uint256 _period) public pure returns(redistributionItem memory) {
		redistributionItem memory redistribution;

		redistribution.period = uint32(_period);
		redistribution.value = uint72(_value);
		redistribution.demurrage = uint64(uint128(_demurrageModifier) & 0xffffffffffffffff);
		_participants;
		return redistribution;

	}

	// Serializes the demurrage period part of the redistribution word
	function toRedistributionPeriod(redistributionItem memory _redistribution) public pure returns (uint256) {
		return uint256(_redistribution.period);
	}

	// Serializes the supply part of the redistribution word
	function toRedistributionSupply(redistributionItem memory _redistribution) public pure returns (uint256) {
		return uint256(_redistribution.value);
	}

	// Serializes the number of participants part of the redistribution word
	function toRedistributionDemurrageModifier(redistributionItem memory _redistribution) public pure returns (int128) {
		int128 r;

		r = int128(int64(_redistribution.demurrage) & int128(0x0000000000000000ffffffffffffffff));
		if (r == 0) {
			r = ABDKMath64x64.fromUInt(1);
		}
		return r;
	}

	// Client accessor to the redistributions array length
	function redistributionCount() public view returns (uint256) {
		return redistributions.length;
	}

	// Save the current total supply amount to the current redistribution period
	function saveRedistributionSupply() private returns (bool) {
		redistributionItem memory currentRedistribution;
		uint256 grownSupply;

		grownSupply = totalSupply();
		currentRedistribution = redistributions[redistributions.length-1];
		currentRedistribution.value = uint72(grownSupply);

		redistributions[redistributions.length-1] = currentRedistribution;
		return true;
	}

	// Get the demurrage period of the current block number
	function actualPeriod() public view returns (uint128) {
		return uint128((block.timestamp - periodStart) / periodDuration + 1);
	}

	// Retrieve next redistribution if the period threshold has been crossed
	function checkPeriod() private view returns (redistributionItem memory) {
		redistributionItem memory lastRedistribution;
		redistributionItem memory emptyRedistribution;
		uint256 currentPeriod;

		lastRedistribution =  redistributions[lastPeriod];
		currentPeriod = this.actualPeriod();
		if (currentPeriod <= toRedistributionPeriod(lastRedistribution)) {
			return emptyRedistribution;
		}
		return lastRedistribution;
	}

	function getDistribution(uint256 _supply, int128 _demurrageAmount) public pure returns (uint256) {
		int128 difference;

		difference = ABDKMath64x64.mul(ABDKMath64x64.fromUInt(_supply), ABDKMath64x64.sub(ABDKMath64x64.fromUInt(1), _demurrageAmount));
		return _supply - ABDKMath64x64.toUInt(difference);
			
	}

	function getDistributionFromRedistribution(redistributionItem memory _redistribution) public pure returns (uint256) {
		uint256 redistributionSupply;
		int128 redistributionDemurrage;

		redistributionSupply = toRedistributionSupply(_redistribution);
		redistributionDemurrage = toRedistributionDemurrageModifier(_redistribution);
		return getDistribution(redistributionSupply, redistributionDemurrage);
	}

	// Returns the amount sent to the sink address
	function applyDefaultRedistribution(redistributionItem memory _redistribution) private returns (uint256) {
		uint256 unit;
		uint256 baseUnit;
	
		unit = totalSupply() - getDistributionFromRedistribution(_redistribution);	
		baseUnit = toBaseAmount(unit) - totalSink;
		increaseBaseBalance(sinkAddress, baseUnit);
		emit Redistribution(sinkAddress, _redistribution.period, unit);
		lastPeriod += 1;
		totalSink += baseUnit;
		return unit;
	}

	// Recalculate the demurrage modifier for the new period
	// Note that the supply for the consecutive period will be taken at the time of code execution, and thus not necessarily at the time when the redistribution period threshold was crossed.
	function changePeriod() public returns (bool) {
		redistributionItem memory currentRedistribution;
		redistributionItem memory nextRedistribution;
		redistributionItem memory lastRedistribution;
		uint256 currentPeriod;
		int128 lastDemurrageAmount;
		int128 nextRedistributionDemurrage;
		uint256 demurrageCounts;
		uint256 nextPeriod;

		applyDemurrage();
		currentRedistribution = checkPeriod();
		if (isEmptyRedistribution(currentRedistribution)) {
			return false;
		}

		// calculate the decay from previous redistributino
		lastRedistribution = redistributions[lastPeriod];
		currentPeriod = toRedistributionPeriod(currentRedistribution);
		nextPeriod = currentPeriod + 1;
		lastDemurrageAmount = toRedistributionDemurrageModifier(lastRedistribution);
		demurrageCounts = (periodDuration * currentPeriod) / 60;
		// TODO refactor decayby to take int128 then DRY with it
		nextRedistributionDemurrage = ABDKMath64x64.exp(ABDKMath64x64.mul(decayLevel, ABDKMath64x64.fromUInt(demurrageCounts)));
		nextRedistribution = toRedistribution(0, nextRedistributionDemurrage, totalSupply(), nextPeriod);
		redistributions.push(nextRedistribution);

		applyDefaultRedistribution(nextRedistribution);
		emit Period(nextPeriod);
		return true;
	}

	// Calculate the time delta in whole minutes passed between given timestamp and current timestamp
	function getMinutesDelta(uint256 _lastTimestamp) public view returns (uint256) {
		return (block.timestamp - _lastTimestamp) / 60;
	}

	// Calculate and cache the demurrage value corresponding to the (period of the) time of the method call
	function applyDemurrage() public returns (uint256) {
		return applyDemurrageLimited(0);
	}

	// returns true if expired
	function applyDemurrageLimited(uint256 _rounds) public returns (uint256) {
		int128 v;
		uint256 periodCount;
		int128 periodPoint;
		int128 lastDemurrageAmount;

		if (expired) {
			return 0; 
		}

		periodCount = getMinutesDelta(demurrageTimestamp);
		if (periodCount == 0) {
			return 0;
		}
		lastDemurrageAmount = demurrageAmount;
	
		// safety limit for exponential calculation to ensure that we can always
		// execute this code no matter how much time passes.			
		if (_rounds > 0 && _rounds < periodCount) {
			periodCount = _rounds;
		}

		periodPoint = ABDKMath64x64.fromUInt(periodCount);
		v = ABDKMath64x64.mul(decayLevel, periodPoint);
		v = ABDKMath64x64.exp(v);
		demurrageAmount = ABDKMath64x64.mul(demurrageAmount, v);

		demurrageTimestamp = demurrageTimestamp + (periodCount * 60);
		emit Decayed(demurrageTimestamp, periodCount, lastDemurrageAmount, demurrageAmount);
		return periodCount;
	}

	// Return timestamp of start of period threshold
	function getPeriodTimeDelta(uint256 _periodCount) public view returns (uint256) {
		return periodStart + (_periodCount * periodDuration);
	}

	// Amount of demurrage cycles inbetween the current timestamp and the given target time
	function demurrageCycles(uint256 _target) public view returns (uint256) {
		return (block.timestamp - _target) / 60;
	}

	// Equality check for empty redistribution data
	function isEmptyRedistribution(redistributionItem memory _redistribution) public pure returns(bool) {
		if (_redistribution.period > 0) {
			return false;
		}
		if (_redistribution.value > 0) {
			return false;
		}
		if (_redistribution.demurrage > 0) {
			return false;
		}
		return true;
	}


	// Calculate a value reduced by demurrage by the given period
	function decayBy(uint256 _value, uint256 _period)  public view returns (uint256) {
		int128 valuePoint;
		int128 periodPoint;
		int128 v;
	
		valuePoint = ABDKMath64x64.fromUInt(_value);
		periodPoint = ABDKMath64x64.fromUInt(_period);

		v = ABDKMath64x64.mul(decayLevel, periodPoint);
		v = ABDKMath64x64.exp(v);
		v = ABDKMath64x64.mul(valuePoint, v);
		return ABDKMath64x64.toUInt(v);
	}


	// Inflates the given amount according to the current demurrage modifier
	function toBaseAmount(uint256 _value) public view returns (uint256) {
		int128 r;
		r = ABDKMath64x64.div(ABDKMath64x64.fromUInt(_value), demurrageAmount);
		return ABDKMath64x64.toUInt(r);
	}

	// Triggers tax and/or redistribution
	// Implements ERC20
	function approve(address _spender, uint256 _value) public returns (bool) {
		uint256 baseValue;
		uint8 ex;

		ex = applyExpiry();
		if (ex == 2) {
			return false;	
		} else if (ex > 0) {
			revert('EXPIRED');
		}
		if (allowance[msg.sender][_spender] > 0) {
			require(_value == 0, 'ZERO_FIRST');
		}
		
		changePeriod();

		// dex code will attempt uint256max approve, but contract cannot handle that size
		// truncate to biggest possible value
		if (_value <= VALUE_LIMIT) {
			baseValue = toBaseAmount(_value);
		} else {
			baseValue = VALUE_LIMIT;
		}

		allowance[msg.sender][_spender] = baseValue;
		emit Approval(msg.sender, _spender, _value);
		return true;
	}

	// Reduce allowance by amount
	function decreaseAllowance(address _spender, uint256 _value) public returns (bool) {
		uint256 baseValue;

		baseValue = toBaseAmount(_value);
		require(allowance[msg.sender][_spender] >= baseValue);
		
		changePeriod();

		allowance[msg.sender][_spender] -= baseValue;
		emit Approval(msg.sender, _spender, allowance[msg.sender][_spender]);
		return true;
	}

	// Increase allowance by amount
	function increaseAllowance(address _spender, uint256 _value) public returns (bool) {
		uint256 baseValue;

		changePeriod();

		baseValue = toBaseAmount(_value);

		allowance[msg.sender][_spender] += baseValue;
		emit Approval(msg.sender, _spender, allowance[msg.sender][_spender]);
		return true;
	}

	// Triggers tax and/or redistribution
	// Implements ERC20
	function transfer(address _to, uint256 _value) public returns (bool) {
		uint256 baseValue;
		bool result;
		uint8 ex;

		ex = applyExpiry();
		if (ex == 2) {
			return false;	
		} else if (ex > 0) {
			revert('EXPIRED');
		}
		changePeriod();

		baseValue = toBaseAmount(_value);
		result = transferBase(msg.sender, _to, baseValue);
		emit Transfer(msg.sender, _to, _value);
		return result;
	}

	// Triggers tax and/or redistribution
	// Implements ERC20
	function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
		uint256 baseValue;
		bool result;
		uint8 ex;

		ex = applyExpiry();
		if (ex == 2) {
			return false;	
		} else if (ex > 0) {
			revert('EXPIRED');
		}
		changePeriod();

		baseValue = toBaseAmount(_value);
		require(allowance[_from][msg.sender] >= baseValue);

		allowance[_from][msg.sender] -= baseValue;
		result = transferBase(_from, _to, baseValue);

		emit Transfer(_from, _to, _value);
		return result;
	}

	// ERC20 transfer backend for transfer, transferFrom
	function transferBase(address _from, address _to, uint256 _value) private returns (bool) {
		decreaseBaseBalance(_from, _value);
		increaseBaseBalance(_to, _value);

		return true;
	}

	// Implements EIP173
	function transferOwnership(address _newOwner) public returns (bool) {
		address oldOwner;

		require(msg.sender == owner);
		oldOwner = owner;
		owner = _newOwner;

		emit OwnershipTransferred(oldOwner, owner);
		return true;
	}

	// Explicitly and irretrievably burn tokens
	// Only token minters can burn tokens
	// Implements Burner
	function burn(uint256 _value) public returns(bool) {
		require(applyExpiry() == 0);
		require(minter[msg.sender] || msg.sender == owner, 'ERR_ACCESS');
		require(_value <= account[msg.sender]);
		uint256 _delta = toBaseAmount(_value);

		//applyDemurrage();
		decreaseBaseBalance(msg.sender, _delta);
		burned += _value;
		emit Burn(msg.sender, _value);
		return true;
	}

	// Implements Burner
	function burn(address _from, uint256 _value, bytes calldata _data) public {
		require(_from == msg.sender, 'ERR_ONLY_SELF_BURN');
		_data;
		burn(_value);
	}

	// Implements Burner
	function burn() public returns(bool) {
		return burn(account[msg.sender]);
	}

	// Implements ERC20
	function totalSupply() public view returns (uint256) {
		return supply - burned;
	}

	// Return total number of burned tokens
	// Implements Burner
	function totalBurned() public view returns (uint256) {
		return burned;
	}

	// Return total number of tokens ever minted
	// Implements Burner
	function totalMinted() public view returns (uint256) {
		return supply;
	}


	// Implements EIP165
	function supportsInterface(bytes4 _sum) public pure returns (bool) {
		if (_sum == 0xb61bc941) { // ERC20
			return true;
		}
		if (_sum == 0x5878bcf4) { // Minter
			return true;
		}
		if (_sum == 0xbc4babdd) { // Burner
			return true;
		}
		if (_sum == 0x0d7491f8) { // Seal
			return true;
		}
		if (_sum == 0xabe1f1f5) { // Writer
			return true;
		}
		if (_sum == 0x841a0e94) { // Expire
			return true;
		}
		if (_sum == 0x01ffc9a7) { // ERC165
			return true;
		}
		if (_sum == 0x9493f8b2) { // ERC173
			return true;
		}
		if (_sum == 0xd0017968) { // ERC5678Ext20
			return true;
		}
		return false;
	}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"int128","name":"_decayLevel","type":"int128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_oldCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newCap","type":"uint256"}],"name":"Cap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int128","name":"_foo","type":"int128"},{"indexed":true,"internalType":"uint256","name":"_bar","type":"uint256"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"int128","name":"_oldAmount","type":"int128"},{"indexed":false,"internalType":"int128","name":"_newAmount","type":"int128"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"Expired","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_oldTimestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newTimestamp","type":"uint256"}],"name":"ExpiryChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","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":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"_final","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_sealState","type":"uint256"}],"name":"SealStateChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyExpiry","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decayLevel","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"deleteWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"expires","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"int128","name":"_demurrageAmount","type":"int128"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"isEmptyRedistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"isSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"isWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","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":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"seal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_expirePeriod","type":"uint256"}],"name":"setExpirePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cap","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sinkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"sweep","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"int128","name":"_demurrageModifier","type":"int128"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

0x6101006040523480156200001257600080fd5b506040516200664338038062006643833981810160405281019062000038919062000859565b6801000000000000000083600f0b126200005157600080fd5b6200005b6200056e565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508660069081620000ad919062000b7a565b508560079081620000bf919062000b7a565b508460ff16608081815250504260038190555060035460a08181525050603c83620000eb919062000c90565b60c081815250506200010d60016200029f640100000000026401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506200016284620002c6640100000000026401000000009004565b600f0b60e081600f0b815250506200019e6000600260009054906101000a9004600f0b600060016200031a640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505081600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000cdb565b6000677fffffffffffffff821115620002b757600080fd5b6040829060020a029050919050565b60008082600f0b13620002d857600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af62000305846200039e640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b620003246200056e565b6200032e6200056e565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b60008082600f0b13620003b057600080fd5b60008083600f0b9050680100000000000000008112620003ec576040819060008212600003808260020a82851804189250505090506040820191505b64010000000081126200041b576020819060008212600003808260020a82851804189250505090506020820191505b62010000811262000448576010819060008212600003808260020a82851804189250505090506010820191505b610100811262000474576008819060008212600003808260020a82851804189250505090506008820191505b601081126200049f576004819060008212600003808260020a82851804189250505090506004820191505b60048112620004ca576002819060008212600003808260020a82851804189250505090506002820191505b60028112620004da576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b600081131562000561578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a828518041892505050905062000507565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200061382620005c8565b810181811067ffffffffffffffff82111715620006355762000634620005d9565b5b80604052505050565b60006200064a620005aa565b905062000658828262000608565b919050565b600067ffffffffffffffff8211156200067b576200067a620005d9565b5b6200068682620005c8565b9050602081019050919050565b60005b83811015620006b357808201518184015260208101905062000696565b60008484015250505050565b6000620006d6620006d0846200065d565b6200063e565b905082815260208101848484011115620006f557620006f4620005c3565b5b6200070284828562000693565b509392505050565b600082601f830112620007225762000721620005be565b5b815162000734848260208601620006bf565b91505092915050565b600060ff82169050919050565b62000755816200073d565b81146200076157600080fd5b50565b60008151905062000775816200074a565b92915050565b600081600f0b9050919050565b62000793816200077b565b81146200079f57600080fd5b50565b600081519050620007b38162000788565b92915050565b6000819050919050565b620007ce81620007b9565b8114620007da57600080fd5b50565b600081519050620007ee81620007c3565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200082182620007f4565b9050919050565b620008338162000814565b81146200083f57600080fd5b50565b600081519050620008538162000828565b92915050565b60008060008060008060c08789031215620008795762000878620005b4565b5b600087015167ffffffffffffffff8111156200089a5762000899620005b9565b5b620008a889828a016200070a565b965050602087015167ffffffffffffffff811115620008cc57620008cb620005b9565b5b620008da89828a016200070a565b9550506040620008ed89828a0162000764565b94505060606200090089828a01620007a2565b93505060806200091389828a01620007dd565b92505060a06200092689828a0162000842565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200098657607f821691505b6020821081036200099c576200099b6200093e565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000a097fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620009c7565b62000a158683620009c7565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000a5862000a5262000a4c84620007b9565b62000a2d565b620007b9565b9050919050565b6000819050919050565b62000a748362000a37565b62000a8c62000a838262000a5f565b848454620009d7565b825550505050565b600090565b62000aa362000a94565b62000ab081848462000a69565b505050565b5b8181101562000ad85762000acc60008262000a99565b60018101905062000ab6565b5050565b601f82111562000b275762000af181620009a2565b62000afc84620009b7565b8101602085101562000b0c578190505b62000b2462000b1b85620009b7565b83018262000ab5565b50505b505050565b60008160020a8304905092915050565b600062000b4f6000198460080262000b2c565b1980831691505092915050565b600062000b6a838362000b3c565b9150826002028217905092915050565b62000b858262000933565b67ffffffffffffffff81111562000ba15762000ba0620005d9565b5b62000bad82546200096d565b62000bba82828562000adc565b600060209050601f83116001811462000bf2576000841562000bdd578287015190505b62000be9858262000b5c565b86555062000c59565b601f19841662000c0286620009a2565b60005b8281101562000c2c5784890151825560018201915060208501945060208101905062000c05565b8683101562000c4c578489015162000c48601f89168262000b3c565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000c9d82620007b9565b915062000caa83620007b9565b925082820262000cba81620007b9565b9150828204841483151762000cd45762000cd362000c61565b5b5092915050565b60805160a05160c05160e0516158e862000d5b60003960008181611909015281816127f4015281816129e10152612ddd015260008181612056015281816127b701528181612d3501528181612f7a01526131c701526000818161208201528181612fa6015281816131e8015261322d0152600061196701526158e86000f3fe608060405234801561001057600080fd5b50600436106103e2576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e1161021c578063a457c2d711610137578063d89135cd116100ca578063e69571af11610099578063e69571af14610ce3578063e809529514610d13578063eda4e6d614610d31578063f2fde38b14610d4f576103e2565b8063d89135cd14610c35578063da2824a814610c53578063dd62ed3e14610c83578063e54063a614610cb3576103e2565b8063c0ab707711610106578063c0ab707714610bad578063d340ef8a14610bdd578063d5abeb0114610bfb578063d7a52fa914610c19576103e2565b8063a457c2d714610b11578063a9059cbb14610b41578063b1cb0db314610b71578063b470aade14610b8f576103e2565b80638832e6e3116101af57806394d008ef1161017e57806394d008ef14610a9b57806395d89b4114610ab75780639f24880814610ad5578063a2309ff814610af3576103e2565b80638832e6e314610a275780638da5cb5b14610a435780638f0b2d5d14610a615780638f1df6bc14610a7d576103e2565b80637445e33a116101eb5780637445e33a1461098b57806374bedb95146109bb57806384dde4af146109d957806386fe212d146109f7576103e2565b80636a2d094e146108f15780636f8b44b01461092157806370a082311461093d578063731f237c1461096d576103e2565b8063313334871161030c57806344df8e701161029f57806358b2833b1161026e57806358b2833b146108555780635ae06f7e146108735780635f408c04146108a35780636787a9be146108c1576103e2565b806344df8e70146107a757806347a50517146107c55780634abfbba2146107f557806351b4541c14610825576103e2565b806340452d91116102db57806340452d91146106f957806342966c681461072b578063449a52f81461075b57806344d171871461078b576103e2565b8063313334871461065d578063313ce5671461068d57806331a5995d146106ab57806339509351146106c9576103e2565b806318cbbcfc1161038457806323b872dd1161035357806323b872dd1461059d5780632a7aec09146105cd5780632b29ba23146105fd5780632c1758c11461062d576103e2565b806318cbbcfc146105015780631989c6a81461051f578063213d1e1e1461053d57806323a859441461056d576103e2565b8063095ea7b3116103c0578063095ea7b31461046557806309f28f3c1461049557806311c56615146104b357806318160ddd146104e3576103e2565b806301681a62146103e757806301ffc9a71461041757806306fdde0314610447575b600080fd5b61040160048036038101906103fc9190614b1d565b610d7f565b60405161040e9190614b63565b60405180910390f35b610431600480360381019061042c9190614bd6565b610ecd565b60405161043e9190614c1e565b60405180910390f35b61044f6111bb565b60405161045c9190614cc9565b60405180910390f35b61047f600480360381019061047a9190614d17565b611249565b60405161048c9190614c1e565b60405180910390f35b61049d6114a5565b6040516104aa9190614d73565b60405180910390f35b6104cd60048036038101906104c89190614dba565b6114b8565b6040516104da9190614b63565b60405180910390f35b6104eb611508565b6040516104f89190614b63565b60405180910390f35b61050961151f565b6040516105169190614b63565b60405180910390f35b610527611524565b6040516105349190614b63565b60405180910390f35b61055760048036038101906105529190614f9b565b611530565b6040516105649190614b63565b60405180910390f35b61058760048036038101906105829190614f9b565b611549565b6040516105949190614c1e565b60405180910390f35b6105b760048036038101906105b29190614fc8565b6115b1565b6040516105c49190614c1e565b60405180910390f35b6105e760048036038101906105e29190614f9b565b6117cf565b6040516105f49190614d73565b60405180910390f35b61061760048036038101906106129190614b1d565b611807565b6040516106249190614c1e565b60405180910390f35b6106476004803603810190610642919061501b565b6118b5565b6040516106549190614c1e565b60405180910390f35b61067760048036038101906106729190615048565b6118e8565b6040516106849190614b63565b60405180910390f35b610695611965565b6040516106a29190614b63565b60405180910390f35b6106b3611989565b6040516106c09190614b63565b60405180910390f35b6106e360048036038101906106de9190614d17565b61198f565b6040516106f09190614c1e565b60405180910390f35b610713600480360381019061070e919061501b565b611b25565b604051610722939291906150b5565b60405180910390f35b6107456004803603810190610740919061501b565b611b94565b6040516107529190614c1e565b60405180910390f35b61077560048036038101906107709190614d17565b611d65565b6040516107829190614c1e565b60405180910390f35b6107a560048036038101906107a09190615151565b611f3c565b005b6107af611fba565b6040516107bc9190614c1e565b60405180910390f35b6107df60048036038101906107da9190614b1d565b612009565b6040516107ec9190614b63565b60405180910390f35b61080f600480360381019061080a919061501b565b612052565b60405161081c9190614b63565b60405180910390f35b61083f600480360381019061083a919061501b565b6120b2565b60405161084c9190614b63565b60405180910390f35b61085d6120d3565b60405161086a9190614b63565b60405180910390f35b61088d60048036038101906108889190614b1d565b6120d9565b60405161089a9190614c1e565b60405180910390f35b6108ab6121e3565b6040516108b891906151e1565b60405180910390f35b6108db60048036038101906108d6919061501b565b6122b0565b6040516108e89190614b63565b60405180910390f35b61090b6004803603810190610906919061501b565b6122f1565b6040516109189190614b63565b60405180910390f35b61093b6004803603810190610936919061501b565b612312565b005b61095760048036038101906109529190614b1d565b6123da565b6040516109649190614b63565b60405180910390f35b610975612441565b6040516109829190614b63565b60405180910390f35b6109a560048036038101906109a09190614f9b565b612452565b6040516109b29190614b63565b60405180910390f35b6109c3612480565b6040516109d09190614b63565b60405180910390f35b6109e1612486565b6040516109ee919061520b565b60405180910390f35b610a116004803603810190610a0c919061501b565b6124ac565b604051610a1e9190614b63565b60405180910390f35b610a416004803603810190610a3c9190615151565b612593565b005b610a4b6125a4565b604051610a58919061520b565b60405180910390f35b610a7b6004803603810190610a769190614b1d565b6125ca565b005b610a8561267f565b604051610a929190614c1e565b60405180910390f35b610ab56004803603810190610ab09190615151565b612940565b005b610abf612951565b604051610acc9190614cc9565b60405180910390f35b610add6129df565b604051610aea9190614d73565b60405180910390f35b610afb612a03565b604051610b089190614b63565b60405180910390f35b610b2b6004803603810190610b269190614d17565b612a0d565b604051610b389190614c1e565b60405180910390f35b610b5b6004803603810190610b569190614d17565b612c2c565b604051610b689190614c1e565b60405180910390f35b610b79612d2d565b604051610b869190614b63565b60405180910390f35b610b97612d33565b604051610ba49190614b63565b60405180910390f35b610bc76004803603810190610bc2919061501b565b612d57565b604051610bd49190614b63565b60405180910390f35b610be5612ede565b604051610bf29190614b63565b60405180910390f35b610c03612ee4565b604051610c109190614b63565b60405180910390f35b610c336004803603810190610c2e919061501b565b612eea565b005b610c3d61302a565b604051610c4a9190614b63565b60405180910390f35b610c6d6004803603810190610c689190614b1d565b613034565b604051610c7a9190614c1e565b60405180910390f35b610c9d6004803603810190610c989190615226565b613108565b604051610caa9190614b63565b60405180910390f35b610ccd6004803603810190610cc89190614f9b565b61312d565b604051610cda9190614b63565b60405180910390f35b610cfd6004803603810190610cf89190615266565b613141565b604051610d0a919061533c565b60405180910390f35b610d1b6131c1565b604051610d289190615382565b60405180910390f35b610d3961322b565b604051610d469190614b63565b60405180910390f35b610d696004803603810190610d649190614b1d565b61324f565b604051610d769190614c1e565b60405180910390f35b600080600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610e5891906153cc565b925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610ebc9190614b63565b60405180910390a380915050919050565b600063b61bc9417c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610f2157600190506111b6565b635878bcf47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610f7357600190506111b6565b63bc4babdd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610fc557600190506111b6565b630d7491f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361101757600190506111b6565b63abe1f1f57c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361106957600190506111b6565b63841a0e947c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036110bb57600190506111b6565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361110d57600190506111b6565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361115f57600190506111b6565b63d00179687c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036111b157600190506111b6565b600090505b919050565b600680546111c89061542f565b80601f01602080910402602001604051908101604052809291908181526020018280546111f49061542f565b80156112415780601f1061121657610100808354040283529160200191611241565b820191906000526020600020905b81548152906001019060200180831161122457829003601f168201915b505050505081565b60008060006112566121e3565b905060028160ff160361126e5760009250505061149f565b60008160ff1611156112b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ac906154ac565b60405180910390fd5b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561137e576000841461137d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137490615518565b60405180910390fd5b5b61138661267f565b5067800000000000000084116113a65761139f846122b0565b91506113b2565b67800000000000000091505b81600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925866040516114909190614b63565b60405180910390a36001925050505b92915050565b600260009054906101000a9004600f0b81565b6000806114df6114c785613398565b6114da6114d46001613398565b866133be565b613425565b90506114ea816134a4565b67ffffffffffffffff16846114ff9190615538565b91505092915050565b6000600b5460085461151a9190615538565b905090565b600f81565b60008080549050905090565b6000816020015168ffffffffffffffffff169050919050565b600080826000015163ffffffff16111561156657600090506115ac565b6000826020015168ffffffffffffffffff16111561158757600090506115ac565b6000826040015167ffffffffffffffff1611156115a757600090506115ac565b600190505b919050565b6000806000806115bf6121e3565b905060028160ff16036115d857600093505050506117c8565b60008160ff16111561161f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611616906154ac565b60405180910390fd5b61162761267f565b50611631856122b0565b925082600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156116bc57600080fd5b82600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117489190615538565b9250508190555061175a8787856134d9565b91508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516117b99190614b63565b60405180910390a38193505050505b9392505050565b60008067ffffffffffffffff836040015160070b169050600081600f0b036117fe576117fb6001613398565b90505b80915050919050565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806118ae5750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050919050565b6000600f82106118c457600080fd5b600082036118d957600f6012541490506118e3565b8160125483161490505b919050565b6000806000806118f786613398565b925061190285613398565b915061192e7f000000000000000000000000000000000000000000000000000000000000000083613425565b9050611939816134fc565b90506119458382613425565b9050611950816134a4565b67ffffffffffffffff16935050505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60125481565b60008061199a61267f565b506119a4836122b0565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a3291906153cc565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054604051611b129190614b63565b60405180910390a3600191505092915050565b60008181548110611b3557600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900467ffffffffffffffff16905083565b600080611b9f6121e3565b60ff1614611bac57600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611c515750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611c90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c87906155b8565b60405180910390fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115611cdc57600080fd5b6000611ce7836122b0565b9050611cf33382613589565b5082600b6000828254611d0691906153cc565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca584604051611d539190614b63565b60405180910390a26001915050919050565b6000806000611d726121e3565b60ff1614611d7f57600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611e245750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611e63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5a906155b8565b60405180910390fd5b611e6b61267f565b5060006011541115611e945760115483600854611e8891906153cc565b1115611e9357600080fd5b5b8260086000828254611ea691906153cc565b92505081905550611eb6836122b0565b9050611ec2848261368d565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051611f209190614b63565b60405180910390a3611f3061374e565b50600191505092915050565b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614611faa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa190615624565b60405180910390fd5b611fb383611b94565b5050505050565b6000612004600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b94565b905090565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826120809190615644565b7f00000000000000000000000000000000000000000000000000000000000000006120ab91906153cc565b9050919050565b6000603c82426120c29190615538565b6120cc91906156b5565b9050919050565b60035481565b60006120e8600160ff166118b5565b156120f257600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061217957503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b61218257600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000601060009054906101000a900460ff161561220357600190506122ad565b6000600f540361221657600090506122ad565b600f5442106122a857612243603c60035461223191906156b5565b600f5461223e9190615538565b612d57565b506001601060006101000a81548160ff0219169083151502179055507ff80dbaea4785589e52984ca36a31de106adc77759539a5c7d92883bf49692fe94260405161228e9190614b63565b60405180910390a161229e61267f565b50600290506122ad565b600090505b90565b6000806122d46122bf84613398565b600260009054906101000a9004600f0b613912565b90506122df816134a4565b67ffffffffffffffff16915050919050565b6000603c82426123019190615538565b61230b91906156b5565b9050919050565b61231f600860ff166118b5565b1561232957600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461238357600080fd5b61238b611508565b811161239657600080fd5b6011547f9722adea12ab7ef86fc45b88f0e0b567639e8dddaae60261e08c03d747fbbfe6826040516123c89190614b63565b60405180910390a28060118190555050565b6000806000806123f16123ec86612009565b613398565b92506123fe6003546120b2565b905061241983600260009054906101000a9004600f0b613425565b9150612437612427836134a4565b67ffffffffffffffff16826118e8565b9350505050919050565b600061244d6000612d57565b905090565b600080600061246084611530565b915061246b846117cf565b905061247782826114b8565b92505050919050565b600a5481565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000601082106124f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e890615732565b60405180910390fd5b6000601254831614612538576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252f9061579e565b60405180910390fd5b81601260008282541792505081905550600f6012541415157f6b7e2e653f93b645d4ed7292d6429f96637084363e477c8aaea1a43ed13c284e6012546040516125819190614b63565b60405180910390a26012549050919050565b61259d8484611d65565b5050505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6125d7600260ff166118b5565b156125e157600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461263b57600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000612689614a6f565b612691614a6f565b612699614a6f565b60008060008060006126a9612441565b506126b261399e565b97506126bd88611549565b156126d35760009850505050505050505061293d565b6000600954815481106126e9576126e86157be565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505095506127968861312d565b94506001856127a591906153cc565b90506127b0866117cf565b9350603c857f00000000000000000000000000000000000000000000000000000000000000006127e09190615644565b6127ea91906156b5565b91506128266128217f000000000000000000000000000000000000000000000000000000000000000061281c85613398565b613425565b6134fc565b925061283c600084612836611508565b84613141565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050506128f887613b34565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d675816040516129289190614b63565b60405180910390a16001985050505050505050505b90565b61294a8484611d65565b5050505050565b6007805461295e9061542f565b80601f016020809104026020016040519081016040528092919081815260200182805461298a9061542f565b80156129d75780601f106129ac576101008083540402835291602001916129d7565b820191906000526020600020905b8154815290600101906020018083116129ba57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600854905090565b600080612a19836122b0565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015612aa457600080fd5b612aac61267f565b5080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b399190615538565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054604051612c199190614b63565b60405180910390a3600191505092915050565b600080600080612c3a6121e3565b905060028160ff1603612c535760009350505050612d27565b60008160ff161115612c9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c91906154ac565b60405180910390fd5b612ca261267f565b50612cac856122b0565b9250612cb93387856134d9565b91508573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef87604051612d189190614b63565b60405180910390a38193505050505b92915050565b600f5481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000806000601060009054906101000a900460ff1615612d81576000945050505050612ed9565b612d8c6003546120b2565b925060008303612da3576000945050505050612ed9565b600260009054906101000a9004600f0b9050600086118015612dc457508286105b15612dcd578592505b612dd683613398565b9150612e027f000000000000000000000000000000000000000000000000000000000000000083613425565b9350612e0d846134fc565b9350612e28600260009054906101000a9004600f0b85613425565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c83612e709190615644565b600354612e7d91906153cc565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b604051612ec99190614d73565b60405180910390a4829450505050505b919050565b60095481565b60115481565b600080612efa600460ff166118b5565b15612f0457600080fd5b601060009054906101000a900460ff1615612f1e57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612f7857600080fd5b7f000000000000000000000000000000000000000000000000000000000000000083612fa49190615644565b7f0000000000000000000000000000000000000000000000000000000000000000612fcf91906153cc565b9150600f548211612fdf57600080fd5b600f54905081600f81905550807ff5bd6cb27a0006b5ea8618058a0d84719695cb6d984f4840bc1a54ca12ae4b7c600f5460405161301d9190614b63565b60405180910390a2505050565b6000600b54905090565b6000613043600160ff166118b5565b1561304d57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146130a757600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600d602052816000526040600020602052806000526040600020600091509150505481565b6000816000015163ffffffff169050919050565b613149614a6f565b613151614a6f565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000426132129190615538565b61321c91906156b5565b61322691906153cc565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146132ac57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36001915050919050565b6000677fffffffffffffff8211156133af57600080fd5b6040829060020a029050919050565b60008082600f0b84600f0b0390507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561341257506f7fffffffffffffffffffffffffffffff600f0b8113155b61341b57600080fd5b8091505092915050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561349157506f7fffffffffffffffffffffffffffffff600f0b8113155b61349a57600080fd5b8091505092915050565b60008082600f0b12156134b657600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b60006134e58483613589565b506134f0838361368d565b50600190509392505050565b60006840000000000000000082600f0b1261351657600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b121561354a5760009050613584565b6135816080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a828518041892505050613c53565b90505b919050565b6000806000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600084036135e357600092505050613687565b6135ec85612009565b915083821015613631576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161362890615839565b60405180910390fd5b838261363d9190615538565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001925050505b92915050565b6000806000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600084036136e757600092505050613748565b6136f085612009565b915083826136fe91906153cc565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001925050505b92915050565b6000613758614a6f565b6000613762611508565b9050600060016000805490506137789190615538565b81548110613789576137886157be565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff168152505081600060016000805490506138649190615538565b81548110613875576138746157be565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060019250505090565b60008082600f0b0361392357600080fd5b600082600f0b604085600f0b9060020a028161394257613941615686565b5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561398b57506f7fffffffffffffffffffffffffffffff600f0b8113155b61399457600080fd5b8091505092915050565b6139a6614a6f565b6139ae614a6f565b6139b6614a6f565b600080600954815481106139cd576139cc6157be565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015613ad8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613afc9190615885565b6fffffffffffffffffffffffffffffffff169050613b198361312d565b8111613b2a57819350505050613b31565b8293505050505b90565b6000806000613b4284612452565b613b4a611508565b613b549190615538565b9150600a54613b62836122b0565b613b6c9190615538565b9050613b9a600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168261368d565b50836000015163ffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d384604051613c0e9190614b63565b60405180910390a3600160096000828254613c2991906153cc565b9250508190555080600a6000828254613c4291906153cc565b925050819055508192505050919050565b60006840000000000000000082600f0b12613c6d57600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b1215613ca15760009050614a6a565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b1315613cef57608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b1315613d285760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b1315613d615760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b1315613d9a57608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b1315613dd35760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b1315613e0c576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b1315613e4557608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b1315613e7e576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b1315613eb657608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b1315613eee5760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b1315613f26576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b1315613f5e5760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b1315613f96576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b1315613fce57608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b13156140065760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b131561403e57608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b13156140755760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b13156140ac576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b13156140e357608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b131561411a576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b131561415157608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b13156141885760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b13156141bf576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b13156141f65760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b131561422c576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b131561426257608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b13156142985760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b13156142ce57608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b13156143045760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b131561433a576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b131561437057608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b13156143a6576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b13156143db57608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b13156144105760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b1315614445576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b131561447a5760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b13156144af576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b13156144e457608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b13156145195760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b131561454e57608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b13156145825760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b13156145b6576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b13156145ea57608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b131561461e576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b131561465257608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b13156146865760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b13156146ba576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b13156146ee5760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b1315614721576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b131561475457608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b13156147875760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b13156147ba57608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b13156147ed5760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b1315614820576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b131561485357608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b1315614886576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b13156148b857608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b13156148ea5760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b131561491c576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b131561494e5760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b1315614980576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b13156149b257608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b13156149e45760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b1315614a1657608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b811115614a6557600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614aea82614abf565b9050919050565b614afa81614adf565b8114614b0557600080fd5b50565b600081359050614b1781614af1565b92915050565b600060208284031215614b3357614b32614ab5565b5b6000614b4184828501614b08565b91505092915050565b6000819050919050565b614b5d81614b4a565b82525050565b6000602082019050614b786000830184614b54565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b614bb381614b7e565b8114614bbe57600080fd5b50565b600081359050614bd081614baa565b92915050565b600060208284031215614bec57614beb614ab5565b5b6000614bfa84828501614bc1565b91505092915050565b60008115159050919050565b614c1881614c03565b82525050565b6000602082019050614c336000830184614c0f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614c73578082015181840152602081019050614c58565b60008484015250505050565b6000601f19601f8301169050919050565b6000614c9b82614c39565b614ca58185614c44565b9350614cb5818560208601614c55565b614cbe81614c7f565b840191505092915050565b60006020820190508181036000830152614ce38184614c90565b905092915050565b614cf481614b4a565b8114614cff57600080fd5b50565b600081359050614d1181614ceb565b92915050565b60008060408385031215614d2e57614d2d614ab5565b5b6000614d3c85828601614b08565b9250506020614d4d85828601614d02565b9150509250929050565b600081600f0b9050919050565b614d6d81614d57565b82525050565b6000602082019050614d886000830184614d64565b92915050565b614d9781614d57565b8114614da257600080fd5b50565b600081359050614db481614d8e565b92915050565b60008060408385031215614dd157614dd0614ab5565b5b6000614ddf85828601614d02565b9250506020614df085828601614da5565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614e3782614c7f565b810181811067ffffffffffffffff82111715614e5657614e55614dff565b5b80604052505050565b6000614e69614aab565b9050614e758282614e2e565b919050565b600063ffffffff82169050919050565b614e9381614e7a565b8114614e9e57600080fd5b50565b600081359050614eb081614e8a565b92915050565b600068ffffffffffffffffff82169050919050565b614ed481614eb6565b8114614edf57600080fd5b50565b600081359050614ef181614ecb565b92915050565b600067ffffffffffffffff82169050919050565b614f1481614ef7565b8114614f1f57600080fd5b50565b600081359050614f3181614f0b565b92915050565b600060608284031215614f4d57614f4c614dfa565b5b614f576060614e5f565b90506000614f6784828501614ea1565b6000830152506020614f7b84828501614ee2565b6020830152506040614f8f84828501614f22565b60408301525092915050565b600060608284031215614fb157614fb0614ab5565b5b6000614fbf84828501614f37565b91505092915050565b600080600060608486031215614fe157614fe0614ab5565b5b6000614fef86828701614b08565b935050602061500086828701614b08565b925050604061501186828701614d02565b9150509250925092565b60006020828403121561503157615030614ab5565b5b600061503f84828501614d02565b91505092915050565b6000806040838503121561505f5761505e614ab5565b5b600061506d85828601614d02565b925050602061507e85828601614d02565b9150509250929050565b61509181614e7a565b82525050565b6150a081614eb6565b82525050565b6150af81614ef7565b82525050565b60006060820190506150ca6000830186615088565b6150d76020830185615097565b6150e460408301846150a6565b949350505050565b600080fd5b600080fd5b600080fd5b60008083601f840112615111576151106150ec565b5b8235905067ffffffffffffffff81111561512e5761512d6150f1565b5b60208301915083600182028301111561514a576151496150f6565b5b9250929050565b6000806000806060858703121561516b5761516a614ab5565b5b600061517987828801614b08565b945050602061518a87828801614d02565b935050604085013567ffffffffffffffff8111156151ab576151aa614aba565b5b6151b7878288016150fb565b925092505092959194509250565b600060ff82169050919050565b6151db816151c5565b82525050565b60006020820190506151f660008301846151d2565b92915050565b61520581614adf565b82525050565b600060208201905061522060008301846151fc565b92915050565b6000806040838503121561523d5761523c614ab5565b5b600061524b85828601614b08565b925050602061525c85828601614b08565b9150509250929050565b600080600080608085870312156152805761527f614ab5565b5b600061528e87828801614d02565b945050602061529f87828801614da5565b93505060406152b087828801614d02565b92505060606152c187828801614d02565b91505092959194509250565b6152d681614e7a565b82525050565b6152e581614eb6565b82525050565b6152f481614ef7565b82525050565b60608201600082015161531060008501826152cd565b50602082015161532360208501826152dc565b50604082015161533660408501826152eb565b50505050565b600060608201905061535160008301846152fa565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b61537c81615357565b82525050565b60006020820190506153976000830184615373565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006153d782614b4a565b91506153e283614b4a565b92508282019050808211156153fa576153f961539d565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061544757607f821691505b60208210810361545a57615459615400565b5b50919050565b7f4558504952454400000000000000000000000000000000000000000000000000600082015250565b6000615496600783614c44565b91506154a182615460565b602082019050919050565b600060208201905081810360008301526154c581615489565b9050919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b6000615502600a83614c44565b915061550d826154cc565b602082019050919050565b60006020820190508181036000830152615531816154f5565b9050919050565b600061554382614b4a565b915061554e83614b4a565b92508282039050818111156155665761556561539d565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b60006155a2600a83614c44565b91506155ad8261556c565b602082019050919050565b600060208201905081810360008301526155d181615595565b9050919050565b7f4552525f4f4e4c595f53454c465f4255524e0000000000000000000000000000600082015250565b600061560e601283614c44565b9150615619826155d8565b602082019050919050565b6000602082019050818103600083015261563d81615601565b9050919050565b600061564f82614b4a565b915061565a83614b4a565b925082820261566881614b4a565b9150828204841483151761567f5761567e61539d565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006156c082614b4a565b91506156cb83614b4a565b9250826156db576156da615686565b5b828204905092915050565b7f4552525f494e56414c49445f5354415445000000000000000000000000000000600082015250565b600061571c601183614c44565b9150615727826156e6565b602082019050919050565b6000602082019050818103600083015261574b8161570f565b9050919050565b7f4552525f414c52454144595f4c4f434b45440000000000000000000000000000600082015250565b6000615788601283614c44565b915061579382615752565b602082019050919050565b600060208201905081810360008301526157b78161577b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6000615823600d83614c44565b915061582e826157ed565b602082019050919050565b6000602082019050818103600083015261585281615816565b9050919050565b61586281615357565b811461586d57600080fd5b50565b60008151905061587f81615859565b92915050565b60006020828403121561589b5761589a614ab5565b5b60006158a984828501615870565b9150509291505056fea2646970667358221220f385dd87c8c69c6c2a499f6ef1b86f025999a2d3537d134331e8146c1db7c54a64736f6c6343000813003300000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000fffff8276fb8cfff000000000000000000000000000000000000000000000000000000000000a8c0000000000000000000000000a0ff1b394e7744b75fcf4cdf1715fde49cbe601800000000000000000000000000000000000000000000000000000000000000165550454e444f2053454c462048454c502047524f55500000000000000000000000000000000000000000000000000000000000000000000000000000000000045553484700000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106103e2576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e1161021c578063a457c2d711610137578063d89135cd116100ca578063e69571af11610099578063e69571af14610ce3578063e809529514610d13578063eda4e6d614610d31578063f2fde38b14610d4f576103e2565b8063d89135cd14610c35578063da2824a814610c53578063dd62ed3e14610c83578063e54063a614610cb3576103e2565b8063c0ab707711610106578063c0ab707714610bad578063d340ef8a14610bdd578063d5abeb0114610bfb578063d7a52fa914610c19576103e2565b8063a457c2d714610b11578063a9059cbb14610b41578063b1cb0db314610b71578063b470aade14610b8f576103e2565b80638832e6e3116101af57806394d008ef1161017e57806394d008ef14610a9b57806395d89b4114610ab75780639f24880814610ad5578063a2309ff814610af3576103e2565b80638832e6e314610a275780638da5cb5b14610a435780638f0b2d5d14610a615780638f1df6bc14610a7d576103e2565b80637445e33a116101eb5780637445e33a1461098b57806374bedb95146109bb57806384dde4af146109d957806386fe212d146109f7576103e2565b80636a2d094e146108f15780636f8b44b01461092157806370a082311461093d578063731f237c1461096d576103e2565b8063313334871161030c57806344df8e701161029f57806358b2833b1161026e57806358b2833b146108555780635ae06f7e146108735780635f408c04146108a35780636787a9be146108c1576103e2565b806344df8e70146107a757806347a50517146107c55780634abfbba2146107f557806351b4541c14610825576103e2565b806340452d91116102db57806340452d91146106f957806342966c681461072b578063449a52f81461075b57806344d171871461078b576103e2565b8063313334871461065d578063313ce5671461068d57806331a5995d146106ab57806339509351146106c9576103e2565b806318cbbcfc1161038457806323b872dd1161035357806323b872dd1461059d5780632a7aec09146105cd5780632b29ba23146105fd5780632c1758c11461062d576103e2565b806318cbbcfc146105015780631989c6a81461051f578063213d1e1e1461053d57806323a859441461056d576103e2565b8063095ea7b3116103c0578063095ea7b31461046557806309f28f3c1461049557806311c56615146104b357806318160ddd146104e3576103e2565b806301681a62146103e757806301ffc9a71461041757806306fdde0314610447575b600080fd5b61040160048036038101906103fc9190614b1d565b610d7f565b60405161040e9190614b63565b60405180910390f35b610431600480360381019061042c9190614bd6565b610ecd565b60405161043e9190614c1e565b60405180910390f35b61044f6111bb565b60405161045c9190614cc9565b60405180910390f35b61047f600480360381019061047a9190614d17565b611249565b60405161048c9190614c1e565b60405180910390f35b61049d6114a5565b6040516104aa9190614d73565b60405180910390f35b6104cd60048036038101906104c89190614dba565b6114b8565b6040516104da9190614b63565b60405180910390f35b6104eb611508565b6040516104f89190614b63565b60405180910390f35b61050961151f565b6040516105169190614b63565b60405180910390f35b610527611524565b6040516105349190614b63565b60405180910390f35b61055760048036038101906105529190614f9b565b611530565b6040516105649190614b63565b60405180910390f35b61058760048036038101906105829190614f9b565b611549565b6040516105949190614c1e565b60405180910390f35b6105b760048036038101906105b29190614fc8565b6115b1565b6040516105c49190614c1e565b60405180910390f35b6105e760048036038101906105e29190614f9b565b6117cf565b6040516105f49190614d73565b60405180910390f35b61061760048036038101906106129190614b1d565b611807565b6040516106249190614c1e565b60405180910390f35b6106476004803603810190610642919061501b565b6118b5565b6040516106549190614c1e565b60405180910390f35b61067760048036038101906106729190615048565b6118e8565b6040516106849190614b63565b60405180910390f35b610695611965565b6040516106a29190614b63565b60405180910390f35b6106b3611989565b6040516106c09190614b63565b60405180910390f35b6106e360048036038101906106de9190614d17565b61198f565b6040516106f09190614c1e565b60405180910390f35b610713600480360381019061070e919061501b565b611b25565b604051610722939291906150b5565b60405180910390f35b6107456004803603810190610740919061501b565b611b94565b6040516107529190614c1e565b60405180910390f35b61077560048036038101906107709190614d17565b611d65565b6040516107829190614c1e565b60405180910390f35b6107a560048036038101906107a09190615151565b611f3c565b005b6107af611fba565b6040516107bc9190614c1e565b60405180910390f35b6107df60048036038101906107da9190614b1d565b612009565b6040516107ec9190614b63565b60405180910390f35b61080f600480360381019061080a919061501b565b612052565b60405161081c9190614b63565b60405180910390f35b61083f600480360381019061083a919061501b565b6120b2565b60405161084c9190614b63565b60405180910390f35b61085d6120d3565b60405161086a9190614b63565b60405180910390f35b61088d60048036038101906108889190614b1d565b6120d9565b60405161089a9190614c1e565b60405180910390f35b6108ab6121e3565b6040516108b891906151e1565b60405180910390f35b6108db60048036038101906108d6919061501b565b6122b0565b6040516108e89190614b63565b60405180910390f35b61090b6004803603810190610906919061501b565b6122f1565b6040516109189190614b63565b60405180910390f35b61093b6004803603810190610936919061501b565b612312565b005b61095760048036038101906109529190614b1d565b6123da565b6040516109649190614b63565b60405180910390f35b610975612441565b6040516109829190614b63565b60405180910390f35b6109a560048036038101906109a09190614f9b565b612452565b6040516109b29190614b63565b60405180910390f35b6109c3612480565b6040516109d09190614b63565b60405180910390f35b6109e1612486565b6040516109ee919061520b565b60405180910390f35b610a116004803603810190610a0c919061501b565b6124ac565b604051610a1e9190614b63565b60405180910390f35b610a416004803603810190610a3c9190615151565b612593565b005b610a4b6125a4565b604051610a58919061520b565b60405180910390f35b610a7b6004803603810190610a769190614b1d565b6125ca565b005b610a8561267f565b604051610a929190614c1e565b60405180910390f35b610ab56004803603810190610ab09190615151565b612940565b005b610abf612951565b604051610acc9190614cc9565b60405180910390f35b610add6129df565b604051610aea9190614d73565b60405180910390f35b610afb612a03565b604051610b089190614b63565b60405180910390f35b610b2b6004803603810190610b269190614d17565b612a0d565b604051610b389190614c1e565b60405180910390f35b610b5b6004803603810190610b569190614d17565b612c2c565b604051610b689190614c1e565b60405180910390f35b610b79612d2d565b604051610b869190614b63565b60405180910390f35b610b97612d33565b604051610ba49190614b63565b60405180910390f35b610bc76004803603810190610bc2919061501b565b612d57565b604051610bd49190614b63565b60405180910390f35b610be5612ede565b604051610bf29190614b63565b60405180910390f35b610c03612ee4565b604051610c109190614b63565b60405180910390f35b610c336004803603810190610c2e919061501b565b612eea565b005b610c3d61302a565b604051610c4a9190614b63565b60405180910390f35b610c6d6004803603810190610c689190614b1d565b613034565b604051610c7a9190614c1e565b60405180910390f35b610c9d6004803603810190610c989190615226565b613108565b604051610caa9190614b63565b60405180910390f35b610ccd6004803603810190610cc89190614f9b565b61312d565b604051610cda9190614b63565b60405180910390f35b610cfd6004803603810190610cf89190615266565b613141565b604051610d0a919061533c565b60405180910390f35b610d1b6131c1565b604051610d289190615382565b60405180910390f35b610d3961322b565b604051610d469190614b63565b60405180910390f35b610d696004803603810190610d649190614b1d565b61324f565b604051610d769190614c1e565b60405180910390f35b600080600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610e5891906153cc565b925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610ebc9190614b63565b60405180910390a380915050919050565b600063b61bc9417c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610f2157600190506111b6565b635878bcf47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610f7357600190506111b6565b63bc4babdd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610fc557600190506111b6565b630d7491f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361101757600190506111b6565b63abe1f1f57c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361106957600190506111b6565b63841a0e947c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036110bb57600190506111b6565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361110d57600190506111b6565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361115f57600190506111b6565b63d00179687c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036111b157600190506111b6565b600090505b919050565b600680546111c89061542f565b80601f01602080910402602001604051908101604052809291908181526020018280546111f49061542f565b80156112415780601f1061121657610100808354040283529160200191611241565b820191906000526020600020905b81548152906001019060200180831161122457829003601f168201915b505050505081565b60008060006112566121e3565b905060028160ff160361126e5760009250505061149f565b60008160ff1611156112b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ac906154ac565b60405180910390fd5b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561137e576000841461137d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137490615518565b60405180910390fd5b5b61138661267f565b5067800000000000000084116113a65761139f846122b0565b91506113b2565b67800000000000000091505b81600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925866040516114909190614b63565b60405180910390a36001925050505b92915050565b600260009054906101000a9004600f0b81565b6000806114df6114c785613398565b6114da6114d46001613398565b866133be565b613425565b90506114ea816134a4565b67ffffffffffffffff16846114ff9190615538565b91505092915050565b6000600b5460085461151a9190615538565b905090565b600f81565b60008080549050905090565b6000816020015168ffffffffffffffffff169050919050565b600080826000015163ffffffff16111561156657600090506115ac565b6000826020015168ffffffffffffffffff16111561158757600090506115ac565b6000826040015167ffffffffffffffff1611156115a757600090506115ac565b600190505b919050565b6000806000806115bf6121e3565b905060028160ff16036115d857600093505050506117c8565b60008160ff16111561161f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611616906154ac565b60405180910390fd5b61162761267f565b50611631856122b0565b925082600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156116bc57600080fd5b82600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117489190615538565b9250508190555061175a8787856134d9565b91508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516117b99190614b63565b60405180910390a38193505050505b9392505050565b60008067ffffffffffffffff836040015160070b169050600081600f0b036117fe576117fb6001613398565b90505b80915050919050565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806118ae5750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050919050565b6000600f82106118c457600080fd5b600082036118d957600f6012541490506118e3565b8160125483161490505b919050565b6000806000806118f786613398565b925061190285613398565b915061192e7ffffffffffffffffffffffffffffffffffffffffffffffffffffff8276f9a087283613425565b9050611939816134fc565b90506119458382613425565b9050611950816134a4565b67ffffffffffffffff16935050505092915050565b7f000000000000000000000000000000000000000000000000000000000000000681565b60125481565b60008061199a61267f565b506119a4836122b0565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a3291906153cc565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054604051611b129190614b63565b60405180910390a3600191505092915050565b60008181548110611b3557600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900467ffffffffffffffff16905083565b600080611b9f6121e3565b60ff1614611bac57600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611c515750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611c90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c87906155b8565b60405180910390fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115611cdc57600080fd5b6000611ce7836122b0565b9050611cf33382613589565b5082600b6000828254611d0691906153cc565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca584604051611d539190614b63565b60405180910390a26001915050919050565b6000806000611d726121e3565b60ff1614611d7f57600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611e245750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611e63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5a906155b8565b60405180910390fd5b611e6b61267f565b5060006011541115611e945760115483600854611e8891906153cc565b1115611e9357600080fd5b5b8260086000828254611ea691906153cc565b92505081905550611eb6836122b0565b9050611ec2848261368d565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051611f209190614b63565b60405180910390a3611f3061374e565b50600191505092915050565b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614611faa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa190615624565b60405180910390fd5b611fb383611b94565b5050505050565b6000612004600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b94565b905090565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f0000000000000000000000000000000000000000000000000000000000278d00826120809190615644565b7f0000000000000000000000000000000000000000000000000000000066ab569b6120ab91906153cc565b9050919050565b6000603c82426120c29190615538565b6120cc91906156b5565b9050919050565b60035481565b60006120e8600160ff166118b5565b156120f257600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061217957503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b61218257600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000601060009054906101000a900460ff161561220357600190506122ad565b6000600f540361221657600090506122ad565b600f5442106122a857612243603c60035461223191906156b5565b600f5461223e9190615538565b612d57565b506001601060006101000a81548160ff0219169083151502179055507ff80dbaea4785589e52984ca36a31de106adc77759539a5c7d92883bf49692fe94260405161228e9190614b63565b60405180910390a161229e61267f565b50600290506122ad565b600090505b90565b6000806122d46122bf84613398565b600260009054906101000a9004600f0b613912565b90506122df816134a4565b67ffffffffffffffff16915050919050565b6000603c82426123019190615538565b61230b91906156b5565b9050919050565b61231f600860ff166118b5565b1561232957600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461238357600080fd5b61238b611508565b811161239657600080fd5b6011547f9722adea12ab7ef86fc45b88f0e0b567639e8dddaae60261e08c03d747fbbfe6826040516123c89190614b63565b60405180910390a28060118190555050565b6000806000806123f16123ec86612009565b613398565b92506123fe6003546120b2565b905061241983600260009054906101000a9004600f0b613425565b9150612437612427836134a4565b67ffffffffffffffff16826118e8565b9350505050919050565b600061244d6000612d57565b905090565b600080600061246084611530565b915061246b846117cf565b905061247782826114b8565b92505050919050565b600a5481565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000601082106124f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e890615732565b60405180910390fd5b6000601254831614612538576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252f9061579e565b60405180910390fd5b81601260008282541792505081905550600f6012541415157f6b7e2e653f93b645d4ed7292d6429f96637084363e477c8aaea1a43ed13c284e6012546040516125819190614b63565b60405180910390a26012549050919050565b61259d8484611d65565b5050505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6125d7600260ff166118b5565b156125e157600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461263b57600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000612689614a6f565b612691614a6f565b612699614a6f565b60008060008060006126a9612441565b506126b261399e565b97506126bd88611549565b156126d35760009850505050505050505061293d565b6000600954815481106126e9576126e86157be565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505095506127968861312d565b94506001856127a591906153cc565b90506127b0866117cf565b9350603c857f0000000000000000000000000000000000000000000000000000000000278d006127e09190615644565b6127ea91906156b5565b91506128266128217ffffffffffffffffffffffffffffffffffffffffffffffffffffff8276f9a087261281c85613398565b613425565b6134fc565b925061283c600084612836611508565b84613141565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050506128f887613b34565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d675816040516129289190614b63565b60405180910390a16001985050505050505050505b90565b61294a8484611d65565b5050505050565b6007805461295e9061542f565b80601f016020809104026020016040519081016040528092919081815260200182805461298a9061542f565b80156129d75780601f106129ac576101008083540402835291602001916129d7565b820191906000526020600020905b8154815290600101906020018083116129ba57829003601f168201915b505050505081565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffff8276f9a087281565b6000600854905090565b600080612a19836122b0565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015612aa457600080fd5b612aac61267f565b5080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b399190615538565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054604051612c199190614b63565b60405180910390a3600191505092915050565b600080600080612c3a6121e3565b905060028160ff1603612c535760009350505050612d27565b60008160ff161115612c9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c91906154ac565b60405180910390fd5b612ca261267f565b50612cac856122b0565b9250612cb93387856134d9565b91508573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef87604051612d189190614b63565b60405180910390a38193505050505b92915050565b600f5481565b7f0000000000000000000000000000000000000000000000000000000000278d0081565b6000806000806000601060009054906101000a900460ff1615612d81576000945050505050612ed9565b612d8c6003546120b2565b925060008303612da3576000945050505050612ed9565b600260009054906101000a9004600f0b9050600086118015612dc457508286105b15612dcd578592505b612dd683613398565b9150612e027ffffffffffffffffffffffffffffffffffffffffffffffffffffff8276f9a087283613425565b9350612e0d846134fc565b9350612e28600260009054906101000a9004600f0b85613425565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c83612e709190615644565b600354612e7d91906153cc565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b604051612ec99190614d73565b60405180910390a4829450505050505b919050565b60095481565b60115481565b600080612efa600460ff166118b5565b15612f0457600080fd5b601060009054906101000a900460ff1615612f1e57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612f7857600080fd5b7f0000000000000000000000000000000000000000000000000000000000278d0083612fa49190615644565b7f0000000000000000000000000000000000000000000000000000000066ab569b612fcf91906153cc565b9150600f548211612fdf57600080fd5b600f54905081600f81905550807ff5bd6cb27a0006b5ea8618058a0d84719695cb6d984f4840bc1a54ca12ae4b7c600f5460405161301d9190614b63565b60405180910390a2505050565b6000600b54905090565b6000613043600160ff166118b5565b1561304d57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146130a757600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600d602052816000526040600020602052806000526040600020600091509150505481565b6000816000015163ffffffff169050919050565b613149614a6f565b613151614a6f565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b600060017f0000000000000000000000000000000000000000000000000000000000278d007f0000000000000000000000000000000000000000000000000000000066ab569b426132129190615538565b61321c91906156b5565b61322691906153cc565b905090565b7f0000000000000000000000000000000000000000000000000000000066ab569b81565b600080600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146132ac57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36001915050919050565b6000677fffffffffffffff8211156133af57600080fd5b6040829060020a029050919050565b60008082600f0b84600f0b0390507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561341257506f7fffffffffffffffffffffffffffffff600f0b8113155b61341b57600080fd5b8091505092915050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561349157506f7fffffffffffffffffffffffffffffff600f0b8113155b61349a57600080fd5b8091505092915050565b60008082600f0b12156134b657600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b60006134e58483613589565b506134f0838361368d565b50600190509392505050565b60006840000000000000000082600f0b1261351657600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b121561354a5760009050613584565b6135816080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a828518041892505050613c53565b90505b919050565b6000806000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600084036135e357600092505050613687565b6135ec85612009565b915083821015613631576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161362890615839565b60405180910390fd5b838261363d9190615538565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001925050505b92915050565b6000806000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600084036136e757600092505050613748565b6136f085612009565b915083826136fe91906153cc565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001925050505b92915050565b6000613758614a6f565b6000613762611508565b9050600060016000805490506137789190615538565b81548110613789576137886157be565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff168152505081600060016000805490506138649190615538565b81548110613875576138746157be565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060019250505090565b60008082600f0b0361392357600080fd5b600082600f0b604085600f0b9060020a028161394257613941615686565b5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561398b57506f7fffffffffffffffffffffffffffffff600f0b8113155b61399457600080fd5b8091505092915050565b6139a6614a6f565b6139ae614a6f565b6139b6614a6f565b600080600954815481106139cd576139cc6157be565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015613ad8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613afc9190615885565b6fffffffffffffffffffffffffffffffff169050613b198361312d565b8111613b2a57819350505050613b31565b8293505050505b90565b6000806000613b4284612452565b613b4a611508565b613b549190615538565b9150600a54613b62836122b0565b613b6c9190615538565b9050613b9a600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168261368d565b50836000015163ffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d384604051613c0e9190614b63565b60405180910390a3600160096000828254613c2991906153cc565b9250508190555080600a6000828254613c4291906153cc565b925050819055508192505050919050565b60006840000000000000000082600f0b12613c6d57600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b1215613ca15760009050614a6a565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b1315613cef57608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b1315613d285760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b1315613d615760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b1315613d9a57608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b1315613dd35760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b1315613e0c576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b1315613e4557608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b1315613e7e576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b1315613eb657608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b1315613eee5760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b1315613f26576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b1315613f5e5760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b1315613f96576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b1315613fce57608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b13156140065760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b131561403e57608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b13156140755760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b13156140ac576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b13156140e357608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b131561411a576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b131561415157608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b13156141885760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b13156141bf576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b13156141f65760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b131561422c576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b131561426257608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b13156142985760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b13156142ce57608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b13156143045760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b131561433a576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b131561437057608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b13156143a6576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b13156143db57608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b13156144105760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b1315614445576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b131561447a5760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b13156144af576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b13156144e457608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b13156145195760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b131561454e57608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b13156145825760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b13156145b6576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b13156145ea57608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b131561461e576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b131561465257608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b13156146865760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b13156146ba576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b13156146ee5760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b1315614721576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b131561475457608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b13156147875760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b13156147ba57608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b13156147ed5760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b1315614820576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b131561485357608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b1315614886576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b13156148b857608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b13156148ea5760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b131561491c576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b131561494e5760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b1315614980576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b13156149b257608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b13156149e45760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b1315614a1657608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b811115614a6557600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614aea82614abf565b9050919050565b614afa81614adf565b8114614b0557600080fd5b50565b600081359050614b1781614af1565b92915050565b600060208284031215614b3357614b32614ab5565b5b6000614b4184828501614b08565b91505092915050565b6000819050919050565b614b5d81614b4a565b82525050565b6000602082019050614b786000830184614b54565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b614bb381614b7e565b8114614bbe57600080fd5b50565b600081359050614bd081614baa565b92915050565b600060208284031215614bec57614beb614ab5565b5b6000614bfa84828501614bc1565b91505092915050565b60008115159050919050565b614c1881614c03565b82525050565b6000602082019050614c336000830184614c0f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614c73578082015181840152602081019050614c58565b60008484015250505050565b6000601f19601f8301169050919050565b6000614c9b82614c39565b614ca58185614c44565b9350614cb5818560208601614c55565b614cbe81614c7f565b840191505092915050565b60006020820190508181036000830152614ce38184614c90565b905092915050565b614cf481614b4a565b8114614cff57600080fd5b50565b600081359050614d1181614ceb565b92915050565b60008060408385031215614d2e57614d2d614ab5565b5b6000614d3c85828601614b08565b9250506020614d4d85828601614d02565b9150509250929050565b600081600f0b9050919050565b614d6d81614d57565b82525050565b6000602082019050614d886000830184614d64565b92915050565b614d9781614d57565b8114614da257600080fd5b50565b600081359050614db481614d8e565b92915050565b60008060408385031215614dd157614dd0614ab5565b5b6000614ddf85828601614d02565b9250506020614df085828601614da5565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614e3782614c7f565b810181811067ffffffffffffffff82111715614e5657614e55614dff565b5b80604052505050565b6000614e69614aab565b9050614e758282614e2e565b919050565b600063ffffffff82169050919050565b614e9381614e7a565b8114614e9e57600080fd5b50565b600081359050614eb081614e8a565b92915050565b600068ffffffffffffffffff82169050919050565b614ed481614eb6565b8114614edf57600080fd5b50565b600081359050614ef181614ecb565b92915050565b600067ffffffffffffffff82169050919050565b614f1481614ef7565b8114614f1f57600080fd5b50565b600081359050614f3181614f0b565b92915050565b600060608284031215614f4d57614f4c614dfa565b5b614f576060614e5f565b90506000614f6784828501614ea1565b6000830152506020614f7b84828501614ee2565b6020830152506040614f8f84828501614f22565b60408301525092915050565b600060608284031215614fb157614fb0614ab5565b5b6000614fbf84828501614f37565b91505092915050565b600080600060608486031215614fe157614fe0614ab5565b5b6000614fef86828701614b08565b935050602061500086828701614b08565b925050604061501186828701614d02565b9150509250925092565b60006020828403121561503157615030614ab5565b5b600061503f84828501614d02565b91505092915050565b6000806040838503121561505f5761505e614ab5565b5b600061506d85828601614d02565b925050602061507e85828601614d02565b9150509250929050565b61509181614e7a565b82525050565b6150a081614eb6565b82525050565b6150af81614ef7565b82525050565b60006060820190506150ca6000830186615088565b6150d76020830185615097565b6150e460408301846150a6565b949350505050565b600080fd5b600080fd5b600080fd5b60008083601f840112615111576151106150ec565b5b8235905067ffffffffffffffff81111561512e5761512d6150f1565b5b60208301915083600182028301111561514a576151496150f6565b5b9250929050565b6000806000806060858703121561516b5761516a614ab5565b5b600061517987828801614b08565b945050602061518a87828801614d02565b935050604085013567ffffffffffffffff8111156151ab576151aa614aba565b5b6151b7878288016150fb565b925092505092959194509250565b600060ff82169050919050565b6151db816151c5565b82525050565b60006020820190506151f660008301846151d2565b92915050565b61520581614adf565b82525050565b600060208201905061522060008301846151fc565b92915050565b6000806040838503121561523d5761523c614ab5565b5b600061524b85828601614b08565b925050602061525c85828601614b08565b9150509250929050565b600080600080608085870312156152805761527f614ab5565b5b600061528e87828801614d02565b945050602061529f87828801614da5565b93505060406152b087828801614d02565b92505060606152c187828801614d02565b91505092959194509250565b6152d681614e7a565b82525050565b6152e581614eb6565b82525050565b6152f481614ef7565b82525050565b60608201600082015161531060008501826152cd565b50602082015161532360208501826152dc565b50604082015161533660408501826152eb565b50505050565b600060608201905061535160008301846152fa565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b61537c81615357565b82525050565b60006020820190506153976000830184615373565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006153d782614b4a565b91506153e283614b4a565b92508282019050808211156153fa576153f961539d565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061544757607f821691505b60208210810361545a57615459615400565b5b50919050565b7f4558504952454400000000000000000000000000000000000000000000000000600082015250565b6000615496600783614c44565b91506154a182615460565b602082019050919050565b600060208201905081810360008301526154c581615489565b9050919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b6000615502600a83614c44565b915061550d826154cc565b602082019050919050565b60006020820190508181036000830152615531816154f5565b9050919050565b600061554382614b4a565b915061554e83614b4a565b92508282039050818111156155665761556561539d565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b60006155a2600a83614c44565b91506155ad8261556c565b602082019050919050565b600060208201905081810360008301526155d181615595565b9050919050565b7f4552525f4f4e4c595f53454c465f4255524e0000000000000000000000000000600082015250565b600061560e601283614c44565b9150615619826155d8565b602082019050919050565b6000602082019050818103600083015261563d81615601565b9050919050565b600061564f82614b4a565b915061565a83614b4a565b925082820261566881614b4a565b9150828204841483151761567f5761567e61539d565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006156c082614b4a565b91506156cb83614b4a565b9250826156db576156da615686565b5b828204905092915050565b7f4552525f494e56414c49445f5354415445000000000000000000000000000000600082015250565b600061571c601183614c44565b9150615727826156e6565b602082019050919050565b6000602082019050818103600083015261574b8161570f565b9050919050565b7f4552525f414c52454144595f4c4f434b45440000000000000000000000000000600082015250565b6000615788601283614c44565b915061579382615752565b602082019050919050565b600060208201905081810360008301526157b78161577b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6000615823600d83614c44565b915061582e826157ed565b602082019050919050565b6000602082019050818103600083015261585281615816565b9050919050565b61586281615357565b811461586d57600080fd5b50565b60008151905061587f81615859565b92915050565b60006020828403121561589b5761589a614ab5565b5b60006158a984828501615870565b9150509291505056fea2646970667358221220f385dd87c8c69c6c2a499f6ef1b86f025999a2d3537d134331e8146c1db7c54a64736f6c63430008130033

Deployed Bytecode Sourcemap

26343:23775:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35606:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49474:641;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26987:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45203:699;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26727:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39428:317;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49062:85;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30173:41;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38143:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37550:152;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44081:303;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47204:526;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37782:299;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33975:113;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31441:205;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44455:403;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27081:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29989:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46348:310;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26518:43;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;48357:382;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35951:511;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48767:161;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48956:79;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34595:105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43668:142;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42296:135;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26855:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33742:205;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33035:335;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44940:196;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43905:121;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32222:200;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34116:437;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42542:92;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39750:413;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27234:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28515:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31155:281;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36649:135;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26917:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32471:157;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40922:1269;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36490:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27033:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28148:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49368:76;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45939:370;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46725:412;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28591:22;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28018:39;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42668:944;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27166:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28651:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31777:361;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49217:76;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33463:176;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28322:68;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37333:153;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36831:428;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38776:132;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27917:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48006:237;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35606:218;35655:7;35669:9;35689:7;:19;35697:10;35689:19;;;;;;;;;;;;;;;;35685:23;;35735:1;35713:7;:19;35721:10;35713:19;;;;;;;;;;;;;;;:23;;;;35762:1;35741:7;:17;35749:8;35741:17;;;;;;;;;;;;;;;;:22;;;;;;;:::i;:::-;;;;;;;;35794:8;35773:33;;35782:10;35773:33;;;35804:1;35773:33;;;;;;:::i;:::-;;;;;;;;35818:1;35811:8;;;35606:218;;;:::o;49474:641::-;49535:4;49558:10;49550:18;;:4;:18;;;;49546:56;;49592:4;49585:11;;;;49546:56;49618:10;49610:18;;:4;:18;;;;49606:57;;49653:4;49646:11;;;;49606:57;49679:10;49671:18;;:4;:18;;;;49667:57;;49714:4;49707:11;;;;49667:57;49740:10;49732:18;;:4;:18;;;;49728:55;;49773:4;49766:11;;;;49728:55;49799:10;49791:18;;:4;:18;;;;49787:57;;49834:4;49827:11;;;;49787:57;49860:10;49852:18;;:4;:18;;;;49848:57;;49895:4;49888:11;;;;49848:57;49921:10;49913:18;;:4;:18;;;;49909:57;;49956:4;49949:11;;;;49909:57;49982:10;49974:18;;:4;:18;;;;49970:57;;50017:4;50010:11;;;;49970:57;50043:10;50035:18;;:4;:18;;;;50031:63;;50084:4;50077:11;;;;50031:63;50105:5;50098:12;;49474:641;;;;:::o;26987:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;45203:699::-;45270:4;45281:17;45303:8;45323:13;:11;:13::i;:::-;45318:18;;45351:1;45345:2;:7;;;45341:85;;45367:5;45360:12;;;;;;45341:85;45394:1;45389:2;:6;;;45385:41;;;45403:17;;;;;;;;;;:::i;:::-;;;;;;;;45385:41;45468:1;45434:9;:21;45444:10;45434:21;;;;;;;;;;;;;;;:31;45456:8;45434:31;;;;;;;;;;;;;;;;:35;45430:87;;;45495:1;45485:6;:11;45477:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;45430:87;45525:14;:12;:14::i;:::-;;26415:7;45676:6;:21;45672:112;;45717:20;45730:6;45717:12;:20::i;:::-;45705:32;;45672:112;;;26415:7;45755:23;;45672:112;45824:9;45790;:21;45800:10;45790:21;;;;;;;;;;;;;;;:31;45812:8;45790:31;;;;;;;;;;;;;;;:43;;;;45864:8;45843:38;;45852:10;45843:38;;;45874:6;45843:38;;;;;;:::i;:::-;;;;;;;;45893:4;45886:11;;;;45203:699;;;;;:::o;26727:29::-;;;;;;;;;;;;;:::o;39428:317::-;39516:7;39530:17;39567:114;39585:31;39608:7;39585:22;:31::i;:::-;39618:62;39636:25;39659:1;39636:22;:25::i;:::-;39663:16;39618:17;:62::i;:::-;39567:17;:114::i;:::-;39554:127;;39703:32;39724:10;39703:20;:32::i;:::-;39693:42;;:7;:42;;;;:::i;:::-;39686:49;;;39428:317;;;;:::o;49062:85::-;49106:7;49136:6;;49127;;:15;;;;:::i;:::-;49120:22;;49062:85;:::o;30173:41::-;30212:2;30173:41;:::o;38143:100::-;38195:7;38216:15;:22;;;;38209:29;;38143:100;:::o;37550:152::-;37646:7;37675:15;:21;;;37667:30;;37660:37;;37550:152;;;:::o;44081:303::-;44175:4;44215:1;44190:15;:22;;;:26;;;44186:56;;;44231:5;44224:12;;;;44186:56;44274:1;44250:15;:21;;;:25;;;44246:55;;;44290:5;44283:12;;;;44246:55;44337:1;44309:15;:25;;;:29;;;44305:59;;;44353:5;44346:12;;;;44305:59;44375:4;44368:11;;44081:303;;;;:::o;47204:526::-;47286:4;47297:17;47319:11;47335:8;47355:13;:11;:13::i;:::-;47350:18;;47383:1;47377:2;:7;;;47373:85;;47399:5;47392:12;;;;;;;47373:85;47426:1;47421:2;:6;;;47417:41;;;47435:17;;;;;;;;;;:::i;:::-;;;;;;;;47417:41;47462:14;:12;:14::i;:::-;;47495:20;47508:6;47495:12;:20::i;:::-;47483:32;;47560:9;47528;:16;47538:5;47528:16;;;;;;;;;;;;;;;:28;47545:10;47528:28;;;;;;;;;;;;;;;;:41;;47520:50;;;;;;47609:9;47577;:16;47587:5;47577:16;;;;;;;;;;;;;;;:28;47594:10;47577:28;;;;;;;;;;;;;;;;:41;;;;;;;:::i;:::-;;;;;;;;47632:35;47645:5;47652:3;47657:9;47632:12;:35::i;:::-;47623:44;;47695:3;47679:28;;47688:5;47679:28;;;47700:6;47679:28;;;;;;:::i;:::-;;;;;;;;47719:6;47712:13;;;;;47204:526;;;;;;:::o;37782:299::-;37889:6;37902:8;37970:34;37934:15;:25;;;37928:77;;;37917:89;;38020:1;38015;:6;;;38011:53;;38033:25;38056:1;38033:22;:25::i;:::-;38029:29;;38011:53;38075:1;38068:8;;;37782:299;;;:::o;33975:113::-;34030:4;34048:6;:15;34055:7;34048:15;;;;;;;;;;;;;;;;;;;;;;;;;:35;;;;34078:5;;;;;;;;;;;34067:16;;:7;:16;;;34048:35;34041:42;;33975:113;;;:::o;31441:205::-;31495:4;30212:2;31514:6;:21;31506:30;;;;;;31555:1;31545:6;:11;31541:61;;30212:2;31571:9;;:25;31564:32;;;;31541:61;31635:6;31622:9;;31613:6;:18;:28;31606:35;;31441:205;;;;:::o;44455:403::-;44527:7;44541:17;44563:18;44586:8;44615:30;44638:6;44615:22;:30::i;:::-;44602:43;;44664:31;44687:7;44664:22;:31::i;:::-;44650:45;;44706:42;44724:10;44736:11;44706:17;:42::i;:::-;44702:46;;44757:20;44775:1;44757:17;:20::i;:::-;44753:24;;44786:32;44804:10;44816:1;44786:17;:32::i;:::-;44782:36;;44830:23;44851:1;44830:20;:23::i;:::-;44823:30;;;;;;;44455:403;;;;:::o;27081:33::-;;;:::o;29989:24::-;;;;:::o;46348:310::-;46425:4;46436:17;46460:14;:12;:14::i;:::-;;46493:20;46506:6;46493:12;:20::i;:::-;46481:32;;46555:9;46520;:21;46530:10;46520:21;;;;;;;;;;;;;;;:31;46542:8;46520:31;;;;;;;;;;;;;;;;:44;;;;;;;:::i;:::-;;;;;;;;46595:8;46574:63;;46583:10;46574:63;;;46605:9;:21;46615:10;46605:21;;;;;;;;;;;;;;;:31;46627:8;46605:31;;;;;;;;;;;;;;;;46574:63;;;;;;:::i;:::-;;;;;;;;46649:4;46642:11;;;46348:310;;;;:::o;26518:43::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;48357:382::-;48402:4;48438:1;48421:13;:11;:13::i;:::-;:18;;;48413:27;;;;;;48453:6;:18;48460:10;48453:18;;;;;;;;;;;;;;;;;;;;;;;;;:41;;;;48489:5;;;;;;;;;;;48475:19;;:10;:19;;;48453:41;48445:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;48532:7;:19;48540:10;48532:19;;;;;;;;;;;;;;;;48522:6;:29;;48514:38;;;;;;48557:14;48574:20;48587:6;48574:12;:20::i;:::-;48557:37;;48624:39;48644:10;48656:6;48624:19;:39::i;:::-;;48678:6;48668;;:16;;;;;;;:::i;:::-;;;;;;;;48699:10;48694:24;;;48711:6;48694:24;;;;;;:::i;:::-;;;;;;;;48730:4;48723:11;;;48357:382;;;:::o;35951:511::-;36022:4;36033:18;36083:1;36066:13;:11;:13::i;:::-;:18;;;36058:27;;;;;;36098:6;:18;36105:10;36098:18;;;;;;;;;;;;;;;;;;;;;;;;;:41;;;;36134:5;;;;;;;;;;;36120:19;;:10;:19;;;36098:41;36090:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;36161:14;:12;:14::i;:::-;;36196:1;36184:9;;:13;36180:69;;;36233:9;;36222:7;36213:6;;:16;;;;:::i;:::-;:29;;36205:38;;;;;;36180:69;36263:7;36253:6;;:17;;;;;;;:::i;:::-;;;;;;;;36290:21;36303:7;36290:12;:21::i;:::-;36277:34;;36316:45;36336:12;36350:10;36316:19;:45::i;:::-;;36388:12;36371:39;;36376:10;36371:39;;;36402:7;36371:39;;;;;;:::i;:::-;;;;;;;;36415:26;:24;:26::i;:::-;;36453:4;36446:11;;;35951:511;;;;:::o;48767:161::-;48863:10;48854:19;;:5;:19;;;48846:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;48911:12;48916:6;48911:4;:12::i;:::-;;48767:161;;;;:::o;48956:79::-;48987:4;49005:25;49010:7;:19;49018:10;49010:19;;;;;;;;;;;;;;;;49005:4;:25::i;:::-;48998:32;;48956:79;:::o;34595:105::-;34657:7;34678;:17;34686:8;34678:17;;;;;;;;;;;;;;;;34671:24;;34595:105;;;:::o;43668:142::-;43739:7;43790:14;43775:12;:29;;;;:::i;:::-;43760:11;:45;;;;:::i;:::-;43753:52;;43668:142;;;:::o;42296:135::-;42366:7;42424:2;42406:14;42388:15;:32;;;;:::i;:::-;42387:39;;;;:::i;:::-;42380:46;;42296:135;;;:::o;26855:33::-;;;;:::o;33742:205::-;33797:4;33817:22;30047:1;33817:22;;:8;:22::i;:::-;33816:23;33808:32;;;;;;33867:5;;;;;;;;;;;33853:19;;:10;:19;;;:44;;;;33887:10;33876:21;;:7;:21;;;33853:44;33845:53;;;;;;33921:5;33903:6;:15;33910:7;33903:15;;;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;33938:4;33931:11;;33742:205;;;:::o;33035:335::-;33073:5;33089:7;;;;;;;;;;;33085:33;;;33111:1;33104:8;;;;33085:33;33137:1;33126:7;;:12;33122:38;;33153:1;33146:8;;;;33122:38;33187:7;;33168:15;:26;33164:189;;33202:56;33255:2;33234:18;;:23;;;;:::i;:::-;33224:7;;:33;;;;:::i;:::-;33202:21;:56::i;:::-;;33274:4;33264:7;;:14;;;;;;;;;;;;;;;;;;33289:24;33297:15;33289:24;;;;;;:::i;:::-;;;;;;;;33319:14;:12;:14::i;:::-;;33346:1;33339:8;;;;33164:189;33364:1;33357:8;;33035:335;;:::o;44940:196::-;44999:7;45013:8;45030:66;45048:30;45071:6;45048:22;:30::i;:::-;45080:15;;;;;;;;;;;45030:17;:66::i;:::-;45026:70;;45108:23;45129:1;45108:20;:23::i;:::-;45101:30;;;;;44940:196;;;:::o;43905:121::-;43968:7;44019:2;44008:7;43990:15;:25;;;;:::i;:::-;43989:32;;;;:::i;:::-;43982:39;;43905:121;;;:::o;32222:200::-;32279:19;30147:1;32279:19;;:8;:19::i;:::-;32278:20;32270:29;;;;;;32326:5;;;;;;;;;;;32312:19;;:10;:19;;;32304:28;;;;;;32352:13;:11;:13::i;:::-;32345:4;:20;32337:29;;;;;;32380:9;;32376:20;32391:4;32376:20;;;;;;:::i;:::-;;;;;;;;32413:4;32401:9;:16;;;;32222:200;:::o;34116:437::-;34174:7;34188:18;34211:30;34246:19;34286:47;34309:23;34323:8;34309:13;:23::i;:::-;34286:22;:47::i;:::-;34272:61;;34354:35;34370:18;;34354:15;:35::i;:::-;34340:49;;34422:47;34440:11;34453:15;;;;;;;;;;;34422:17;:47::i;:::-;34396:73;;34481:67;34489:45;34510:23;34489:20;:45::i;:::-;34481:67;;34536:11;34481:7;:67::i;:::-;34474:74;;;;;34116:437;;;:::o;42542:92::-;42584:7;42605:24;42627:1;42605:21;:24::i;:::-;42598:31;;42542:92;:::o;39750:413::-;39857:7;39871:28;39904:30;39964:39;39987:15;39964:22;:39::i;:::-;39941:62;;40034:50;40068:15;40034:33;:50::i;:::-;40008:76;;40096:62;40112:20;40134:23;40096:15;:62::i;:::-;40089:69;;;;39750:413;;;:::o;27234:24::-;;;;:::o;28515:26::-;;;;;;;;;;;;;:::o;31155:281::-;31200:7;31231:2;31222:6;:11;31214:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;31290:1;31277:9;;31268:6;:18;:23;31260:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;31332:6;31319:9;;:19;;;;;;;;;;;30212:2;31364:9;;:25;31348:53;;;31391:9;;31348:53;;;;;;:::i;:::-;;;;;;;;31421:9;;31406:25;;31155:281;;;:::o;36649:135::-;36750:29;36757:12;36771:7;36750:6;:29::i;:::-;;36649:135;;;;:::o;26917:20::-;;;;;;;;;;;;;:::o;32471:157::-;32538:20;30080:1;32538:20;;:8;:20::i;:::-;32537:21;32529:30;;;;;;32586:5;;;;;;;;;;;32572:19;;:10;:19;;;32564:28;;;;;;32611:12;32597:11;;:26;;;;;;;;;;;;;;;;;;32471:157;:::o;40922:1269::-;40962:4;40973:47;;:::i;:::-;41025:44;;:::i;:::-;41074;;:::i;:::-;41123:21;41149:26;41180:34;41219:23;41247:18;41272:16;:14;:16::i;:::-;;41317:13;:11;:13::i;:::-;41293:37;;41339:44;41361:21;41339;:44::i;:::-;41335:74;;;41398:5;41391:12;;;;;;;;;;;;41335:74;41491:15;41507:10;;41491:27;;;;;;;;:::i;:::-;;;;;;;;;41470:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41539:45;41562:21;41539:22;:45::i;:::-;41523:61;;41618:1;41602:13;:17;;;;:::i;:::-;41589:30;;41646:53;41680:18;41646:33;:53::i;:::-;41624:75;;41757:2;41740:13;41723:14;:30;;;;:::i;:::-;41722:37;;;;:::i;:::-;41704:55;;41854:89;41872:70;41890:10;41902:39;41925:15;41902:22;:39::i;:::-;41872:17;:70::i;:::-;41854:17;:89::i;:::-;41824:119;;41969:75;41986:1;41989:27;42018:13;:11;:13::i;:::-;42033:10;41969:16;:75::i;:::-;41948:96;;42049:15;42070:18;42049:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42096:46;42123:18;42096:26;:46::i;:::-;;42152:18;42159:10;42152:18;;;;;;:::i;:::-;;;;;;;;42182:4;42175:11;;;;;;;;;;40922:1269;;:::o;36490:131::-;36587:29;36594:12;36608:7;36587:6;:29::i;:::-;;36490:131;;;;:::o;27033:20::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;28148:34::-;;;:::o;49368:76::-;49412:7;49433:6;;49426:13;;49368:76;:::o;45939:370::-;46016:4;46027:17;46063:20;46076:6;46063:12;:20::i;:::-;46051:32;;46131:9;46096;:21;46106:10;46096:21;;;;;;;;;;;;;;;:31;46118:8;46096:31;;;;;;;;;;;;;;;;:44;;46088:53;;;;;;46150:14;:12;:14::i;:::-;;46206:9;46171;:21;46181:10;46171:21;;;;;;;;;;;;;;;:31;46193:8;46171:31;;;;;;;;;;;;;;;;:44;;;;;;;:::i;:::-;;;;;;;;46246:8;46225:63;;46234:10;46225:63;;;46256:9;:21;46266:10;46256:21;;;;;;;;;;;;;;;:31;46278:8;46256:31;;;;;;;;;;;;;;;;46225:63;;;;;;:::i;:::-;;;;;;;;46300:4;46293:11;;;45939:370;;;;:::o;46725:412::-;46788:4;46799:17;46821:11;46837:8;46857:13;:11;:13::i;:::-;46852:18;;46885:1;46879:2;:7;;;46875:85;;46901:5;46894:12;;;;;;;46875:85;46928:1;46923:2;:6;;;46919:41;;;46937:17;;;;;;;;;;:::i;:::-;;;;;;;;46919:41;46964:14;:12;:14::i;:::-;;46997:20;47010:6;46997:12;:20::i;:::-;46985:32;;47031:40;47044:10;47056:3;47061:9;47031:12;:40::i;:::-;47022:49;;47102:3;47081:33;;47090:10;47081:33;;;47107:6;47081:33;;;;;;:::i;:::-;;;;;;;;47126:6;47119:13;;;;;46725:412;;;;;:::o;28591:22::-;;;;:::o;28018:39::-;;;:::o;42668:944::-;42732:7;42746:8;42759:19;42783:18;42806:26;42843:7;;;;;;;;;;;42839:34;;;42865:1;42858:8;;;;;;;;42839:34;42893:35;42909:18;;42893:15;:35::i;:::-;42879:49;;42952:1;42937:11;:16;42933:42;;42968:1;42961:8;;;;;;;;42933:42;43001:15;;;;;;;;;;;42979:37;;43173:1;43163:7;:11;:36;;;;;43188:11;43178:7;:21;43163:36;43159:75;;;43221:7;43207:21;;43159:75;43254:35;43277:11;43254:22;:35::i;:::-;43240:49;;43298:42;43316:10;43328:11;43298:17;:42::i;:::-;43294:46;;43349:20;43367:1;43349:17;:20::i;:::-;43345:24;;43392:37;43410:15;;;;;;;;;;;43427:1;43392:17;:37::i;:::-;43374:15;;:55;;;;;;;;;;;;;;;;;;;;43493:2;43479:11;:16;;;;:::i;:::-;43457:18;;:39;;;;:::i;:::-;43436:18;:60;;;;43547:19;43506:78;;43534:11;43514:18;;43506:78;43568:15;;;;;;;;;;;43506:78;;;;;;:::i;:::-;;;;;;;;43596:11;43589:18;;;;;;42668:944;;;;:::o;27166:25::-;;;;:::o;28651:24::-;;;;:::o;31777:361::-;31837:9;31851:20;31887:22;30115:1;31887:22;;:8;:22::i;:::-;31886:23;31878:32;;;;;;31924:7;;;;;;;;;;;31923:8;31915:17;;;;;;31959:5;;;;;;;;;;;31945:19;;:10;:19;;;31937:28;;;;;;32005:14;31989:13;:30;;;;:::i;:::-;31974:11;:46;;;;:::i;:::-;31970:50;;32037:7;;32033:1;:11;32025:20;;;;;;32065:7;;32050:22;;32087:1;32077:7;:11;;;;32111:12;32098:35;32125:7;;32098:35;;;;;;:::i;:::-;;;;;;;;31832:306;;31777:361;:::o;49217:76::-;49261:7;49282:6;;49275:13;;49217:76;:::o;33463:176::-;33515:4;33535:22;30047:1;33535:22;;:8;:22::i;:::-;33534:23;33526:32;;;;;;33585:5;;;;;;;;;;;33571:19;;:10;:19;;;33563:28;;;;;;33614:4;33596:6;:15;33603:7;33596:15;;;;;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;33630:4;33623:11;;33463:176;;;:::o;28322:68::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37333:153::-;37429:7;37458:15;:22;;;37450:31;;37443:38;;37333:153;;;:::o;36831:428::-;36960:25;;:::i;:::-;36992:40;;:::i;:::-;37070:7;37039:14;:21;;:39;;;;;;;;;;;37113:6;37083:14;:20;;:37;;;;;;;;;;;37189:18;37167;37159:48;37125:14;:24;;:83;;;;;;;;;;;37238:14;37231:21;;;36831:428;;;;;;:::o;38776:132::-;38821:7;38901:1;38884:14;38869:11;38851:15;:29;;;;:::i;:::-;38850:48;;;;:::i;:::-;:52;;;;:::i;:::-;38835:68;;38776:132;:::o;27917:36::-;;;:::o;48006:237::-;48068:4;48079:16;48124:5;;;;;;;;;;;48110:19;;:10;:19;;;48102:28;;;;;;48146:5;;;;;;;;;;;48135:16;;48164:9;48156:5;;:17;;;;;;;;;;;;;;;;;;48216:5;;;;;;;;;;;48185:37;;48206:8;48185:37;;;;;;;;;;;;48234:4;48227:11;;;48006:237;;;:::o;2009:174::-;2062:6;2110:18;2105:1;:23;;2096:33;;;;;;2166:2;2161:1;:7;;;;2138:32;;2009:174;;;:::o;4071:225::-;4128:6;4162:13;4190:1;4178:13;;4185:1;4178:9;;:13;4162:29;;815:35;4209:19;;:6;:19;;:42;;;;;973:34;4232:19;;:6;:19;;4209:42;4200:52;;;;;;4276:6;4261:22;;;4071:225;;;;:::o;4532:231::-;4589:6;4623:13;4656:2;4651:1;4639:13;;4646:1;4639:9;;:13;:19;;;;;;;;;;;;;;;;;;;4623:35;;815;4676:19;;:6;:19;;:42;;;;;973:34;4699:19;;:6;:19;;4676:42;4667:52;;;;;;4743:6;4728:22;;;4532:231;;;;:::o;2430:155::-;2480:6;2528:1;2523;:6;;;;2514:16;;;;;;2568:2;2563:1;:7;;;;;;;;;;;;;;;;;;;;;2539:33;;2430:155;;;:::o;47790:188::-;47873:4;47884:34;47904:5;47911:6;47884:19;:34::i;:::-;;47923:32;47943:3;47948:6;47923:19;:32::i;:::-;;47969:4;47962:11;;47790:188;;;;;:::o;23217:305::-;23264:6;23311:20;23307:1;:24;;;23298:34;;;;;;23363:21;23359:1;:25;;;23355:39;;;23393:1;23386:8;;;;23355:39;23425:84;23504:3;23465:35;23460:1;23452:10;;:48;:55;;;;;;;;;;;;;;;;;;;23425:5;:84::i;:::-;23418:91;;23217:305;;;;:::o;35146:406::-;35226:4;35237:18;35260:19;35308:7;:17;35316:8;35308:17;;;;;;;;;;;;;;;;35286:40;;35347:1;35337:6;:11;35333:41;;35363:5;35356:12;;;;;;35333:41;35393:23;35407:8;35393:13;:23::i;:::-;35380:36;;35444:6;35430:10;:20;;35422:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;35525:6;35512:10;:19;;;;:::i;:::-;35492:7;:17;35500:8;35492:17;;;;;;;;;;;;;;;:39;;;;35543:4;35536:11;;;;35146:406;;;;;:::o;34755:336::-;34835:4;34846:18;34869:19;34917:7;:17;34925:8;34917:17;;;;;;;;;;;;;;;;34895:40;;34957:1;34947:6;:11;34943:41;;34973:5;34966:12;;;;;;34943:41;35003:23;35017:8;35003:13;:23::i;:::-;34990:36;;35064:6;35051:10;:19;;;;:::i;:::-;35031:7;:17;35039:8;35031:17;;;;;;;;;;;;;;;:39;;;;35082:4;35075:11;;;;34755:336;;;;;:::o;38327:386::-;38380:4;38391:47;;:::i;:::-;38443:19;38483:13;:11;:13::i;:::-;38469:27;;38525:15;38564:1;38541:15;:22;;;;:24;;;;:::i;:::-;38525:41;;;;;;;;:::i;:::-;;;;;;;;;38501:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38608:11;38571:21;:27;;:49;;;;;;;;;;;38671:21;38627:15;38666:1;38643:15;:22;;;;:24;;;;:::i;:::-;38627:41;;;;;;;;:::i;:::-;;;;;;;;;:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38704:4;38697:11;;;;38327:386;:::o;7255:259::-;7312:6;7360:1;7355;:6;;;7346:16;;;;;;7371:13;7408:1;7387:22;;7402:2;7396:1;7388:10;;:16;;;;7387:22;;;;;:::i;:::-;;;7371:38;;815:35;7427:19;;:6;:19;;:42;;;;;973:34;7450:19;;:6;:19;;7427:42;7418:52;;;;;;7494:6;7479:22;;;7255:259;;;;:::o;38988:435::-;39033:25;;:::i;:::-;39065:44;;:::i;:::-;39114:45;;:::i;:::-;39164:21;39214:15;39230:10;;39214:27;;;;;;;;:::i;:::-;;;;;;;;;39192:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39262:4;:17;;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39246:35;;;;39307:42;39330:18;39307:22;:42::i;:::-;39290:13;:59;39286:103;;39364:19;39357:26;;;;;;;39286:103;39400:18;39393:25;;;;;38988:435;;:::o;40217:452::-;40313:7;40327:12;40344:16;40391:50;40425:15;40391:33;:50::i;:::-;40375:13;:11;:13::i;:::-;:66;;;;:::i;:::-;40368:73;;40479:9;;40458:18;40471:4;40458:12;:18::i;:::-;:30;;;;:::i;:::-;40447:41;;40493:42;40513:11;;;;;;;;;;;40526:8;40493:19;:42::i;:::-;;40573:15;:22;;;40545:57;;40560:11;;;;;;;;;;;40545:57;;;40597:4;40545:57;;;;;;:::i;:::-;;;;;;;;40621:1;40607:10;;:15;;;;;;;:::i;:::-;;;;;;;;40640:8;40627:9;;:21;;;;;;;:::i;:::-;;;;;;;;40660:4;40653:11;;;;40217:452;;;:::o;16047:6983::-;16096:6;16143:20;16139:1;:24;;;16130:34;;;;;;16195:21;16191:1;:25;;;16187:39;;;16225:1;16218:8;;;;16187:39;16250:14;16267:34;16250:51;;16341:1;16320:18;16316:1;:22;:26;;;16312:101;;;16410:3;16371:35;16362:6;:44;:51;;;;;;;;;16353:60;;16312:101;16451:1;16430:18;16426:1;:22;:26;;;16422:101;;;16520:3;16481:35;16472:6;:44;:51;;;;;;;;;16463:60;;16422:101;16561:1;16540:18;16536:1;:22;:26;;;16532:101;;;16630:3;16591:35;16582:6;:44;:51;;;;;;;;;16573:60;;16532:101;16671:1;16650:18;16646:1;:22;:26;;;16642:101;;;16740:3;16701:35;16692:6;:44;:51;;;;;;;;;16683:60;;16642:101;16780:1;16760:17;16756:1;:21;:25;;;16752:100;;;16849:3;16810:35;16801:6;:44;:51;;;;;;;;;16792:60;;16752:100;16889:1;16869:17;16865:1;:21;:25;;;16861:100;;;16958:3;16919:35;16910:6;:44;:51;;;;;;;;;16901:60;;16861:100;16998:1;16978:17;16974:1;:21;:25;;;16970:100;;;17067:3;17028:35;17019:6;:44;:51;;;;;;;;;17010:60;;16970:100;17107:1;17087:17;17083:1;:21;:25;;;17079:100;;;17176:3;17137:35;17128:6;:44;:51;;;;;;;;;17119:60;;17079:100;17215:1;17196:16;17192:1;:20;:24;;;17188:99;;;17284:3;17245:35;17236:6;:44;:51;;;;;;;;;17227:60;;17188:99;17323:1;17304:16;17300:1;:20;:24;;;17296:99;;;17392:3;17353:35;17344:6;:44;:51;;;;;;;;;17335:60;;17296:99;17431:1;17412:16;17408:1;:20;:24;;;17404:99;;;17500:3;17461:35;17452:6;:44;:51;;;;;;;;;17443:60;;17404:99;17539:1;17520:16;17516:1;:20;:24;;;17512:99;;;17608:3;17569:35;17560:6;:44;:51;;;;;;;;;17551:60;;17512:99;17646:1;17628:15;17624:1;:19;:23;;;17620:98;;;17715:3;17676:35;17667:6;:44;:51;;;;;;;;;17658:60;;17620:98;17753:1;17735:15;17731:1;:19;:23;;;17727:98;;;17822:3;17783:35;17774:6;:44;:51;;;;;;;;;17765:60;;17727:98;17860:1;17842:15;17838:1;:19;:23;;;17834:98;;;17929:3;17890:35;17881:6;:44;:51;;;;;;;;;17872:60;;17834:98;17967:1;17949:15;17945:1;:19;:23;;;17941:98;;;18036:3;17997:35;17988:6;:44;:51;;;;;;;;;17979:60;;17941:98;18073:1;18056:14;18052:1;:18;:22;;;18048:97;;;18142:3;18103:35;18094:6;:44;:51;;;;;;;;;18085:60;;18048:97;18179:1;18162:14;18158:1;:18;:22;;;18154:97;;;18248:3;18209:35;18200:6;:44;:51;;;;;;;;;18191:60;;18154:97;18285:1;18268:14;18264:1;:18;:22;;;18260:97;;;18354:3;18315:35;18306:6;:44;:51;;;;;;;;;18297:60;;18260:97;18391:1;18374:14;18370:1;:18;:22;;;18366:97;;;18460:3;18421:35;18412:6;:44;:51;;;;;;;;;18403:60;;18366:97;18496:1;18480:13;18476:1;:17;:21;;;18472:96;;;18565:3;18526:35;18517:6;:44;:51;;;;;;;;;18508:60;;18472:96;18601:1;18585:13;18581:1;:17;:21;;;18577:96;;;18670:3;18631:35;18622:6;:44;:51;;;;;;;;;18613:60;;18577:96;18706:1;18690:13;18686:1;:17;:21;;;18682:96;;;18775:3;18736:35;18727:6;:44;:51;;;;;;;;;18718:60;;18682:96;18811:1;18795:13;18791:1;:17;:21;;;18787:96;;;18880:3;18841:35;18832:6;:44;:51;;;;;;;;;18823:60;;18787:96;18915:1;18900:12;18896:1;:16;:20;;;18892:95;;;18984:3;18945:35;18936:6;:44;:51;;;;;;;;;18927:60;;18892:95;19019:1;19004:12;19000:1;:16;:20;;;18996:95;;;19088:3;19049:35;19040:6;:44;:51;;;;;;;;;19031:60;;18996:95;19123:1;19108:12;19104:1;:16;:20;;;19100:95;;;19192:3;19153:35;19144:6;:44;:51;;;;;;;;;19135:60;;19100:95;19227:1;19212:12;19208:1;:16;:20;;;19204:95;;;19296:3;19257:35;19248:6;:44;:51;;;;;;;;;19239:60;;19204:95;19330:1;19316:11;19312:1;:15;:19;;;19308:94;;;19399:3;19360:35;19351:6;:44;:51;;;;;;;;;19342:60;;19308:94;19433:1;19419:11;19415:1;:15;:19;;;19411:94;;;19502:3;19463:35;19454:6;:44;:51;;;;;;;;;19445:60;;19411:94;19536:1;19522:11;19518:1;:15;:19;;;19514:94;;;19605:3;19566:35;19557:6;:44;:51;;;;;;;;;19548:60;;19514:94;19639:1;19625:11;19621:1;:15;:19;;;19617:94;;;19708:3;19669:35;19660:6;:44;:51;;;;;;;;;19651:60;;19617:94;19741:1;19728:10;19724:1;:14;:18;;;19720:93;;;19810:3;19771:35;19762:6;:44;:51;;;;;;;;;19753:60;;19720:93;19843:1;19830:10;19826:1;:14;:18;;;19822:93;;;19912:3;19873:35;19864:6;:44;:51;;;;;;;;;19855:60;;19822:93;19945:1;19932:10;19928:1;:14;:18;;;19924:93;;;20014:3;19975:35;19966:6;:44;:51;;;;;;;;;19957:60;;19924:93;20047:1;20034:10;20030:1;:14;:18;;;20026:93;;;20116:3;20077:35;20068:6;:44;:51;;;;;;;;;20059:60;;20026:93;20148:1;20136:9;20132:1;:13;:17;;;20128:92;;;20217:3;20178:35;20169:6;:44;:51;;;;;;;;;20160:60;;20128:92;20249:1;20237:9;20233:1;:13;:17;;;20229:92;;;20318:3;20279:35;20270:6;:44;:51;;;;;;;;;20261:60;;20229:92;20350:1;20338:9;20334:1;:13;:17;;;20330:92;;;20419:3;20380:35;20371:6;:44;:51;;;;;;;;;20362:60;;20330:92;20451:1;20439:9;20435:1;:13;:17;;;20431:92;;;20520:3;20481:35;20472:6;:44;:51;;;;;;;;;20463:60;;20431:92;20551:1;20540:8;20536:1;:12;:16;;;20532:91;;;20620:3;20581:35;20572:6;:44;:51;;;;;;;;;20563:60;;20532:91;20651:1;20640:8;20636:1;:12;:16;;;20632:91;;;20720:3;20681:35;20672:6;:44;:51;;;;;;;;;20663:60;;20632:91;20751:1;20740:8;20736:1;:12;:16;;;20732:91;;;20820:3;20781:35;20772:6;:44;:51;;;;;;;;;20763:60;;20732:91;20851:1;20840:8;20836:1;:12;:16;;;20832:91;;;20920:3;20881:35;20872:6;:44;:51;;;;;;;;;20863:60;;20832:91;20950:1;20940:7;20936:1;:11;:15;;;20932:90;;;21019:3;20980:35;20971:6;:44;:51;;;;;;;;;20962:60;;20932:90;21049:1;21039:7;21035:1;:11;:15;;;21031:90;;;21118:3;21079:35;21070:6;:44;:51;;;;;;;;;21061:60;;21031:90;21148:1;21138:7;21134:1;:11;:15;;;21130:90;;;21217:3;21178:35;21169:6;:44;:51;;;;;;;;;21160:60;;21130:90;21247:1;21237:7;21233:1;:11;:15;;;21229:90;;;21316:3;21277:35;21268:6;:44;:51;;;;;;;;;21259:60;;21229:90;21345:1;21336:6;21332:1;:10;:14;;;21328:89;;;21414:3;21375:35;21366:6;:44;:51;;;;;;;;;21357:60;;21328:89;21443:1;21434:6;21430:1;:10;:14;;;21426:89;;;21512:3;21473:35;21464:6;:44;:51;;;;;;;;;21455:60;;21426:89;21541:1;21532:6;21528:1;:10;:14;;;21524:89;;;21610:3;21571:35;21562:6;:44;:51;;;;;;;;;21553:60;;21524:89;21639:1;21630:6;21626:1;:10;:14;;;21622:89;;;21708:3;21669:35;21660:6;:44;:51;;;;;;;;;21651:60;;21622:89;21736:1;21728:5;21724:1;:9;:13;;;21720:88;;;21805:3;21766:35;21757:6;:44;:51;;;;;;;;;21748:60;;21720:88;21833:1;21825:5;21821:1;:9;:13;;;21817:88;;;21902:3;21863:35;21854:6;:44;:51;;;;;;;;;21845:60;;21817:88;21930:1;21922:5;21918:1;:9;:13;;;21914:88;;;21999:3;21960:35;21951:6;:44;:51;;;;;;;;;21942:60;;21914:88;22027:1;22019:5;22015:1;:9;:13;;;22011:88;;;22096:3;22057:35;22048:6;:44;:51;;;;;;;;;22039:60;;22011:88;22123:1;22116:4;22112:1;:8;:12;;;22108:87;;;22192:3;22153:35;22144:6;:44;:51;;;;;;;;;22135:60;;22108:87;22219:1;22212:4;22208:1;:8;:12;;;22204:87;;;22288:3;22249:35;22240:6;:44;:51;;;;;;;;;22231:60;;22204:87;22315:1;22308:4;22304:1;:8;:12;;;22300:87;;;22384:3;22345:35;22336:6;:44;:51;;;;;;;;;22327:60;;22300:87;22411:1;22404:4;22400:1;:8;:12;;;22396:87;;;22480:3;22441:35;22432:6;:44;:51;;;;;;;;;22423:60;;22396:87;22506:1;22500:3;22496:1;:7;:11;;;22492:86;;;22575:3;22536:35;22527:6;:44;:51;;;;;;;;;22518:60;;22492:86;22601:1;22595:3;22591:1;:7;:11;;;22587:86;;;22670:3;22631:35;22622:6;:44;:51;;;;;;;;;22613:60;;22587:86;22696:1;22690:3;22686:1;:7;:11;;;22682:86;;;22765:3;22726:35;22717:6;:44;:51;;;;;;;;;22708:60;;22682:86;22791:1;22785:3;22781:1;:7;:11;;;22777:86;;;22860:3;22821:35;22812:6;:44;:51;;;;;;;;;22803:60;;22777:86;22913:2;22908:1;:7;;;;;;;;;;;;;;;;;;;;;22902:2;:14;22894:23;;22874:44;;;;;;;;;;;;973:34;22955:18;;22936:6;:38;;22927:48;;;;;;23009:6;22986:31;;;16047:6983;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:329::-;900:6;949:2;937:9;928:7;924:23;920:32;917:119;;;955:79;;:::i;:::-;917:119;1075:1;1100:53;1145:7;1136:6;1125:9;1121:22;1100:53;:::i;:::-;1090:63;;1046:117;841:329;;;;:::o;1176:77::-;1213:7;1242:5;1231:16;;1176:77;;;:::o;1259:118::-;1346:24;1364:5;1346:24;:::i;:::-;1341:3;1334:37;1259:118;;:::o;1383:222::-;1476:4;1514:2;1503:9;1499:18;1491:26;;1527:71;1595:1;1584:9;1580:17;1571:6;1527:71;:::i;:::-;1383:222;;;;:::o;1611:149::-;1647:7;1687:66;1680:5;1676:78;1665:89;;1611:149;;;:::o;1766:120::-;1838:23;1855:5;1838:23;:::i;:::-;1831:5;1828:34;1818:62;;1876:1;1873;1866:12;1818:62;1766:120;:::o;1892:137::-;1937:5;1975:6;1962:20;1953:29;;1991:32;2017:5;1991:32;:::i;:::-;1892:137;;;;:::o;2035:327::-;2093:6;2142:2;2130:9;2121:7;2117:23;2113:32;2110:119;;;2148:79;;:::i;:::-;2110:119;2268:1;2293:52;2337:7;2328:6;2317:9;2313:22;2293:52;:::i;:::-;2283:62;;2239:116;2035:327;;;;:::o;2368:90::-;2402:7;2445:5;2438:13;2431:21;2420:32;;2368:90;;;:::o;2464:109::-;2545:21;2560:5;2545:21;:::i;:::-;2540:3;2533:34;2464:109;;:::o;2579:210::-;2666:4;2704:2;2693:9;2689:18;2681:26;;2717:65;2779:1;2768:9;2764:17;2755:6;2717:65;:::i;:::-;2579:210;;;;:::o;2795:99::-;2847:6;2881:5;2875:12;2865:22;;2795:99;;;:::o;2900:169::-;2984:11;3018:6;3013:3;3006:19;3058:4;3053:3;3049:14;3034:29;;2900:169;;;;:::o;3075:246::-;3156:1;3166:113;3180:6;3177:1;3174:13;3166:113;;;3265:1;3260:3;3256:11;3250:18;3246:1;3241:3;3237:11;3230:39;3202:2;3199:1;3195:10;3190:15;;3166:113;;;3313:1;3304:6;3299:3;3295:16;3288:27;3137:184;3075:246;;;:::o;3327:102::-;3368:6;3419:2;3415:7;3410:2;3403:5;3399:14;3395:28;3385:38;;3327:102;;;:::o;3435:377::-;3523:3;3551:39;3584:5;3551:39;:::i;:::-;3606:71;3670:6;3665:3;3606:71;:::i;:::-;3599:78;;3686:65;3744:6;3739:3;3732:4;3725:5;3721:16;3686:65;:::i;:::-;3776:29;3798:6;3776:29;:::i;:::-;3771:3;3767:39;3760:46;;3527:285;3435:377;;;;:::o;3818:313::-;3931:4;3969:2;3958:9;3954:18;3946:26;;4018:9;4012:4;4008:20;4004:1;3993:9;3989:17;3982:47;4046:78;4119:4;4110:6;4046:78;:::i;:::-;4038:86;;3818:313;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:92::-;4926:7;4970:5;4966:2;4955:21;4944:32;;4890:92;;;:::o;4988:115::-;5073:23;5090:5;5073:23;:::i;:::-;5068:3;5061:36;4988:115;;:::o;5109:218::-;5200:4;5238:2;5227:9;5223:18;5215:26;;5251:69;5317:1;5306:9;5302:17;5293:6;5251:69;:::i;:::-;5109:218;;;;:::o;5333:120::-;5405:23;5422:5;5405:23;:::i;:::-;5398:5;5395:34;5385:62;;5443:1;5440;5433:12;5385:62;5333:120;:::o;5459:137::-;5504:5;5542:6;5529:20;5520:29;;5558:32;5584:5;5558:32;:::i;:::-;5459:137;;;;:::o;5602:472::-;5669:6;5677;5726:2;5714:9;5705:7;5701:23;5697:32;5694:119;;;5732:79;;:::i;:::-;5694:119;5852:1;5877:53;5922:7;5913:6;5902:9;5898:22;5877:53;:::i;:::-;5867:63;;5823:117;5979:2;6005:52;6049:7;6040:6;6029:9;6025:22;6005:52;:::i;:::-;5995:62;;5950:117;5602:472;;;;;:::o;6080:117::-;6189:1;6186;6179:12;6203:180;6251:77;6248:1;6241:88;6348:4;6345:1;6338:15;6372:4;6369:1;6362:15;6389:281;6472:27;6494:4;6472:27;:::i;:::-;6464:6;6460:40;6602:6;6590:10;6587:22;6566:18;6554:10;6551:34;6548:62;6545:88;;;6613:18;;:::i;:::-;6545:88;6653:10;6649:2;6642:22;6432:238;6389:281;;:::o;6676:129::-;6710:6;6737:20;;:::i;:::-;6727:30;;6766:33;6794:4;6786:6;6766:33;:::i;:::-;6676:129;;;:::o;6934:93::-;6970:7;7010:10;7003:5;6999:22;6988:33;;6934:93;;;:::o;7033:120::-;7105:23;7122:5;7105:23;:::i;:::-;7098:5;7095:34;7085:62;;7143:1;7140;7133:12;7085:62;7033:120;:::o;7159:137::-;7204:5;7242:6;7229:20;7220:29;;7258:32;7284:5;7258:32;:::i;:::-;7159:137;;;;:::o;7302:103::-;7338:7;7378:20;7371:5;7367:32;7356:43;;7302:103;;;:::o;7411:120::-;7483:23;7500:5;7483:23;:::i;:::-;7476:5;7473:34;7463:62;;7521:1;7518;7511:12;7463:62;7411:120;:::o;7537:137::-;7582:5;7620:6;7607:20;7598:29;;7636:32;7662:5;7636:32;:::i;:::-;7537:137;;;;:::o;7680:101::-;7716:7;7756:18;7749:5;7745:30;7734:41;;7680:101;;;:::o;7787:120::-;7859:23;7876:5;7859:23;:::i;:::-;7852:5;7849:34;7839:62;;7897:1;7894;7887:12;7839:62;7787:120;:::o;7913:137::-;7958:5;7996:6;7983:20;7974:29;;8012:32;8038:5;8012:32;:::i;:::-;7913:137;;;;:::o;8115:751::-;8200:5;8244:4;8232:9;8227:3;8223:19;8219:30;8216:117;;;8252:79;;:::i;:::-;8216:117;8351:21;8367:4;8351:21;:::i;:::-;8342:30;;8433:1;8473:48;8517:3;8508:6;8497:9;8493:22;8473:48;:::i;:::-;8466:4;8459:5;8455:16;8448:74;8382:151;8593:2;8634:48;8678:3;8669:6;8658:9;8654:22;8634:48;:::i;:::-;8627:4;8620:5;8616:16;8609:74;8543:151;8758:2;8799:48;8843:3;8834:6;8823:9;8819:22;8799:48;:::i;:::-;8792:4;8785:5;8781:16;8774:74;8704:155;8115:751;;;;:::o;8872:401::-;8967:6;9016:2;9004:9;8995:7;8991:23;8987:32;8984:119;;;9022:79;;:::i;:::-;8984:119;9142:1;9167:89;9248:7;9239:6;9228:9;9224:22;9167:89;:::i;:::-;9157:99;;9113:153;8872:401;;;;:::o;9279:619::-;9356:6;9364;9372;9421:2;9409:9;9400:7;9396:23;9392:32;9389:119;;;9427:79;;:::i;:::-;9389:119;9547:1;9572:53;9617:7;9608:6;9597:9;9593:22;9572:53;:::i;:::-;9562:63;;9518:117;9674:2;9700:53;9745:7;9736:6;9725:9;9721:22;9700:53;:::i;:::-;9690:63;;9645:118;9802:2;9828:53;9873:7;9864:6;9853:9;9849:22;9828:53;:::i;:::-;9818:63;;9773:118;9279:619;;;;;:::o;9904:329::-;9963:6;10012:2;10000:9;9991:7;9987:23;9983:32;9980:119;;;10018:79;;:::i;:::-;9980:119;10138:1;10163:53;10208:7;10199:6;10188:9;10184:22;10163:53;:::i;:::-;10153:63;;10109:117;9904:329;;;;:::o;10239:474::-;10307:6;10315;10364:2;10352:9;10343:7;10339:23;10335:32;10332:119;;;10370:79;;:::i;:::-;10332:119;10490:1;10515:53;10560:7;10551:6;10540:9;10536:22;10515:53;:::i;:::-;10505:63;;10461:117;10617:2;10643:53;10688:7;10679:6;10668:9;10664:22;10643:53;:::i;:::-;10633:63;;10588:118;10239:474;;;;;:::o;10719:115::-;10804:23;10821:5;10804:23;:::i;:::-;10799:3;10792:36;10719:115;;:::o;10840:::-;10925:23;10942:5;10925:23;:::i;:::-;10920:3;10913:36;10840:115;;:::o;10961:::-;11046:23;11063:5;11046:23;:::i;:::-;11041:3;11034:36;10961:115;;:::o;11082:430::-;11225:4;11263:2;11252:9;11248:18;11240:26;;11276:69;11342:1;11331:9;11327:17;11318:6;11276:69;:::i;:::-;11355:70;11421:2;11410:9;11406:18;11397:6;11355:70;:::i;:::-;11435;11501:2;11490:9;11486:18;11477:6;11435:70;:::i;:::-;11082:430;;;;;;:::o;11518:117::-;11627:1;11624;11617:12;11641:117;11750:1;11747;11740:12;11764:117;11873:1;11870;11863:12;11900:552;11957:8;11967:6;12017:3;12010:4;12002:6;11998:17;11994:27;11984:122;;12025:79;;:::i;:::-;11984:122;12138:6;12125:20;12115:30;;12168:18;12160:6;12157:30;12154:117;;;12190:79;;:::i;:::-;12154:117;12304:4;12296:6;12292:17;12280:29;;12358:3;12350:4;12342:6;12338:17;12328:8;12324:32;12321:41;12318:128;;;12365:79;;:::i;:::-;12318:128;11900:552;;;;;:::o;12458:817::-;12546:6;12554;12562;12570;12619:2;12607:9;12598:7;12594:23;12590:32;12587:119;;;12625:79;;:::i;:::-;12587:119;12745:1;12770:53;12815:7;12806:6;12795:9;12791:22;12770:53;:::i;:::-;12760:63;;12716:117;12872:2;12898:53;12943:7;12934:6;12923:9;12919:22;12898:53;:::i;:::-;12888:63;;12843:118;13028:2;13017:9;13013:18;13000:32;13059:18;13051:6;13048:30;13045:117;;;13081:79;;:::i;:::-;13045:117;13194:64;13250:7;13241:6;13230:9;13226:22;13194:64;:::i;:::-;13176:82;;;;12971:297;12458:817;;;;;;;:::o;13281:86::-;13316:7;13356:4;13349:5;13345:16;13334:27;;13281:86;;;:::o;13373:112::-;13456:22;13472:5;13456:22;:::i;:::-;13451:3;13444:35;13373:112;;:::o;13491:214::-;13580:4;13618:2;13607:9;13603:18;13595:26;;13631:67;13695:1;13684:9;13680:17;13671:6;13631:67;:::i;:::-;13491:214;;;;:::o;13711:118::-;13798:24;13816:5;13798:24;:::i;:::-;13793:3;13786:37;13711:118;;:::o;13835:222::-;13928:4;13966:2;13955:9;13951:18;13943:26;;13979:71;14047:1;14036:9;14032:17;14023:6;13979:71;:::i;:::-;13835:222;;;;:::o;14063:474::-;14131:6;14139;14188:2;14176:9;14167:7;14163:23;14159:32;14156:119;;;14194:79;;:::i;:::-;14156:119;14314:1;14339:53;14384:7;14375:6;14364:9;14360:22;14339:53;:::i;:::-;14329:63;;14285:117;14441:2;14467:53;14512:7;14503:6;14492:9;14488:22;14467:53;:::i;:::-;14457:63;;14412:118;14063:474;;;;;:::o;14543:763::-;14628:6;14636;14644;14652;14701:3;14689:9;14680:7;14676:23;14672:33;14669:120;;;14708:79;;:::i;:::-;14669:120;14828:1;14853:53;14898:7;14889:6;14878:9;14874:22;14853:53;:::i;:::-;14843:63;;14799:117;14955:2;14981:52;15025:7;15016:6;15005:9;15001:22;14981:52;:::i;:::-;14971:62;;14926:117;15082:2;15108:53;15153:7;15144:6;15133:9;15129:22;15108:53;:::i;:::-;15098:63;;15053:118;15210:2;15236:53;15281:7;15272:6;15261:9;15257:22;15236:53;:::i;:::-;15226:63;;15181:118;14543:763;;;;;;;:::o;15312:105::-;15387:23;15404:5;15387:23;:::i;:::-;15382:3;15375:36;15312:105;;:::o;15423:::-;15498:23;15515:5;15498:23;:::i;:::-;15493:3;15486:36;15423:105;;:::o;15534:::-;15609:23;15626:5;15609:23;:::i;:::-;15604:3;15597:36;15534:105;;:::o;15759:705::-;15928:4;15923:3;15919:14;16017:4;16010:5;16006:16;16000:23;16036:61;16091:4;16086:3;16082:14;16068:12;16036:61;:::i;:::-;15943:164;16190:4;16183:5;16179:16;16173:23;16209:61;16264:4;16259:3;16255:14;16241:12;16209:61;:::i;:::-;16117:163;16367:4;16360:5;16356:16;16350:23;16386:61;16441:4;16436:3;16432:14;16418:12;16386:61;:::i;:::-;16290:167;15897:567;15759:705;;:::o;16470:366::-;16635:4;16673:2;16662:9;16658:18;16650:26;;16686:143;16826:1;16815:9;16811:17;16802:6;16686:143;:::i;:::-;16470:366;;;;:::o;16842:118::-;16879:7;16919:34;16912:5;16908:46;16897:57;;16842:118;;;:::o;16966:::-;17053:24;17071:5;17053:24;:::i;:::-;17048:3;17041:37;16966:118;;:::o;17090:222::-;17183:4;17221:2;17210:9;17206:18;17198:26;;17234:71;17302:1;17291:9;17287:17;17278:6;17234:71;:::i;:::-;17090:222;;;;:::o;17318:180::-;17366:77;17363:1;17356:88;17463:4;17460:1;17453:15;17487:4;17484:1;17477:15;17504:191;17544:3;17563:20;17581:1;17563:20;:::i;:::-;17558:25;;17597:20;17615:1;17597:20;:::i;:::-;17592:25;;17640:1;17637;17633:9;17626:16;;17661:3;17658:1;17655:10;17652:36;;;17668:18;;:::i;:::-;17652:36;17504:191;;;;:::o;17701:180::-;17749:77;17746:1;17739:88;17846:4;17843:1;17836:15;17870:4;17867:1;17860:15;17887:320;17931:6;17968:1;17962:4;17958:12;17948:22;;18015:1;18009:4;18005:12;18036:18;18026:81;;18092:4;18084:6;18080:17;18070:27;;18026:81;18154:2;18146:6;18143:14;18123:18;18120:38;18117:84;;18173:18;;:::i;:::-;18117:84;17938:269;17887:320;;;:::o;18213:157::-;18353:9;18349:1;18341:6;18337:14;18330:33;18213:157;:::o;18376:365::-;18518:3;18539:66;18603:1;18598:3;18539:66;:::i;:::-;18532:73;;18614:93;18703:3;18614:93;:::i;:::-;18732:2;18727:3;18723:12;18716:19;;18376:365;;;:::o;18747:419::-;18913:4;18951:2;18940:9;18936:18;18928:26;;19000:9;18994:4;18990:20;18986:1;18975:9;18971:17;18964:47;19028:131;19154:4;19028:131;:::i;:::-;19020:139;;18747:419;;;:::o;19172:160::-;19312:12;19308:1;19300:6;19296:14;19289:36;19172:160;:::o;19338:366::-;19480:3;19501:67;19565:2;19560:3;19501:67;:::i;:::-;19494:74;;19577:93;19666:3;19577:93;:::i;:::-;19695:2;19690:3;19686:12;19679:19;;19338:366;;;:::o;19710:419::-;19876:4;19914:2;19903:9;19899:18;19891:26;;19963:9;19957:4;19953:20;19949:1;19938:9;19934:17;19927:47;19991:131;20117:4;19991:131;:::i;:::-;19983:139;;19710:419;;;:::o;20135:194::-;20175:4;20195:20;20213:1;20195:20;:::i;:::-;20190:25;;20229:20;20247:1;20229:20;:::i;:::-;20224:25;;20273:1;20270;20266:9;20258:17;;20297:1;20291:4;20288:11;20285:37;;;20302:18;;:::i;:::-;20285:37;20135:194;;;;:::o;20335:160::-;20475:12;20471:1;20463:6;20459:14;20452:36;20335:160;:::o;20501:366::-;20643:3;20664:67;20728:2;20723:3;20664:67;:::i;:::-;20657:74;;20740:93;20829:3;20740:93;:::i;:::-;20858:2;20853:3;20849:12;20842:19;;20501:366;;;:::o;20873:419::-;21039:4;21077:2;21066:9;21062:18;21054:26;;21126:9;21120:4;21116:20;21112:1;21101:9;21097:17;21090:47;21154:131;21280:4;21154:131;:::i;:::-;21146:139;;20873:419;;;:::o;21298:168::-;21438:20;21434:1;21426:6;21422:14;21415:44;21298:168;:::o;21472:366::-;21614:3;21635:67;21699:2;21694:3;21635:67;:::i;:::-;21628:74;;21711:93;21800:3;21711:93;:::i;:::-;21829:2;21824:3;21820:12;21813:19;;21472:366;;;:::o;21844:419::-;22010:4;22048:2;22037:9;22033:18;22025:26;;22097:9;22091:4;22087:20;22083:1;22072:9;22068:17;22061:47;22125:131;22251:4;22125:131;:::i;:::-;22117:139;;21844:419;;;:::o;22269:410::-;22309:7;22332:20;22350:1;22332:20;:::i;:::-;22327:25;;22366:20;22384:1;22366:20;:::i;:::-;22361:25;;22421:1;22418;22414:9;22443:30;22461:11;22443:30;:::i;:::-;22432:41;;22622:1;22613:7;22609:15;22606:1;22603:22;22583:1;22576:9;22556:83;22533:139;;22652:18;;:::i;:::-;22533:139;22317:362;22269:410;;;;:::o;22685:180::-;22733:77;22730:1;22723:88;22830:4;22827:1;22820:15;22854:4;22851:1;22844:15;22871:185;22911:1;22928:20;22946:1;22928:20;:::i;:::-;22923:25;;22962:20;22980:1;22962:20;:::i;:::-;22957:25;;23001:1;22991:35;;23006:18;;:::i;:::-;22991:35;23048:1;23045;23041:9;23036:14;;22871:185;;;;:::o;23062:167::-;23202:19;23198:1;23190:6;23186:14;23179:43;23062:167;:::o;23235:366::-;23377:3;23398:67;23462:2;23457:3;23398:67;:::i;:::-;23391:74;;23474:93;23563:3;23474:93;:::i;:::-;23592:2;23587:3;23583:12;23576:19;;23235:366;;;:::o;23607:419::-;23773:4;23811:2;23800:9;23796:18;23788:26;;23860:9;23854:4;23850:20;23846:1;23835:9;23831:17;23824:47;23888:131;24014:4;23888:131;:::i;:::-;23880:139;;23607:419;;;:::o;24032:168::-;24172:20;24168:1;24160:6;24156:14;24149:44;24032:168;:::o;24206:366::-;24348:3;24369:67;24433:2;24428:3;24369:67;:::i;:::-;24362:74;;24445:93;24534:3;24445:93;:::i;:::-;24563:2;24558:3;24554:12;24547:19;;24206:366;;;:::o;24578:419::-;24744:4;24782:2;24771:9;24767:18;24759:26;;24831:9;24825:4;24821:20;24817:1;24806:9;24802:17;24795:47;24859:131;24985:4;24859:131;:::i;:::-;24851:139;;24578:419;;;:::o;25003:180::-;25051:77;25048:1;25041:88;25148:4;25145:1;25138:15;25172:4;25169:1;25162:15;25189:163;25329:15;25325:1;25317:6;25313:14;25306:39;25189:163;:::o;25358:366::-;25500:3;25521:67;25585:2;25580:3;25521:67;:::i;:::-;25514:74;;25597:93;25686:3;25597:93;:::i;:::-;25715:2;25710:3;25706:12;25699:19;;25358:366;;;:::o;25730:419::-;25896:4;25934:2;25923:9;25919:18;25911:26;;25983:9;25977:4;25973:20;25969:1;25958:9;25954:17;25947:47;26011:131;26137:4;26011:131;:::i;:::-;26003:139;;25730:419;;;:::o;26155:122::-;26228:24;26246:5;26228:24;:::i;:::-;26221:5;26218:35;26208:63;;26267:1;26264;26257:12;26208:63;26155:122;:::o;26283:143::-;26340:5;26371:6;26365:13;26356:22;;26387:33;26414:5;26387:33;:::i;:::-;26283:143;;;;:::o;26432:351::-;26502:6;26551:2;26539:9;26530:7;26526:23;26522:32;26519:119;;;26557:79;;:::i;:::-;26519:119;26677:1;26702:64;26758:7;26749:6;26738:9;26734:22;26702:64;:::i;:::-;26692:74;;26648:128;26432:351;;;;:::o

Swarm Source

ipfs://f385dd87c8c69c6c2a499f6ef1b86f025999a2d3537d134331e8146c1db7c54a

Block Transaction Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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