Contract 0x480985a836cd31225C037847384d8a9D835b4236

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x8da243fa613632e43801a72647047aa8840887189a8cbe42a0a0c0a43e4d5ea1Transfer223229182023-11-06 15:06:2824 days 3 hrs ago0x393716b630634474c5f9c14b17e3ec3cd1c66109 IN  0x480985a836cd31225c037847384d8a9d835b42360 CELO0.00036538
0x0db03761f82f28a6a99352f6010ced84e1bd6a5b330502d99f2cb8508500ed42Transfer223219852023-11-06 13:48:4324 days 4 hrs ago0x49fcf2bd0028da6d89c3194ee5c680d3132b2f79 IN  0x480985a836cd31225c037847384d8a9d835b42360 CELO0.000363895
0x5a418149a5fbc821c961c27c153fc64224d36d3e89469d656e5f26233f8197aaTransfer223219632023-11-06 13:46:5324 days 4 hrs ago0x49fcf2bd0028da6d89c3194ee5c680d3132b2f79 IN  0x480985a836cd31225c037847384d8a9d835b42360 CELO0.00036338
0x5357e8baeeed546deb23bb52826edc9377678fbaa45381660c410ea683cb05caTransfer223219172023-11-06 13:43:0324 days 4 hrs ago0x49fcf2bd0028da6d89c3194ee5c680d3132b2f79 IN  0x480985a836cd31225c037847384d8a9d835b42360 CELO0.000364865
0xc5119217ba7ceed11923a328de4f1a0ac46e4f78f5bcef30671684d8ed714e79Transfer222986522023-11-05 5:24:1825 days 12 hrs ago0x393716b630634474c5f9c14b17e3ec3cd1c66109 IN  0x480985a836cd31225c037847384d8a9d835b42360 CELO0.000362865
0xb9f4b26c8023b38446e34bfcdeb60bd2e88440e2c96dcd66e89c5a8ab60ea083Transfer221866322023-10-29 17:49:1832 days 18 mins ago0xabdbb66e5bb72feaaa10982ff124c3d14d4b8132 IN  0x480985a836cd31225c037847384d8a9d835b42360 CELO0.000364985
0xb2cb0ab193deacf6709b3f0d117dcbf77d6181926931b9724fd8fdad9cad33efTransfer221865072023-10-29 17:38:5332 days 29 mins ago0x910e26fa028b6cd88cfc4afe38f68e5ae9d5fb40 IN  0x480985a836cd31225c037847384d8a9d835b42360 CELO0.000366985
0xf511ba4ffbfb68687889412b7d78d57b083d2985c41b4b67fc630c813a71cc1fTransfer221864672023-10-29 17:35:3332 days 32 mins ago0x78ce617d30e6054734034c79f34fd6e3848419d4 IN  0x480985a836cd31225c037847384d8a9d835b42360 CELO0.00036647
0x04a3c2cfbaf105cd487d59f3f9c917d3784bc2b293d0546b43374e311f55649fTransfer221863982023-10-29 17:29:4832 days 38 mins ago0x05188176c6886fe7229a6920ac04810ef48f8b50 IN  0x480985a836cd31225c037847384d8a9d835b42360 CELO0.000363895
0x086d52c43c5448c6852992467f7446cd7981cef16f4e5b107a240947b79338b7Transfer221863772023-10-29 17:28:0332 days 39 mins ago0x49fcf2bd0028da6d89c3194ee5c680d3132b2f79 IN  0x480985a836cd31225c037847384d8a9d835b42360 CELO0.0003675
0x315b5f1b14becffbd507c6760cd1bcebc6055bd4059ae371e0b88f1a9f2888bcTransfer221863172023-10-29 17:23:0332 days 44 mins ago0xcb9646b70896509e0424a3f7b2d6f47e95b15ba8 IN  0x480985a836cd31225c037847384d8a9d835b42360 CELO0.000366985
0xd692280e10a5372f8dbb793f19f8d72cf991e82a80c0632b57a5b84eebe4551bTransfer221862752023-10-29 17:19:3332 days 48 mins ago0x49002be208d6e0e477816d5b5d091b3cd9635499 IN  0x480985a836cd31225c037847384d8a9d835b42360 CELO0.000364925
0x40296b07bc69d5c4ab94ec4a60f3e1aae0b113625a7247f7868803864310b52dTransfer221861022023-10-29 17:05:0832 days 1 hr ago0x2bb7c0e2da93075fda5852473e45ef3bc69c8e1c IN  0x480985a836cd31225c037847384d8a9d835b42360 CELO0.00036132
0xa9a7ca2c9eb35ffb298b8d81cf2281ed031e945ba266e51dd32c2691754d77a1Transfer221309282023-10-26 12:27:1735 days 5 hrs ago0x910e26fa028b6cd88cfc4afe38f68e5ae9d5fb40 IN  0x480985a836cd31225c037847384d8a9d835b42360 CELO0.000366985
0x9447cdd6b5db60dd89045658bb61a71ecd20debd632a393b6c66efb5c3772b49Transfer221308942023-10-26 12:24:2735 days 5 hrs ago0x393716b630634474c5f9c14b17e3ec3cd1c66109 IN  0x480985a836cd31225c037847384d8a9d835b42360 CELO0.000363895
0xee0d1bb6d5f5b7cef17e45b0c21a6c607451ada4ac45553ba2692ac7f0c71c58Transfer221308782023-10-26 12:23:0735 days 5 hrs ago0x393716b630634474c5f9c14b17e3ec3cd1c66109 IN  0x480985a836cd31225c037847384d8a9d835b42360 CELO0.000278115
0x2de5102d472d1d74ba97a08da3fd434293248c7c85c26ff1c4af4f624deaf201Transfer221308722023-10-26 12:22:3735 days 5 hrs ago0x49002be208d6e0e477816d5b5d091b3cd9635499 IN  0x480985a836cd31225c037847384d8a9d835b42360 CELO0.000363895
0xcb158372994505924a2f13e0a30fad0a0bd8b97b9c9852aa04ea03a7a542a648Transfer221308662023-10-26 12:22:0735 days 5 hrs ago0x393716b630634474c5f9c14b17e3ec3cd1c66109 IN  0x480985a836cd31225c037847384d8a9d835b42360 CELO0.000363895
0x709d7a9a2b7bb1d82cc95d3f6468dafa5fa2b61c47ec2918f51554eb4dead9ddTransfer221308432023-10-26 12:20:1235 days 5 hrs ago0x05188176c6886fe7229a6920ac04810ef48f8b50 IN  0x480985a836cd31225c037847384d8a9d835b42360 CELO0.00036338
0xc26b9b31f5ed9412ba5c75d1d5b8346ae3b38edbd74cf9f27add0681ada623b5Transfer221308002023-10-26 12:16:3735 days 5 hrs ago0xc22daed5ce79dbc05dce129fcabc2353ac7ce03b IN  0x480985a836cd31225c037847384d8a9d835b42360 CELO0.000366985
0x63b856e451edf021294dc886bd88f32ff375e5c59b0cdad3fdfa3d43abf7e177Transfer221307682023-10-26 12:13:5735 days 5 hrs ago0x72d3c4a1092d5ee6aa38b5f45d12c1061739ca34 IN  0x480985a836cd31225c037847384d8a9d835b42360 CELO0.00036235
0xedb4c67fc70fe337ac3f7e5a082ee20e1f922248e747942ea1cb90201a7d9fc1Transfer221305492023-10-26 11:55:4235 days 6 hrs ago0x910e26fa028b6cd88cfc4afe38f68e5ae9d5fb40 IN  0x480985a836cd31225c037847384d8a9d835b42360 CELO0.000363895
0x864339783c53e2c14ca680ff8dc82dc0a0800b474bcee32103ef10597e977a99Transfer221305382023-10-26 11:54:4735 days 6 hrs ago0x78ce617d30e6054734034c79f34fd6e3848419d4 IN  0x480985a836cd31225c037847384d8a9d835b42360 CELO0.000363895
0x07b9910469a8ee4b33c0fce96988dc836bfa0418e8f0225f6cd3633f68a12f13Transfer221305192023-10-26 11:53:1235 days 6 hrs ago0x05188176c6886fe7229a6920ac04810ef48f8b50 IN  0x480985a836cd31225c037847384d8a9d835b42360 CELO0.000363895
0x350c69cb87845bcca194a9593b581adb9bc60a3560e6d330f4ad39798244b069Transfer221305072023-10-26 11:52:1235 days 6 hrs ago0x910e26fa028b6cd88cfc4afe38f68e5ae9d5fb40 IN  0x480985a836cd31225c037847384d8a9d835b42360 CELO0.000363835
[ Download CSV Export 
Parent Txn Hash Block From To Value
Index Block
Loading

Similar Match Source Code
This contract matches the deployed ByteCode of the Source Code for Contract 0x45d747172e77d55575c197cba9451bc2cd8f4958
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.18+commit.87f61d96

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-06-03
*/

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: GPL-3.0-or-later
contract DemurrageTokenSingleNocap {

	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 ) ) 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];
	}

	/// 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;
		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();

		baseValue = toBaseAmount(_value);
		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 ABI

[{"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":[],"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"}]

6101006040523480156200001257600080fd5b50604051620066d8380380620066d8833981810160405281019062000038919062000863565b6801000000000000000083600f0b126200005157600080fd5b6200005b62000578565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508660069081620000ad919062000b84565b508560079081620000bf919062000b84565b508460ff16608081815250504260038190555060035460a08181525050603c83620000eb919062000c9a565b60c08181525050620001126001620002a9640100000000026200325b176401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506200016c84620002d06401000000000262003281176401000000009004565b600f0b60e081600f0b81525050620001a86000600260009054906101000a9004600f0b6000600162000324640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505081600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000ce5565b6000677fffffffffffffff821115620002c157600080fd5b6040829060020a029050919050565b60008082600f0b13620002e257600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af6200030f84620003a8640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b6200032e62000578565b6200033862000578565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b60008082600f0b13620003ba57600080fd5b60008083600f0b9050680100000000000000008112620003f6576040819060008212600003808260020a82851804189250505090506040820191505b640100000000811262000425576020819060008212600003808260020a82851804189250505090506020820191505b62010000811262000452576010819060008212600003808260020a82851804189250505090506010820191505b61010081126200047e576008819060008212600003808260020a82851804189250505090506008820191505b60108112620004a9576004819060008212600003808260020a82851804189250505090506004820191505b60048112620004d4576002819060008212600003808260020a82851804189250505090506002820191505b60028112620004e4576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b60008113156200056b578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a828518041892505050905062000511565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200061d82620005d2565b810181811067ffffffffffffffff821117156200063f576200063e620005e3565b5b80604052505050565b600062000654620005b4565b905062000662828262000612565b919050565b600067ffffffffffffffff821115620006855762000684620005e3565b5b6200069082620005d2565b9050602081019050919050565b60005b83811015620006bd578082015181840152602081019050620006a0565b60008484015250505050565b6000620006e0620006da8462000667565b62000648565b905082815260208101848484011115620006ff57620006fe620005cd565b5b6200070c8482856200069d565b509392505050565b600082601f8301126200072c576200072b620005c8565b5b81516200073e848260208601620006c9565b91505092915050565b600060ff82169050919050565b6200075f8162000747565b81146200076b57600080fd5b50565b6000815190506200077f8162000754565b92915050565b600081600f0b9050919050565b6200079d8162000785565b8114620007a957600080fd5b50565b600081519050620007bd8162000792565b92915050565b6000819050919050565b620007d881620007c3565b8114620007e457600080fd5b50565b600081519050620007f881620007cd565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200082b82620007fe565b9050919050565b6200083d816200081e565b81146200084957600080fd5b50565b6000815190506200085d8162000832565b92915050565b60008060008060008060c08789031215620008835762000882620005be565b5b600087015167ffffffffffffffff811115620008a457620008a3620005c3565b5b620008b289828a0162000714565b965050602087015167ffffffffffffffff811115620008d657620008d5620005c3565b5b620008e489828a0162000714565b9550506040620008f789828a016200076e565b94505060606200090a89828a01620007ac565b93505060806200091d89828a01620007e7565b92505060a06200093089828a016200084c565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200099057607f821691505b602082108103620009a657620009a562000948565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000a137fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620009d1565b62000a1f8683620009d1565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000a6262000a5c62000a5684620007c3565b62000a37565b620007c3565b9050919050565b6000819050919050565b62000a7e8362000a41565b62000a9662000a8d8262000a69565b848454620009e1565b825550505050565b600090565b62000aad62000a9e565b62000aba81848462000a73565b505050565b5b8181101562000ae25762000ad660008262000aa3565b60018101905062000ac0565b5050565b601f82111562000b315762000afb81620009ac565b62000b0684620009c1565b8101602085101562000b16578190505b62000b2e62000b2585620009c1565b83018262000abf565b50505b505050565b60008160020a8304905092915050565b600062000b596000198460080262000b36565b1980831691505092915050565b600062000b74838362000b46565b9150826002028217905092915050565b62000b8f826200093d565b67ffffffffffffffff81111562000bab5762000baa620005e3565b5b62000bb7825462000977565b62000bc482828562000ae6565b600060209050601f83116001811462000bfc576000841562000be7578287015190505b62000bf3858262000b66565b86555062000c63565b601f19841662000c0c86620009ac565b60005b8281101562000c365784890151825560018201915060208501945060208101905062000c0f565b8683101562000c56578489015162000c52601f89168262000b46565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000ca782620007c3565b915062000cb483620007c3565b925082820262000cc481620007c3565b9150828204841483151762000cde5762000cdd62000c6b565b5b5092915050565b60805160a05160c05160e05161597362000d65600039600081816117f1015281816126dc015281816128c90152612cc5015260008181611f3e0152818161269f01528181612c1d01528181612e62015261308a015260008181611f6a01528181612e8e015281816130ab01526130f00152600061184f01526159736000f3fe608060405234801561001057600080fd5b50600436106103d7576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e11610211578063a2309ff811610137578063d7a52fa9116100ca578063e69571af11610099578063e69571af14610ca8578063e809529514610cd8578063eda4e6d614610cf6578063f2fde38b14610d14576103d7565b8063d7a52fa914610c0e578063d89135cd14610c2a578063da2824a814610c48578063e54063a614610c78576103d7565b8063b470aade11610106578063b470aade14610b84578063c0ab707714610ba2578063d340ef8a14610bd2578063d5abeb0114610bf0576103d7565b8063a2309ff814610ae8578063a457c2d714610b06578063a9059cbb14610b36578063b1cb0db314610b66576103d7565b806386fe212d116101af5780638f1df6bc1161017e5780638f1df6bc14610a7257806394d008ef14610a9057806395d89b4114610aac5780639f24880814610aca576103d7565b806386fe212d146109ec5780638832e6e314610a1c5780638da5cb5b14610a385780638f0b2d5d14610a56576103d7565b8063731f237c116101eb578063731f237c146109625780637445e33a1461098057806374bedb95146109b057806384dde4af146109ce576103d7565b80636a2d094e146108e65780636f8b44b01461091657806370a0823114610932576103d7565b8063313334871161030157806344df8e701161029457806358b2833b1161026357806358b2833b1461084a5780635ae06f7e146108685780635f408c04146108985780636787a9be146108b6576103d7565b806344df8e701461079c57806347a50517146107ba5780634abfbba2146107ea57806351b4541c1461081a576103d7565b806340452d91116102d057806340452d91146106ee57806342966c6814610720578063449a52f81461075057806344d1718714610780576103d7565b80633133348714610652578063313ce5671461068257806331a5995d146106a057806339509351146106be576103d7565b806318cbbcfc1161037957806323b872dd1161034857806323b872dd146105925780632a7aec09146105c25780632b29ba23146105f25780632c1758c114610622576103d7565b806318cbbcfc146104f65780631989c6a814610514578063213d1e1e1461053257806323a8594414610562576103d7565b8063095ea7b3116103b5578063095ea7b31461045a57806309f28f3c1461048a57806311c56615146104a857806318160ddd146104d8576103d7565b806301681a62146103dc57806301ffc9a71461040c57806306fdde031461043c575b600080fd5b6103f660048036038101906103f19190614be8565b610d44565b6040516104039190614c2e565b60405180910390f35b61042660048036038101906104219190614ca1565b610e2d565b6040516104339190614ce9565b60405180910390f35b61044461111b565b6040516104519190614d94565b60405180910390f35b610474600480360381019061046f9190614de2565b6111a9565b6040516104819190614ce9565b60405180910390f35b6104926113e5565b60405161049f9190614e3e565b60405180910390f35b6104c260048036038101906104bd9190614e85565b6113f8565b6040516104cf9190614c2e565b60405180910390f35b6104e0611448565b6040516104ed9190614c2e565b60405180910390f35b6104fe61145f565b60405161050b9190614c2e565b60405180910390f35b61051c611464565b6040516105299190614c2e565b60405180910390f35b61054c60048036038101906105479190615066565b611470565b6040516105599190614c2e565b60405180910390f35b61057c60048036038101906105779190615066565b611489565b6040516105899190614ce9565b60405180910390f35b6105ac60048036038101906105a79190615093565b6114f1565b6040516105b99190614ce9565b60405180910390f35b6105dc60048036038101906105d79190615066565b61170f565b6040516105e99190614e3e565b60405180910390f35b61060c60048036038101906106079190614be8565b611747565b6040516106199190614ce9565b60405180910390f35b61063c600480360381019061063791906150e6565b61179d565b6040516106499190614ce9565b60405180910390f35b61066c60048036038101906106679190615113565b6117d0565b6040516106799190614c2e565b60405180910390f35b61068a61184d565b6040516106979190614c2e565b60405180910390f35b6106a8611871565b6040516106b59190614c2e565b60405180910390f35b6106d860048036038101906106d39190614de2565b611877565b6040516106e59190614ce9565b60405180910390f35b610708600480360381019061070391906150e6565b611a0d565b60405161071793929190615180565b60405180910390f35b61073a600480360381019061073591906150e6565b611a7c565b6040516107479190614ce9565b60405180910390f35b61076a60048036038101906107659190614de2565b611c4d565b6040516107779190614ce9565b60405180910390f35b61079a6004803603810190610795919061521c565b611e24565b005b6107a4611ea2565b6040516107b19190614ce9565b60405180910390f35b6107d460048036038101906107cf9190614be8565b611ef1565b6040516107e19190614c2e565b60405180910390f35b61080460048036038101906107ff91906150e6565b611f3a565b6040516108119190614c2e565b60405180910390f35b610834600480360381019061082f91906150e6565b611f9a565b6040516108419190614c2e565b60405180910390f35b610852611fbb565b60405161085f9190614c2e565b60405180910390f35b610882600480360381019061087d9190614be8565b611fc1565b60405161088f9190614ce9565b60405180910390f35b6108a06120cb565b6040516108ad91906152ac565b60405180910390f35b6108d060048036038101906108cb91906150e6565b612198565b6040516108dd9190614c2e565b60405180910390f35b61090060048036038101906108fb91906150e6565b6121d9565b60405161090d9190614c2e565b60405180910390f35b610930600480360381019061092b91906150e6565b6121fa565b005b61094c60048036038101906109479190614be8565b6122c2565b6040516109599190614c2e565b60405180910390f35b61096a612329565b6040516109779190614c2e565b60405180910390f35b61099a60048036038101906109959190615066565b61233a565b6040516109a79190614c2e565b60405180910390f35b6109b8612368565b6040516109c59190614c2e565b60405180910390f35b6109d661236e565b6040516109e391906152d6565b60405180910390f35b610a066004803603810190610a0191906150e6565b612394565b604051610a139190614c2e565b60405180910390f35b610a366004803603810190610a31919061521c565b61247b565b005b610a4061248c565b604051610a4d91906152d6565b60405180910390f35b610a706004803603810190610a6b9190614be8565b6124b2565b005b610a7a612567565b604051610a879190614ce9565b60405180910390f35b610aaa6004803603810190610aa5919061521c565b612828565b005b610ab4612839565b604051610ac19190614d94565b60405180910390f35b610ad26128c7565b604051610adf9190614e3e565b60405180910390f35b610af06128eb565b604051610afd9190614c2e565b60405180910390f35b610b206004803603810190610b1b9190614de2565b6128f5565b604051610b2d9190614ce9565b60405180910390f35b610b506004803603810190610b4b9190614de2565b612b14565b604051610b5d9190614ce9565b60405180910390f35b610b6e612c15565b604051610b7b9190614c2e565b60405180910390f35b610b8c612c1b565b604051610b999190614c2e565b60405180910390f35b610bbc6004803603810190610bb791906150e6565b612c3f565b604051610bc99190614c2e565b60405180910390f35b610bda612dc6565b604051610be79190614c2e565b60405180910390f35b610bf8612dcc565b604051610c059190614c2e565b60405180910390f35b610c286004803603810190610c2391906150e6565b612dd2565b005b610c32612f12565b604051610c3f9190614c2e565b60405180910390f35b610c626004803603810190610c5d9190614be8565b612f1c565b604051610c6f9190614ce9565b60405180910390f35b610c926004803603810190610c8d9190615066565b612ff0565b604051610c9f9190614c2e565b60405180910390f35b610cc26004803603810190610cbd91906152f1565b613004565b604051610ccf91906153c7565b60405180910390f35b610ce0613084565b604051610ced919061540d565b60405180910390f35b610cfe6130ee565b604051610d0b9190614c2e565b60405180910390f35b610d2e6004803603810190610d299190614be8565b613112565b604051610d3b9190614ce9565b60405180910390f35b600080600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610e1d9190615457565b9250508190555080915050919050565b600063b61bc9417c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610e815760019050611116565b635878bcf47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610ed35760019050611116565b63bc4babdd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610f255760019050611116565b630d7491f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610f775760019050611116565b63abe1f1f57c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610fc95760019050611116565b63841a0e947c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361101b5760019050611116565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361106d5760019050611116565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036110bf5760019050611116565b63d00179687c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036111115760019050611116565b600090505b919050565b60068054611128906154ba565b80601f0160208091040260200160405190810160405280929190818152602001828054611154906154ba565b80156111a15780601f10611176576101008083540402835291602001916111a1565b820191906000526020600020905b81548152906001019060200180831161118457829003601f168201915b505050505081565b60008060006111b66120cb565b905060028160ff16036111ce576000925050506113df565b60008160ff161115611215576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120c90615537565b60405180910390fd5b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156112de57600084146112dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d4906155a3565b60405180910390fd5b5b6112e6612567565b506112f084612198565b915081600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925866040516113d09190614c2e565b60405180910390a36001925050505b92915050565b600260009054906101000a9004600f0b81565b60008061141f6114078561325b565b61141a611414600161325b565b866132c3565b61332a565b905061142a816133a9565b67ffffffffffffffff168461143f91906155c3565b91505092915050565b6000600b5460085461145a91906155c3565b905090565b600f81565b60008080549050905090565b6000816020015168ffffffffffffffffff169050919050565b600080826000015163ffffffff1611156114a657600090506114ec565b6000826020015168ffffffffffffffffff1611156114c757600090506114ec565b6000826040015167ffffffffffffffff1611156114e757600090506114ec565b600190505b919050565b6000806000806114ff6120cb565b905060028160ff16036115185760009350505050611708565b60008160ff16111561155f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155690615537565b60405180910390fd5b611567612567565b5061157185612198565b925082600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156115fc57600080fd5b82600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461168891906155c3565b9250508190555061169a8787856133de565b91508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516116f99190614c2e565b60405180910390a38193505050505b9392505050565b60008067ffffffffffffffff836040015160070b169050600081600f0b0361173e5761173b600161325b565b90505b80915050919050565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600f82106117ac57600080fd5b600082036117c157600f6012541490506117cb565b8160125483161490505b919050565b6000806000806117df8661325b565b92506117ea8561325b565b91506118167f00000000000000000000000000000000000000000000000000000000000000008361332a565b905061182181613401565b905061182d838261332a565b9050611838816133a9565b67ffffffffffffffff16935050505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60125481565b600080611882612567565b5061188c83612198565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461191a9190615457565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516119fa9190614c2e565b60405180910390a3600191505092915050565b60008181548110611a1d57600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900467ffffffffffffffff16905083565b600080611a876120cb565b60ff1614611a9457600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611b395750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611b78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6f90615643565b60405180910390fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115611bc457600080fd5b6000611bcf83612198565b9050611bdb338261348e565b5082600b6000828254611bee9190615457565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca584604051611c3b9190614c2e565b60405180910390a26001915050919050565b6000806000611c5a6120cb565b60ff1614611c6757600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611d0c5750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611d4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4290615643565b60405180910390fd5b611d53612567565b5060006011541115611d7c5760115483600854611d709190615457565b1115611d7b57600080fd5b5b8260086000828254611d8e9190615457565b92505081905550611d9e83612198565b9050611daa8482613592565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051611e089190614c2e565b60405180910390a3611e18613653565b50600191505092915050565b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614611e92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e89906156af565b60405180910390fd5b611e9b83611a7c565b5050505050565b6000611eec600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a7c565b905090565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082611f6891906156cf565b7f0000000000000000000000000000000000000000000000000000000000000000611f939190615457565b9050919050565b6000603c8242611faa91906155c3565b611fb49190615740565b9050919050565b60035481565b6000611fd0600160ff1661179d565b15611fda57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061206157503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b61206a57600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000601060009054906101000a900460ff16156120eb5760019050612195565b6000600f54036120fe5760009050612195565b600f5442106121905761212b603c6003546121199190615740565b600f5461212691906155c3565b612c3f565b506001601060006101000a81548160ff0219169083151502179055507ff80dbaea4785589e52984ca36a31de106adc77759539a5c7d92883bf49692fe9426040516121769190614c2e565b60405180910390a1612186612567565b5060029050612195565b600090505b90565b6000806121bc6121a78461325b565b600260009054906101000a9004600f0b613817565b90506121c7816133a9565b67ffffffffffffffff16915050919050565b6000603c82426121e991906155c3565b6121f39190615740565b9050919050565b612207600860ff1661179d565b1561221157600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461226b57600080fd5b612273611448565b811161227e57600080fd5b6011547f9722adea12ab7ef86fc45b88f0e0b567639e8dddaae60261e08c03d747fbbfe6826040516122b09190614c2e565b60405180910390a28060118190555050565b6000806000806122d96122d486611ef1565b61325b565b92506122e6600354611f9a565b905061230183600260009054906101000a9004600f0b61332a565b915061231f61230f836133a9565b67ffffffffffffffff16826117d0565b9350505050919050565b60006123356000612c3f565b905090565b600080600061234884611470565b91506123538461170f565b905061235f82826113f8565b92505050919050565b600a5481565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000601082106123d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d0906157bd565b60405180910390fd5b6000601254831614612420576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241790615829565b60405180910390fd5b81601260008282541792505081905550600f6012541415157f6b7e2e653f93b645d4ed7292d6429f96637084363e477c8aaea1a43ed13c284e6012546040516124699190614c2e565b60405180910390a26012549050919050565b6124858484611c4d565b5050505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6124bf600260ff1661179d565b156124c957600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461252357600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000612571614b3a565b612579614b3a565b612581614b3a565b6000806000806000612591612329565b5061259a6138a3565b97506125a588611489565b156125bb57600098505050505050505050612825565b6000600954815481106125d1576125d0615849565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050955061267e88612ff0565b945060018561268d9190615457565b90506126988661170f565b9350603c857f00000000000000000000000000000000000000000000000000000000000000006126c891906156cf565b6126d29190615740565b915061270e6127097f00000000000000000000000000000000000000000000000000000000000000006127048561325b565b61332a565b613401565b925061272460008461271e611448565b84613004565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050506127e087613a39565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d675816040516128109190614c2e565b60405180910390a16001985050505050505050505b90565b6128328484611c4d565b5050505050565b60078054612846906154ba565b80601f0160208091040260200160405190810160405280929190818152602001828054612872906154ba565b80156128bf5780601f10612894576101008083540402835291602001916128bf565b820191906000526020600020905b8154815290600101906020018083116128a257829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600854905090565b60008061290183612198565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561298c57600080fd5b612994612567565b5080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a2191906155c3565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054604051612b019190614c2e565b60405180910390a3600191505092915050565b600080600080612b226120cb565b905060028160ff1603612b3b5760009350505050612c0f565b60008160ff161115612b82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b7990615537565b60405180910390fd5b612b8a612567565b50612b9485612198565b9250612ba13387856133de565b91508573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef87604051612c009190614c2e565b60405180910390a38193505050505b92915050565b600f5481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000806000601060009054906101000a900460ff1615612c69576000945050505050612dc1565b612c74600354611f9a565b925060008303612c8b576000945050505050612dc1565b600260009054906101000a9004600f0b9050600086118015612cac57508286105b15612cb5578592505b612cbe8361325b565b9150612cea7f00000000000000000000000000000000000000000000000000000000000000008361332a565b9350612cf584613401565b9350612d10600260009054906101000a9004600f0b8561332a565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c83612d5891906156cf565b600354612d659190615457565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b604051612db19190614e3e565b60405180910390a4829450505050505b919050565b60095481565b60115481565b600080612de2600460ff1661179d565b15612dec57600080fd5b601060009054906101000a900460ff1615612e0657600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612e6057600080fd5b7f000000000000000000000000000000000000000000000000000000000000000083612e8c91906156cf565b7f0000000000000000000000000000000000000000000000000000000000000000612eb79190615457565b9150600f548211612ec757600080fd5b600f54905081600f81905550807ff5bd6cb27a0006b5ea8618058a0d84719695cb6d984f4840bc1a54ca12ae4b7c600f54604051612f059190614c2e565b60405180910390a2505050565b6000600b54905090565b6000612f2b600160ff1661179d565b15612f3557600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612f8f57600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000816000015163ffffffff169050919050565b61300c614b3a565b613014614b3a565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000426130d591906155c3565b6130df9190615740565b6130e99190615457565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461316f57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36001915050919050565b6000677fffffffffffffff82111561327257600080fd5b6040829060020a029050919050565b60008082600f0b1361329257600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af6132ae84613b58565b600f0b02908060020a82049150509050919050565b60008082600f0b84600f0b0390507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561331757506f7fffffffffffffffffffffffffffffff600f0b8113155b61332057600080fd5b8091505092915050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561339657506f7fffffffffffffffffffffffffffffff600f0b8113155b61339f57600080fd5b8091505092915050565b60008082600f0b12156133bb57600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b60006133ea848361348e565b506133f58383613592565b50600190509392505050565b60006840000000000000000082600f0b1261341b57600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b121561344f5760009050613489565b6134866080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a828518041892505050613d1e565b90505b919050565b6000806000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600084036134e85760009250505061358c565b6134f185611ef1565b915083821015613536576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161352d906158c4565b60405180910390fd5b838261354291906155c3565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001925050505b92915050565b6000806000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600084036135ec5760009250505061364d565b6135f585611ef1565b915083826136039190615457565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001925050505b92915050565b600061365d614b3a565b6000613667611448565b90506000600160008054905061367d91906155c3565b8154811061368e5761368d615849565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff1681525050816000600160008054905061376991906155c3565b8154811061377a57613779615849565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060019250505090565b60008082600f0b0361382857600080fd5b600082600f0b604085600f0b9060020a028161384757613846615711565b5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561389057506f7fffffffffffffffffffffffffffffff600f0b8113155b61389957600080fd5b8091505092915050565b6138ab614b3a565b6138b3614b3a565b6138bb614b3a565b600080600954815481106138d2576138d1615849565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa1580156139dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a019190615910565b6fffffffffffffffffffffffffffffffff169050613a1e83612ff0565b8111613a2f57819350505050613a36565b8293505050505b90565b6000806000613a478461233a565b613a4f611448565b613a5991906155c3565b9150600a54613a6783612198565b613a7191906155c3565b9050613a9f600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682613592565b50836000015163ffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d384604051613b139190614c2e565b60405180910390a3600160096000828254613b2e9190615457565b9250508190555080600a6000828254613b479190615457565b925050819055508192505050919050565b60008082600f0b13613b6957600080fd5b60008083600f0b9050680100000000000000008112613ba4576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112613bd2576020819060008212600003808260020a82851804189250505090506020820191505b620100008112613bfe576010819060008212600003808260020a82851804189250505090506010820191505b6101008112613c29576008819060008212600003808260020a82851804189250505090506008820191505b60108112613c53576004819060008212600003808260020a82851804189250505090506004820191505b60048112613c7d576002819060008212600003808260020a82851804189250505090506002820191505b60028112613c8c576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b6000811315613d11578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050613cb9565b5081945050505050919050565b60006840000000000000000082600f0b12613d3857600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b1215613d6c5760009050614b35565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b1315613dba57608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b1315613df35760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b1315613e2c5760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b1315613e6557608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b1315613e9e5760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b1315613ed7576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b1315613f1057608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b1315613f49576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b1315613f8157608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b1315613fb95760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b1315613ff1576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b13156140295760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b1315614061576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b131561409957608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b13156140d15760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b131561410957608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b13156141405760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b1315614177576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b13156141ae57608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b13156141e5576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b131561421c57608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b13156142535760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b131561428a576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b13156142c15760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b13156142f7576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b131561432d57608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b13156143635760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b131561439957608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b13156143cf5760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b1315614405576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b131561443b57608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b1315614471576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b13156144a657608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b13156144db5760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b1315614510576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b13156145455760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b131561457a576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b13156145af57608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b13156145e45760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b131561461957608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b131561464d5760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b1315614681576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b13156146b557608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b13156146e9576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b131561471d57608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b13156147515760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b1315614785576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b13156147b95760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b13156147ec576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b131561481f57608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b13156148525760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b131561488557608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b13156148b85760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b13156148eb576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b131561491e57608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b1315614951576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b131561498357608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b13156149b55760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b13156149e7576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b1315614a195760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b1315614a4b576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b1315614a7d57608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b1315614aaf5760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b1315614ae157608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b811115614b3057600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614bb582614b8a565b9050919050565b614bc581614baa565b8114614bd057600080fd5b50565b600081359050614be281614bbc565b92915050565b600060208284031215614bfe57614bfd614b80565b5b6000614c0c84828501614bd3565b91505092915050565b6000819050919050565b614c2881614c15565b82525050565b6000602082019050614c436000830184614c1f565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b614c7e81614c49565b8114614c8957600080fd5b50565b600081359050614c9b81614c75565b92915050565b600060208284031215614cb757614cb6614b80565b5b6000614cc584828501614c8c565b91505092915050565b60008115159050919050565b614ce381614cce565b82525050565b6000602082019050614cfe6000830184614cda565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614d3e578082015181840152602081019050614d23565b60008484015250505050565b6000601f19601f8301169050919050565b6000614d6682614d04565b614d708185614d0f565b9350614d80818560208601614d20565b614d8981614d4a565b840191505092915050565b60006020820190508181036000830152614dae8184614d5b565b905092915050565b614dbf81614c15565b8114614dca57600080fd5b50565b600081359050614ddc81614db6565b92915050565b60008060408385031215614df957614df8614b80565b5b6000614e0785828601614bd3565b9250506020614e1885828601614dcd565b9150509250929050565b600081600f0b9050919050565b614e3881614e22565b82525050565b6000602082019050614e536000830184614e2f565b92915050565b614e6281614e22565b8114614e6d57600080fd5b50565b600081359050614e7f81614e59565b92915050565b60008060408385031215614e9c57614e9b614b80565b5b6000614eaa85828601614dcd565b9250506020614ebb85828601614e70565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614f0282614d4a565b810181811067ffffffffffffffff82111715614f2157614f20614eca565b5b80604052505050565b6000614f34614b76565b9050614f408282614ef9565b919050565b600063ffffffff82169050919050565b614f5e81614f45565b8114614f6957600080fd5b50565b600081359050614f7b81614f55565b92915050565b600068ffffffffffffffffff82169050919050565b614f9f81614f81565b8114614faa57600080fd5b50565b600081359050614fbc81614f96565b92915050565b600067ffffffffffffffff82169050919050565b614fdf81614fc2565b8114614fea57600080fd5b50565b600081359050614ffc81614fd6565b92915050565b60006060828403121561501857615017614ec5565b5b6150226060614f2a565b9050600061503284828501614f6c565b600083015250602061504684828501614fad565b602083015250604061505a84828501614fed565b60408301525092915050565b60006060828403121561507c5761507b614b80565b5b600061508a84828501615002565b91505092915050565b6000806000606084860312156150ac576150ab614b80565b5b60006150ba86828701614bd3565b93505060206150cb86828701614bd3565b92505060406150dc86828701614dcd565b9150509250925092565b6000602082840312156150fc576150fb614b80565b5b600061510a84828501614dcd565b91505092915050565b6000806040838503121561512a57615129614b80565b5b600061513885828601614dcd565b925050602061514985828601614dcd565b9150509250929050565b61515c81614f45565b82525050565b61516b81614f81565b82525050565b61517a81614fc2565b82525050565b60006060820190506151956000830186615153565b6151a26020830185615162565b6151af6040830184615171565b949350505050565b600080fd5b600080fd5b600080fd5b60008083601f8401126151dc576151db6151b7565b5b8235905067ffffffffffffffff8111156151f9576151f86151bc565b5b602083019150836001820283011115615215576152146151c1565b5b9250929050565b6000806000806060858703121561523657615235614b80565b5b600061524487828801614bd3565b945050602061525587828801614dcd565b935050604085013567ffffffffffffffff81111561527657615275614b85565b5b615282878288016151c6565b925092505092959194509250565b600060ff82169050919050565b6152a681615290565b82525050565b60006020820190506152c1600083018461529d565b92915050565b6152d081614baa565b82525050565b60006020820190506152eb60008301846152c7565b92915050565b6000806000806080858703121561530b5761530a614b80565b5b600061531987828801614dcd565b945050602061532a87828801614e70565b935050604061533b87828801614dcd565b925050606061534c87828801614dcd565b91505092959194509250565b61536181614f45565b82525050565b61537081614f81565b82525050565b61537f81614fc2565b82525050565b60608201600082015161539b6000850182615358565b5060208201516153ae6020850182615367565b5060408201516153c16040850182615376565b50505050565b60006060820190506153dc6000830184615385565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b615407816153e2565b82525050565b600060208201905061542260008301846153fe565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061546282614c15565b915061546d83614c15565b925082820190508082111561548557615484615428565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806154d257607f821691505b6020821081036154e5576154e461548b565b5b50919050565b7f4558504952454400000000000000000000000000000000000000000000000000600082015250565b6000615521600783614d0f565b915061552c826154eb565b602082019050919050565b6000602082019050818103600083015261555081615514565b9050919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b600061558d600a83614d0f565b915061559882615557565b602082019050919050565b600060208201905081810360008301526155bc81615580565b9050919050565b60006155ce82614c15565b91506155d983614c15565b92508282039050818111156155f1576155f0615428565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b600061562d600a83614d0f565b9150615638826155f7565b602082019050919050565b6000602082019050818103600083015261565c81615620565b9050919050565b7f4552525f4f4e4c595f53454c465f4255524e0000000000000000000000000000600082015250565b6000615699601283614d0f565b91506156a482615663565b602082019050919050565b600060208201905081810360008301526156c88161568c565b9050919050565b60006156da82614c15565b91506156e583614c15565b92508282026156f381614c15565b9150828204841483151761570a57615709615428565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061574b82614c15565b915061575683614c15565b92508261576657615765615711565b5b828204905092915050565b7f4552525f494e56414c49445f5354415445000000000000000000000000000000600082015250565b60006157a7601183614d0f565b91506157b282615771565b602082019050919050565b600060208201905081810360008301526157d68161579a565b9050919050565b7f4552525f414c52454144595f4c4f434b45440000000000000000000000000000600082015250565b6000615813601283614d0f565b915061581e826157dd565b602082019050919050565b6000602082019050818103600083015261584281615806565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b60006158ae600d83614d0f565b91506158b982615878565b602082019050919050565b600060208201905081810360008301526158dd816158a1565b9050919050565b6158ed816153e2565b81146158f857600080fd5b50565b60008151905061590a816158e4565b92915050565b60006020828403121561592657615925614b80565b5b6000615934848285016158fb565b9150509291505056fea2646970667358221220328f0fbbc2c230ab0b2baa7351327ca952449758c2fcb28fb33fe2b826f38dba64736f6c6343000812003300000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000fffff8276fb8cfff000000000000000000000000000000000000000000000000000000000000a8c00000000000000000000000005523058cdffe5f3c1eadadd5015e55c6e00fb4390000000000000000000000000000000000000000000000000000000000000006536172616675000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035352460000000000000000000000000000000000000000000000000000000000

Deployed ByteCode Sourcemap

26344:23454:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35536:175;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49154:641;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26944:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45090:492;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26684:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39315:317;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48742:85;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30123:41;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38030:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37437:152;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43968:303;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46884:526;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37669:299;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33925:93;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31391:205;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44342:403;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27038:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29939:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46028:310;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26475:43;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;48037:382;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35838:511;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48447:161;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48636:79;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34525:105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43555:142;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42183:135;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26812:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33692:205;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32985:335;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44827:196;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43792:121;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32172:200;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34046:437;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42429:92;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39637:413;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27191:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28465:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31105:281;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36536:135;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26874:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32421:157;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40809:1269;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36377:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26990:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28105:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49048:76;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45619:370;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46405:412;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28541:22;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27975:39;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42555:944;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27123:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28601:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31727:361;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48897:76;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33413:176;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37220:153;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36718:428;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38663:132;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27874:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47686:237;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35536:175;35585:7;35599:9;35619:7;:19;35627:10;35619:19;;;;;;;;;;;;;;;;35615:23;;35665:1;35643:7;:19;35651:10;35643:19;;;;;;;;;;;;;;;:23;;;;35692:1;35671:7;:17;35679:8;35671:17;;;;;;;;;;;;;;;;:22;;;;;;;:::i;:::-;;;;;;;;35705:1;35698:8;;;35536:175;;;:::o;49154:641::-;49215:4;49238:10;49230:18;;:4;:18;;;;49226:56;;49272:4;49265:11;;;;49226:56;49298:10;49290:18;;:4;:18;;;;49286:57;;49333:4;49326:11;;;;49286:57;49359:10;49351:18;;:4;:18;;;;49347:57;;49394:4;49387:11;;;;49347:57;49420:10;49412:18;;:4;:18;;;;49408:55;;49453:4;49446:11;;;;49408:55;49479:10;49471:18;;:4;:18;;;;49467:57;;49514:4;49507:11;;;;49467:57;49540:10;49532:18;;:4;:18;;;;49528:57;;49575:4;49568:11;;;;49528:57;49601:10;49593:18;;:4;:18;;;;49589:57;;49636:4;49629:11;;;;49589:57;49662:10;49654:18;;:4;:18;;;;49650:57;;49697:4;49690:11;;;;49650:57;49723:10;49715:18;;:4;:18;;;;49711:63;;49764:4;49757:11;;;;49711:63;49785:5;49778:12;;49154:641;;;;:::o;26944:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;45090:492::-;45157:4;45168:17;45190:8;45210:13;:11;:13::i;:::-;45205:18;;45238:1;45232:2;:7;;;45228:85;;45254:5;45247:12;;;;;;45228:85;45281:1;45276:2;:6;;;45272:41;;;45290:17;;;;;;;;;;:::i;:::-;;;;;;;;45272:41;45355:1;45321:9;:21;45331:10;45321:21;;;;;;;;;;;;;;;:31;45343:8;45321:31;;;;;;;;;;;;;;;;:35;45317:87;;;45382:1;45372:6;:11;45364:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;45317:87;45412:14;:12;:14::i;:::-;;45445:20;45458:6;45445:12;:20::i;:::-;45433:32;;45504:9;45470;:21;45480:10;45470:21;;;;;;;;;;;;;;;:31;45492:8;45470:31;;;;;;;;;;;;;;;:43;;;;45544:8;45523:38;;45532:10;45523:38;;;45554:6;45523:38;;;;;;:::i;:::-;;;;;;;;45573:4;45566:11;;;;45090:492;;;;;:::o;26684:29::-;;;;;;;;;;;;;:::o;39315:317::-;39403:7;39417:17;39454:114;39472:31;39495:7;39472:22;:31::i;:::-;39505:62;39523:25;39546:1;39523:22;:25::i;:::-;39550:16;39505:17;:62::i;:::-;39454:17;:114::i;:::-;39441:127;;39590:32;39611:10;39590:20;:32::i;:::-;39580:42;;:7;:42;;;;:::i;:::-;39573:49;;;39315:317;;;;:::o;48742:85::-;48786:7;48816:6;;48807;;:15;;;;:::i;:::-;48800:22;;48742:85;:::o;30123:41::-;30162:2;30123:41;:::o;38030:100::-;38082:7;38103:15;:22;;;;38096:29;;38030:100;:::o;37437:152::-;37533:7;37562:15;:21;;;37554:30;;37547:37;;37437:152;;;:::o;43968:303::-;44062:4;44102:1;44077:15;:22;;;:26;;;44073:56;;;44118:5;44111:12;;;;44073:56;44161:1;44137:15;:21;;;:25;;;44133:55;;;44177:5;44170:12;;;;44133:55;44224:1;44196:15;:25;;;:29;;;44192:59;;;44240:5;44233:12;;;;44192:59;44262:4;44255:11;;43968:303;;;;:::o;46884:526::-;46966:4;46977:17;46999:11;47015:8;47035:13;:11;:13::i;:::-;47030:18;;47063:1;47057:2;:7;;;47053:85;;47079:5;47072:12;;;;;;;47053:85;47106:1;47101:2;:6;;;47097:41;;;47115:17;;;;;;;;;;:::i;:::-;;;;;;;;47097:41;47142:14;:12;:14::i;:::-;;47175:20;47188:6;47175:12;:20::i;:::-;47163:32;;47240:9;47208;:16;47218:5;47208:16;;;;;;;;;;;;;;;:28;47225:10;47208:28;;;;;;;;;;;;;;;;:41;;47200:50;;;;;;47289:9;47257;:16;47267:5;47257:16;;;;;;;;;;;;;;;:28;47274:10;47257:28;;;;;;;;;;;;;;;;:41;;;;;;;:::i;:::-;;;;;;;;47312:35;47325:5;47332:3;47337:9;47312:12;:35::i;:::-;47303:44;;47375:3;47359:28;;47368:5;47359:28;;;47380:6;47359:28;;;;;;:::i;:::-;;;;;;;;47399:6;47392:13;;;;;46884:526;;;;;;:::o;37669:299::-;37776:6;37789:8;37857:34;37821:15;:25;;;37815:77;;;37804:89;;37907:1;37902;:6;;;37898:53;;37920:25;37943:1;37920:22;:25::i;:::-;37916:29;;37898:53;37962:1;37955:8;;;37669:299;;;:::o;33925:93::-;33980:4;33998:6;:15;34005:7;33998:15;;;;;;;;;;;;;;;;;;;;;;;;;33991:22;;33925:93;;;:::o;31391:205::-;31445:4;30162:2;31464:6;:21;31456:30;;;;;;31505:1;31495:6;:11;31491:61;;30162:2;31521:9;;:25;31514:32;;;;31491:61;31585:6;31572:9;;31563:6;:18;:28;31556:35;;31391:205;;;;:::o;44342:403::-;44414:7;44428:17;44450:18;44473:8;44502:30;44525:6;44502:22;:30::i;:::-;44489:43;;44551:31;44574:7;44551:22;:31::i;:::-;44537:45;;44593:42;44611:10;44623:11;44593:17;:42::i;:::-;44589:46;;44644:20;44662:1;44644:17;:20::i;:::-;44640:24;;44673:32;44691:10;44703:1;44673:17;:32::i;:::-;44669:36;;44717:23;44738:1;44717:20;:23::i;:::-;44710:30;;;;;;;44342:403;;;;:::o;27038:33::-;;;:::o;29939:24::-;;;;:::o;46028:310::-;46105:4;46116:17;46140:14;:12;:14::i;:::-;;46173:20;46186:6;46173:12;:20::i;:::-;46161:32;;46235:9;46200;:21;46210:10;46200:21;;;;;;;;;;;;;;;:31;46222:8;46200:31;;;;;;;;;;;;;;;;:44;;;;;;;:::i;:::-;;;;;;;;46275:8;46254:63;;46263:10;46254:63;;;46285:9;:21;46295:10;46285:21;;;;;;;;;;;;;;;:31;46307:8;46285:31;;;;;;;;;;;;;;;;46254:63;;;;;;:::i;:::-;;;;;;;;46329:4;46322:11;;;46028:310;;;;:::o;26475:43::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;48037:382::-;48082:4;48118:1;48101:13;:11;:13::i;:::-;:18;;;48093:27;;;;;;48133:6;:18;48140:10;48133:18;;;;;;;;;;;;;;;;;;;;;;;;;:41;;;;48169:5;;;;;;;;;;;48155:19;;:10;:19;;;48133:41;48125:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;48212:7;:19;48220:10;48212:19;;;;;;;;;;;;;;;;48202:6;:29;;48194:38;;;;;;48237:14;48254:20;48267:6;48254:12;:20::i;:::-;48237:37;;48304:39;48324:10;48336:6;48304:19;:39::i;:::-;;48358:6;48348;;:16;;;;;;;:::i;:::-;;;;;;;;48379:10;48374:24;;;48391:6;48374:24;;;;;;:::i;:::-;;;;;;;;48410:4;48403:11;;;48037:382;;;:::o;35838:511::-;35909:4;35920:18;35970:1;35953:13;:11;:13::i;:::-;:18;;;35945:27;;;;;;35985:6;:18;35992:10;35985:18;;;;;;;;;;;;;;;;;;;;;;;;;:41;;;;36021:5;;;;;;;;;;;36007:19;;:10;:19;;;35985:41;35977:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;36048:14;:12;:14::i;:::-;;36083:1;36071:9;;:13;36067:69;;;36120:9;;36109:7;36100:6;;:16;;;;:::i;:::-;:29;;36092:38;;;;;;36067:69;36150:7;36140:6;;:17;;;;;;;:::i;:::-;;;;;;;;36177:21;36190:7;36177:12;:21::i;:::-;36164:34;;36203:45;36223:12;36237:10;36203:19;:45::i;:::-;;36275:12;36258:39;;36263:10;36258:39;;;36289:7;36258:39;;;;;;:::i;:::-;;;;;;;;36302:26;:24;:26::i;:::-;;36340:4;36333:11;;;35838:511;;;;:::o;48447:161::-;48543:10;48534:19;;:5;:19;;;48526:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;48591:12;48596:6;48591:4;:12::i;:::-;;48447:161;;;;:::o;48636:79::-;48667:4;48685:25;48690:7;:19;48698:10;48690:19;;;;;;;;;;;;;;;;48685:4;:25::i;:::-;48678:32;;48636:79;:::o;34525:105::-;34587:7;34608;:17;34616:8;34608:17;;;;;;;;;;;;;;;;34601:24;;34525:105;;;:::o;43555:142::-;43626:7;43677:14;43662:12;:29;;;;:::i;:::-;43647:11;:45;;;;:::i;:::-;43640:52;;43555:142;;;:::o;42183:135::-;42253:7;42311:2;42293:14;42275:15;:32;;;;:::i;:::-;42274:39;;;;:::i;:::-;42267:46;;42183:135;;;:::o;26812:33::-;;;;:::o;33692:205::-;33747:4;33767:22;29997:1;33767:22;;:8;:22::i;:::-;33766:23;33758:32;;;;;;33817:5;;;;;;;;;;;33803:19;;:10;:19;;;:44;;;;33837:10;33826:21;;:7;:21;;;33803:44;33795:53;;;;;;33871:5;33853:6;:15;33860:7;33853:15;;;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;33888:4;33881:11;;33692:205;;;:::o;32985:335::-;33023:5;33039:7;;;;;;;;;;;33035:33;;;33061:1;33054:8;;;;33035:33;33087:1;33076:7;;:12;33072:38;;33103:1;33096:8;;;;33072:38;33137:7;;33118:15;:26;33114:189;;33152:56;33205:2;33184:18;;:23;;;;:::i;:::-;33174:7;;:33;;;;:::i;:::-;33152:21;:56::i;:::-;;33224:4;33214:7;;:14;;;;;;;;;;;;;;;;;;33239:24;33247:15;33239:24;;;;;;:::i;:::-;;;;;;;;33269:14;:12;:14::i;:::-;;33296:1;33289:8;;;;33114:189;33314:1;33307:8;;32985:335;;:::o;44827:196::-;44886:7;44900:8;44917:66;44935:30;44958:6;44935:22;:30::i;:::-;44967:15;;;;;;;;;;;44917:17;:66::i;:::-;44913:70;;44995:23;45016:1;44995:20;:23::i;:::-;44988:30;;;;;44827:196;;;:::o;43792:121::-;43855:7;43906:2;43895:7;43877:15;:25;;;;:::i;:::-;43876:32;;;;:::i;:::-;43869:39;;43792:121;;;:::o;32172:200::-;32229:19;30097:1;32229:19;;:8;:19::i;:::-;32228:20;32220:29;;;;;;32276:5;;;;;;;;;;;32262:19;;:10;:19;;;32254:28;;;;;;32302:13;:11;:13::i;:::-;32295:4;:20;32287:29;;;;;;32330:9;;32326:20;32341:4;32326:20;;;;;;:::i;:::-;;;;;;;;32363:4;32351:9;:16;;;;32172:200;:::o;34046:437::-;34104:7;34118:18;34141:30;34176:19;34216:47;34239:23;34253:8;34239:13;:23::i;:::-;34216:22;:47::i;:::-;34202:61;;34284:35;34300:18;;34284:15;:35::i;:::-;34270:49;;34352:47;34370:11;34383:15;;;;;;;;;;;34352:17;:47::i;:::-;34326:73;;34411:67;34419:45;34440:23;34419:20;:45::i;:::-;34411:67;;34466:11;34411:7;:67::i;:::-;34404:74;;;;;34046:437;;;:::o;42429:92::-;42471:7;42492:24;42514:1;42492:21;:24::i;:::-;42485:31;;42429:92;:::o;39637:413::-;39744:7;39758:28;39791:30;39851:39;39874:15;39851:22;:39::i;:::-;39828:62;;39921:50;39955:15;39921:33;:50::i;:::-;39895:76;;39983:62;39999:20;40021:23;39983:15;:62::i;:::-;39976:69;;;;39637:413;;;:::o;27191:24::-;;;;:::o;28465:26::-;;;;;;;;;;;;;:::o;31105:281::-;31150:7;31181:2;31172:6;:11;31164:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;31240:1;31227:9;;31218:6;:18;:23;31210:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;31282:6;31269:9;;:19;;;;;;;;;;;30162:2;31314:9;;:25;31298:53;;;31341:9;;31298:53;;;;;;:::i;:::-;;;;;;;;31371:9;;31356:25;;31105:281;;;:::o;36536:135::-;36637:29;36644:12;36658:7;36637:6;:29::i;:::-;;36536:135;;;;:::o;26874:20::-;;;;;;;;;;;;;:::o;32421:157::-;32488:20;30030:1;32488:20;;:8;:20::i;:::-;32487:21;32479:30;;;;;;32536:5;;;;;;;;;;;32522:19;;:10;:19;;;32514:28;;;;;;32561:12;32547:11;;:26;;;;;;;;;;;;;;;;;;32421:157;:::o;40809:1269::-;40849:4;40860:47;;:::i;:::-;40912:44;;:::i;:::-;40961;;:::i;:::-;41010:21;41036:26;41067:34;41106:23;41134:18;41159:16;:14;:16::i;:::-;;41204:13;:11;:13::i;:::-;41180:37;;41226:44;41248:21;41226;:44::i;:::-;41222:74;;;41285:5;41278:12;;;;;;;;;;;;41222:74;41378:15;41394:10;;41378:27;;;;;;;;:::i;:::-;;;;;;;;;41357:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41426:45;41449:21;41426:22;:45::i;:::-;41410:61;;41505:1;41489:13;:17;;;;:::i;:::-;41476:30;;41533:53;41567:18;41533:33;:53::i;:::-;41511:75;;41644:2;41627:13;41610:14;:30;;;;:::i;:::-;41609:37;;;;:::i;:::-;41591:55;;41741:89;41759:70;41777:10;41789:39;41812:15;41789:22;:39::i;:::-;41759:17;:70::i;:::-;41741:17;:89::i;:::-;41711:119;;41856:75;41873:1;41876:27;41905:13;:11;:13::i;:::-;41920:10;41856:16;:75::i;:::-;41835:96;;41936:15;41957:18;41936:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41983:46;42010:18;41983:26;:46::i;:::-;;42039:18;42046:10;42039:18;;;;;;:::i;:::-;;;;;;;;42069:4;42062:11;;;;;;;;;;40809:1269;;:::o;36377:131::-;36474:29;36481:12;36495:7;36474:6;:29::i;:::-;;36377:131;;;;:::o;26990:20::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;28105:34::-;;;:::o;49048:76::-;49092:7;49113:6;;49106:13;;49048:76;:::o;45619:370::-;45696:4;45707:17;45743:20;45756:6;45743:12;:20::i;:::-;45731:32;;45811:9;45776;:21;45786:10;45776:21;;;;;;;;;;;;;;;:31;45798:8;45776:31;;;;;;;;;;;;;;;;:44;;45768:53;;;;;;45830:14;:12;:14::i;:::-;;45886:9;45851;:21;45861:10;45851:21;;;;;;;;;;;;;;;:31;45873:8;45851:31;;;;;;;;;;;;;;;;:44;;;;;;;:::i;:::-;;;;;;;;45926:8;45905:63;;45914:10;45905:63;;;45936:9;:21;45946:10;45936:21;;;;;;;;;;;;;;;:31;45958:8;45936:31;;;;;;;;;;;;;;;;45905:63;;;;;;:::i;:::-;;;;;;;;45980:4;45973:11;;;45619:370;;;;:::o;46405:412::-;46468:4;46479:17;46501:11;46517:8;46537:13;:11;:13::i;:::-;46532:18;;46565:1;46559:2;:7;;;46555:85;;46581:5;46574:12;;;;;;;46555:85;46608:1;46603:2;:6;;;46599:41;;;46617:17;;;;;;;;;;:::i;:::-;;;;;;;;46599:41;46644:14;:12;:14::i;:::-;;46677:20;46690:6;46677:12;:20::i;:::-;46665:32;;46711:40;46724:10;46736:3;46741:9;46711:12;:40::i;:::-;46702:49;;46782:3;46761:33;;46770:10;46761:33;;;46787:6;46761:33;;;;;;:::i;:::-;;;;;;;;46806:6;46799:13;;;;;46405:412;;;;;:::o;28541:22::-;;;;:::o;27975:39::-;;;:::o;42555:944::-;42619:7;42633:8;42646:19;42670:18;42693:26;42730:7;;;;;;;;;;;42726:34;;;42752:1;42745:8;;;;;;;;42726:34;42780:35;42796:18;;42780:15;:35::i;:::-;42766:49;;42839:1;42824:11;:16;42820:42;;42855:1;42848:8;;;;;;;;42820:42;42888:15;;;;;;;;;;;42866:37;;43060:1;43050:7;:11;:36;;;;;43075:11;43065:7;:21;43050:36;43046:75;;;43108:7;43094:21;;43046:75;43141:35;43164:11;43141:22;:35::i;:::-;43127:49;;43185:42;43203:10;43215:11;43185:17;:42::i;:::-;43181:46;;43236:20;43254:1;43236:17;:20::i;:::-;43232:24;;43279:37;43297:15;;;;;;;;;;;43314:1;43279:17;:37::i;:::-;43261:15;;:55;;;;;;;;;;;;;;;;;;;;43380:2;43366:11;:16;;;;:::i;:::-;43344:18;;:39;;;;:::i;:::-;43323:18;:60;;;;43434:19;43393:78;;43421:11;43401:18;;43393:78;43455:15;;;;;;;;;;;43393:78;;;;;;:::i;:::-;;;;;;;;43483:11;43476:18;;;;;;42555:944;;;;:::o;27123:25::-;;;;:::o;28601:24::-;;;;:::o;31727:361::-;31787:9;31801:20;31837:22;30065:1;31837:22;;:8;:22::i;:::-;31836:23;31828:32;;;;;;31874:7;;;;;;;;;;;31873:8;31865:17;;;;;;31909:5;;;;;;;;;;;31895:19;;:10;:19;;;31887:28;;;;;;31955:14;31939:13;:30;;;;:::i;:::-;31924:11;:46;;;;:::i;:::-;31920:50;;31987:7;;31983:1;:11;31975:20;;;;;;32015:7;;32000:22;;32037:1;32027:7;:11;;;;32061:12;32048:35;32075:7;;32048:35;;;;;;:::i;:::-;;;;;;;;31782:306;;31727:361;:::o;48897:76::-;48941:7;48962:6;;48955:13;;48897:76;:::o;33413:176::-;33465:4;33485:22;29997:1;33485:22;;:8;:22::i;:::-;33484:23;33476:32;;;;;;33535:5;;;;;;;;;;;33521:19;;:10;:19;;;33513:28;;;;;;33564:4;33546:6;:15;33553:7;33546:15;;;;;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;33580:4;33573:11;;33413:176;;;:::o;37220:153::-;37316:7;37345:15;:22;;;37337:31;;37330:38;;37220:153;;;:::o;36718:428::-;36847:25;;:::i;:::-;36879:40;;:::i;:::-;36957:7;36926:14;:21;;:39;;;;;;;;;;;37000:6;36970:14;:20;;:37;;;;;;;;;;;37076:18;37054;37046:48;37012:14;:24;;:83;;;;;;;;;;;37125:14;37118:21;;;36718:428;;;;;;:::o;38663:132::-;38708:7;38788:1;38771:14;38756:11;38738:15;:29;;;;:::i;:::-;38737:48;;;;:::i;:::-;:52;;;;:::i;:::-;38722:68;;38663:132;:::o;27874:36::-;;;:::o;47686:237::-;47748:4;47759:16;47804:5;;;;;;;;;;;47790:19;;:10;:19;;;47782:28;;;;;;47826:5;;;;;;;;;;;47815:16;;47844:9;47836:5;;:17;;;;;;;;;;;;;;;;;;47896:5;;;;;;;;;;;47865:37;;47886:8;47865:37;;;;;;;;;;;;47914:4;47907:11;;;47686:237;;;:::o;2009:174::-;2062:6;2110:18;2105:1;:23;;2096:33;;;;;;2166:2;2161:1;:7;;;;2138:32;;2009:174;;;:::o;15633:228::-;15679:6;15726:1;15722;:5;;;15713:15;;;;;;15843:3;15805:34;15791:9;15798:1;15791:5;:9::i;:::-;15783:18;;15774:65;:72;;;;;;;;;15739:109;;15633:228;;;:::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;47470:188::-;47553:4;47564:34;47584:5;47591:6;47564:19;:34::i;:::-;;47603:32;47623:3;47628:6;47603:19;:32::i;:::-;;47649:4;47642:11;;47470: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;35076:406::-;35156:4;35167:18;35190:19;35238:7;:17;35246:8;35238:17;;;;;;;;;;;;;;;;35216:40;;35277:1;35267:6;:11;35263:41;;35293:5;35286:12;;;;;;35263:41;35323:23;35337:8;35323:13;:23::i;:::-;35310:36;;35374:6;35360:10;:20;;35352:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;35455:6;35442:10;:19;;;;:::i;:::-;35422:7;:17;35430:8;35422:17;;;;;;;;;;;;;;;:39;;;;35473:4;35466:11;;;;35076:406;;;;;:::o;34685:336::-;34765:4;34776:18;34799:19;34847:7;:17;34855:8;34847:17;;;;;;;;;;;;;;;;34825:40;;34887:1;34877:6;:11;34873:41;;34903:5;34896:12;;;;;;34873:41;34933:23;34947:8;34933:13;:23::i;:::-;34920:36;;34994:6;34981:10;:19;;;;:::i;:::-;34961:7;:17;34969:8;34961:17;;;;;;;;;;;;;;;:39;;;;35012:4;35005:11;;;;34685:336;;;;;:::o;38214:386::-;38267:4;38278:47;;:::i;:::-;38330:19;38370:13;:11;:13::i;:::-;38356:27;;38412:15;38451:1;38428:15;:22;;;;:24;;;;:::i;:::-;38412:41;;;;;;;;:::i;:::-;;;;;;;;;38388:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38495:11;38458:21;:27;;:49;;;;;;;;;;;38558:21;38514:15;38553:1;38530:15;:22;;;;:24;;;;:::i;:::-;38514:41;;;;;;;;:::i;:::-;;;;;;;;;:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38591:4;38584:11;;;;38214: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;38875:435::-;38920:25;;:::i;:::-;38952:44;;:::i;:::-;39001:45;;:::i;:::-;39051:21;39101:15;39117:10;;39101:27;;;;;;;;:::i;:::-;;;;;;;;;39079:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39149:4;:17;;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39133:35;;;;39194:42;39217:18;39194:22;:42::i;:::-;39177:13;:59;39173:103;;39251:19;39244:26;;;;;;;39173:103;39287:18;39280:25;;;;;38875:435;;:::o;40104:452::-;40200:7;40214:12;40231:16;40278:50;40312:15;40278:33;:50::i;:::-;40262:13;:11;:13::i;:::-;:66;;;;:::i;:::-;40255:73;;40366:9;;40345:18;40358:4;40345:12;:18::i;:::-;:30;;;;:::i;:::-;40334:41;;40380:42;40400:11;;;;;;;;;;;40413:8;40380:19;:42::i;:::-;;40460:15;:22;;;40432:57;;40447:11;;;;;;;;;;;40432:57;;;40484:4;40432:57;;;;;;:::i;:::-;;;;;;;;40508:1;40494:10;;:15;;;;;;;:::i;:::-;;;;;;;;40527:8;40514:9;;:21;;;;;;;:::i;:::-;;;;;;;;40547:4;40540:11;;;;40104:452;;;:::o;14584:863::-;14633:6;14680:1;14676;:5;;;14667:15;;;;;;14693:10;14716:9;14728:1;14716:13;;;;14748:19;14742:2;:25;14738:56;;14778:2;14771:9;;;;;;;;;;;;;;;;;;;;;;14789:2;14782:9;;;;14738:56;14812:11;14806:2;:17;14802:48;;14834:2;14827:9;;;;;;;;;;;;;;;;;;;;;;14845:2;14838:9;;;;14802:48;14868:7;14862:2;:13;14858:44;;14886:2;14879:9;;;;;;;;;;;;;;;;;;;;;;14897:2;14890:9;;;;14858:44;14920:5;14914:2;:11;14910:40;;14936:1;14929:8;;;;;;;;;;;;;;;;;;;;;;14946:1;14939:8;;;;14910:40;14968:4;14962:2;:10;14958:39;;14983:1;14976:8;;;;;;;;;;;;;;;;;;;;;;14993:1;14986:8;;;;14958:39;15015:3;15009:2;:9;15005:38;;15029:1;15022:8;;;;;;;;;;;;;;;;;;;;;;15039:1;15032:8;;;;15005:38;15061:3;15055:2;:9;15051:23;;15073:1;15066:8;;;;15051:23;15117:13;15145:2;15139;15133:3;:8;:14;;;;15117:30;;15156:10;15208:3;15202;:9;15186:1;15178:10;;15169:43;;;;15156:56;;15226:10;15239:18;15226:31;;15221:181;15265:1;15259:3;:7;15221:181;;;15296:2;15290:8;;;;15309:9;15327:3;15321:2;:9;;;;;;;;;15309:21;;15354:1;15348:3;:7;15341:14;;;;;;;;;;;;15390:1;15376:3;:16;15366:26;;;;15279:123;15276:1;15268:9;;;;;;;;;;;;;;;;;;;;;;15221:181;;;;15427:6;15412:22;;;;;;14584:863;;;:::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:763::-;14148:6;14156;14164;14172;14221:3;14209:9;14200:7;14196:23;14192:33;14189:120;;;14228:79;;:::i;:::-;14189:120;14348:1;14373:53;14418:7;14409:6;14398:9;14394:22;14373:53;:::i;:::-;14363:63;;14319:117;14475:2;14501:52;14545:7;14536:6;14525:9;14521:22;14501:52;:::i;:::-;14491:62;;14446:117;14602:2;14628:53;14673:7;14664:6;14653:9;14649:22;14628:53;:::i;:::-;14618:63;;14573:118;14730:2;14756:53;14801:7;14792:6;14781:9;14777:22;14756:53;:::i;:::-;14746:63;;14701:118;14063:763;;;;;;;:::o;14832:105::-;14907:23;14924:5;14907:23;:::i;:::-;14902:3;14895:36;14832:105;;:::o;14943:::-;15018:23;15035:5;15018:23;:::i;:::-;15013:3;15006:36;14943:105;;:::o;15054:::-;15129:23;15146:5;15129:23;:::i;:::-;15124:3;15117:36;15054:105;;:::o;15279:705::-;15448:4;15443:3;15439:14;15537:4;15530:5;15526:16;15520:23;15556:61;15611:4;15606:3;15602:14;15588:12;15556:61;:::i;:::-;15463:164;15710:4;15703:5;15699:16;15693:23;15729:61;15784:4;15779:3;15775:14;15761:12;15729:61;:::i;:::-;15637:163;15887:4;15880:5;15876:16;15870:23;15906:61;15961:4;15956:3;15952:14;15938:12;15906:61;:::i;:::-;15810:167;15417:567;15279:705;;:::o;15990:366::-;16155:4;16193:2;16182:9;16178:18;16170:26;;16206:143;16346:1;16335:9;16331:17;16322:6;16206:143;:::i;:::-;15990:366;;;;:::o;16362:118::-;16399:7;16439:34;16432:5;16428:46;16417:57;;16362:118;;;:::o;16486:::-;16573:24;16591:5;16573:24;:::i;:::-;16568:3;16561:37;16486:118;;:::o;16610:222::-;16703:4;16741:2;16730:9;16726:18;16718:26;;16754:71;16822:1;16811:9;16807:17;16798:6;16754:71;:::i;:::-;16610:222;;;;:::o;16838:180::-;16886:77;16883:1;16876:88;16983:4;16980:1;16973:15;17007:4;17004:1;16997:15;17024:191;17064:3;17083:20;17101:1;17083:20;:::i;:::-;17078:25;;17117:20;17135:1;17117:20;:::i;:::-;17112:25;;17160:1;17157;17153:9;17146:16;;17181:3;17178:1;17175:10;17172:36;;;17188:18;;:::i;:::-;17172:36;17024:191;;;;:::o;17221:180::-;17269:77;17266:1;17259:88;17366:4;17363:1;17356:15;17390:4;17387:1;17380:15;17407:320;17451:6;17488:1;17482:4;17478:12;17468:22;;17535:1;17529:4;17525:12;17556:18;17546:81;;17612:4;17604:6;17600:17;17590:27;;17546:81;17674:2;17666:6;17663:14;17643:18;17640:38;17637:84;;17693:18;;:::i;:::-;17637:84;17458:269;17407:320;;;:::o;17733:157::-;17873:9;17869:1;17861:6;17857:14;17850:33;17733:157;:::o;17896:365::-;18038:3;18059:66;18123:1;18118:3;18059:66;:::i;:::-;18052:73;;18134:93;18223:3;18134:93;:::i;:::-;18252:2;18247:3;18243:12;18236:19;;17896:365;;;:::o;18267:419::-;18433:4;18471:2;18460:9;18456:18;18448:26;;18520:9;18514:4;18510:20;18506:1;18495:9;18491:17;18484:47;18548:131;18674:4;18548:131;:::i;:::-;18540:139;;18267:419;;;:::o;18692:160::-;18832:12;18828:1;18820:6;18816:14;18809:36;18692:160;:::o;18858:366::-;19000:3;19021:67;19085:2;19080:3;19021:67;:::i;:::-;19014:74;;19097:93;19186:3;19097:93;:::i;:::-;19215:2;19210:3;19206:12;19199:19;;18858:366;;;:::o;19230:419::-;19396:4;19434:2;19423:9;19419:18;19411:26;;19483:9;19477:4;19473:20;19469:1;19458:9;19454:17;19447:47;19511:131;19637:4;19511:131;:::i;:::-;19503:139;;19230:419;;;:::o;19655:194::-;19695:4;19715:20;19733:1;19715:20;:::i;:::-;19710:25;;19749:20;19767:1;19749:20;:::i;:::-;19744:25;;19793:1;19790;19786:9;19778:17;;19817:1;19811:4;19808:11;19805:37;;;19822:18;;:::i;:::-;19805:37;19655:194;;;;:::o;19855:160::-;19995:12;19991:1;19983:6;19979:14;19972:36;19855:160;:::o;20021:366::-;20163:3;20184:67;20248:2;20243:3;20184:67;:::i;:::-;20177:74;;20260:93;20349:3;20260:93;:::i;:::-;20378:2;20373:3;20369:12;20362:19;;20021:366;;;:::o;20393:419::-;20559:4;20597:2;20586:9;20582:18;20574:26;;20646:9;20640:4;20636:20;20632:1;20621:9;20617:17;20610:47;20674:131;20800:4;20674:131;:::i;:::-;20666:139;;20393:419;;;:::o;20818:168::-;20958:20;20954:1;20946:6;20942:14;20935:44;20818:168;:::o;20992:366::-;21134:3;21155:67;21219:2;21214:3;21155:67;:::i;:::-;21148:74;;21231:93;21320:3;21231:93;:::i;:::-;21349:2;21344:3;21340:12;21333:19;;20992:366;;;:::o;21364:419::-;21530:4;21568:2;21557:9;21553:18;21545:26;;21617:9;21611:4;21607:20;21603:1;21592:9;21588:17;21581:47;21645:131;21771:4;21645:131;:::i;:::-;21637:139;;21364:419;;;:::o;21789:410::-;21829:7;21852:20;21870:1;21852:20;:::i;:::-;21847:25;;21886:20;21904:1;21886:20;:::i;:::-;21881:25;;21941:1;21938;21934:9;21963:30;21981:11;21963:30;:::i;:::-;21952:41;;22142:1;22133:7;22129:15;22126:1;22123:22;22103:1;22096:9;22076:83;22053:139;;22172:18;;:::i;:::-;22053:139;21837:362;21789:410;;;;:::o;22205:180::-;22253:77;22250:1;22243:88;22350:4;22347:1;22340:15;22374:4;22371:1;22364:15;22391:185;22431:1;22448:20;22466:1;22448:20;:::i;:::-;22443:25;;22482:20;22500:1;22482:20;:::i;:::-;22477:25;;22521:1;22511:35;;22526:18;;:::i;:::-;22511:35;22568:1;22565;22561:9;22556:14;;22391:185;;;;:::o;22582:167::-;22722:19;22718:1;22710:6;22706:14;22699:43;22582:167;:::o;22755:366::-;22897:3;22918:67;22982:2;22977:3;22918:67;:::i;:::-;22911:74;;22994:93;23083:3;22994:93;:::i;:::-;23112:2;23107:3;23103:12;23096:19;;22755:366;;;:::o;23127:419::-;23293:4;23331:2;23320:9;23316:18;23308:26;;23380:9;23374:4;23370:20;23366:1;23355:9;23351:17;23344:47;23408:131;23534:4;23408:131;:::i;:::-;23400:139;;23127:419;;;:::o;23552:168::-;23692:20;23688:1;23680:6;23676:14;23669:44;23552:168;:::o;23726:366::-;23868:3;23889:67;23953:2;23948:3;23889:67;:::i;:::-;23882:74;;23965:93;24054:3;23965:93;:::i;:::-;24083:2;24078:3;24074:12;24067:19;;23726:366;;;:::o;24098:419::-;24264:4;24302:2;24291:9;24287:18;24279:26;;24351:9;24345:4;24341:20;24337:1;24326:9;24322:17;24315:47;24379:131;24505:4;24379:131;:::i;:::-;24371:139;;24098:419;;;:::o;24523:180::-;24571:77;24568:1;24561:88;24668:4;24665:1;24658:15;24692:4;24689:1;24682:15;24709:163;24849:15;24845:1;24837:6;24833:14;24826:39;24709:163;:::o;24878:366::-;25020:3;25041:67;25105:2;25100:3;25041:67;:::i;:::-;25034:74;;25117:93;25206:3;25117:93;:::i;:::-;25235:2;25230:3;25226:12;25219:19;;24878:366;;;:::o;25250:419::-;25416:4;25454:2;25443:9;25439:18;25431:26;;25503:9;25497:4;25493:20;25489:1;25478:9;25474:17;25467:47;25531:131;25657:4;25531:131;:::i;:::-;25523:139;;25250:419;;;:::o;25675:122::-;25748:24;25766:5;25748:24;:::i;:::-;25741:5;25738:35;25728:63;;25787:1;25784;25777:12;25728:63;25675:122;:::o;25803:143::-;25860:5;25891:6;25885:13;25876:22;;25907:33;25934:5;25907:33;:::i;:::-;25803:143;;;;:::o;25952:351::-;26022:6;26071:2;26059:9;26050:7;26046:23;26042:32;26039:119;;;26077:79;;:::i;:::-;26039:119;26197:1;26222:64;26278:7;26269:6;26258:9;26254:22;26222:64;:::i;:::-;26212:74;;26168:128;25952:351;;;;:::o

Swarm Source

ipfs://328f0fbbc2c230ab0b2baa7351327ca952449758c2fcb28fb33fe2b826f38dba
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.