ETH Price: $2,474.42 (+0.81%)
Gas: 4.16 Gwei
 

Overview

Max Total Supply

438.287536911 AZIZ

Holders

557

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Azizos

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-09-24
*/

pragma solidity ^0.6.6;

contract ABDKMathQuad {
/*
 * ABDK Math Quad Smart Contract Library.  Copyright © 2019 by ABDK Consulting.
 * Author: Mikhail Vladimirov <[email protected]>
 */

/**
 * Smart contract library of mathematical functions operating with IEEE 754
 * quadruple-precision binary floating-point numbers (quadruple precision
 * numbers).  As long as quadruple precision numbers are 16-bytes long, they are
 * represented by bytes16 type.
 */
  /**
   * 0.
   */
  bytes16 private constant POSITIVE_ZERO = 0x00000000000000000000000000000000;

  /**
   * -0.
   */
  bytes16 private constant NEGATIVE_ZERO = 0x80000000000000000000000000000000;

  /**
   * +Infinity.
   */
  bytes16 private constant POSITIVE_INFINITY = 0x7FFF0000000000000000000000000000;

  /**
   * -Infinity.
   */
  bytes16 private constant NEGATIVE_INFINITY = 0xFFFF0000000000000000000000000000;

  /**
   * Canonical NaN value.
   */
  bytes16 private constant NaN = 0x7FFF8000000000000000000000000000;

  /**
   * Convert unsigned 256-bit integer number into quadruple precision number.
   *
   * @param x unsigned 256-bit integer number
   * @return quadruple precision number
   */
  function fromUInt (uint256 x) internal pure returns (bytes16) {
    if (x == 0) return bytes16 (0);
    else {
      uint256 result = x;

      uint256 msb = msb (result);
      if (msb < 112) result <<= 112 - msb;
      else if (msb > 112) result >>= msb - 112;

      result = result & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF | 16383 + msb << 112;

      return bytes16 (uint128 (result));
    }
  }

  /**
   * Convert quadruple precision number into unsigned 256-bit integer number
   * rounding towards zero.  Revert on underflow.  Note, that negative floating
   * point numbers in range (-1.0 .. 0.0) may be converted to unsigned integer
   * without error, because they are rounded to zero.
   *
   * @param x quadruple precision number
   * @return unsigned 256-bit integer number
   */
  function toUInt (bytes16 x) internal pure returns (uint256) {
    uint256 exponent = uint128 (x) >> 112 & 0x7FFF;

    if (exponent < 16383) return 0; // Underflow

    require (uint128 (x) < 0x80000000000000000000000000000000); // Negative

    require (exponent <= 16638); // Overflow
    uint256 result = uint256 (uint128 (x)) & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF |
      0x10000000000000000000000000000;

    if (exponent < 16495) result >>= 16495 - exponent;
    else if (exponent > 16495) result <<= exponent - 16495;

    return result;
  }

  /**
   * Calculate x + y.  Special values behave in the following way:
   *
   * NaN + x = NaN for any x.
   * Infinity + x = Infinity for any finite x.
   * -Infinity + x = -Infinity for any finite x.
   * Infinity + Infinity = Infinity.
   * -Infinity + -Infinity = -Infinity.
   * Infinity + -Infinity = -Infinity + Infinity = NaN.
   *
   * @param x quadruple precision number
   * @param y quadruple precision number
   * @return quadruple precision number
   */
  function addABDK (bytes16 x, bytes16 y) internal pure returns (bytes16) {
    uint256 xExponent = uint128 (x) >> 112 & 0x7FFF;
    uint256 yExponent = uint128 (y) >> 112 & 0x7FFF;

    if (xExponent == 0x7FFF) {
      if (yExponent == 0x7FFF) { 
        if (x == y) return x;
        else return NaN;
      } else return x; 
    } else if (yExponent == 0x7FFF) return y;
    else {
      bool xSign = uint128 (x) >= 0x80000000000000000000000000000000;
      uint256 xSignifier = uint128 (x) & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
      if (xExponent == 0) xExponent = 1;
      else xSignifier |= 0x10000000000000000000000000000;

      bool ySign = uint128 (y) >= 0x80000000000000000000000000000000;
      uint256 ySignifier = uint128 (y) & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
      if (yExponent == 0) yExponent = 1;
      else ySignifier |= 0x10000000000000000000000000000;

      if (xSignifier == 0) return y == NEGATIVE_ZERO ? POSITIVE_ZERO : y;
      else if (ySignifier == 0) return x == NEGATIVE_ZERO ? POSITIVE_ZERO : x;
      else {
        int256 delta = int256 (xExponent) - int256 (yExponent);
  
        if (xSign == ySign) {
          if (delta > 112) return x;
          else if (delta > 0) ySignifier >>= delta;
          else if (delta < -112) return y;
          else if (delta < 0) {
            xSignifier >>= -delta;
            xExponent = yExponent;
          }
  
          xSignifier += ySignifier;
  
          if (xSignifier >= 0x20000000000000000000000000000) {
            xSignifier >>= 1;
            xExponent += 1;
          }
  
          if (xExponent == 0x7FFF)
            return xSign ? NEGATIVE_INFINITY : POSITIVE_INFINITY;
          else {
            if (xSignifier < 0x10000000000000000000000000000) xExponent = 0;
            else xSignifier &= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
  
            return bytes16 (uint128 (
                (xSign ? 0x80000000000000000000000000000000 : 0) |
                (xExponent << 112) |
                xSignifier)); 
          }
        } else {
          if (delta > 0) {
            xSignifier <<= 1;
            xExponent -= 1;
          } else if (delta < 0) {
            ySignifier <<= 1;
            xExponent = yExponent - 1;
          }

          if (delta > 112) ySignifier = 1;
          else if (delta > 1) ySignifier = (ySignifier - 1 >> delta - 1) + 1;
          else if (delta < -112) xSignifier = 1;
          else if (delta < -1) xSignifier = (xSignifier - 1 >> -delta - 1) + 1;

          if (xSignifier >= ySignifier) xSignifier -= ySignifier;
          else {
            xSignifier = ySignifier - xSignifier;
            xSign = ySign;
          }

          if (xSignifier == 0)
            return POSITIVE_ZERO;

          uint256 msb = msb (xSignifier);

          if (msb == 113) {
            xSignifier = xSignifier >> 1 & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
            xExponent += 1;
          } else if (msb < 112) {
            uint256 shift = 112 - msb;
            if (xExponent > shift) {
              xSignifier = xSignifier << shift & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
              xExponent -= shift;
            } else {
              xSignifier <<= xExponent - 1;
              xExponent = 0;
            }
          } else xSignifier &= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF;

          if (xExponent == 0x7FFF)
            return xSign ? NEGATIVE_INFINITY : POSITIVE_INFINITY;
          else return bytes16 (uint128 (
              (xSign ? 0x80000000000000000000000000000000 : 0) |
              (xExponent << 112) |
              xSignifier));
        }
      }
    }
  }

  /**
   * Calculate x - y.  Special values behave in the following way:
   *
   * NaN - x = NaN for any x.
   * Infinity - x = Infinity for any finite x.
   * -Infinity - x = -Infinity for any finite x.
   * Infinity - -Infinity = Infinity.
   * -Infinity - Infinity = -Infinity.
   * Infinity - Infinity = -Infinity - -Infinity = NaN.
   *
   * @param x quadruple precision number
   * @param y quadruple precision number
   * @return quadruple precision number
   */
  function subABDK (bytes16 x, bytes16 y) internal pure returns (bytes16) {
    return addABDK(x, y ^ 0x80000000000000000000000000000000);
  }

  /**
   * Calculate x * y.  Special values behave in the following way:
   *
   * NaN * x = NaN for any x.
   * Infinity * x = Infinity for any finite positive x.
   * Infinity * x = -Infinity for any finite negative x.
   * -Infinity * x = -Infinity for any finite positive x.
   * -Infinity * x = Infinity for any finite negative x.
   * Infinity * 0 = NaN.
   * -Infinity * 0 = NaN.
   * Infinity * Infinity = Infinity.
   * Infinity * -Infinity = -Infinity.
   * -Infinity * Infinity = -Infinity.
   * -Infinity * -Infinity = Infinity.
   *
   * @param x quadruple precision number
   * @param y quadruple precision number
   * @return quadruple precision number
   */
  function mulABDK (bytes16 x, bytes16 y) internal pure returns (bytes16) {
    uint256 xExponent = uint128 (x) >> 112 & 0x7FFF;
    uint256 yExponent = uint128 (y) >> 112 & 0x7FFF;

    if (xExponent == 0x7FFF) {
      if (yExponent == 0x7FFF) {
        if (x == y) return x ^ y & 0x80000000000000000000000000000000;
        else if (x ^ y == 0x80000000000000000000000000000000) return x | y;
        else return NaN;
      } else {
        if (y & 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF == 0) return NaN;
        else return x ^ y & 0x80000000000000000000000000000000;
      }
    } else if (yExponent == 0x7FFF) {
        if (x & 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF == 0) return NaN;
        else return y ^ x & 0x80000000000000000000000000000000;
    } else {
      uint256 xSignifier = uint128 (x) & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
      if (xExponent == 0) xExponent = 1;
      else xSignifier |= 0x10000000000000000000000000000;

      uint256 ySignifier = uint128 (y) & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
      if (yExponent == 0) yExponent = 1;
      else ySignifier |= 0x10000000000000000000000000000;

      xSignifier *= ySignifier;
      if (xSignifier == 0)
        return (x ^ y) & 0x80000000000000000000000000000000 > 0 ?
            NEGATIVE_ZERO : POSITIVE_ZERO;

      xExponent += yExponent;

      uint256 msb =
        xSignifier >= 0x200000000000000000000000000000000000000000000000000000000 ? 225 :
        xSignifier >= 0x100000000000000000000000000000000000000000000000000000000 ? 224 :
        msb (xSignifier);

      if (xExponent + msb < 16496) { // Underflow
        xExponent = 0;
        xSignifier = 0;
      } else if (xExponent + msb < 16608) { // Subnormal
        if (xExponent < 16496)
          xSignifier >>= 16496 - xExponent;
        else if (xExponent > 16496)
          xSignifier <<= xExponent - 16496;
        xExponent = 0;
      } else if (xExponent + msb > 49373) {
        xExponent = 0x7FFF;
        xSignifier = 0;
      } else {
        if (msb > 112)
          xSignifier >>= msb - 112;
        else if (msb < 112)
          xSignifier <<= 112 - msb;

        xSignifier &= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF;

        xExponent = xExponent + msb - 16607;
      }

      return bytes16 (uint128 (uint128 ((x ^ y) & 0x80000000000000000000000000000000) |
          xExponent << 112 | xSignifier));
    }
  }

  /**
   * Calculate x / y.  Special values behave in the following way:
   *
   * NaN / x = NaN for any x.
   * x / NaN = NaN for any x.
   * Infinity / x = Infinity for any finite non-negative x.
   * Infinity / x = -Infinity for any finite negative x including -0.
   * -Infinity / x = -Infinity for any finite non-negative x.
   * -Infinity / x = Infinity for any finite negative x including -0.
   * x / Infinity = 0 for any finite non-negative x.
   * x / -Infinity = -0 for any finite non-negative x.
   * x / Infinity = -0 for any finite non-negative x including -0.
   * x / -Infinity = 0 for any finite non-negative x including -0.
   * 
   * Infinity / Infinity = NaN.
   * Infinity / -Infinity = -NaN.
   * -Infinity / Infinity = -NaN.
   * -Infinity / -Infinity = NaN.
   *
   * Division by zero behaves in the following way:
   *
   * x / 0 = Infinity for any finite positive x.
   * x / -0 = -Infinity for any finite positive x.
   * x / 0 = -Infinity for any finite negative x.
   * x / -0 = Infinity for any finite negative x.
   * 0 / 0 = NaN.
   * 0 / -0 = NaN.
   * -0 / 0 = NaN.
   * -0 / -0 = NaN.
   *
   * @param x quadruple precision number
   * @param y quadruple precision number
   * @return quadruple precision number
   */
  function divABDK (bytes16 x, bytes16 y) internal pure returns (bytes16) {
    uint256 xExponent = uint128 (x) >> 112 & 0x7FFF;
    uint256 yExponent = uint128 (y) >> 112 & 0x7FFF;

    if (xExponent == 0x7FFF) {
      if (yExponent == 0x7FFF) return NaN;
      else return x ^ y & 0x80000000000000000000000000000000;
    } else if (yExponent == 0x7FFF) {
      if (y & 0x0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF != 0) return NaN;
      else return POSITIVE_ZERO | (x ^ y) & 0x80000000000000000000000000000000;
    } else if (y & 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF == 0) {
      if (x & 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF == 0) return NaN;
      else return POSITIVE_INFINITY | (x ^ y) & 0x80000000000000000000000000000000;
    } else {
      uint256 ySignifier = uint128 (y) & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
      if (yExponent == 0) yExponent = 1;
      else ySignifier |= 0x10000000000000000000000000000;

      uint256 xSignifier = uint128 (x) & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
      if (xExponent == 0) {
        if (xSignifier != 0) {
          uint shift = 226 - msb (xSignifier);

          xSignifier <<= shift;

          xExponent = 1;
          yExponent += shift - 114;
        }
      }
      else {
        xSignifier = (xSignifier | 0x10000000000000000000000000000) << 114;
      }

      xSignifier = xSignifier / ySignifier;
      if (xSignifier == 0)
        return (x ^ y) & 0x80000000000000000000000000000000 > 0 ?
            NEGATIVE_ZERO : POSITIVE_ZERO;

      assert (xSignifier >= 0x1000000000000000000000000000);

      uint256 msb =
        xSignifier >= 0x80000000000000000000000000000 ? msb (xSignifier) :
        xSignifier >= 0x40000000000000000000000000000 ? 114 :
        xSignifier >= 0x20000000000000000000000000000 ? 113 : 112;

      if (xExponent + msb > yExponent + 16497) { // Overflow
        xExponent = 0x7FFF;
        xSignifier = 0;
      } else if (xExponent + msb + 16380  < yExponent) { // Underflow
        xExponent = 0;
        xSignifier = 0;
      } else if (xExponent + msb + 16268  < yExponent) { // Subnormal
        if (xExponent + 16380 > yExponent)
          xSignifier <<= xExponent + 16380 - yExponent;
        else if (xExponent + 16380 < yExponent)
          xSignifier >>= yExponent - xExponent - 16380;

        xExponent = 0;
      } else { // Normal
        if (msb > 112)
          xSignifier >>= msb - 112;

        xSignifier &= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF;

        xExponent = xExponent + msb + 16269 - yExponent;
      }

      return bytes16 (uint128 (uint128 ((x ^ y) & 0x80000000000000000000000000000000) |
          xExponent << 112 | xSignifier));
    }
  }

  /**
   * Calculate 2^x.
   *
   * @param x quadruple precision number
   * @return quadruple precision number
   */
  function pow_2 (bytes16 x) internal pure returns (bytes16) {
    bool xNegative = uint128 (x) > 0x80000000000000000000000000000000;
    uint256 xExponent = uint128 (x) >> 112 & 0x7FFF;
    uint256 xSignifier = uint128 (x) & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF;

    if (xExponent == 0x7FFF && xSignifier != 0) return NaN;
    else if (xExponent > 16397)
      return xNegative ? POSITIVE_ZERO : POSITIVE_INFINITY;
    else if (xExponent < 16255)
      return 0x3FFF0000000000000000000000000000;
    else {
      if (xExponent == 0) xExponent = 1;
      else xSignifier |= 0x10000000000000000000000000000;

      if (xExponent > 16367)
        xSignifier <<= xExponent - 16367;
      else if (xExponent < 16367)
        xSignifier >>= 16367 - xExponent;

      if (xNegative && xSignifier > 0x406E00000000000000000000000000000000)
        return POSITIVE_ZERO;

      if (!xNegative && xSignifier > 0x3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
        return POSITIVE_INFINITY;

      uint256 resultExponent = xSignifier >> 128;
      xSignifier &= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
      if (xNegative && xSignifier != 0) {
        xSignifier = ~xSignifier;
        resultExponent += 1;
      }

      uint256 resultSignifier = 0x80000000000000000000000000000000;
      if (xSignifier & 0x80000000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x16A09E667F3BCC908B2FB1366EA957D3E >> 128;
      if (xSignifier & 0x40000000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x1306FE0A31B7152DE8D5A46305C85EDEC >> 128;
      if (xSignifier & 0x20000000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x1172B83C7D517ADCDF7C8C50EB14A791F >> 128;
      if (xSignifier & 0x10000000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x10B5586CF9890F6298B92B71842A98363 >> 128;
      if (xSignifier & 0x8000000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x1059B0D31585743AE7C548EB68CA417FD >> 128;
      if (xSignifier & 0x4000000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x102C9A3E778060EE6F7CACA4F7A29BDE8 >> 128;
      if (xSignifier & 0x2000000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x10163DA9FB33356D84A66AE336DCDFA3F >> 128;
      if (xSignifier & 0x1000000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x100B1AFA5ABCBED6129AB13EC11DC9543 >> 128;
      if (xSignifier & 0x800000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x10058C86DA1C09EA1FF19D294CF2F679B >> 128;
      if (xSignifier & 0x400000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x1002C605E2E8CEC506D21BFC89A23A00F >> 128;
      if (xSignifier & 0x200000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x100162F3904051FA128BCA9C55C31E5DF >> 128;
      if (xSignifier & 0x100000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x1000B175EFFDC76BA38E31671CA939725 >> 128;
      if (xSignifier & 0x80000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x100058BA01FB9F96D6CACD4B180917C3D >> 128;
      if (xSignifier & 0x40000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x10002C5CC37DA9491D0985C348C68E7B3 >> 128;
      if (xSignifier & 0x20000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x1000162E525EE054754457D5995292026 >> 128;
      if (xSignifier & 0x10000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x10000B17255775C040618BF4A4ADE83FC >> 128;
      if (xSignifier & 0x8000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x1000058B91B5BC9AE2EED81E9B7D4CFAB >> 128;
      if (xSignifier & 0x4000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x100002C5C89D5EC6CA4D7C8ACC017B7C9 >> 128;
      if (xSignifier & 0x2000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x10000162E43F4F831060E02D839A9D16D >> 128;
      if (xSignifier & 0x1000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x100000B1721BCFC99D9F890EA06911763 >> 128;
      if (xSignifier & 0x800000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x10000058B90CF1E6D97F9CA14DBCC1628 >> 128;
      if (xSignifier & 0x400000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x1000002C5C863B73F016468F6BAC5CA2B >> 128;
      if (xSignifier & 0x200000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x100000162E430E5A18F6119E3C02282A5 >> 128;
      if (xSignifier & 0x100000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x1000000B1721835514B86E6D96EFD1BFE >> 128;
      if (xSignifier & 0x80000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x100000058B90C0B48C6BE5DF846C5B2EF >> 128;
      if (xSignifier & 0x40000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x10000002C5C8601CC6B9E94213C72737A >> 128;
      if (xSignifier & 0x20000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x1000000162E42FFF037DF38AA2B219F06 >> 128;
      if (xSignifier & 0x10000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x10000000B17217FBA9C739AA5819F44F9 >> 128;
      if (xSignifier & 0x8000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x1000000058B90BFCDEE5ACD3C1CEDC823 >> 128;
      if (xSignifier & 0x4000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x100000002C5C85FE31F35A6A30DA1BE50 >> 128;
      if (xSignifier & 0x2000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x10000000162E42FF0999CE3541B9FFFCF >> 128;
      if (xSignifier & 0x1000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x100000000B17217F80F4EF5AADDA45554 >> 128;
      if (xSignifier & 0x800000000000000000000000 > 0) resultSignifier = resultSignifier * 0x10000000058B90BFBF8479BD5A81B51AD >> 128;
      if (xSignifier & 0x400000000000000000000000 > 0) resultSignifier = resultSignifier * 0x1000000002C5C85FDF84BD62AE30A74CC >> 128;
      if (xSignifier & 0x200000000000000000000000 > 0) resultSignifier = resultSignifier * 0x100000000162E42FEFB2FED257559BDAA >> 128;
      if (xSignifier & 0x100000000000000000000000 > 0) resultSignifier = resultSignifier * 0x1000000000B17217F7D5A7716BBA4A9AE >> 128;
      if (xSignifier & 0x80000000000000000000000 > 0) resultSignifier = resultSignifier * 0x100000000058B90BFBE9DDBAC5E109CCE >> 128;
      if (xSignifier & 0x40000000000000000000000 > 0) resultSignifier = resultSignifier * 0x10000000002C5C85FDF4B15DE6F17EB0D >> 128;
      if (xSignifier & 0x20000000000000000000000 > 0) resultSignifier = resultSignifier * 0x1000000000162E42FEFA494F1478FDE05 >> 128;
      if (xSignifier & 0x10000000000000000000000 > 0) resultSignifier = resultSignifier * 0x10000000000B17217F7D20CF927C8E94C >> 128;
      if (xSignifier & 0x8000000000000000000000 > 0) resultSignifier = resultSignifier * 0x1000000000058B90BFBE8F71CB4E4B33D >> 128;
      if (xSignifier & 0x4000000000000000000000 > 0) resultSignifier = resultSignifier * 0x100000000002C5C85FDF477B662B26945 >> 128;
      if (xSignifier & 0x2000000000000000000000 > 0) resultSignifier = resultSignifier * 0x10000000000162E42FEFA3AE53369388C >> 128;
      if (xSignifier & 0x1000000000000000000000 > 0) resultSignifier = resultSignifier * 0x100000000000B17217F7D1D351A389D40 >> 128;
      if (xSignifier & 0x800000000000000000000 > 0) resultSignifier = resultSignifier * 0x10000000000058B90BFBE8E8B2D3D4EDE >> 128;
      if (xSignifier & 0x400000000000000000000 > 0) resultSignifier = resultSignifier * 0x1000000000002C5C85FDF4741BEA6E77E >> 128;
      if (xSignifier & 0x200000000000000000000 > 0) resultSignifier = resultSignifier * 0x100000000000162E42FEFA39FE95583C2 >> 128;
      if (xSignifier & 0x100000000000000000000 > 0) resultSignifier = resultSignifier * 0x1000000000000B17217F7D1CFB72B45E1 >> 128;
      if (xSignifier & 0x80000000000000000000 > 0) resultSignifier = resultSignifier * 0x100000000000058B90BFBE8E7CC35C3F0 >> 128;
      if (xSignifier & 0x40000000000000000000 > 0) resultSignifier = resultSignifier * 0x10000000000002C5C85FDF473E242EA38 >> 128;
      if (xSignifier & 0x20000000000000000000 > 0) resultSignifier = resultSignifier * 0x1000000000000162E42FEFA39F02B772C >> 128;
      if (xSignifier & 0x10000000000000000000 > 0) resultSignifier = resultSignifier * 0x10000000000000B17217F7D1CF7D83C1A >> 128;
      if (xSignifier & 0x8000000000000000000 > 0) resultSignifier = resultSignifier * 0x1000000000000058B90BFBE8E7BDCBE2E >> 128;
      if (xSignifier & 0x4000000000000000000 > 0) resultSignifier = resultSignifier * 0x100000000000002C5C85FDF473DEA871F >> 128;
      if (xSignifier & 0x2000000000000000000 > 0) resultSignifier = resultSignifier * 0x10000000000000162E42FEFA39EF44D91 >> 128;
      if (xSignifier & 0x1000000000000000000 > 0) resultSignifier = resultSignifier * 0x100000000000000B17217F7D1CF79E949 >> 128;
      if (xSignifier & 0x800000000000000000 > 0) resultSignifier = resultSignifier * 0x10000000000000058B90BFBE8E7BCE544 >> 128;
      if (xSignifier & 0x400000000000000000 > 0) resultSignifier = resultSignifier * 0x1000000000000002C5C85FDF473DE6ECA >> 128;
      if (xSignifier & 0x200000000000000000 > 0) resultSignifier = resultSignifier * 0x100000000000000162E42FEFA39EF366F >> 128;
      if (xSignifier & 0x100000000000000000 > 0) resultSignifier = resultSignifier * 0x1000000000000000B17217F7D1CF79AFA >> 128;
      if (xSignifier & 0x80000000000000000 > 0) resultSignifier = resultSignifier * 0x100000000000000058B90BFBE8E7BCD6D >> 128;
      if (xSignifier & 0x40000000000000000 > 0) resultSignifier = resultSignifier * 0x10000000000000002C5C85FDF473DE6B2 >> 128;
      if (xSignifier & 0x20000000000000000 > 0) resultSignifier = resultSignifier * 0x1000000000000000162E42FEFA39EF358 >> 128;
      if (xSignifier & 0x10000000000000000 > 0) resultSignifier = resultSignifier * 0x10000000000000000B17217F7D1CF79AB >> 128;
      if (xSignifier & 0x8000000000000000 > 0) resultSignifier = resultSignifier * 0x1000000000000000058B90BFBE8E7BCD5 >> 128;
      if (xSignifier & 0x4000000000000000 > 0) resultSignifier = resultSignifier * 0x100000000000000002C5C85FDF473DE6A >> 128;
      if (xSignifier & 0x2000000000000000 > 0) resultSignifier = resultSignifier * 0x10000000000000000162E42FEFA39EF34 >> 128;
      if (xSignifier & 0x1000000000000000 > 0) resultSignifier = resultSignifier * 0x100000000000000000B17217F7D1CF799 >> 128;
      if (xSignifier & 0x800000000000000 > 0) resultSignifier = resultSignifier * 0x10000000000000000058B90BFBE8E7BCC >> 128;
      if (xSignifier & 0x400000000000000 > 0) resultSignifier = resultSignifier * 0x1000000000000000002C5C85FDF473DE5 >> 128;
      if (xSignifier & 0x200000000000000 > 0) resultSignifier = resultSignifier * 0x100000000000000000162E42FEFA39EF2 >> 128;
      if (xSignifier & 0x100000000000000 > 0) resultSignifier = resultSignifier * 0x1000000000000000000B17217F7D1CF78 >> 128;
      if (xSignifier & 0x80000000000000 > 0) resultSignifier = resultSignifier * 0x100000000000000000058B90BFBE8E7BB >> 128;
      if (xSignifier & 0x40000000000000 > 0) resultSignifier = resultSignifier * 0x10000000000000000002C5C85FDF473DD >> 128;
      if (xSignifier & 0x20000000000000 > 0) resultSignifier = resultSignifier * 0x1000000000000000000162E42FEFA39EE >> 128;
      if (xSignifier & 0x10000000000000 > 0) resultSignifier = resultSignifier * 0x10000000000000000000B17217F7D1CF6 >> 128;
      if (xSignifier & 0x8000000000000 > 0) resultSignifier = resultSignifier * 0x1000000000000000000058B90BFBE8E7A >> 128;
      if (xSignifier & 0x4000000000000 > 0) resultSignifier = resultSignifier * 0x100000000000000000002C5C85FDF473C >> 128;
      if (xSignifier & 0x2000000000000 > 0) resultSignifier = resultSignifier * 0x10000000000000000000162E42FEFA39D >> 128;
      if (xSignifier & 0x1000000000000 > 0) resultSignifier = resultSignifier * 0x100000000000000000000B17217F7D1CE >> 128;
      if (xSignifier & 0x800000000000 > 0) resultSignifier = resultSignifier * 0x10000000000000000000058B90BFBE8E6 >> 128;
      if (xSignifier & 0x400000000000 > 0) resultSignifier = resultSignifier * 0x1000000000000000000002C5C85FDF472 >> 128;
      if (xSignifier & 0x200000000000 > 0) resultSignifier = resultSignifier * 0x100000000000000000000162E42FEFA38 >> 128;
      if (xSignifier & 0x100000000000 > 0) resultSignifier = resultSignifier * 0x1000000000000000000000B17217F7D1B >> 128;
      if (xSignifier & 0x80000000000 > 0) resultSignifier = resultSignifier * 0x100000000000000000000058B90BFBE8D >> 128;
      if (xSignifier & 0x40000000000 > 0) resultSignifier = resultSignifier * 0x10000000000000000000002C5C85FDF46 >> 128;
      if (xSignifier & 0x20000000000 > 0) resultSignifier = resultSignifier * 0x1000000000000000000000162E42FEFA2 >> 128;
      if (xSignifier & 0x10000000000 > 0) resultSignifier = resultSignifier * 0x10000000000000000000000B17217F7D0 >> 128;
      if (xSignifier & 0x8000000000 > 0) resultSignifier = resultSignifier * 0x1000000000000000000000058B90BFBE7 >> 128;
      if (xSignifier & 0x4000000000 > 0) resultSignifier = resultSignifier * 0x100000000000000000000002C5C85FDF3 >> 128;
      if (xSignifier & 0x2000000000 > 0) resultSignifier = resultSignifier * 0x10000000000000000000000162E42FEF9 >> 128;
      if (xSignifier & 0x1000000000 > 0) resultSignifier = resultSignifier * 0x100000000000000000000000B17217F7C >> 128;
      if (xSignifier & 0x800000000 > 0) resultSignifier = resultSignifier * 0x10000000000000000000000058B90BFBD >> 128;
      if (xSignifier & 0x400000000 > 0) resultSignifier = resultSignifier * 0x1000000000000000000000002C5C85FDE >> 128;
      if (xSignifier & 0x200000000 > 0) resultSignifier = resultSignifier * 0x100000000000000000000000162E42FEE >> 128;
      if (xSignifier & 0x100000000 > 0) resultSignifier = resultSignifier * 0x1000000000000000000000000B17217F6 >> 128;
      if (xSignifier & 0x80000000 > 0) resultSignifier = resultSignifier * 0x100000000000000000000000058B90BFA >> 128;
      if (xSignifier & 0x40000000 > 0) resultSignifier = resultSignifier * 0x10000000000000000000000002C5C85FC >> 128;
      if (xSignifier & 0x20000000 > 0) resultSignifier = resultSignifier * 0x1000000000000000000000000162E42FD >> 128;
      if (xSignifier & 0x10000000 > 0) resultSignifier = resultSignifier * 0x10000000000000000000000000B17217E >> 128;
      if (xSignifier & 0x8000000 > 0) resultSignifier = resultSignifier * 0x1000000000000000000000000058B90BE >> 128;
      if (xSignifier & 0x4000000 > 0) resultSignifier = resultSignifier * 0x100000000000000000000000002C5C85E >> 128;
      if (xSignifier & 0x2000000 > 0) resultSignifier = resultSignifier * 0x10000000000000000000000000162E42E >> 128;
      if (xSignifier & 0x1000000 > 0) resultSignifier = resultSignifier * 0x100000000000000000000000000B17216 >> 128;
      if (xSignifier & 0x800000 > 0) resultSignifier = resultSignifier * 0x10000000000000000000000000058B90A >> 128;
      if (xSignifier & 0x400000 > 0) resultSignifier = resultSignifier * 0x1000000000000000000000000002C5C84 >> 128;
      if (xSignifier & 0x200000 > 0) resultSignifier = resultSignifier * 0x100000000000000000000000000162E41 >> 128;
      if (xSignifier & 0x100000 > 0) resultSignifier = resultSignifier * 0x1000000000000000000000000000B1720 >> 128;
      if (xSignifier & 0x80000 > 0) resultSignifier = resultSignifier * 0x100000000000000000000000000058B8F >> 128;
      if (xSignifier & 0x40000 > 0) resultSignifier = resultSignifier * 0x10000000000000000000000000002C5C7 >> 128;
      if (xSignifier & 0x20000 > 0) resultSignifier = resultSignifier * 0x1000000000000000000000000000162E3 >> 128;
      if (xSignifier & 0x10000 > 0) resultSignifier = resultSignifier * 0x10000000000000000000000000000B171 >> 128;
      if (xSignifier & 0x8000 > 0) resultSignifier = resultSignifier * 0x1000000000000000000000000000058B8 >> 128;
      if (xSignifier & 0x4000 > 0) resultSignifier = resultSignifier * 0x100000000000000000000000000002C5B >> 128;
      if (xSignifier & 0x2000 > 0) resultSignifier = resultSignifier * 0x10000000000000000000000000000162D >> 128;
      if (xSignifier & 0x1000 > 0) resultSignifier = resultSignifier * 0x100000000000000000000000000000B16 >> 128;
      if (xSignifier & 0x800 > 0) resultSignifier = resultSignifier * 0x10000000000000000000000000000058A >> 128;
      if (xSignifier & 0x400 > 0) resultSignifier = resultSignifier * 0x1000000000000000000000000000002C4 >> 128;
      if (xSignifier & 0x200 > 0) resultSignifier = resultSignifier * 0x100000000000000000000000000000161 >> 128;
      if (xSignifier & 0x100 > 0) resultSignifier = resultSignifier * 0x1000000000000000000000000000000B0 >> 128;
      if (xSignifier & 0x80 > 0) resultSignifier = resultSignifier * 0x100000000000000000000000000000057 >> 128;
      if (xSignifier & 0x40 > 0) resultSignifier = resultSignifier * 0x10000000000000000000000000000002B >> 128;
      if (xSignifier & 0x20 > 0) resultSignifier = resultSignifier * 0x100000000000000000000000000000015 >> 128;
      if (xSignifier & 0x10 > 0) resultSignifier = resultSignifier * 0x10000000000000000000000000000000A >> 128;
      if (xSignifier & 0x8 > 0) resultSignifier = resultSignifier * 0x100000000000000000000000000000004 >> 128;
      if (xSignifier & 0x4 > 0) resultSignifier = resultSignifier * 0x100000000000000000000000000000001 >> 128;

      if (!xNegative) {
        resultSignifier = resultSignifier >> 15 & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
        resultExponent += 0x3FFF;
      } else if (resultExponent <= 0x3FFE) {
        resultSignifier = resultSignifier >> 15 & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
        resultExponent = 0x3FFF - resultExponent;
      } else {
        resultSignifier = resultSignifier >> resultExponent - 16367;
        resultExponent = 0;
      }

      return bytes16 (uint128 (resultExponent << 112 | resultSignifier));
    }
  }

  /**
   * Calculate e^x.
   *
   * @param x quadruple precision number
   * @return quadruple precision number
   */
  function exp (bytes16 x) internal pure returns (bytes16) {
    return pow_2 (mulABDK (x, 0x3FFF71547652B82FE1777D0FFDA0D23A));
  }
  
  function msb (uint256 x) private pure returns (uint256) {
    require (x > 0);

    uint256 result = 0;

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

    return result;
  }
  
  function totalSupplyAtTime (uint t) internal pure returns (bytes16 fin) {
      bytes16 xQuad = fromUInt(t);
      bytes16 xQuadSub = subABDK(xQuad, 0x4016e133800000000000000000000000);
      bytes16 exponent = mulABDK(xQuadSub, 0xbfea0c6f7a0b5ed8d36b4c7f34938583);
      bytes16 expExp = exp(exponent);
      bytes16 bottom = addABDK(0x3fff0000000000000000000000000000, expExp);
      bytes16 whole = divABDK(0x402a22db571485000000000000000000, bottom);
      fin = addABDK(whole, 0x401f73b9fbd700000000000000000000);
  }
  
}

contract SafeMath {
    
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }
    
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }
    
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;
        return c;
    }
    
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }
    
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }
    
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        return c;
    }
    
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }
    
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
    
}

contract ERC20wRebase is SafeMath, ABDKMathQuad {

  string public name;
  string public symbol;
  uint8 public decimals;
  address public _owner;
  uint private supplyTotal;
  uint private constant _decimals = 9;
  uint private constant uintMax = ~uint256(0);
  uint private constant tokensMax = 10**4 * 10**_decimals;
  uint private tokensInitial = 10**1 * 10**_decimals;
  uint internal unitsPerToken;
  uint private unitsTotal = uintMax - (uintMax % tokensMax);
  uint public tokensCurrent;

  mapping(address => uint) balances;
  mapping(address => mapping(address => uint)) allowed;

  event Transfer(address indexed from, address indexed to, uint tokens);
  event Approval(address indexed tokenOwner, address indexed spender, uint tokens);

  modifier onlyOwner() {
    require(_owner == msg.sender, "Ownable: caller is not the owner");
    _;
  }

  constructor() public {
    name = "Azizos";
    symbol = "AZIZ";
    decimals = 9;
    supplyTotal = tokensMax;
    unitsPerToken = div(unitsTotal, supplyTotal);
    uint unitsInitial =  mul(unitsPerToken, tokensInitial);
    tokensCurrent = tokensInitial;
    balances[msg.sender] = unitsInitial;
    _owner = msg.sender;
    emit Transfer(address(0), msg.sender, tokensInitial);
  }

  function rebase(int supplyDelta) external onlyOwner returns (uint) {
    if (supplyDelta == 0) {
        emit RebaseEvent(supplyDelta);
        return supplyTotal;
    }
    
    if (supplyDelta < 0) {
        tokensCurrent = sub(tokensCurrent, div(mul(uint(-supplyDelta), tokensCurrent), supplyTotal));
        supplyTotal = sub(supplyTotal, uint(-supplyDelta));
    }
    
    if (supplyDelta > 0) {
        tokensCurrent = add(tokensCurrent, div(mul(uint(supplyDelta), tokensCurrent), supplyTotal));
        supplyTotal = add(supplyTotal, uint(supplyDelta));
    }

    unitsPerToken = div(unitsTotal, supplyTotal);

    emit RebaseEvent(supplyDelta);
    return supplyTotal;
  }

  function totalSupply() public view returns (uint) {
    return tokensCurrent;
  }
  
  function balanceOf(address who) public view returns (uint) {
    return div(balances[who], unitsPerToken);
  }

  function transfer(address to, uint value) public returns (bool) {
    uint unitValue = mul(value, unitsPerToken);
    balances[msg.sender] = sub(balances[msg.sender], unitValue);
    balances[to] = add(balances[to], unitValue);
    emit Transfer(msg.sender, to, value);
    return true;
  }

  function allowance(address owner_, address spender) public view returns (uint) {
    return allowed[owner_][spender];
  }

  function transferFrom(address from, address to, uint256 value) public returns (bool) {
    allowed[from][msg.sender] = sub(allowed[from][msg.sender], value);

    uint unitValue = mul(value, unitsPerToken);
    balances[from] = sub(balances[from], unitValue);
    balances[to] = add(balances[to], unitValue);
    emit Transfer(from, to, value);

    return true;
  }

  function approve(address spender, uint value) public returns (bool) {
    allowed[msg.sender][spender] = value;
    emit Approval(msg.sender, spender, value);
    return true;
  }

  function increaseAllowance(address spender, uint addedValue) public returns (bool) {
    allowed[msg.sender][spender] = add(allowed[msg.sender][spender], addedValue);
    emit Approval(msg.sender, spender, allowed[msg.sender][spender]);
    return true;
  }

  function decreaseAllowance(address spender, uint subtractedValue) public returns (bool) {
    uint256 oldValue = allowed[msg.sender][spender];
    if (subtractedValue >= oldValue) {
      allowed[msg.sender][spender] = 0;
    } else {
      allowed[msg.sender][spender] = sub(oldValue, subtractedValue);
    }
    emit Approval(msg.sender, spender, allowed[msg.sender][spender]);
    return true;
  }

  event RebaseEvent(int supplyDelta);

}

abstract contract TwinContract {
    
    function totalBalanceOf(address _of) virtual public view returns (uint256 amount);
    function mint(address unlocker, uint unlockAmount) virtual external returns (bool);
    function getRewardsGiven() virtual public view returns(uint);
    function rebase(int supplyDelta) virtual external returns (uint);
    function getTokensCurrent() virtual public view returns(uint);
    function getSupplyTotal() virtual public view returns (uint);
    function setTokensCurrent(uint newTokens) virtual external returns(uint);
    function getUnitsPerToken() virtual public view returns (uint);
    
}

abstract contract ThirdPartyContract {
    
    function transferFrom(address from, address to, uint256 value) virtual public returns (bool);
    function transfer(address to, uint value) virtual public returns (bool);
    
}

contract Azizos is ERC20wRebase {
  
  uint public totalValueTPT;
  uint public totalRewardsGivenTPT;
  
  address public twinAddress;
  TwinContract private twinContract;
  address public thirdPartyTokenAddress;
  ThirdPartyContract private thirdPartyContract;
  uint public lockingEnabledTime;
  bool public lockEnabled = false;

  event Mint(address mintee, uint amount);
  event Lock(address locker, uint lockAmount, uint duration);
  event Unlock(address unlocker);
  event UpdatePosition(address updater, int amountDelta, int timeDelta);
  event LockTPT(address locker, uint lockAmount, uint duration);
  event UnlockTPT(address unlocker);
  event UpdatePositionTPT(address updater, int amountDelta, int timeDelta);
  event EnableLock();
  event SetTwin(address twinAddress);
  event SetTPT(address tptAddress);
  event ChangeOwner(address newOwner);
  
  modifier onlyTwin() {
    require(msg.sender == twinAddress, "Ownable: caller is not the owner");
    _;
  }
  
  function setTwin(address addr) external onlyOwner returns (bool) {
    require(twinAddress == address(0), "TWIN_ALREADY_SET");
    twinAddress = addr;
    twinContract = TwinContract(addr);
    emit SetTwin(addr);
    return true;
  }
  
  function setTPT(address addr) external onlyOwner returns (bool) {
      thirdPartyTokenAddress = addr;
      thirdPartyContract = ThirdPartyContract(addr);
      emit SetTPT(addr);
      return true;
  }
  
  function changeOwner(address addr) external onlyOwner returns (bool) {
    _owner = addr;
    return true;
  }

  mapping(address => lockStruct) public locked;
  mapping(address => lockTPTStruct) public lockedTPT;
  
  struct lockStruct {
    uint amount;
    bytes16 percentSupplyLocked;
    uint unlockTime;
    bool punishmentFlag;
    uint confirmedReward;
    bytes16 supplyWhenLastModified;
  }
  
  struct lockTPTStruct {
    uint amount;
    uint value;
    uint unlockTime;
    bool punishmentFlag;
    uint confirmedReward;
    bytes16 supplyWhenLastModified;
  }
  
  function mint(address unlocker, uint unlockAmount) external onlyTwin returns (bool) {
    uint addedTokens = unlockAmount;
    uint addedUnits = mul(unitsPerToken, addedTokens);
    tokensCurrent = add(tokensCurrent, addedTokens);
    balances[unlocker] = add(balances[unlocker], addedUnits);
    emit Mint(unlocker, unlockAmount);
    return true;
  }
  
  function enableLocking() external onlyOwner returns (bool) {
    require(!lockEnabled, "LOCKING_ALREADY_ENABLED");
    lockEnabled = true;
    lockingEnabledTime = now;
    emit EnableLock();
    return lockEnabled;
  }
  
  function lock(uint amount, uint duration) public returns (bool) {
    require(locked[msg.sender].amount == 0, "POSITION_ALREADY_EXISTS");
    require(amount > 0, "INVALID_AMOUNT");
    require(duration > 0, "INVALID_DURATION");
    require(lockEnabled, "LOCKING_NOT_ENABLED_YET");
    uint unitAmount = mul(amount, unitsPerToken);
    uint unitsCurrent = mul(tokensCurrent, unitsPerToken);
    bytes16 percentSupplyLocked = divABDK(fromUInt(unitAmount), fromUInt(unitsCurrent));
    uint unlockTime = add(now, duration);
    locked[msg.sender] = lockStruct(unitAmount, percentSupplyLocked, unlockTime, false, 0, mulABDK(totalSupplyAtTime(sub(now, lockingEnabledTime)), 0x40d3c25c268497681c2650cb4be40d60));
    transfer(address(this), amount);
    emit Lock(msg.sender, amount, duration);
    return true;
  }
  
  function lockTPT(uint amount, uint duration) public returns (bool) {
    require(lockedTPT[msg.sender].amount == 0, "POSITION_ALREADY_EXISTS");
    require(amount > 0, "INVALID_AMOUNT");
    require(duration > 0, "INVALID_DURATION");
    require(lockEnabled, "LOCKING_NOT_ENABLED_YET");
    uint value = mul(amount, mul(duration, duration));
    totalValueTPT = add(totalValueTPT, value);
    lockedTPT[msg.sender] = lockTPTStruct(amount, value, add(now, duration), false, 0, mulABDK(totalSupplyAtTime(sub(now, lockingEnabledTime)), 0x40d3c25c268497681c2650cb4be40d60));
    thirdPartyContract.transferFrom(msg.sender, address(this), amount);
    emit LockTPT(msg.sender, amount, duration);
    return true;
  }

  function calculateUnlockReward(address unlocker, uint unlockTime, bool includeConfirmed) private view returns (uint reward) {
    bool pseudoFlag = false;
    if (locked[unlocker].punishmentFlag || locked[unlocker].unlockTime > unlockTime) {
      pseudoFlag = true;
    }
    int timeUnlockTimeDiff = int(unlockTime) - int(locked[unlocker].unlockTime);
    if (timeUnlockTimeDiff < 0) {
      timeUnlockTimeDiff = -timeUnlockTimeDiff;
    }
    uint minNowUnlockTime = (unlockTime + locked[unlocker].unlockTime) / 2 - uint(timeUnlockTimeDiff) / 2;
    require(minNowUnlockTime == unlockTime || minNowUnlockTime == locked[unlocker].unlockTime, "MIN_ERROR");
    reward = toUInt(mulABDK(subABDK(mulABDK(totalSupplyAtTime(sub(minNowUnlockTime, lockingEnabledTime)), 0x40d3c25c268497681c2650cb4be40d60), locked[unlocker].supplyWhenLastModified), locked[unlocker].percentSupplyLocked));
    if (includeConfirmed) {
        reward = add(reward, locked[unlocker].confirmedReward);
    }
    reward = div(reward, 3);
    if (pseudoFlag) {
      reward = div(reward, 2);
    }
  }
  
  function calculateUnlockRewardTPT(address unlocker, uint unlockTime, bool includeConfirmed) private view returns (uint reward) {
    bool pseudoFlag = false;
    if(lockedTPT[unlocker].punishmentFlag || lockedTPT[unlocker].unlockTime > unlockTime) {
      pseudoFlag = true;
    }
    int timeUnlockTimeDiff = int(unlockTime) - int(lockedTPT[unlocker].unlockTime);
    if (timeUnlockTimeDiff < 0) {
      timeUnlockTimeDiff = -timeUnlockTimeDiff;
    }
    uint minNowUnlockTime = (unlockTime + lockedTPT[unlocker].unlockTime) / 2 - uint(timeUnlockTimeDiff) / 2;
    require(minNowUnlockTime == unlockTime || minNowUnlockTime == lockedTPT[unlocker].unlockTime, "MIN_ERROR");
    reward = toUInt(mulABDK(subABDK(mulABDK(totalSupplyAtTime(sub(minNowUnlockTime, lockingEnabledTime)), 0x40d3c25c268497681c2650cb4be40d60), lockedTPT[unlocker].supplyWhenLastModified), divABDK(fromUInt(lockedTPT[unlocker].value), fromUInt(totalValueTPT))));
    if (includeConfirmed) {
        reward = add(reward, lockedTPT[unlocker].confirmedReward);
    }
    reward = toUInt(mulABDK(fromUInt(reward), subABDK(0x3fff0000000000000000000000000000, divABDK(fromUInt(totalRewardsGivenTPT), mulABDK(subABDK(totalSupplyAtTime(sub(now, lockingEnabledTime)), 0x40202a05f20000000000000000000000), 0x40d3c25c268497681c2650cb4be40d60)))));
    reward = toUInt(mulABDK(fromUInt(reward), 0x3ffe5555555555555555555555555555));
    if (pseudoFlag) {
      reward = div(reward, 2);
    }      
  }
  
  function updatePosition(int amountDelta, int durationDelta) public returns (bool) {
    require(locked[msg.sender].amount > 0, "NO_POSITION");

    uint confirmedReward = calculateUnlockReward(msg.sender, now, false) * 2;
    locked[msg.sender].confirmedReward = add(locked[msg.sender].confirmedReward, confirmedReward);

    uint unitsCurrent = mul(tokensCurrent, unitsPerToken);

    if (locked[msg.sender].unlockTime < now) {
        require (durationDelta > 0, "DURATION_DELTA_OF_EXPIRED_POSITION_MUST_BE_POSITIVE");
        require (amountDelta >= 0, "AMOUNT_DELTA_OF_EXPIRE_POSITION_MUST_BE_AT_LEAST_ZERO");
        bytes16 percentSupplyLocked = divABDK(fromUInt(locked[msg.sender].amount), fromUInt(unitsCurrent));
        locked[msg.sender].percentSupplyLocked = percentSupplyLocked;
        locked[msg.sender].unlockTime = now;
    }

    if (amountDelta > 0) {
      uint unitDelta = mul(uint(amountDelta), unitsPerToken);
      locked[msg.sender].amount = add(locked[msg.sender].amount, unitDelta);
      bytes16 percentSupplyLocked = divABDK(fromUInt(unitDelta), fromUInt(unitsCurrent));
      locked[msg.sender].percentSupplyLocked = addABDK(locked[msg.sender].percentSupplyLocked, percentSupplyLocked);
      transfer(address(this), uint(amountDelta));
    }
    
    if (amountDelta < 0) {
      uint unitDelta = mul(uint(-amountDelta), unitsPerToken);
      locked[msg.sender].amount = sub(locked[msg.sender].amount, unitDelta);
      bytes16 percentSupplyLocked = divABDK(fromUInt(unitDelta), fromUInt(unitsCurrent));
      locked[msg.sender].percentSupplyLocked = subABDK(locked[msg.sender].percentSupplyLocked, percentSupplyLocked);
      locked[msg.sender].punishmentFlag = true;
      this.transfer(msg.sender, uint(-amountDelta));
    }

    if (durationDelta < 0) {
      locked[msg.sender].unlockTime = sub(locked[msg.sender].unlockTime, uint(-durationDelta));
      locked[msg.sender].punishmentFlag = true;
    }

    if (durationDelta > 0) {
      locked[msg.sender].unlockTime = add(locked[msg.sender].unlockTime, uint(durationDelta));
    }
    
    locked[msg.sender].supplyWhenLastModified = mulABDK(totalSupplyAtTime(sub(now, lockingEnabledTime)), 0x40d3c25c268497681c2650cb4be40d60);

    require(locked[msg.sender].amount > 0, "POSITION_AMOUNT_CANNOT_BE_NEGATIVE");
    require(locked[msg.sender].unlockTime > now, "UNLOCKTIME_MUST_BE_IN_FUTURE");
    
    emit UpdatePosition(msg.sender, amountDelta, durationDelta);
    return true;
  }
  
  function updatePositionTPT(int amountDelta, int durationDelta) public returns (bool) {
    require(lockedTPT[msg.sender].amount > 0, "NO_POSITION");
    
    uint confirmedReward = calculateUnlockRewardTPT(msg.sender, now, false) * 2;
    lockedTPT[msg.sender].confirmedReward = add(lockedTPT[msg.sender].confirmedReward, confirmedReward);

    if (lockedTPT[msg.sender].unlockTime < now) {
        require (durationDelta > 0, "DURATION_DELTA_OF_EXPIRED_POSITION_MUST_BE_POSITIVE");
        require (amountDelta >= 0, "AMOUNT_DELTA_OF_EXPIRE_POSITION_MUST_BE_AT_LEAST_ZERO");
        lockedTPT[msg.sender].unlockTime = now;
    }

    if (amountDelta > 0) {
      lockedTPT[msg.sender].amount = add(lockedTPT[msg.sender].amount, uint(amountDelta));
      uint timeUntilUnlock = sub(lockedTPT[msg.sender].unlockTime, now);
      uint value = mul(uint(amountDelta), mul(timeUntilUnlock, timeUntilUnlock));
      totalValueTPT = add(totalValueTPT, value);
      lockedTPT[msg.sender].value = add(lockedTPT[msg.sender].value, value);
      thirdPartyContract.transferFrom(msg.sender, address(this), uint(amountDelta));
    }
    
    if (amountDelta < 0) {
      lockedTPT[msg.sender].amount = sub(lockedTPT[msg.sender].amount, uint(-amountDelta));
      uint timeUntilUnlock = sub(lockedTPT[msg.sender].unlockTime, now);
      uint value = mul(uint(-amountDelta), mul(timeUntilUnlock, timeUntilUnlock));
      totalValueTPT = sub(totalValueTPT, value);
      lockedTPT[msg.sender].value = sub(lockedTPT[msg.sender].value, value);
      lockedTPT[msg.sender].punishmentFlag = true;
      thirdPartyContract.transfer(msg.sender, uint(-amountDelta));
    }

    if (durationDelta < 0) {
      lockedTPT[msg.sender].unlockTime = sub(lockedTPT[msg.sender].unlockTime, uint(-durationDelta));
      uint value = mul(lockedTPT[msg.sender].amount, mul(uint(-durationDelta), uint(-durationDelta)));
      totalValueTPT = sub(totalValueTPT, value);
      lockedTPT[msg.sender].value = sub(lockedTPT[msg.sender].value, value);
      lockedTPT[msg.sender].punishmentFlag = true;
    }

    if (durationDelta > 0) {
      lockedTPT[msg.sender].unlockTime = add(lockedTPT[msg.sender].unlockTime, uint(durationDelta));
      uint value = mul(lockedTPT[msg.sender].amount, mul(uint(durationDelta), uint(durationDelta)));
      totalValueTPT = add(totalValueTPT, value);
      lockedTPT[msg.sender].value = add(lockedTPT[msg.sender].value, value);
    }
    
    lockedTPT[msg.sender].supplyWhenLastModified = mulABDK(totalSupplyAtTime(sub(now, lockingEnabledTime)), 0x40d3c25c268497681c2650cb4be40d60);
    
    require(lockedTPT[msg.sender].amount > 0, "POSITION_AMOUNT_CANNOT_BE_NEGATIVE");
    require(lockedTPT[msg.sender].unlockTime > now, "UNLOCKTIME_MUST_BE_IN_FUTURE");
    
    emit UpdatePositionTPT(msg.sender, amountDelta, durationDelta);
    return true;
  }
  
  function unlock() public returns (bool success) {
    require(locked[msg.sender].amount > 0, "NO_POSITION");
    uint tokenAmount = div(locked[msg.sender].amount, unitsPerToken);
    this.transfer(msg.sender, tokenAmount);
    uint reward = calculateUnlockReward(msg.sender, now, true);
    uint rewardTokens = div(reward, twinContract.getUnitsPerToken());
    success = twinContract.mint(msg.sender, rewardTokens);
    locked[msg.sender] = lockStruct(0, bytes16(0), 0, false, 0, bytes16(0));
    require(success, "MINT_FAILED");
    emit Unlock(msg.sender);
  }
  
  function unlockTPT() public returns (bool success) {
    require(lockedTPT[msg.sender].amount > 0, "NO_POSITION");
    thirdPartyContract.transfer(msg.sender, lockedTPT[msg.sender].amount);
    uint reward = calculateUnlockRewardTPT(msg.sender, now, true);
    totalRewardsGivenTPT = add(reward, totalRewardsGivenTPT);
    uint rewardTokens = div(reward, twinContract.getUnitsPerToken());
    success = twinContract.mint(msg.sender, rewardTokens);
    totalValueTPT = sub(totalValueTPT, lockedTPT[msg.sender].value);
    lockedTPT[msg.sender] = lockTPTStruct(0, 0, 0, false, 0, bytes16(0));
    require(success, "MINT_FAILED");
    emit UnlockTPT(msg.sender);
  }
  
  function getRewardTokens(address addr, uint time) public view returns (uint) {
    require(locked[addr].amount > 0, "NO_POSITION");
    return div(calculateUnlockReward(addr, time, true), twinContract.getUnitsPerToken());
  }
  
  function getLockedTokens(address addr) public view returns (uint) {
    require(locked[addr].amount > 0, "NO_POSITION");
    return div(locked[addr].amount, unitsPerToken);   
  }
  
  function getRewardTokensTPT(address addr, uint time) public view returns (uint) {
    require(lockedTPT[addr].amount > 0, "NO_POSITION");
    return div(calculateUnlockRewardTPT(addr, time, true), twinContract.getUnitsPerToken());
  }
  
  function getUnitsPerToken() public view returns (uint) {
      return unitsPerToken;
  }

}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenOwner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"ChangeOwner","type":"event"},{"anonymous":false,"inputs":[],"name":"EnableLock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"locker","type":"address"},{"indexed":false,"internalType":"uint256","name":"lockAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"Lock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"locker","type":"address"},{"indexed":false,"internalType":"uint256","name":"lockAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"LockTPT","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"mintee","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"int256","name":"supplyDelta","type":"int256"}],"name":"RebaseEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tptAddress","type":"address"}],"name":"SetTPT","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"twinAddress","type":"address"}],"name":"SetTwin","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":"tokens","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"unlocker","type":"address"}],"name":"Unlock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"unlocker","type":"address"}],"name":"UnlockTPT","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"updater","type":"address"},{"indexed":false,"internalType":"int256","name":"amountDelta","type":"int256"},{"indexed":false,"internalType":"int256","name":"timeDelta","type":"int256"}],"name":"UpdatePosition","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"updater","type":"address"},{"indexed":false,"internalType":"int256","name":"amountDelta","type":"int256"},{"indexed":false,"internalType":"int256","name":"timeDelta","type":"int256"}],"name":"UpdatePositionTPT","type":"event"},{"inputs":[],"name":"_owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"who","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"changeOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableLocking","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getLockedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"time","type":"uint256"}],"name":"getRewardTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"time","type":"uint256"}],"name":"getRewardTokensTPT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUnitsPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"lock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"lockTPT","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"locked","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes16","name":"percentSupplyLocked","type":"bytes16"},{"internalType":"uint256","name":"unlockTime","type":"uint256"},{"internalType":"bool","name":"punishmentFlag","type":"bool"},{"internalType":"uint256","name":"confirmedReward","type":"uint256"},{"internalType":"bytes16","name":"supplyWhenLastModified","type":"bytes16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lockedTPT","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"unlockTime","type":"uint256"},{"internalType":"bool","name":"punishmentFlag","type":"bool"},{"internalType":"uint256","name":"confirmedReward","type":"uint256"},{"internalType":"bytes16","name":"supplyWhenLastModified","type":"bytes16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockingEnabledTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"unlocker","type":"address"},{"internalType":"uint256","name":"unlockAmount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"int256","name":"supplyDelta","type":"int256"}],"name":"rebase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setTPT","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setTwin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"thirdPartyTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensCurrent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRewardsGivenTPT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalValueTPT","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":[],"name":"twinAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unlock","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlockTPT","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"int256","name":"amountDelta","type":"int256"},{"internalType":"int256","name":"durationDelta","type":"int256"}],"name":"updatePosition","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"int256","name":"amountDelta","type":"int256"},{"internalType":"int256","name":"durationDelta","type":"int256"}],"name":"updatePositionTPT","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

6402540be4006004556507326b47ffff1960069081556011805460ff1916905560c0604052608081905265417a697a6f7360d01b60a090815262000047916000919062000290565b506040805180820190915260048082526320ad24ad60e11b6020909201918252620000759160019162000290565b506002805460ff191660091790556509184e72a0006003819055600654620000a6916001600160e01b036200013816565b6005819055600454600091620000c5916001600160e01b036200018b16565b6004805460075533600081815260086020908152604080832086905560028054610100600160a81b0319166101008602179055935484519081529351949550919390927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92908290030190a35062000335565b60006200018283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250620001e960201b60201c565b90505b92915050565b6000826200019c5750600062000185565b82820282848281620001aa57fe5b0414620001825760405162461bcd60e51b8152600401808060200182810382526021815260200180620054296021913960400191505060405180910390fd5b60008183620002795760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156200023d57818101518382015260200162000223565b50505050905090810190601f1680156200026b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816200028657fe5b0495945050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002d357805160ff191683800117855562000303565b8280016001018555821562000303579182015b8281111562000303578251825591602001919060010190620002e6565b506200031192915062000315565b5090565b6200033291905b808211156200031157600081556001016200031c565b90565b6150e480620003456000396000f3fe608060405234801561001057600080fd5b50600436106102275760003560e01c80636b2d95d411610130578063a9059cbb116100b8578063d16bfa5d1161007c578063d16bfa5d146106d7578063dd62ed3e146106fa578063ea4c798c14610728578063eefa39ed14610730578063fcec898d1461073857610227565b8063a9059cbb14610610578063b2bdfa7b1461063c578063c25116b014610644578063c78aa6681461064c578063cbf9fe5f1461067257610227565b80639b5308ec116100ff5780639b5308ec1461052d578063a457c2d714610590578063a69df4b5146105bc578063a6f9dae1146105c4578063a7f89797146105ea57610227565b80636b2d95d4146104b657806370a08231146104dc57806385cb8b571461050257806395d89b411461052557610227565b806324da6603116101b35780633356c39c116101825780633356c39c14610407578063395093511461042a57806340c10f19146104565780634ca5d3e414610482578063627752231461048a57610227565b806324da6603146103ad578063313ce567146103b55780633166b848146103d3578063320d714e146103db57610227565b80630cac4e60116101fa5780630cac4e601461033c5780631089994c146103445780631338736f1461034c57806318160ddd1461036f57806323b872dd1461037757610227565b806301bec1cc1461022c57806306fdde0314610250578063095ea7b3146102cd5780630ab114f91461030d575b600080fd5b610234610740565b604080516001600160a01b039092168252519081900360200190f35b61025861074f565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561029257818101518382015260200161027a565b50505050905090810190601f1680156102bf5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102f9600480360360408110156102e357600080fd5b506001600160a01b0381351690602001356107dd565b604080519115158252519081900360200190f35b61032a6004803603602081101561032357600080fd5b5035610844565b60408051918252519081900360200190f35b61032a6109a5565b6102f96109ab565b6102f96004803603604081101561036257600080fd5b5080359060200135610cd2565b61032a610f97565b6102f96004803603606081101561038d57600080fd5b506001600160a01b03813581169160208101359091169060400135610f9d565b61032a6110b7565b6103bd6110bd565b6040805160ff9092168252519081900360200190f35b6102f96110c6565b61032a600480360360408110156103f157600080fd5b506001600160a01b0381351690602001356110cf565b6102f96004803603604081101561041d57600080fd5b508035906020013561118b565b6102f96004803603604081101561044057600080fd5b506001600160a01b038135169060200135611780565b6102f96004803603604081101561046c57600080fd5b506001600160a01b038135169060200135611813565b61032a61190d565b61032a600480360360408110156104a057600080fd5b506001600160a01b038135169060200135611913565b61032a600480360360208110156104cc57600080fd5b50356001600160a01b031661197a565b61032a600480360360208110156104f257600080fd5b50356001600160a01b03166119f8565b6102f96004803603604081101561051857600080fd5b5080359060200135611a1e565b610258611d04565b6105536004803603602081101561054357600080fd5b50356001600160a01b0316611d5e565b60408051968752602087019590955285850193909352901515606085015260808401526001600160801b03191660a0830152519081900360c00190f35b6102f9600480360360408110156105a657600080fd5b506001600160a01b038135169060200135611d9a565b6102f9611e83565b6102f9600480360360208110156105da57600080fd5b50356001600160a01b031661215c565b6102f96004803603602081101561060057600080fd5b50356001600160a01b03166121db565b6102f96004803603604081101561062657600080fd5b506001600160a01b038135169060200135612294565b61023461234b565b61023461235f565b6102f96004803603602081101561066257600080fd5b50356001600160a01b031661236e565b6106986004803603602081101561068857600080fd5b50356001600160a01b0316612478565b604080519687526001600160801b03199586166020880152868101949094529115156060860152608085015290911660a0830152519081900360c00190f35b6102f9600480360360408110156106ed57600080fd5b50803590602001356124b8565b61032a6004803603604081101561071057600080fd5b506001600160a01b03813581169160200135166129e5565b6102f9612a10565b61032a612b01565b61032a612b07565b600e546001600160a01b031681565b6000805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107d55780601f106107aa576101008083540402835291602001916107d5565b820191906000526020600020905b8154815290600101906020018083116107b857829003601f168201915b505050505081565b3360008181526009602090815260408083206001600160a01b038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35060015b92915050565b60025460009061010090046001600160a01b03163314610899576040805162461bcd60e51b8152602060048201819052602482015260008051602061503a833981519152604482015290519081900360640190fd5b816108da576040805183815290517f0b7e711d124e53e17b23a99f1ccbb839f29f7988434c16a32905c49fd25c067f9181900360200190a1506003546109a0565b6000821215610920576109086007546109036108fb85600003600754612b0d565b600354612b66565b612ba8565b60075560035461091c906000849003612ba8565b6003555b60008213156109575761094360075461093e6108fb85600754612b0d565b612bea565b6007556003546109539083612bea565b6003555b610965600654600354612b66565b6005556040805183815290517f0b7e711d124e53e17b23a99f1ccbb839f29f7988434c16a32905c49fd25c067f9181900360200190a1506003545b919050565b60075481565b336000908152601360205260408120546109fa576040805162461bcd60e51b815260206004820152600b60248201526a2727afa827a9a4aa24a7a760a91b604482015290519081900360640190fd5b600f5433600081815260136020908152604080832054815163a9059cbb60e01b815260048101959095526024850152516001600160a01b039094169363a9059cbb93604480820194918390030190829087803b158015610a5957600080fd5b505af1158015610a6d573d6000803e3d6000fd5b505050506040513d6020811015610a8357600080fd5b5060009050610a9433426001612c44565b9050610aa281600b54612bea565b600b819055506000610b2d82600d60009054906101000a90046001600160a01b03166001600160a01b031663fcec898d6040518163ffffffff1660e01b815260040160206040518083038186803b158015610afc57600080fd5b505afa158015610b10573d6000803e3d6000fd5b505050506040513d6020811015610b2657600080fd5b5051612b66565b600d54604080516340c10f1960e01b81523360048201526024810184905290519293506001600160a01b03909116916340c10f19916044808201926020929091908290030181600087803b158015610b8457600080fd5b505af1158015610b98573d6000803e3d6000fd5b505050506040513d6020811015610bae57600080fd5b5051600a5433600090815260136020526040902060010154919450610bd291612ba8565b600a556040805160c0810182526000808252602080830182815283850183815260608501848152608080870186815260a0880187815233885260139096529790952095518655915160018601555160028501555160038401805460ff1916911515919091179055925160048301559151600590910180546001600160801b0319169190921c17905582610c9a576040805162461bcd60e51b815260206004820152600b60248201526a1352539517d1905253115160aa1b604482015290519081900360640190fd5b6040805133815290517fc0b7a800db8dd9b5c87a08cd46842e5489191da7f8eb637a690a9202eacd5d049181900360200190a1505090565b3360009081526012602052604081205415610d2e576040805162461bcd60e51b8152602060048201526017602482015276504f534954494f4e5f414c52454144595f45584953545360481b604482015290519081900360640190fd5b60008311610d74576040805162461bcd60e51b815260206004820152600e60248201526d1253959053125117d05353d5539560921b604482015290519081900360640190fd5b60008211610dbc576040805162461bcd60e51b815260206004820152601060248201526f24a72b20a624a22fa22aa920aa24a7a760811b604482015290519081900360640190fd5b60115460ff16610e0d576040805162461bcd60e51b81526020600482015260176024820152761313d0d2d25391d7d393d517d153905093115117d65155604a1b604482015290519081900360640190fd5b6000610e1b84600554612b0d565b90506000610e2d600754600554612b0d565b90506000610e4b610e3d84612e95565b610e4684612e95565b612efa565b90506000610e594287612bea565b90506040518060c00160405280858152602001836001600160801b031916815260200182815260200160001515815260200160008152602001610ec2610ea9610ea442601054612ba8565b6131a7565b6f02069e12e13424bb40e132865a5f206b60851b613242565b6001600160801b03199081169091523360009081526012602090815260409182902084518155908401516001820180548516608092831c179055918401516002820155606084015160038201805460ff191691151591909117905581840151600482015560a0909301516005909301805490921692901c919091179055610f493088612294565b50604080513381526020810189905280820188905290517f49eaf4942f1237055eb4cfa5f31c9dfe50d5b4ade01e021f7de8be2fbbde557b9181900360600190a15060019695505050505050565b60075490565b6001600160a01b0383166000908152600960209081526040808320338452909152812054610fcb9083612ba8565b6001600160a01b0385166000908152600960209081526040808320338452909152812091909155600554611000908490612b0d565b6001600160a01b0386166000908152600860205260409020549091506110269082612ba8565b6001600160a01b0380871660009081526008602052604080822093909355908616815220546110559082612bea565b6001600160a01b0380861660008181526008602090815260409182902094909455805187815290519193928916927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3506001949350505050565b600b5481565b60025460ff1681565b60115460ff1681565b6001600160a01b038216600090815260136020526040812054611127576040805162461bcd60e51b815260206004820152600b60248201526a2727afa827a9a4aa24a7a760a91b604482015290519081900360640190fd5b61118461113684846001612c44565b600d60009054906101000a90046001600160a01b03166001600160a01b031663fcec898d6040518163ffffffff1660e01b815260040160206040518083038186803b158015610afc57600080fd5b9392505050565b336000908152601360205260408120546111da576040805162461bcd60e51b815260206004820152600b60248201526a2727afa827a9a4aa24a7a760a91b604482015290519081900360640190fd5b60006111e833426000612c44565b33600090815260136020526040902060040154600291909102915061120d9082612bea565b3360009081526013602052604090206004810191909155600201544211156112c5576000831361126e5760405162461bcd60e51b815260040180806020018281038252603381526020018061507c6033913960400191505060405180910390fd5b60008412156112ae5760405162461bcd60e51b8152600401808060200182810382526035815260200180614fe46035913960400191505060405180910390fd5b336000908152601360205260409020426002909101555b60008413156113ec57336000908152601360205260409020546112e89085612bea565b33600090815260136020526040812091825560029091015461130a9042612ba8565b905060006113218661131c8485612b0d565b612b0d565b905061132f600a5482612bea565b600a553360009081526013602052604090206001015461134f9082612bea565b33600081815260136020908152604080832060010194909455600f5484516323b872dd60e01b81526004810194909452306024850152604484018b905293516001600160a01b03909416936323b872dd93606480820194918390030190829087803b1580156113bd57600080fd5b505af11580156113d1573d6000803e3d6000fd5b505050506040513d60208110156113e757600080fd5b505050505b600084121561151f573360009081526013602052604081205461141191869003612ba8565b3360009081526013602052604081209182556002909101546114339042612ba8565b905060006114488660000361131c8485612b0d565b9050611456600a5482612ba8565b600a55336000908152601360205260409020600101546114769082612ba8565b336000818152601360209081526040808320600180820196909655600301805460ff1916909517909455600f54845163a9059cbb60e01b815260048101949094528a8303602485015293516001600160a01b039094169363a9059cbb93604480820194918390030190829087803b1580156114f057600080fd5b505af1158015611504573d6000803e3d6000fd5b505050506040513d602081101561151a57600080fd5b505050505b60008312156115c6573360009081526013602052604081206002015461154791859003612ba8565b336000908152601360205260408120600281019290925590546115709061131c86840380612b0d565b905061157e600a5482612ba8565b600a553360009081526013602052604090206001015461159e9082612ba8565b336000908152601360205260409020600180820192909255600301805460ff19169091179055505b600083131561165657336000908152601360205260409020600201546115ec9084612bea565b336000908152601360205260408120600281019290925590546116139061131c8680612b0d565b9050611621600a5482612bea565b600a55336000908152601360205260409020600101546116419082612bea565b33600090815260136020526040902060010155505b611668610ea9610ea442601054612ba8565b3360009081526013602052604090206005810180546001600160801b03191660809390931c92909217909155546116d05760405162461bcd60e51b815260040180806020018281038252602281526020018061505a6022913960400191505060405180910390fd5b336000908152601360205260409020600201544210611736576040805162461bcd60e51b815260206004820152601c60248201527f554e4c4f434b54494d455f4d5553545f42455f494e5f46555455524500000000604482015290519081900360640190fd5b604080513381526020810186905280820185905290517fc9d9742d6d75df29e861931a83d22f49a9bb389814d2b6ea46e8f01f2d4f8aa59181900360600190a15060019392505050565b3360009081526009602090815260408083206001600160a01b03861684529091528120546117ae9083612bea565b3360008181526009602090815260408083206001600160a01b0389168085529083529281902085905580519485525191937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929081900390910190a350600192915050565b600c546000906001600160a01b03163314611863576040805162461bcd60e51b8152602060048201819052602482015260008051602061503a833981519152604482015290519081900360640190fd5b6000829050600061187660055483612b0d565b905061188460075483612bea565b6007556001600160a01b0385166000908152600860205260409020546118aa9082612bea565b6001600160a01b03861660008181526008602090815260409182902093909355805191825291810186905281517f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885929181900390910190a1506001949350505050565b600a5481565b6001600160a01b03821660009081526012602052604081205461196b576040805162461bcd60e51b815260206004820152600b60248201526a2727afa827a9a4aa24a7a760a91b604482015290519081900360640190fd5b6111846111368484600161349e565b6001600160a01b0381166000908152601260205260408120546119d2576040805162461bcd60e51b815260206004820152600b60248201526a2727afa827a9a4aa24a7a760a91b604482015290519081900360640190fd5b6001600160a01b03821660009081526012602052604090205460055461083e9190612b66565b6001600160a01b03811660009081526008602052604081205460055461083e9190612b66565b3360009081526013602052604081205415611a7a576040805162461bcd60e51b8152602060048201526017602482015276504f534954494f4e5f414c52454144595f45584953545360481b604482015290519081900360640190fd5b60008311611ac0576040805162461bcd60e51b815260206004820152600e60248201526d1253959053125117d05353d5539560921b604482015290519081900360640190fd5b60008211611b08576040805162461bcd60e51b815260206004820152601060248201526f24a72b20a624a22fa22aa920aa24a7a760811b604482015290519081900360640190fd5b60115460ff16611b59576040805162461bcd60e51b81526020600482015260176024820152761313d0d2d25391d7d393d517d153905093115117d65155604a1b604482015290519081900360640190fd5b6000611b698461131c8586612b0d565b9050611b77600a5482612bea565b600a556040805160c08101825285815260208101839052908101611b9b4286612bea565b815260200160001515815260200160008152602001611bc2610ea9610ea442601054612ba8565b6001600160801b031990811690915233600081815260136020908152604080832086518155868301516001820155868201516002820155606087015160038201805460ff191691151591909117905560808088015160048084019190915560a0909801516005909201805490971691901c17909455600f5484516323b872dd60e01b8152958601939093523060248601526044850189905292516001600160a01b03909216936323b872dd93606480830194919391928390030190829087803b158015611c8e57600080fd5b505af1158015611ca2573d6000803e3d6000fd5b505050506040513d6020811015611cb857600080fd5b5050604080513381526020810186905280820185905290517ff37df2ada5e4cecc7e5442aee1a4f06d88347e03f6aab9ada70c6f2a2ea6f9259181900360600190a15060019392505050565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107d55780601f106107aa576101008083540402835291602001916107d5565b60136020526000908152604090208054600182015460028301546003840154600485015460059095015493949293919260ff9091169160801b86565b3360009081526009602090815260408083206001600160a01b0386168452909152812054808310611dee573360009081526009602090815260408083206001600160a01b0388168452909152812055611e1d565b611df88184612ba8565b3360009081526009602090815260408083206001600160a01b03891684529091529020555b3360008181526009602090815260408083206001600160a01b0389168085529083529281902054815190815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060019392505050565b33600090815260126020526040812054611ed2576040805162461bcd60e51b815260206004820152600b60248201526a2727afa827a9a4aa24a7a760a91b604482015290519081900360640190fd5b33600090815260126020526040812054600554611eef9190612b66565b6040805163a9059cbb60e01b8152336004820152602481018390529051919250309163a9059cbb916044808201926020929091908290030181600087803b158015611f3957600080fd5b505af1158015611f4d573d6000803e3d6000fd5b505050506040513d6020811015611f6357600080fd5b5060009050611f743342600161349e565b90506000611fca82600d60009054906101000a90046001600160a01b03166001600160a01b031663fcec898d6040518163ffffffff1660e01b815260040160206040518083038186803b158015610afc57600080fd5b600d54604080516340c10f1960e01b81523360048201526024810184905290519293506001600160a01b03909116916340c10f19916044808201926020929091908290030181600087803b15801561202157600080fd5b505af1158015612035573d6000803e3d6000fd5b505050506040513d602081101561204b57600080fd5b50516040805160c0810182526000808252602080830182815283850183815260608501848152608080870186815260a088018781523388526012909652979095209551865591516001860180546001600160801b031990811692871c92909217905590516002860155905160038501805460ff191691151591909117905593516004840155516005909201805490931691901c179055935083612123576040805162461bcd60e51b815260206004820152600b60248201526a1352539517d1905253115160aa1b604482015290519081900360640190fd5b6040805133815290517f0be774851955c26a1d6a32b13b020663a069006b4a3b643ff0b809d3182605729181900360200190a150505090565b60025460009061010090046001600160a01b031633146121b1576040805162461bcd60e51b8152602060048201819052602482015260008051602061503a833981519152604482015290519081900360640190fd5b50600280546001600160a01b03831661010002610100600160a81b03199091161790556001919050565b60025460009061010090046001600160a01b03163314612230576040805162461bcd60e51b8152602060048201819052602482015260008051602061503a833981519152604482015290519081900360640190fd5b600e80546001600160a01b0384166001600160a01b03199182168117909255600f80549091168217905560408051918252517f5b7aee82a290644995a6f01961d12cb9e4a18b9533c0b2d20d5cd71a8fac9b7a9181900360200190a1506001919050565b6000806122a383600554612b0d565b336000908152600860205260409020549091506122c09082612ba8565b33600090815260086020526040808220929092556001600160a01b038616815220546122ec9082612bea565b6001600160a01b0385166000818152600860209081526040918290209390935580518681529051919233927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35060019392505050565b60025461010090046001600160a01b031681565b600c546001600160a01b031681565b60025460009061010090046001600160a01b031633146123c3576040805162461bcd60e51b8152602060048201819052602482015260008051602061503a833981519152604482015290519081900360640190fd5b600c546001600160a01b031615612414576040805162461bcd60e51b815260206004820152601060248201526f1515d25397d053149150511657d4d15560821b604482015290519081900360640190fd5b600c80546001600160a01b0384166001600160a01b03199182168117909255600d80549091168217905560408051918252517f80028450124b717cea125e678344e03e645c9cae901531348f26ddf86e414b5e9181900360200190a1506001919050565b6012602052600090815260409020805460018201546002830154600384015460048501546005909501549394608093841b94929360ff9092169290911b86565b33600090815260126020526040812054612507576040805162461bcd60e51b815260206004820152600b60248201526a2727afa827a9a4aa24a7a760a91b604482015290519081900360640190fd5b60006125153342600061349e565b33600090815260126020526040902060040154600291909102915061253a9082612bea565b336000908152601260205260408120600401919091556007546005546125609190612b0d565b3360009081526012602052604090206002015490915042111561264e57600084136125bc5760405162461bcd60e51b815260040180806020018281038252603381526020018061507c6033913960400191505060405180910390fd5b60008512156125fc5760405162461bcd60e51b8152600401808060200182810382526035815260200180614fe46035913960400191505060405180910390fd5b3360009081526012602052604081205461261990610e3d90612e95565b3360009081526012602052604090206001810180546001600160801b03191660809390931c9290921790915542600290910155505b600085131561270557600061266586600554612b0d565b336000908152601260205260409020549091506126829082612bea565b336000908152601260205260408120919091556126aa6126a183612e95565b610e4685612e95565b336000908152601260205260409020600101549091506126cd9060801b82613645565b33600090815260126020526040902060010180546001600160801b03191660809290921c9190911790556127013088612294565b5050505b600085121561283257600061271f86600003600554612b0d565b3360009081526012602052604090205490915061273c9082612ba8565b3360009081526012602052604081209190915561275b6126a183612e95565b3360009081526012602052604090206001015490915061277e9060801b82613a33565b336000818152601260209081526040808320600180820180546001600160801b03191660809890981c97909717909655600301805460ff1916909517909455835163a9059cbb60e01b815260048101939093528a820360248401529251309363a9059cbb93604480820194929392918390030190829087803b15801561280357600080fd5b505af1158015612817573d6000803e3d6000fd5b505050506040513d602081101561282d57600080fd5b505050505b6000841215612880573360009081526012602052604081206002015461285a91869003612ba8565b3360009081526012602052604090206002810191909155600301805460ff191660011790555b60008413156128ba57336000908152601260205260409020600201546128a69085612bea565b336000908152601260205260409020600201555b6128cc610ea9610ea442601054612ba8565b3360009081526012602052604090206005810180546001600160801b03191660809390931c92909217909155546129345760405162461bcd60e51b815260040180806020018281038252602281526020018061505a6022913960400191505060405180910390fd5b33600090815260126020526040902060020154421061299a576040805162461bcd60e51b815260206004820152601c60248201527f554e4c4f434b54494d455f4d5553545f42455f494e5f46555455524500000000604482015290519081900360640190fd5b604080513381526020810187905280820186905290517fc89acf41e7e6c33e4ea960f9cfd12574859c1d2083dd730d31f7975e7fafe58f9181900360600190a1506001949350505050565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205490565b60025460009061010090046001600160a01b03163314612a65576040805162461bcd60e51b8152602060048201819052602482015260008051602061503a833981519152604482015290519081900360640190fd5b60115460ff1615612abd576040805162461bcd60e51b815260206004820152601760248201527f4c4f434b494e475f414c52454144595f454e41424c4544000000000000000000604482015290519081900360640190fd5b6011805460ff19166001179055426010556040517f8ed8806e096263615ba5e4a411f81ce1ea856a776aa4a3a384fa1e8bba86546790600090a15060115460ff1690565b60105481565b60055490565b600082612b1c5750600061083e565b82820282848281612b2957fe5b04146111845760405162461bcd60e51b81526004018080602001828103825260218152602001806150196021913960400191505060405180910390fd5b600061118483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613a45565b600061118483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613ae7565b600082820183811015611184576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6001600160a01b038316600090815260136020526040812060030154819060ff1680612c8a57506001600160a01b03851660009081526013602052604090206002015484105b15612c93575060015b6001600160a01b038516600090815260136020526040812060020154850390811215612cbd576000035b6001600160a01b0386166000908152601360205260409020600290810154818304908701919091040380861480612d0e57506001600160a01b03871660009081526013602052604090206002015481145b612d4b576040805162461bcd60e51b815260206004820152600960248201526826a4a72fa2a92927a960b91b604482015290519081900360640190fd5b612dc8612dc3612d8a612d66610ea9610ea486601054612ba8565b6001600160a01b038b1660009081526013602052604090206005015460801b613a33565b6001600160a01b038a16600090815260136020526040902060010154612dbe90612db390612e95565b610e46600a54612e95565b613242565b613b41565b93508415612dfa576001600160a01b038716600090815260136020526040902060040154612df7908590612bea565b93505b612e4b612dc3612e0986612e95565b612dbe613fff60701b60801b612e46612e23600b54612e95565b610e46610ea9612e38610ea442601054612ba8565b6420101502f960d91b613a33565b613a33565b9350612e75612dc3612e5c86612e95565b6f3ffe555555555555555555555555555560801b613242565b93508215612e8b57612e88846002612b66565b93505b5050509392505050565b600081612ea4575060006109a0565b816000612eb082613bc5565b90506070811015612ec9578060700382901b9150612edc565b6070811115612edc576070810382901c91505b613fff0160701b6001600160701b03919091161760801b90506109a0565b6000617fff60f084811c8216919084901c811690821415612f405780617fff1415612f2f575061ffff60ef1b915061083e9050565b505050600160ff1b8116821861083e565b80617fff1415612f84576dffffffffffffffffffffffffffff60801b841615612f73575061ffff60ef1b915061083e9050565b505050808218600160ff1b1661083e565b600160801b600160ff1b038416612fce57600160801b600160ff1b038516612fb6575061ffff60ef1b915061083e9050565b505050808218600160ff1b16617fff60f01b1761083e565b6001600160701b03608085901c1681612fea5760019150612ff1565b600160701b175b6001600160701b03608087901c168361303057801561302b57600061301582613bc5565b6001955060e20393840160711901939190911b90505b61303a565b600160701b1760721b5b81818161304357fe5b0490508061307057600160ff1b8787181661305f576000613065565b600160ff1b5b94505050505061083e565b6001606c1b81101561307e57fe5b6000600160731b8210156130be57600160721b8210156130b357600160711b8210156130ab5760706130ae565b60715b6130b6565b60725b60ff166130c7565b6130c782613bc5565b9050836140710181860111156130e557617fff945060009150613178565b83818601613ffc011015613100576000945060009150613178565b83818601613f8c01101561314d578385613ffc01111561312b578385613ffc010382901b9150613144565b8385613ffc01101561314457613ffc8585030382901c91505b60009450613178565b6070811115613160576070810382901c91505b6001600160701b038216915083818601613f8d010394505b81607086901b888a186001607f1b60801b1660801c6001600160801b0316171760801b9550505050505061083e565b6000806131b383612e95565b905060006131c88263802dc26760df1b613a33565b905060006131e9826fbfea0c6f7a0b5ed8d36b4c7f3493858360801b613242565b905060006131f682613c63565b90506000613209613fff60f01b83613645565b9050600061322166402a22db57148560c81b83612efa565b90506132368165401f73b9fbd760d01b613645565b98975050505050505050565b6000617fff60f084811c8216919084901c8116908214156132e15780617fff14156132c0576001600160801b0319858116908516141561328d57505050600160ff1b8116821861083e565b600160ff1b6001600160801b03198686181614156132b05750505081811761083e565b5061ffff60ef1b915061083e9050565b600160801b600160ff1b038416612f2f575061ffff60ef1b915061083e9050565b80617fff141561331d57600160801b600160ff1b03851661330c575061ffff60ef1b915061083e9050565b505050600160ff1b8216811861083e565b6001600160701b03608086901c16826133395760019250613340565b600160701b175b6001600160701b03608086901c168261335c5760019250613363565b600160701b175b908102908161338057600160ff1b8787181661305f576000613065565b928201926000600160e11b8310156133b457600160e01b8310156133ac576133a783613bc5565b6133af565b60e05b6133b7565b60e15b905061407081860110156133d257600094506000925061346f565b6140e08186011015613415576140708510156133f757846140700383901c925061340c565b61407085111561340c57614070850383901b92505b6000945061346f565b61c0dd818601111561342f57617fff94506000925061346f565b6070811115613446576070810383901c9250613459565b6070811015613459578060700383901b92505b6001600160701b03831692506140df8186010394505b82607086901b888a186001607f1b60801b1660801c6001600160801b0316171760801b9550505050505061083e565b6001600160a01b038316600090815260126020526040812060030154819060ff16806134e457506001600160a01b03851660009081526012602052604090206002015484105b156134ed575060015b6001600160a01b038516600090815260126020526040812060020154850390811215613517576000035b6001600160a01b038616600090815260126020526040902060029081015481830490870191909104038086148061356857506001600160a01b03871660009081526012602052604090206002015481145b6135a5576040805162461bcd60e51b815260206004820152600960248201526826a4a72fa2a92927a960b91b604482015290519081900360640190fd5b613608612dc36135e46135c0610ea9610ea486601054612ba8565b6001600160a01b038b1660009081526012602052604090206005015460801b613a33565b6001600160a01b038a1660009081526012602052604090206001015460801b613242565b9350841561363a576001600160a01b038716600090815260126020526040902060040154613637908590612bea565b93505b612e75846003612b66565b6000617fff60f084811c8216919084901c8116908214156136935780617fff1415613689576001600160801b031985811690851614156132b057849250505061083e565b849250505061083e565b80617fff14156136a757839250505061083e565b6001607f1b608086901c90811015906001600160701b0316836136cd57600193506136d4565b600160701b175b6001607f1b608087901c90811015906001600160701b0316846136fa5760019450613701565b600160701b175b82613731576001600160801b03198816600160ff1b146137215787613724565b60005b965050505050505061083e565b80613751576001600160801b03198916600160ff1b146137215788613724565b8486038415158315151415613874576070811315613778578997505050505050505061083e565b6000811315613797578082600082121561378e57fe5b901c91506137d1565b606f198112156137b0578897505050505050505061083e565b60008112156137d157806000038460008212156137c957fe5b901c93508596505b92810192600160711b84106137ec576001968701969390931c925b86617fff141561381e578461380657617fff60f01b613810565b6001600160f01b03195b97505050505050505061083e565b600160701b8410156138335760009650613840565b6001600160701b03841693505b83607088901b86613852576000613858565b6001607f1b5b6001600160801b0316171760801b97505050505050505061083e565b600081131561388f57600184901b93506001870396506138a6565b60008112156138a657600182901b91506001860396505b60708113156138b8576001915061391b565b60018113156138e057600181036001830360008212156138d457fe5b901c600101915061391b565b606f198112156138f3576001935061391b565b60001981121561391b576001816000030360018503600082121561391357fe5b901c60010193505b81841061392c578184039350613935565b83820393508294505b8361394b57506000965061083e95505050505050565b600061395685613bc5565b9050806071141561397c57600185901c6001600160701b031694506001880197506139cb565b60708110156139be576070819003808911156139ab578086901b6001600160701b0316955080890398506139b8565b600098600019019590951b945b506139cb565b6001600160701b03851694505b87617fff14156139fe57856139e557617fff60f01b6139ef565b6001600160f01b03195b9850505050505050505061083e565b84607089901b87613a10576000613a16565b6001607f1b5b6001600160801b0316171760801b9850505050505050505061083e565b600061118483600160ff1b8418613645565b60008183613ad15760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613a96578181015183820152602001613a7e565b50505050905090810190601f168015613ac35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613add57fe5b0495945050505050565b60008184841115613b395760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613a96578181015183820152602001613a7e565b505050900390565b6000617fff60f083901c16613fff811015613b605760009150506109a0565b6001607f1b608084901c10613b7457600080fd5b6140fe811115613b8357600080fd5b600160701b6001600160701b03608085901c161761406f821015613bad5761406f8290031c611184565b61406f8211156111845761406e1982011b9392505050565b6000808211613bd357600080fd5b6000600160801b8310613be857608092831c92015b600160401b8310613bfb57604092831c92015b6401000000008310613c0f57602092831c92015b620100008310613c2157601092831c92015b6101008310613c3257600892831c92015b60108310613c4257600492831c92015b60048310613c5257600292831c92015b6002831061083e5760010192915050565b600061083e613c85836f1fffb8aa3b295c17f0bbbe87fed0691d60811b613242565b60006001607f1b608083901c90811190617fff60f085901c8116916001600160701b03169082148015613cb757508015155b15613ccd575061ffff60ef1b92506109a0915050565b61400d821115613cf45782613ce757617fff60f01b613cea565b60005b93505050506109a0565b613f7f821015613d0f5750613fff60f01b92506109a0915050565b81613d1d5760019150613d24565b600160701b175b613fef821115613d3a57613fee1982011b613d4c565b613fef821015613d4c57613fef8290031c5b828015613d5d575061203760811b81115b15613d6f5750600092506109a0915050565b82158015613d8e5750713fffffffffffffffffffffffffffffffffff81115b15613da45750617fff60f01b92506109a0915050565b6001600160801b0381169060801c838015613dbe57508115155b15613dca579019906001015b6001607f1b82811615613dee5770016a09e667f3bcc908b2fb1366ea957d3e0260801c5b6001607e1b831615613e11577001306fe0a31b7152de8d5a46305c85edec0260801c5b6001607d1b831615613e34577001172b83c7d517adcdf7c8c50eb14a791f0260801c5b6001607c1b831615613e575770010b5586cf9890f6298b92b71842a983630260801c5b6001607b1b831615613e7a577001059b0d31585743ae7c548eb68ca417fd0260801c5b6001607a1b831615613e9d57700102c9a3e778060ee6f7caca4f7a29bde80260801c5b600160791b831615613ec05770010163da9fb33356d84a66ae336dcdfa3f0260801c5b600160781b831615613ee357700100b1afa5abcbed6129ab13ec11dc95430260801c5b600160771b831615613f065770010058c86da1c09ea1ff19d294cf2f679b0260801c5b600160761b831615613f29577001002c605e2e8cec506d21bfc89a23a00f0260801c5b600160751b831615613f4c57700100162f3904051fa128bca9c55c31e5df0260801c5b600160741b831615613f6f577001000b175effdc76ba38e31671ca9397250260801c5b600160731b831615613f9257700100058ba01fb9f96d6cacd4b180917c3d0260801c5b600160721b831615613fb55770010002c5cc37da9491d0985c348c68e7b30260801c5b600160711b831615613fd8577001000162e525ee054754457d59952920260260801c5b600160701b831615613ffb5770010000b17255775c040618bf4a4ade83fc0260801c5b6001606f1b83161561401e577001000058b91b5bc9ae2eed81e9b7d4cfab0260801c5b6001606e1b83161561404157700100002c5c89d5ec6ca4d7c8acc017b7c90260801c5b6001606d1b8316156140645770010000162e43f4f831060e02d839a9d16d0260801c5b6001606c1b83161561408757700100000b1721bcfc99d9f890ea069117630260801c5b6001606b1b8316156140aa5770010000058b90cf1e6d97f9ca14dbcc16280260801c5b6001606a1b8316156140cd577001000002c5c863b73f016468f6bac5ca2b0260801c5b600160691b8316156140f057700100000162e430e5a18f6119e3c02282a50260801c5b600160681b831615614113577001000000b1721835514b86e6d96efd1bfe0260801c5b600160671b83161561413657700100000058b90c0b48c6be5df846c5b2ef0260801c5b600160661b8316156141595770010000002c5c8601cc6b9e94213c72737a0260801c5b600160651b83161561417c577001000000162e42fff037df38aa2b219f060260801c5b600160641b83161561419f5770010000000b17217fba9c739aa5819f44f90260801c5b600160631b8316156141c2577001000000058b90bfcdee5acd3c1cedc8230260801c5b600160621b8316156141e557700100000002c5c85fe31f35a6a30da1be500260801c5b600160611b8316156142085770010000000162e42ff0999ce3541b9fffcf0260801c5b600160601b83161561422b57700100000000b17217f80f4ef5aadda455540260801c5b6001605f1b83161561424e5770010000000058b90bfbf8479bd5a81b51ad0260801c5b6001605e1b831615614271577001000000002c5c85fdf84bd62ae30a74cc0260801c5b6001605d1b83161561429457700100000000162e42fefb2fed257559bdaa0260801c5b6001605c1b8316156142b7577001000000000b17217f7d5a7716bba4a9ae0260801c5b6001605b1b8316156142da57700100000000058b90bfbe9ddbac5e109cce0260801c5b6001605a1b8316156142fd5770010000000002c5c85fdf4b15de6f17eb0d0260801c5b600160591b831615614320577001000000000162e42fefa494f1478fde050260801c5b600160581b8316156143435770010000000000b17217f7d20cf927c8e94c0260801c5b600160571b831615614366577001000000000058b90bfbe8f71cb4e4b33d0260801c5b600160561b83161561438957700100000000002c5c85fdf477b662b269450260801c5b600160551b8316156143ac5770010000000000162e42fefa3ae53369388c0260801c5b600160541b8316156143cf57700100000000000b17217f7d1d351a389d400260801c5b600160531b8316156143f25770010000000000058b90bfbe8e8b2d3d4ede0260801c5b600160521b831615614415577001000000000002c5c85fdf4741bea6e77e0260801c5b600160511b83161561443857700100000000000162e42fefa39fe95583c20260801c5b600160501b83161561445b577001000000000000b17217f7d1cfb72b45e10260801c5b698000000000000000000083161561448457700100000000000058b90bfbe8e7cc35c3f00260801c5b69400000000000000000008316156144ad5770010000000000002c5c85fdf473e242ea380260801c5b69200000000000000000008316156144d6577001000000000000162e42fefa39f02b772c0260801c5b69100000000000000000008316156144ff5770010000000000000b17217f7d1cf7d83c1a0260801c5b6908000000000000000000831615614528577001000000000000058b90bfbe8e7bdcbe2e0260801c5b690400000000000000000083161561455157700100000000000002c5c85fdf473dea871f0260801c5b690200000000000000000083161561457a5770010000000000000162e42fefa39ef44d910260801c5b69010000000000000000008316156145a357700100000000000000b17217f7d1cf79e9490260801c5b688000000000000000008316156145cb5770010000000000000058b90bfbe8e7bce5440260801c5b684000000000000000008316156145f3577001000000000000002c5c85fdf473de6eca0260801c5b6820000000000000000083161561461b57700100000000000000162e42fefa39ef366f0260801c5b68100000000000000000831615614643577001000000000000000b17217f7d1cf79afa0260801c5b6808000000000000000083161561466b57700100000000000000058b90bfbe8e7bcd6d0260801c5b680400000000000000008316156146935770010000000000000002c5c85fdf473de6b20260801c5b680200000000000000008316156146bb577001000000000000000162e42fefa39ef3580260801c5b600160401b8316156146de5770010000000000000000b17217f7d1cf79ab0260801c5b678000000000000000831615614705577001000000000000000058b90bfbe8e7bcd50260801c5b67400000000000000083161561472c57700100000000000000002c5c85fdf473de6a0260801c5b6720000000000000008316156147535770010000000000000000162e42fefa39ef340260801c5b67100000000000000083161561477a57700100000000000000000b17217f7d1cf7990260801c5b6708000000000000008316156147a15770010000000000000000058b90bfbe8e7bcc0260801c5b6704000000000000008316156147c8577001000000000000000002c5c85fdf473de50260801c5b6702000000000000008316156147ef57700100000000000000000162e42fefa39ef20260801c5b670100000000000000831615614816577001000000000000000000b17217f7d1cf780260801c5b668000000000000083161561483c57700100000000000000000058b90bfbe8e7bb0260801c5b66400000000000008316156148625770010000000000000000002c5c85fdf473dd0260801c5b6620000000000000831615614888577001000000000000000000162e42fefa39ee0260801c5b66100000000000008316156148ae5770010000000000000000000b17217f7d1cf60260801c5b66080000000000008316156148d4577001000000000000000000058b90bfbe8e7a0260801c5b66040000000000008316156148fa57700100000000000000000002c5c85fdf473c0260801c5b66020000000000008316156149205770010000000000000000000162e42fefa39d0260801c5b660100000000000083161561494657700100000000000000000000b17217f7d1ce0260801c5b6580000000000083161561496b5770010000000000000000000058b90bfbe8e60260801c5b65400000000000831615614990577001000000000000000000002c5c85fdf4720260801c5b652000000000008316156149b557700100000000000000000000162e42fefa380260801c5b651000000000008316156149da577001000000000000000000000b17217f7d1b0260801c5b650800000000008316156149ff57700100000000000000000000058b90bfbe8d0260801c5b65040000000000831615614a245770010000000000000000000002c5c85fdf460260801c5b65020000000000831615614a49577001000000000000000000000162e42fefa20260801c5b65010000000000831615614a6e5770010000000000000000000000b17217f7d00260801c5b648000000000831615614a92577001000000000000000000000058b90bfbe70260801c5b644000000000831615614ab657700100000000000000000000002c5c85fdf30260801c5b642000000000831615614ada5770010000000000000000000000162e42fef90260801c5b641000000000831615614afe57700100000000000000000000000b17217f7c0260801c5b640800000000831615614b225770010000000000000000000000058b90bfbd0260801c5b640400000000831615614b46577001000000000000000000000002c5c85fde0260801c5b640200000000831615614b6a57700100000000000000000000000162e42fee0260801c5b640100000000831615614b8e577001000000000000000000000000b17217f60260801c5b6380000000831615614bb157700100000000000000000000000058b90bfa0260801c5b6340000000831615614bd45770010000000000000000000000002c5c85fc0260801c5b6320000000831615614bf7577001000000000000000000000000162e42fd0260801c5b6310000000831615614c1a5770010000000000000000000000000b17217e0260801c5b6308000000831615614c3d577001000000000000000000000000058b90be0260801c5b6304000000831615614c6057700100000000000000000000000002c5c85e0260801c5b6302000000831615614c835770010000000000000000000000000162e42e0260801c5b6301000000831615614ca657700100000000000000000000000000b172160260801c5b62800000831615614cc85770010000000000000000000000000058b90a0260801c5b62400000831615614cea577001000000000000000000000000002c5c840260801c5b62200000831615614d0c57700100000000000000000000000000162e410260801c5b62100000831615614d2e577001000000000000000000000000000b17200260801c5b62080000831615614d5057700100000000000000000000000000058b8f0260801c5b62040000831615614d725770010000000000000000000000000002c5c70260801c5b62020000831615614d94577001000000000000000000000000000162e30260801c5b62010000831615614db65770010000000000000000000000000000b1710260801c5b618000831615614dd7577001000000000000000000000000000058b80260801c5b614000831615614df857700100000000000000000000000000002c5b0260801c5b612000831615614e195770010000000000000000000000000000162d0260801c5b611000831615614e3a57700100000000000000000000000000000b160260801c5b610800831615614e5b5770010000000000000000000000000000058a0260801c5b610400831615614e7c577001000000000000000000000000000002c40260801c5b610200831615614e9d577001000000000000000000000000000001610260801c5b610100831615614ebe577001000000000000000000000000000000b00260801c5b6080831615614ede577001000000000000000000000000000000570260801c5b6040831615614efe5770010000000000000000000000000000002b0260801c5b6020831615614f1e577001000000000000000000000000000000150260801c5b6010831615614f3e5770010000000000000000000000000000000a0260801c5b6008831615614f5e577001000000000000000000000000000000040260801c5b6004831615614f7e577001000000000000000000000000000000010260801c5b84614f9f57600f81901c6001600160701b03169050613fff82019150614fce565b613ffe8211614fc457600f81901c6001600160701b0316905081613fff039150614fce565b600091613fee19011c5b60709190911b1760801b93506109a09250505056fe414d4f554e545f44454c54415f4f465f4558504952455f504f534954494f4e5f4d5553545f42455f41545f4c454153545f5a45524f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572504f534954494f4e5f414d4f554e545f43414e4e4f545f42455f4e454741544956454455524154494f4e5f44454c54415f4f465f455850495245445f504f534954494f4e5f4d5553545f42455f504f534954495645a264697066735822122045daa4d44a33f148449c5c13b1a748ef4b68f2ae3cfc5851138e685181ba5ccb64736f6c63430006060033536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102275760003560e01c80636b2d95d411610130578063a9059cbb116100b8578063d16bfa5d1161007c578063d16bfa5d146106d7578063dd62ed3e146106fa578063ea4c798c14610728578063eefa39ed14610730578063fcec898d1461073857610227565b8063a9059cbb14610610578063b2bdfa7b1461063c578063c25116b014610644578063c78aa6681461064c578063cbf9fe5f1461067257610227565b80639b5308ec116100ff5780639b5308ec1461052d578063a457c2d714610590578063a69df4b5146105bc578063a6f9dae1146105c4578063a7f89797146105ea57610227565b80636b2d95d4146104b657806370a08231146104dc57806385cb8b571461050257806395d89b411461052557610227565b806324da6603116101b35780633356c39c116101825780633356c39c14610407578063395093511461042a57806340c10f19146104565780634ca5d3e414610482578063627752231461048a57610227565b806324da6603146103ad578063313ce567146103b55780633166b848146103d3578063320d714e146103db57610227565b80630cac4e60116101fa5780630cac4e601461033c5780631089994c146103445780631338736f1461034c57806318160ddd1461036f57806323b872dd1461037757610227565b806301bec1cc1461022c57806306fdde0314610250578063095ea7b3146102cd5780630ab114f91461030d575b600080fd5b610234610740565b604080516001600160a01b039092168252519081900360200190f35b61025861074f565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561029257818101518382015260200161027a565b50505050905090810190601f1680156102bf5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102f9600480360360408110156102e357600080fd5b506001600160a01b0381351690602001356107dd565b604080519115158252519081900360200190f35b61032a6004803603602081101561032357600080fd5b5035610844565b60408051918252519081900360200190f35b61032a6109a5565b6102f96109ab565b6102f96004803603604081101561036257600080fd5b5080359060200135610cd2565b61032a610f97565b6102f96004803603606081101561038d57600080fd5b506001600160a01b03813581169160208101359091169060400135610f9d565b61032a6110b7565b6103bd6110bd565b6040805160ff9092168252519081900360200190f35b6102f96110c6565b61032a600480360360408110156103f157600080fd5b506001600160a01b0381351690602001356110cf565b6102f96004803603604081101561041d57600080fd5b508035906020013561118b565b6102f96004803603604081101561044057600080fd5b506001600160a01b038135169060200135611780565b6102f96004803603604081101561046c57600080fd5b506001600160a01b038135169060200135611813565b61032a61190d565b61032a600480360360408110156104a057600080fd5b506001600160a01b038135169060200135611913565b61032a600480360360208110156104cc57600080fd5b50356001600160a01b031661197a565b61032a600480360360208110156104f257600080fd5b50356001600160a01b03166119f8565b6102f96004803603604081101561051857600080fd5b5080359060200135611a1e565b610258611d04565b6105536004803603602081101561054357600080fd5b50356001600160a01b0316611d5e565b60408051968752602087019590955285850193909352901515606085015260808401526001600160801b03191660a0830152519081900360c00190f35b6102f9600480360360408110156105a657600080fd5b506001600160a01b038135169060200135611d9a565b6102f9611e83565b6102f9600480360360208110156105da57600080fd5b50356001600160a01b031661215c565b6102f96004803603602081101561060057600080fd5b50356001600160a01b03166121db565b6102f96004803603604081101561062657600080fd5b506001600160a01b038135169060200135612294565b61023461234b565b61023461235f565b6102f96004803603602081101561066257600080fd5b50356001600160a01b031661236e565b6106986004803603602081101561068857600080fd5b50356001600160a01b0316612478565b604080519687526001600160801b03199586166020880152868101949094529115156060860152608085015290911660a0830152519081900360c00190f35b6102f9600480360360408110156106ed57600080fd5b50803590602001356124b8565b61032a6004803603604081101561071057600080fd5b506001600160a01b03813581169160200135166129e5565b6102f9612a10565b61032a612b01565b61032a612b07565b600e546001600160a01b031681565b6000805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107d55780601f106107aa576101008083540402835291602001916107d5565b820191906000526020600020905b8154815290600101906020018083116107b857829003601f168201915b505050505081565b3360008181526009602090815260408083206001600160a01b038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35060015b92915050565b60025460009061010090046001600160a01b03163314610899576040805162461bcd60e51b8152602060048201819052602482015260008051602061503a833981519152604482015290519081900360640190fd5b816108da576040805183815290517f0b7e711d124e53e17b23a99f1ccbb839f29f7988434c16a32905c49fd25c067f9181900360200190a1506003546109a0565b6000821215610920576109086007546109036108fb85600003600754612b0d565b600354612b66565b612ba8565b60075560035461091c906000849003612ba8565b6003555b60008213156109575761094360075461093e6108fb85600754612b0d565b612bea565b6007556003546109539083612bea565b6003555b610965600654600354612b66565b6005556040805183815290517f0b7e711d124e53e17b23a99f1ccbb839f29f7988434c16a32905c49fd25c067f9181900360200190a1506003545b919050565b60075481565b336000908152601360205260408120546109fa576040805162461bcd60e51b815260206004820152600b60248201526a2727afa827a9a4aa24a7a760a91b604482015290519081900360640190fd5b600f5433600081815260136020908152604080832054815163a9059cbb60e01b815260048101959095526024850152516001600160a01b039094169363a9059cbb93604480820194918390030190829087803b158015610a5957600080fd5b505af1158015610a6d573d6000803e3d6000fd5b505050506040513d6020811015610a8357600080fd5b5060009050610a9433426001612c44565b9050610aa281600b54612bea565b600b819055506000610b2d82600d60009054906101000a90046001600160a01b03166001600160a01b031663fcec898d6040518163ffffffff1660e01b815260040160206040518083038186803b158015610afc57600080fd5b505afa158015610b10573d6000803e3d6000fd5b505050506040513d6020811015610b2657600080fd5b5051612b66565b600d54604080516340c10f1960e01b81523360048201526024810184905290519293506001600160a01b03909116916340c10f19916044808201926020929091908290030181600087803b158015610b8457600080fd5b505af1158015610b98573d6000803e3d6000fd5b505050506040513d6020811015610bae57600080fd5b5051600a5433600090815260136020526040902060010154919450610bd291612ba8565b600a556040805160c0810182526000808252602080830182815283850183815260608501848152608080870186815260a0880187815233885260139096529790952095518655915160018601555160028501555160038401805460ff1916911515919091179055925160048301559151600590910180546001600160801b0319169190921c17905582610c9a576040805162461bcd60e51b815260206004820152600b60248201526a1352539517d1905253115160aa1b604482015290519081900360640190fd5b6040805133815290517fc0b7a800db8dd9b5c87a08cd46842e5489191da7f8eb637a690a9202eacd5d049181900360200190a1505090565b3360009081526012602052604081205415610d2e576040805162461bcd60e51b8152602060048201526017602482015276504f534954494f4e5f414c52454144595f45584953545360481b604482015290519081900360640190fd5b60008311610d74576040805162461bcd60e51b815260206004820152600e60248201526d1253959053125117d05353d5539560921b604482015290519081900360640190fd5b60008211610dbc576040805162461bcd60e51b815260206004820152601060248201526f24a72b20a624a22fa22aa920aa24a7a760811b604482015290519081900360640190fd5b60115460ff16610e0d576040805162461bcd60e51b81526020600482015260176024820152761313d0d2d25391d7d393d517d153905093115117d65155604a1b604482015290519081900360640190fd5b6000610e1b84600554612b0d565b90506000610e2d600754600554612b0d565b90506000610e4b610e3d84612e95565b610e4684612e95565b612efa565b90506000610e594287612bea565b90506040518060c00160405280858152602001836001600160801b031916815260200182815260200160001515815260200160008152602001610ec2610ea9610ea442601054612ba8565b6131a7565b6f02069e12e13424bb40e132865a5f206b60851b613242565b6001600160801b03199081169091523360009081526012602090815260409182902084518155908401516001820180548516608092831c179055918401516002820155606084015160038201805460ff191691151591909117905581840151600482015560a0909301516005909301805490921692901c919091179055610f493088612294565b50604080513381526020810189905280820188905290517f49eaf4942f1237055eb4cfa5f31c9dfe50d5b4ade01e021f7de8be2fbbde557b9181900360600190a15060019695505050505050565b60075490565b6001600160a01b0383166000908152600960209081526040808320338452909152812054610fcb9083612ba8565b6001600160a01b0385166000908152600960209081526040808320338452909152812091909155600554611000908490612b0d565b6001600160a01b0386166000908152600860205260409020549091506110269082612ba8565b6001600160a01b0380871660009081526008602052604080822093909355908616815220546110559082612bea565b6001600160a01b0380861660008181526008602090815260409182902094909455805187815290519193928916927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3506001949350505050565b600b5481565b60025460ff1681565b60115460ff1681565b6001600160a01b038216600090815260136020526040812054611127576040805162461bcd60e51b815260206004820152600b60248201526a2727afa827a9a4aa24a7a760a91b604482015290519081900360640190fd5b61118461113684846001612c44565b600d60009054906101000a90046001600160a01b03166001600160a01b031663fcec898d6040518163ffffffff1660e01b815260040160206040518083038186803b158015610afc57600080fd5b9392505050565b336000908152601360205260408120546111da576040805162461bcd60e51b815260206004820152600b60248201526a2727afa827a9a4aa24a7a760a91b604482015290519081900360640190fd5b60006111e833426000612c44565b33600090815260136020526040902060040154600291909102915061120d9082612bea565b3360009081526013602052604090206004810191909155600201544211156112c5576000831361126e5760405162461bcd60e51b815260040180806020018281038252603381526020018061507c6033913960400191505060405180910390fd5b60008412156112ae5760405162461bcd60e51b8152600401808060200182810382526035815260200180614fe46035913960400191505060405180910390fd5b336000908152601360205260409020426002909101555b60008413156113ec57336000908152601360205260409020546112e89085612bea565b33600090815260136020526040812091825560029091015461130a9042612ba8565b905060006113218661131c8485612b0d565b612b0d565b905061132f600a5482612bea565b600a553360009081526013602052604090206001015461134f9082612bea565b33600081815260136020908152604080832060010194909455600f5484516323b872dd60e01b81526004810194909452306024850152604484018b905293516001600160a01b03909416936323b872dd93606480820194918390030190829087803b1580156113bd57600080fd5b505af11580156113d1573d6000803e3d6000fd5b505050506040513d60208110156113e757600080fd5b505050505b600084121561151f573360009081526013602052604081205461141191869003612ba8565b3360009081526013602052604081209182556002909101546114339042612ba8565b905060006114488660000361131c8485612b0d565b9050611456600a5482612ba8565b600a55336000908152601360205260409020600101546114769082612ba8565b336000818152601360209081526040808320600180820196909655600301805460ff1916909517909455600f54845163a9059cbb60e01b815260048101949094528a8303602485015293516001600160a01b039094169363a9059cbb93604480820194918390030190829087803b1580156114f057600080fd5b505af1158015611504573d6000803e3d6000fd5b505050506040513d602081101561151a57600080fd5b505050505b60008312156115c6573360009081526013602052604081206002015461154791859003612ba8565b336000908152601360205260408120600281019290925590546115709061131c86840380612b0d565b905061157e600a5482612ba8565b600a553360009081526013602052604090206001015461159e9082612ba8565b336000908152601360205260409020600180820192909255600301805460ff19169091179055505b600083131561165657336000908152601360205260409020600201546115ec9084612bea565b336000908152601360205260408120600281019290925590546116139061131c8680612b0d565b9050611621600a5482612bea565b600a55336000908152601360205260409020600101546116419082612bea565b33600090815260136020526040902060010155505b611668610ea9610ea442601054612ba8565b3360009081526013602052604090206005810180546001600160801b03191660809390931c92909217909155546116d05760405162461bcd60e51b815260040180806020018281038252602281526020018061505a6022913960400191505060405180910390fd5b336000908152601360205260409020600201544210611736576040805162461bcd60e51b815260206004820152601c60248201527f554e4c4f434b54494d455f4d5553545f42455f494e5f46555455524500000000604482015290519081900360640190fd5b604080513381526020810186905280820185905290517fc9d9742d6d75df29e861931a83d22f49a9bb389814d2b6ea46e8f01f2d4f8aa59181900360600190a15060019392505050565b3360009081526009602090815260408083206001600160a01b03861684529091528120546117ae9083612bea565b3360008181526009602090815260408083206001600160a01b0389168085529083529281902085905580519485525191937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929081900390910190a350600192915050565b600c546000906001600160a01b03163314611863576040805162461bcd60e51b8152602060048201819052602482015260008051602061503a833981519152604482015290519081900360640190fd5b6000829050600061187660055483612b0d565b905061188460075483612bea565b6007556001600160a01b0385166000908152600860205260409020546118aa9082612bea565b6001600160a01b03861660008181526008602090815260409182902093909355805191825291810186905281517f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885929181900390910190a1506001949350505050565b600a5481565b6001600160a01b03821660009081526012602052604081205461196b576040805162461bcd60e51b815260206004820152600b60248201526a2727afa827a9a4aa24a7a760a91b604482015290519081900360640190fd5b6111846111368484600161349e565b6001600160a01b0381166000908152601260205260408120546119d2576040805162461bcd60e51b815260206004820152600b60248201526a2727afa827a9a4aa24a7a760a91b604482015290519081900360640190fd5b6001600160a01b03821660009081526012602052604090205460055461083e9190612b66565b6001600160a01b03811660009081526008602052604081205460055461083e9190612b66565b3360009081526013602052604081205415611a7a576040805162461bcd60e51b8152602060048201526017602482015276504f534954494f4e5f414c52454144595f45584953545360481b604482015290519081900360640190fd5b60008311611ac0576040805162461bcd60e51b815260206004820152600e60248201526d1253959053125117d05353d5539560921b604482015290519081900360640190fd5b60008211611b08576040805162461bcd60e51b815260206004820152601060248201526f24a72b20a624a22fa22aa920aa24a7a760811b604482015290519081900360640190fd5b60115460ff16611b59576040805162461bcd60e51b81526020600482015260176024820152761313d0d2d25391d7d393d517d153905093115117d65155604a1b604482015290519081900360640190fd5b6000611b698461131c8586612b0d565b9050611b77600a5482612bea565b600a556040805160c08101825285815260208101839052908101611b9b4286612bea565b815260200160001515815260200160008152602001611bc2610ea9610ea442601054612ba8565b6001600160801b031990811690915233600081815260136020908152604080832086518155868301516001820155868201516002820155606087015160038201805460ff191691151591909117905560808088015160048084019190915560a0909801516005909201805490971691901c17909455600f5484516323b872dd60e01b8152958601939093523060248601526044850189905292516001600160a01b03909216936323b872dd93606480830194919391928390030190829087803b158015611c8e57600080fd5b505af1158015611ca2573d6000803e3d6000fd5b505050506040513d6020811015611cb857600080fd5b5050604080513381526020810186905280820185905290517ff37df2ada5e4cecc7e5442aee1a4f06d88347e03f6aab9ada70c6f2a2ea6f9259181900360600190a15060019392505050565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107d55780601f106107aa576101008083540402835291602001916107d5565b60136020526000908152604090208054600182015460028301546003840154600485015460059095015493949293919260ff9091169160801b86565b3360009081526009602090815260408083206001600160a01b0386168452909152812054808310611dee573360009081526009602090815260408083206001600160a01b0388168452909152812055611e1d565b611df88184612ba8565b3360009081526009602090815260408083206001600160a01b03891684529091529020555b3360008181526009602090815260408083206001600160a01b0389168085529083529281902054815190815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060019392505050565b33600090815260126020526040812054611ed2576040805162461bcd60e51b815260206004820152600b60248201526a2727afa827a9a4aa24a7a760a91b604482015290519081900360640190fd5b33600090815260126020526040812054600554611eef9190612b66565b6040805163a9059cbb60e01b8152336004820152602481018390529051919250309163a9059cbb916044808201926020929091908290030181600087803b158015611f3957600080fd5b505af1158015611f4d573d6000803e3d6000fd5b505050506040513d6020811015611f6357600080fd5b5060009050611f743342600161349e565b90506000611fca82600d60009054906101000a90046001600160a01b03166001600160a01b031663fcec898d6040518163ffffffff1660e01b815260040160206040518083038186803b158015610afc57600080fd5b600d54604080516340c10f1960e01b81523360048201526024810184905290519293506001600160a01b03909116916340c10f19916044808201926020929091908290030181600087803b15801561202157600080fd5b505af1158015612035573d6000803e3d6000fd5b505050506040513d602081101561204b57600080fd5b50516040805160c0810182526000808252602080830182815283850183815260608501848152608080870186815260a088018781523388526012909652979095209551865591516001860180546001600160801b031990811692871c92909217905590516002860155905160038501805460ff191691151591909117905593516004840155516005909201805490931691901c179055935083612123576040805162461bcd60e51b815260206004820152600b60248201526a1352539517d1905253115160aa1b604482015290519081900360640190fd5b6040805133815290517f0be774851955c26a1d6a32b13b020663a069006b4a3b643ff0b809d3182605729181900360200190a150505090565b60025460009061010090046001600160a01b031633146121b1576040805162461bcd60e51b8152602060048201819052602482015260008051602061503a833981519152604482015290519081900360640190fd5b50600280546001600160a01b03831661010002610100600160a81b03199091161790556001919050565b60025460009061010090046001600160a01b03163314612230576040805162461bcd60e51b8152602060048201819052602482015260008051602061503a833981519152604482015290519081900360640190fd5b600e80546001600160a01b0384166001600160a01b03199182168117909255600f80549091168217905560408051918252517f5b7aee82a290644995a6f01961d12cb9e4a18b9533c0b2d20d5cd71a8fac9b7a9181900360200190a1506001919050565b6000806122a383600554612b0d565b336000908152600860205260409020549091506122c09082612ba8565b33600090815260086020526040808220929092556001600160a01b038616815220546122ec9082612bea565b6001600160a01b0385166000818152600860209081526040918290209390935580518681529051919233927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35060019392505050565b60025461010090046001600160a01b031681565b600c546001600160a01b031681565b60025460009061010090046001600160a01b031633146123c3576040805162461bcd60e51b8152602060048201819052602482015260008051602061503a833981519152604482015290519081900360640190fd5b600c546001600160a01b031615612414576040805162461bcd60e51b815260206004820152601060248201526f1515d25397d053149150511657d4d15560821b604482015290519081900360640190fd5b600c80546001600160a01b0384166001600160a01b03199182168117909255600d80549091168217905560408051918252517f80028450124b717cea125e678344e03e645c9cae901531348f26ddf86e414b5e9181900360200190a1506001919050565b6012602052600090815260409020805460018201546002830154600384015460048501546005909501549394608093841b94929360ff9092169290911b86565b33600090815260126020526040812054612507576040805162461bcd60e51b815260206004820152600b60248201526a2727afa827a9a4aa24a7a760a91b604482015290519081900360640190fd5b60006125153342600061349e565b33600090815260126020526040902060040154600291909102915061253a9082612bea565b336000908152601260205260408120600401919091556007546005546125609190612b0d565b3360009081526012602052604090206002015490915042111561264e57600084136125bc5760405162461bcd60e51b815260040180806020018281038252603381526020018061507c6033913960400191505060405180910390fd5b60008512156125fc5760405162461bcd60e51b8152600401808060200182810382526035815260200180614fe46035913960400191505060405180910390fd5b3360009081526012602052604081205461261990610e3d90612e95565b3360009081526012602052604090206001810180546001600160801b03191660809390931c9290921790915542600290910155505b600085131561270557600061266586600554612b0d565b336000908152601260205260409020549091506126829082612bea565b336000908152601260205260408120919091556126aa6126a183612e95565b610e4685612e95565b336000908152601260205260409020600101549091506126cd9060801b82613645565b33600090815260126020526040902060010180546001600160801b03191660809290921c9190911790556127013088612294565b5050505b600085121561283257600061271f86600003600554612b0d565b3360009081526012602052604090205490915061273c9082612ba8565b3360009081526012602052604081209190915561275b6126a183612e95565b3360009081526012602052604090206001015490915061277e9060801b82613a33565b336000818152601260209081526040808320600180820180546001600160801b03191660809890981c97909717909655600301805460ff1916909517909455835163a9059cbb60e01b815260048101939093528a820360248401529251309363a9059cbb93604480820194929392918390030190829087803b15801561280357600080fd5b505af1158015612817573d6000803e3d6000fd5b505050506040513d602081101561282d57600080fd5b505050505b6000841215612880573360009081526012602052604081206002015461285a91869003612ba8565b3360009081526012602052604090206002810191909155600301805460ff191660011790555b60008413156128ba57336000908152601260205260409020600201546128a69085612bea565b336000908152601260205260409020600201555b6128cc610ea9610ea442601054612ba8565b3360009081526012602052604090206005810180546001600160801b03191660809390931c92909217909155546129345760405162461bcd60e51b815260040180806020018281038252602281526020018061505a6022913960400191505060405180910390fd5b33600090815260126020526040902060020154421061299a576040805162461bcd60e51b815260206004820152601c60248201527f554e4c4f434b54494d455f4d5553545f42455f494e5f46555455524500000000604482015290519081900360640190fd5b604080513381526020810187905280820186905290517fc89acf41e7e6c33e4ea960f9cfd12574859c1d2083dd730d31f7975e7fafe58f9181900360600190a1506001949350505050565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205490565b60025460009061010090046001600160a01b03163314612a65576040805162461bcd60e51b8152602060048201819052602482015260008051602061503a833981519152604482015290519081900360640190fd5b60115460ff1615612abd576040805162461bcd60e51b815260206004820152601760248201527f4c4f434b494e475f414c52454144595f454e41424c4544000000000000000000604482015290519081900360640190fd5b6011805460ff19166001179055426010556040517f8ed8806e096263615ba5e4a411f81ce1ea856a776aa4a3a384fa1e8bba86546790600090a15060115460ff1690565b60105481565b60055490565b600082612b1c5750600061083e565b82820282848281612b2957fe5b04146111845760405162461bcd60e51b81526004018080602001828103825260218152602001806150196021913960400191505060405180910390fd5b600061118483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613a45565b600061118483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613ae7565b600082820183811015611184576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6001600160a01b038316600090815260136020526040812060030154819060ff1680612c8a57506001600160a01b03851660009081526013602052604090206002015484105b15612c93575060015b6001600160a01b038516600090815260136020526040812060020154850390811215612cbd576000035b6001600160a01b0386166000908152601360205260409020600290810154818304908701919091040380861480612d0e57506001600160a01b03871660009081526013602052604090206002015481145b612d4b576040805162461bcd60e51b815260206004820152600960248201526826a4a72fa2a92927a960b91b604482015290519081900360640190fd5b612dc8612dc3612d8a612d66610ea9610ea486601054612ba8565b6001600160a01b038b1660009081526013602052604090206005015460801b613a33565b6001600160a01b038a16600090815260136020526040902060010154612dbe90612db390612e95565b610e46600a54612e95565b613242565b613b41565b93508415612dfa576001600160a01b038716600090815260136020526040902060040154612df7908590612bea565b93505b612e4b612dc3612e0986612e95565b612dbe613fff60701b60801b612e46612e23600b54612e95565b610e46610ea9612e38610ea442601054612ba8565b6420101502f960d91b613a33565b613a33565b9350612e75612dc3612e5c86612e95565b6f3ffe555555555555555555555555555560801b613242565b93508215612e8b57612e88846002612b66565b93505b5050509392505050565b600081612ea4575060006109a0565b816000612eb082613bc5565b90506070811015612ec9578060700382901b9150612edc565b6070811115612edc576070810382901c91505b613fff0160701b6001600160701b03919091161760801b90506109a0565b6000617fff60f084811c8216919084901c811690821415612f405780617fff1415612f2f575061ffff60ef1b915061083e9050565b505050600160ff1b8116821861083e565b80617fff1415612f84576dffffffffffffffffffffffffffff60801b841615612f73575061ffff60ef1b915061083e9050565b505050808218600160ff1b1661083e565b600160801b600160ff1b038416612fce57600160801b600160ff1b038516612fb6575061ffff60ef1b915061083e9050565b505050808218600160ff1b16617fff60f01b1761083e565b6001600160701b03608085901c1681612fea5760019150612ff1565b600160701b175b6001600160701b03608087901c168361303057801561302b57600061301582613bc5565b6001955060e20393840160711901939190911b90505b61303a565b600160701b1760721b5b81818161304357fe5b0490508061307057600160ff1b8787181661305f576000613065565b600160ff1b5b94505050505061083e565b6001606c1b81101561307e57fe5b6000600160731b8210156130be57600160721b8210156130b357600160711b8210156130ab5760706130ae565b60715b6130b6565b60725b60ff166130c7565b6130c782613bc5565b9050836140710181860111156130e557617fff945060009150613178565b83818601613ffc011015613100576000945060009150613178565b83818601613f8c01101561314d578385613ffc01111561312b578385613ffc010382901b9150613144565b8385613ffc01101561314457613ffc8585030382901c91505b60009450613178565b6070811115613160576070810382901c91505b6001600160701b038216915083818601613f8d010394505b81607086901b888a186001607f1b60801b1660801c6001600160801b0316171760801b9550505050505061083e565b6000806131b383612e95565b905060006131c88263802dc26760df1b613a33565b905060006131e9826fbfea0c6f7a0b5ed8d36b4c7f3493858360801b613242565b905060006131f682613c63565b90506000613209613fff60f01b83613645565b9050600061322166402a22db57148560c81b83612efa565b90506132368165401f73b9fbd760d01b613645565b98975050505050505050565b6000617fff60f084811c8216919084901c8116908214156132e15780617fff14156132c0576001600160801b0319858116908516141561328d57505050600160ff1b8116821861083e565b600160ff1b6001600160801b03198686181614156132b05750505081811761083e565b5061ffff60ef1b915061083e9050565b600160801b600160ff1b038416612f2f575061ffff60ef1b915061083e9050565b80617fff141561331d57600160801b600160ff1b03851661330c575061ffff60ef1b915061083e9050565b505050600160ff1b8216811861083e565b6001600160701b03608086901c16826133395760019250613340565b600160701b175b6001600160701b03608086901c168261335c5760019250613363565b600160701b175b908102908161338057600160ff1b8787181661305f576000613065565b928201926000600160e11b8310156133b457600160e01b8310156133ac576133a783613bc5565b6133af565b60e05b6133b7565b60e15b905061407081860110156133d257600094506000925061346f565b6140e08186011015613415576140708510156133f757846140700383901c925061340c565b61407085111561340c57614070850383901b92505b6000945061346f565b61c0dd818601111561342f57617fff94506000925061346f565b6070811115613446576070810383901c9250613459565b6070811015613459578060700383901b92505b6001600160701b03831692506140df8186010394505b82607086901b888a186001607f1b60801b1660801c6001600160801b0316171760801b9550505050505061083e565b6001600160a01b038316600090815260126020526040812060030154819060ff16806134e457506001600160a01b03851660009081526012602052604090206002015484105b156134ed575060015b6001600160a01b038516600090815260126020526040812060020154850390811215613517576000035b6001600160a01b038616600090815260126020526040902060029081015481830490870191909104038086148061356857506001600160a01b03871660009081526012602052604090206002015481145b6135a5576040805162461bcd60e51b815260206004820152600960248201526826a4a72fa2a92927a960b91b604482015290519081900360640190fd5b613608612dc36135e46135c0610ea9610ea486601054612ba8565b6001600160a01b038b1660009081526012602052604090206005015460801b613a33565b6001600160a01b038a1660009081526012602052604090206001015460801b613242565b9350841561363a576001600160a01b038716600090815260126020526040902060040154613637908590612bea565b93505b612e75846003612b66565b6000617fff60f084811c8216919084901c8116908214156136935780617fff1415613689576001600160801b031985811690851614156132b057849250505061083e565b849250505061083e565b80617fff14156136a757839250505061083e565b6001607f1b608086901c90811015906001600160701b0316836136cd57600193506136d4565b600160701b175b6001607f1b608087901c90811015906001600160701b0316846136fa5760019450613701565b600160701b175b82613731576001600160801b03198816600160ff1b146137215787613724565b60005b965050505050505061083e565b80613751576001600160801b03198916600160ff1b146137215788613724565b8486038415158315151415613874576070811315613778578997505050505050505061083e565b6000811315613797578082600082121561378e57fe5b901c91506137d1565b606f198112156137b0578897505050505050505061083e565b60008112156137d157806000038460008212156137c957fe5b901c93508596505b92810192600160711b84106137ec576001968701969390931c925b86617fff141561381e578461380657617fff60f01b613810565b6001600160f01b03195b97505050505050505061083e565b600160701b8410156138335760009650613840565b6001600160701b03841693505b83607088901b86613852576000613858565b6001607f1b5b6001600160801b0316171760801b97505050505050505061083e565b600081131561388f57600184901b93506001870396506138a6565b60008112156138a657600182901b91506001860396505b60708113156138b8576001915061391b565b60018113156138e057600181036001830360008212156138d457fe5b901c600101915061391b565b606f198112156138f3576001935061391b565b60001981121561391b576001816000030360018503600082121561391357fe5b901c60010193505b81841061392c578184039350613935565b83820393508294505b8361394b57506000965061083e95505050505050565b600061395685613bc5565b9050806071141561397c57600185901c6001600160701b031694506001880197506139cb565b60708110156139be576070819003808911156139ab578086901b6001600160701b0316955080890398506139b8565b600098600019019590951b945b506139cb565b6001600160701b03851694505b87617fff14156139fe57856139e557617fff60f01b6139ef565b6001600160f01b03195b9850505050505050505061083e565b84607089901b87613a10576000613a16565b6001607f1b5b6001600160801b0316171760801b9850505050505050505061083e565b600061118483600160ff1b8418613645565b60008183613ad15760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613a96578181015183820152602001613a7e565b50505050905090810190601f168015613ac35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613add57fe5b0495945050505050565b60008184841115613b395760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613a96578181015183820152602001613a7e565b505050900390565b6000617fff60f083901c16613fff811015613b605760009150506109a0565b6001607f1b608084901c10613b7457600080fd5b6140fe811115613b8357600080fd5b600160701b6001600160701b03608085901c161761406f821015613bad5761406f8290031c611184565b61406f8211156111845761406e1982011b9392505050565b6000808211613bd357600080fd5b6000600160801b8310613be857608092831c92015b600160401b8310613bfb57604092831c92015b6401000000008310613c0f57602092831c92015b620100008310613c2157601092831c92015b6101008310613c3257600892831c92015b60108310613c4257600492831c92015b60048310613c5257600292831c92015b6002831061083e5760010192915050565b600061083e613c85836f1fffb8aa3b295c17f0bbbe87fed0691d60811b613242565b60006001607f1b608083901c90811190617fff60f085901c8116916001600160701b03169082148015613cb757508015155b15613ccd575061ffff60ef1b92506109a0915050565b61400d821115613cf45782613ce757617fff60f01b613cea565b60005b93505050506109a0565b613f7f821015613d0f5750613fff60f01b92506109a0915050565b81613d1d5760019150613d24565b600160701b175b613fef821115613d3a57613fee1982011b613d4c565b613fef821015613d4c57613fef8290031c5b828015613d5d575061203760811b81115b15613d6f5750600092506109a0915050565b82158015613d8e5750713fffffffffffffffffffffffffffffffffff81115b15613da45750617fff60f01b92506109a0915050565b6001600160801b0381169060801c838015613dbe57508115155b15613dca579019906001015b6001607f1b82811615613dee5770016a09e667f3bcc908b2fb1366ea957d3e0260801c5b6001607e1b831615613e11577001306fe0a31b7152de8d5a46305c85edec0260801c5b6001607d1b831615613e34577001172b83c7d517adcdf7c8c50eb14a791f0260801c5b6001607c1b831615613e575770010b5586cf9890f6298b92b71842a983630260801c5b6001607b1b831615613e7a577001059b0d31585743ae7c548eb68ca417fd0260801c5b6001607a1b831615613e9d57700102c9a3e778060ee6f7caca4f7a29bde80260801c5b600160791b831615613ec05770010163da9fb33356d84a66ae336dcdfa3f0260801c5b600160781b831615613ee357700100b1afa5abcbed6129ab13ec11dc95430260801c5b600160771b831615613f065770010058c86da1c09ea1ff19d294cf2f679b0260801c5b600160761b831615613f29577001002c605e2e8cec506d21bfc89a23a00f0260801c5b600160751b831615613f4c57700100162f3904051fa128bca9c55c31e5df0260801c5b600160741b831615613f6f577001000b175effdc76ba38e31671ca9397250260801c5b600160731b831615613f9257700100058ba01fb9f96d6cacd4b180917c3d0260801c5b600160721b831615613fb55770010002c5cc37da9491d0985c348c68e7b30260801c5b600160711b831615613fd8577001000162e525ee054754457d59952920260260801c5b600160701b831615613ffb5770010000b17255775c040618bf4a4ade83fc0260801c5b6001606f1b83161561401e577001000058b91b5bc9ae2eed81e9b7d4cfab0260801c5b6001606e1b83161561404157700100002c5c89d5ec6ca4d7c8acc017b7c90260801c5b6001606d1b8316156140645770010000162e43f4f831060e02d839a9d16d0260801c5b6001606c1b83161561408757700100000b1721bcfc99d9f890ea069117630260801c5b6001606b1b8316156140aa5770010000058b90cf1e6d97f9ca14dbcc16280260801c5b6001606a1b8316156140cd577001000002c5c863b73f016468f6bac5ca2b0260801c5b600160691b8316156140f057700100000162e430e5a18f6119e3c02282a50260801c5b600160681b831615614113577001000000b1721835514b86e6d96efd1bfe0260801c5b600160671b83161561413657700100000058b90c0b48c6be5df846c5b2ef0260801c5b600160661b8316156141595770010000002c5c8601cc6b9e94213c72737a0260801c5b600160651b83161561417c577001000000162e42fff037df38aa2b219f060260801c5b600160641b83161561419f5770010000000b17217fba9c739aa5819f44f90260801c5b600160631b8316156141c2577001000000058b90bfcdee5acd3c1cedc8230260801c5b600160621b8316156141e557700100000002c5c85fe31f35a6a30da1be500260801c5b600160611b8316156142085770010000000162e42ff0999ce3541b9fffcf0260801c5b600160601b83161561422b57700100000000b17217f80f4ef5aadda455540260801c5b6001605f1b83161561424e5770010000000058b90bfbf8479bd5a81b51ad0260801c5b6001605e1b831615614271577001000000002c5c85fdf84bd62ae30a74cc0260801c5b6001605d1b83161561429457700100000000162e42fefb2fed257559bdaa0260801c5b6001605c1b8316156142b7577001000000000b17217f7d5a7716bba4a9ae0260801c5b6001605b1b8316156142da57700100000000058b90bfbe9ddbac5e109cce0260801c5b6001605a1b8316156142fd5770010000000002c5c85fdf4b15de6f17eb0d0260801c5b600160591b831615614320577001000000000162e42fefa494f1478fde050260801c5b600160581b8316156143435770010000000000b17217f7d20cf927c8e94c0260801c5b600160571b831615614366577001000000000058b90bfbe8f71cb4e4b33d0260801c5b600160561b83161561438957700100000000002c5c85fdf477b662b269450260801c5b600160551b8316156143ac5770010000000000162e42fefa3ae53369388c0260801c5b600160541b8316156143cf57700100000000000b17217f7d1d351a389d400260801c5b600160531b8316156143f25770010000000000058b90bfbe8e8b2d3d4ede0260801c5b600160521b831615614415577001000000000002c5c85fdf4741bea6e77e0260801c5b600160511b83161561443857700100000000000162e42fefa39fe95583c20260801c5b600160501b83161561445b577001000000000000b17217f7d1cfb72b45e10260801c5b698000000000000000000083161561448457700100000000000058b90bfbe8e7cc35c3f00260801c5b69400000000000000000008316156144ad5770010000000000002c5c85fdf473e242ea380260801c5b69200000000000000000008316156144d6577001000000000000162e42fefa39f02b772c0260801c5b69100000000000000000008316156144ff5770010000000000000b17217f7d1cf7d83c1a0260801c5b6908000000000000000000831615614528577001000000000000058b90bfbe8e7bdcbe2e0260801c5b690400000000000000000083161561455157700100000000000002c5c85fdf473dea871f0260801c5b690200000000000000000083161561457a5770010000000000000162e42fefa39ef44d910260801c5b69010000000000000000008316156145a357700100000000000000b17217f7d1cf79e9490260801c5b688000000000000000008316156145cb5770010000000000000058b90bfbe8e7bce5440260801c5b684000000000000000008316156145f3577001000000000000002c5c85fdf473de6eca0260801c5b6820000000000000000083161561461b57700100000000000000162e42fefa39ef366f0260801c5b68100000000000000000831615614643577001000000000000000b17217f7d1cf79afa0260801c5b6808000000000000000083161561466b57700100000000000000058b90bfbe8e7bcd6d0260801c5b680400000000000000008316156146935770010000000000000002c5c85fdf473de6b20260801c5b680200000000000000008316156146bb577001000000000000000162e42fefa39ef3580260801c5b600160401b8316156146de5770010000000000000000b17217f7d1cf79ab0260801c5b678000000000000000831615614705577001000000000000000058b90bfbe8e7bcd50260801c5b67400000000000000083161561472c57700100000000000000002c5c85fdf473de6a0260801c5b6720000000000000008316156147535770010000000000000000162e42fefa39ef340260801c5b67100000000000000083161561477a57700100000000000000000b17217f7d1cf7990260801c5b6708000000000000008316156147a15770010000000000000000058b90bfbe8e7bcc0260801c5b6704000000000000008316156147c8577001000000000000000002c5c85fdf473de50260801c5b6702000000000000008316156147ef57700100000000000000000162e42fefa39ef20260801c5b670100000000000000831615614816577001000000000000000000b17217f7d1cf780260801c5b668000000000000083161561483c57700100000000000000000058b90bfbe8e7bb0260801c5b66400000000000008316156148625770010000000000000000002c5c85fdf473dd0260801c5b6620000000000000831615614888577001000000000000000000162e42fefa39ee0260801c5b66100000000000008316156148ae5770010000000000000000000b17217f7d1cf60260801c5b66080000000000008316156148d4577001000000000000000000058b90bfbe8e7a0260801c5b66040000000000008316156148fa57700100000000000000000002c5c85fdf473c0260801c5b66020000000000008316156149205770010000000000000000000162e42fefa39d0260801c5b660100000000000083161561494657700100000000000000000000b17217f7d1ce0260801c5b6580000000000083161561496b5770010000000000000000000058b90bfbe8e60260801c5b65400000000000831615614990577001000000000000000000002c5c85fdf4720260801c5b652000000000008316156149b557700100000000000000000000162e42fefa380260801c5b651000000000008316156149da577001000000000000000000000b17217f7d1b0260801c5b650800000000008316156149ff57700100000000000000000000058b90bfbe8d0260801c5b65040000000000831615614a245770010000000000000000000002c5c85fdf460260801c5b65020000000000831615614a49577001000000000000000000000162e42fefa20260801c5b65010000000000831615614a6e5770010000000000000000000000b17217f7d00260801c5b648000000000831615614a92577001000000000000000000000058b90bfbe70260801c5b644000000000831615614ab657700100000000000000000000002c5c85fdf30260801c5b642000000000831615614ada5770010000000000000000000000162e42fef90260801c5b641000000000831615614afe57700100000000000000000000000b17217f7c0260801c5b640800000000831615614b225770010000000000000000000000058b90bfbd0260801c5b640400000000831615614b46577001000000000000000000000002c5c85fde0260801c5b640200000000831615614b6a57700100000000000000000000000162e42fee0260801c5b640100000000831615614b8e577001000000000000000000000000b17217f60260801c5b6380000000831615614bb157700100000000000000000000000058b90bfa0260801c5b6340000000831615614bd45770010000000000000000000000002c5c85fc0260801c5b6320000000831615614bf7577001000000000000000000000000162e42fd0260801c5b6310000000831615614c1a5770010000000000000000000000000b17217e0260801c5b6308000000831615614c3d577001000000000000000000000000058b90be0260801c5b6304000000831615614c6057700100000000000000000000000002c5c85e0260801c5b6302000000831615614c835770010000000000000000000000000162e42e0260801c5b6301000000831615614ca657700100000000000000000000000000b172160260801c5b62800000831615614cc85770010000000000000000000000000058b90a0260801c5b62400000831615614cea577001000000000000000000000000002c5c840260801c5b62200000831615614d0c57700100000000000000000000000000162e410260801c5b62100000831615614d2e577001000000000000000000000000000b17200260801c5b62080000831615614d5057700100000000000000000000000000058b8f0260801c5b62040000831615614d725770010000000000000000000000000002c5c70260801c5b62020000831615614d94577001000000000000000000000000000162e30260801c5b62010000831615614db65770010000000000000000000000000000b1710260801c5b618000831615614dd7577001000000000000000000000000000058b80260801c5b614000831615614df857700100000000000000000000000000002c5b0260801c5b612000831615614e195770010000000000000000000000000000162d0260801c5b611000831615614e3a57700100000000000000000000000000000b160260801c5b610800831615614e5b5770010000000000000000000000000000058a0260801c5b610400831615614e7c577001000000000000000000000000000002c40260801c5b610200831615614e9d577001000000000000000000000000000001610260801c5b610100831615614ebe577001000000000000000000000000000000b00260801c5b6080831615614ede577001000000000000000000000000000000570260801c5b6040831615614efe5770010000000000000000000000000000002b0260801c5b6020831615614f1e577001000000000000000000000000000000150260801c5b6010831615614f3e5770010000000000000000000000000000000a0260801c5b6008831615614f5e577001000000000000000000000000000000040260801c5b6004831615614f7e577001000000000000000000000000000000010260801c5b84614f9f57600f81901c6001600160701b03169050613fff82019150614fce565b613ffe8211614fc457600f81901c6001600160701b0316905081613fff039150614fce565b600091613fee19011c5b60709190911b1760801b93506109a09250505056fe414d4f554e545f44454c54415f4f465f4558504952455f504f534954494f4e5f4d5553545f42455f41545f4c454153545f5a45524f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572504f534954494f4e5f414d4f554e545f43414e4e4f545f42455f4e454741544956454455524154494f4e5f44454c54415f4f465f455850495245445f504f534954494f4e5f4d5553545f42455f504f534954495645a264697066735822122045daa4d44a33f148449c5c13b1a748ef4b68f2ae3cfc5851138e685181ba5ccb64736f6c63430006060033

Deployed Bytecode Sourcemap

40394:14290:0:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;40394:14290:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;40575:37:0;;;:::i;:::-;;;;-1:-1:-1;;;;;40575:37:0;;;;;;;;;;;;;;35637:18;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;35637:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38596:183;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;38596:183:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;36867:702;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;36867:702:0;;:::i;:::-;;;;;;;;;;;;;;;;36063:25;;;:::i;53236:674::-;;;:::i;43068:822::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;43068:822:0;;;;;;;:::i;37575:83::-;;;:::i;38215:375::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;38215:375:0;;;;;;;;;;;;;;;;;:::i;40465:32::-;;;:::i;35685:21::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;40702:31;;;:::i;54344:237::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;54344:237:0;;;;;;;;:::i;49744:2904::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;49744:2904:0;;;;;;;:::i;38785:261::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;38785:261:0;;;;;;;;:::i;42468:359::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;42468:359:0;;;;;;;;:::i;40435:25::-;;;:::i;53918:228::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;53918:228:0;;;;;;;;:::i;54154:182::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;54154:182:0;-1:-1:-1;;;;;54154:182:0;;:::i;37666:112::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;37666:112:0;-1:-1:-1;;;;;37666:112:0;;:::i;43898:722::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;43898:722:0;;;;;;;:::i;35660:20::-;;;:::i;42031:50::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;42031:50:0;-1:-1:-1;;;;;42031:50:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;42031:50:0;;;;;;;;;;;;;;39052:409;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;39052:409:0;;;;;;;;:::i;52656:572::-;;;:::i;41863:113::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;41863:113:0;-1:-1:-1;;;;;41863:113:0;;:::i;41647:208::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;41647:208:0;-1:-1:-1;;;;;41647:208:0;;:::i;37784:296::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;37784:296:0;;;;;;;;:::i;35711:21::-;;;:::i;40506:26::-;;;:::i;41399:240::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;41399:240:0;-1:-1:-1;;;;;41399:240:0;;:::i;41982:44::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;41982:44:0;-1:-1:-1;;;;;41982:44:0;;:::i;:::-;;;;;;;-1:-1:-1;;;;;;41982:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47215:2521;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;47215:2521:0;;;;;;;:::i;38086:123::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;38086:123:0;;;;;;;;;;:::i;42835:225::-;;;:::i;40667:30::-;;;:::i;54589:90::-;;;:::i;40575:37::-;;;-1:-1:-1;;;;;40575:37:0;;:::o;35637:18::-;;;;;;;;;;;;;;;-1:-1:-1;;35637:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38596:183::-;38679:10;38658:4;38671:19;;;:7;:19;;;;;;;;-1:-1:-1;;;;;38671:28:0;;;;;;;;;;;:36;;;38719;;;;;;;38658:4;;38671:28;;38679:10;;38719:36;;;;;;;;-1:-1:-1;38769:4:0;38596:183;;;;;:::o;36867:702::-;36389:6;;36928:4;;36389:6;;;-1:-1:-1;;;;;36389:6:0;36399:10;36389:20;36381:65;;;;;-1:-1:-1;;;36381:65:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36381:65:0;;;;;;;;;;;;;;;36945:16;36941:99:::1;;36979:24;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;-1:-1:-1::0;37021:11:0::1;::::0;37014:18:::1;;36941:99;37070:1;37056:11;:15;37052:193;;;37100:76;37104:13;;37119:56;37123:38;37133:11;37132:12;;37147:13;;37123:3;:38::i;:::-;37163:11;;37119:3;:56::i;:::-;37100:3;:76::i;:::-;37084:13;:92:::0;37205:11:::1;::::0;37201:36:::1;::::0;37223:12:::1;::::0;;::::1;37201:3;:36::i;:::-;37187:11;:50:::0;37052:193:::1;37275:1;37261:11;:15;37257:191;;;37305:75;37309:13;;37324:55;37328:37;37337:11;37351:13;;37328:3;:37::i;37324:55::-;37305:3;:75::i;:::-;37289:13;:91:::0;37409:11:::1;::::0;37405:35:::1;::::0;37427:11;37405:3:::1;:35::i;:::-;37391:11;:49:::0;37257:191:::1;37472:28;37476:10;;37488:11;;37472:3;:28::i;:::-;37456:13;:44:::0;37514:24:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;-1:-1:-1::0;37552:11:0::1;::::0;36453:1:::1;36867:702:::0;;;:::o;36063:25::-;;;;:::o;53236:674::-;53312:10;53273:12;53302:21;;;:9;:21;;;;;:28;53294:56;;;;;-1:-1:-1;;;53294:56:0;;;;;;;;;;;;-1:-1:-1;;;53294:56:0;;;;;;;;;;;;;;;53357:18;;53385:10;53357:18;53397:21;;;:9;:21;;;;;;;;:28;53357:69;;-1:-1:-1;;;53357:69:0;;;;;;;;;;;;;;-1:-1:-1;;;;;53357:18:0;;;;:27;;:69;;;;;;;;;;;;;:18;:69;;;2:2:-1;;;;27:1;24;17:12;2:2;53357:69:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53357:69:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;53433:11:0;;-1:-1:-1;53447:47:0;53472:10;53484:3;53489:4;53447:24;:47::i;:::-;53433:61;;53524:33;53528:6;53536:20;;53524:3;:33::i;:::-;53501:20;:56;;;;53564:17;53584:44;53588:6;53596:12;;;;;;;;;-1:-1:-1;;;;;53596:12:0;-1:-1:-1;;;;;53596:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;53596:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53596:31:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;53596:31:0;53584:3;:44::i;:::-;53645:12;;:43;;;-1:-1:-1;;;53645:43:0;;53663:10;53645:43;;;;;;;;;;;;53564:64;;-1:-1:-1;;;;;;53645:12:0;;;;:17;;:43;;;;;;;;;;;;;;;:12;;:43;;;2:2:-1;;;;27:1;24;17:12;2:2;53645:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53645:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;53645:43:0;53715:13;;53740:10;53730:21;;;;:9;53645:43;53730:21;;;;:27;;;53645:43;;-1:-1:-1;53711:47:0;;:3;:47::i;:::-;53695:13;:63;53789:44;;;;;;;;-1:-1:-1;53789:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53775:10;53765:21;;:9;:21;;;;;;;:68;;;;;;53789:44;53765:68;;;;;;;;;;;;;;-1:-1:-1;;53765:68:0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;53765:68:0;;;;;;;;53848:7;53840:31;;;;;-1:-1:-1;;;53840:31:0;;;;;;;;;;;;-1:-1:-1;;;53840:31:0;;;;;;;;;;;;;;;53883:21;;;53893:10;53883:21;;;;;;;;;;;;;53236:674;;;:::o;43068:822::-;43154:10;43126:4;43147:18;;;:6;:18;;;;;:25;:30;43139:66;;;;;-1:-1:-1;;;43139:66:0;;;;;;;;;;;;-1:-1:-1;;;43139:66:0;;;;;;;;;;;;;;;43229:1;43220:6;:10;43212:37;;;;;-1:-1:-1;;;43212:37:0;;;;;;;;;;;;-1:-1:-1;;;43212:37:0;;;;;;;;;;;;;;;43275:1;43264:8;:12;43256:41;;;;;-1:-1:-1;;;43256:41:0;;;;;;;;;;;;-1:-1:-1;;;43256:41:0;;;;;;;;;;;;;;;43312:11;;;;43304:47;;;;;-1:-1:-1;;;43304:47:0;;;;;;;;;;;;-1:-1:-1;;;43304:47:0;;;;;;;;;;;;;;;43358:15;43376:26;43380:6;43388:13;;43376:3;:26::i;:::-;43358:44;;43409:17;43429:33;43433:13;;43448;;43429:3;:33::i;:::-;43409:53;;43469:27;43499:53;43507:20;43516:10;43507:8;:20::i;:::-;43529:22;43538:12;43529:8;:22::i;:::-;43499:7;:53::i;:::-;43469:83;;43559:15;43577:18;43581:3;43586:8;43577:3;:18::i;:::-;43559:36;;43623:159;;;;;;;;43634:10;43623:159;;;;43646:19;-1:-1:-1;;;;;43623:159:0;;;;;;43667:10;43623:159;;;;43679:5;43623:159;;;;;;43686:1;43623:159;;;;43689:92;43697:47;43715:28;43719:3;43724:18;;43715:3;:28::i;:::-;43697:17;:47::i;:::-;-1:-1:-1;;;43689:7:0;:92::i;:::-;-1:-1:-1;;;;;;43623:159:0;;;;;;43609:10;43602:18;;;;:6;:18;;;;;;;;;:180;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43602:180:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43789:31;43806:4;43813:6;43789:8;:31::i;:::-;-1:-1:-1;43832:34:0;;;43837:10;43832:34;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43880:4:0;;43068:822;-1:-1:-1;;;;;;43068:822:0:o;37575:83::-;37639:13;;37575:83;:::o;38215:375::-;-1:-1:-1;;;;;38339:13:0;;38294:4;38339:13;;;:7;:13;;;;;;;;38353:10;38339:25;;;;;;;;38335:37;;38366:5;38335:3;:37::i;:::-;-1:-1:-1;;;;;38307:13:0;;;;;;:7;:13;;;;;;;;38321:10;38307:25;;;;;;;:65;;;;38409:13;;38398:25;;38402:5;;38398:3;:25::i;:::-;-1:-1:-1;;;;;38451:14:0;;;;;;:8;:14;;;;;;38381:42;;-1:-1:-1;38447:30:0;;38381:42;38447:3;:30::i;:::-;-1:-1:-1;;;;;38430:14:0;;;;;;;:8;:14;;;;;;:47;;;;38503:12;;;;;;;38499:28;;38517:9;38499:3;:28::i;:::-;-1:-1:-1;;;;;38484:12:0;;;;;;;:8;:12;;;;;;;;;:43;;;;38539:25;;;;;;;38484:12;;38539:25;;;;;;;;;;;;;-1:-1:-1;38580:4:0;;38215:375;-1:-1:-1;;;;38215:375:0:o;40465:32::-;;;;:::o;35685:21::-;;;;;;:::o;40702:31::-;;;;;;:::o;54344:237::-;-1:-1:-1;;;;;54439:15:0;;54418:4;54439:15;;;:9;:15;;;;;:22;54431:50;;;;;-1:-1:-1;;;54431:50:0;;;;;;;;;;;;-1:-1:-1;;;54431:50:0;;;;;;;;;;;;;;;54495:80;54499:42;54524:4;54530;54536;54499:24;:42::i;:::-;54543:12;;;;;;;;;-1:-1:-1;;;;;54543:12:0;-1:-1:-1;;;;;54543:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;54495:80:0;54488:87;54344:237;-1:-1:-1;;;54344:237:0:o;49744:2904::-;49854:10;49823:4;49844:21;;;:9;:21;;;;;:28;49836:56;;;;;-1:-1:-1;;;49836:56:0;;;;;;;;;;;;-1:-1:-1;;;49836:56:0;;;;;;;;;;;;;;;49905:20;49928:48;49953:10;49965:3;49970:5;49928:24;:48::i;:::-;50041:10;50031:21;;;;:9;:21;;;;;:37;;;49979:1;49928:52;;;;;-1:-1:-1;50027:59:0;;49928:52;50027:3;:59::i;:::-;49997:10;49987:21;;;;:9;:21;;;;;:37;;;:99;;;;50099:32;;;50134:3;-1:-1:-1;50095:288:0;;;50175:1;50159:13;:17;50150:82;;;;-1:-1:-1;;;50150:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50267:1;50252:11;:16;;50243:83;;;;-1:-1:-1;;;50243:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50347:10;50337:21;;;;:9;:21;;;;;50372:3;50337:32;;;;:38;50095:288;50409:1;50395:11;:15;50391:492;;;50466:10;50456:21;;;;:9;:21;;;;;:28;50452:52;;50491:11;50452:3;:52::i;:::-;50431:10;50421:21;;;;:9;:21;;;;;:83;;;50540:32;;;;;50536:42;;50574:3;50536;:42::i;:::-;50513:65;;50587:10;50600:61;50609:11;50623:37;50627:15;50644;50623:3;:37::i;:::-;50600:3;:61::i;:::-;50587:74;;50686:25;50690:13;;50705:5;50686:3;:25::i;:::-;50670:13;:41;50764:10;50754:21;;;;:9;:21;;;;;:27;;;50750:39;;50783:5;50750:3;:39::i;:::-;50730:10;50720:21;;;;:9;:21;;;;;;;;:27;;:69;;;;50798:18;;:77;;-1:-1:-1;;;50798:77:0;;;;;;;;;50850:4;50798:77;;;;;;;;;;;;-1:-1:-1;;;;;50798:18:0;;;;:31;;:77;;;;;;;;;;;;;:18;:77;;;2:2:-1;;;;27:1;24;17:12;2:2;50798:77:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50798:77:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;50391:492:0;50913:1;50899:11;:15;50895:528;;;50970:10;50960:21;;;;:9;:21;;;;;:28;50956:53;;50995:12;;;50956:3;:53::i;:::-;50935:10;50925:21;;;;:9;:21;;;;;:84;;;51045:32;;;;;51041:42;;51079:3;51041;:42::i;:::-;51018:65;;51092:10;51105:62;51115:11;51114:12;;51129:37;51133:15;51150;51129:3;:37::i;51105:62::-;51092:75;;51192:25;51196:13;;51211:5;51192:3;:25::i;:::-;51176:13;:41;51270:10;51260:21;;;;:9;:21;;;;;:27;;;51256:39;;51289:5;51256:3;:39::i;:::-;51236:10;51226:21;;;;:9;:21;;;;;;;;:27;;;;:69;;;;51304:36;;:43;;-1:-1:-1;;51304:43:0;;;;;;;51356:18;;:59;;-1:-1:-1;;;51356:59:0;;;;;;;;;51401:12;;;51356:59;;;;;;-1:-1:-1;;;;;51356:18:0;;;;:27;;:59;;;;;;;;;;;;;:18;:59;;;2:2:-1;;;;27:1;24;17:12;2:2;51356:59:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51356:59:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;50895:528:0;51451:1;51435:13;:17;51431:418;;;51512:10;51502:21;;;;:9;:21;;;;;:32;;;51498:59;;51541:14;;;51498:3;:59::i;:::-;51473:10;51463:21;;;;:9;:21;;;;;:32;;;:94;;;;51583:28;;51579:82;;51613:47;51622:14;;;;51613:3;:47::i;51579:82::-;51566:95;;51686:25;51690:13;;51705:5;51686:3;:25::i;:::-;51670:13;:41;51764:10;51754:21;;;;:9;:21;;;;;:27;;;51750:39;;51783:5;51750:3;:39::i;:::-;51730:10;51720:21;;;;:9;:21;;;;;:27;;;;:69;;;;51798:36;;:43;;-1:-1:-1;;51798:43:0;;;;;;-1:-1:-1;51431:418:0;51877:1;51861:13;:17;51857:363;;;51938:10;51928:21;;;;:9;:21;;;;;:32;;;51924:58;;51967:13;51924:3;:58::i;:::-;51899:10;51889:21;;;;:9;:21;;;;;:32;;;:93;;;;52008:28;;52004:80;;52038:45;52047:13;;52038:3;:45::i;52004:80::-;51991:93;;52109:25;52113:13;;52128:5;52109:3;:25::i;:::-;52093:13;:41;52187:10;52177:21;;;;:9;:21;;;;;:27;;;52173:39;;52206:5;52173:3;:39::i;:::-;52153:10;52143:21;;;;:9;:21;;;;;:27;;:69;-1:-1:-1;51857:363:0;52279:92;52287:47;52305:28;52309:3;52314:18;;52305:3;:28::i;52279:92::-;52242:10;52232:21;;;;:9;:21;;;;;:44;;;:139;;-1:-1:-1;;;;;;52232:139:0;;;;;;;;;;;;;52392:28;52384:79;;;;-1:-1:-1;;;52384:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52488:10;52478:21;;;;:9;:21;;;;;:32;;;52513:3;-1:-1:-1;52470:79:0;;;;;-1:-1:-1;;;52470:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;52567:57;;;52585:10;52567:57;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52638:4:0;;49744:2904;-1:-1:-1;;;49744:2904:0:o;38785:261::-;38918:10;38862:4;38910:19;;;:7;:19;;;;;;;;-1:-1:-1;;;;;38910:28:0;;;;;;;;;;38906:45;;38940:10;38906:3;:45::i;:::-;38883:10;38875:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;38875:28:0;;;;;;;;;;;;:76;;;38963:59;;;;;;38875:28;;38963:59;;;;;;;;;;;-1:-1:-1;39036:4:0;38785:261;;;;:::o;42468:359::-;41329:11;;42546:4;;-1:-1:-1;;;;;41329:11:0;41315:10;:25;41307:70;;;;;-1:-1:-1;;;41307:70:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;41307:70:0;;;;;;;;;;;;;;;42559:16:::1;42578:12;42559:31;;42597:15;42615:31;42619:13;;42634:11;42615:3;:31::i;:::-;42597:49;;42669:31;42673:13;;42688:11;42669:3;:31::i;:::-;42653:13;:47:::0;-1:-1:-1;;;;;42732:18:0;::::1;;::::0;;;:8:::1;:18;::::0;;;;;42728:35:::1;::::0;42752:10;42728:3:::1;:35::i;:::-;-1:-1:-1::0;;;;;42707:18:0;::::1;;::::0;;;:8:::1;:18;::::0;;;;;;;;:56;;;;42775:28;;;;;;;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;-1:-1:-1::0;42817:4:0::1;::::0;42468:359;-1:-1:-1;;;;42468:359:0:o;40435:25::-;;;;:::o;53918:228::-;-1:-1:-1;;;;;54010:12:0;;53989:4;54010:12;;;:6;:12;;;;;:19;54002:47;;;;;-1:-1:-1;;;54002:47:0;;;;;;;;;;;;-1:-1:-1;;;54002:47:0;;;;;;;;;;;;;;;54063:77;54067:39;54089:4;54095;54101;54067:21;:39::i;54154:182::-;-1:-1:-1;;;;;54235:12:0;;54214:4;54235:12;;;:6;:12;;;;;:19;54227:47;;;;;-1:-1:-1;;;54227:47:0;;;;;;;;;;;;-1:-1:-1;;;54227:47:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;54292:12:0;;;;;;:6;:12;;;;;:19;54313:13;;54288:39;;54292:19;54288:3;:39::i;37666:112::-;-1:-1:-1;;;;;37743:13:0;;37719:4;37743:13;;;:8;:13;;;;;;37758;;37739:33;;37743:13;37739:3;:33::i;43898:722::-;43990:10;43959:4;43980:21;;;:9;:21;;;;;:28;:33;43972:69;;;;;-1:-1:-1;;;43972:69:0;;;;;;;;;;;;-1:-1:-1;;;43972:69:0;;;;;;;;;;;;;;;44065:1;44056:6;:10;44048:37;;;;;-1:-1:-1;;;44048:37:0;;;;;;;;;;;;-1:-1:-1;;;44048:37:0;;;;;;;;;;;;;;;44111:1;44100:8;:12;44092:41;;;;;-1:-1:-1;;;44092:41:0;;;;;;;;;;;;-1:-1:-1;;;44092:41:0;;;;;;;;;;;;;;;44148:11;;;;44140:47;;;;;-1:-1:-1;;;44140:47:0;;;;;;;;;;;;-1:-1:-1;;;44140:47:0;;;;;;;;;;;;;;;44194:10;44207:36;44211:6;44219:23;44223:8;44233;44219:3;:23::i;44207:36::-;44194:49;;44266:25;44270:13;;44285:5;44266:3;:25::i;:::-;44250:13;:41;44322:152;;;;;;;;;;;;;;;;;;;;44351:18;44355:3;44360:8;44351:3;:18::i;:::-;44322:152;;;;44371:5;44322:152;;;;;;44378:1;44322:152;;;;44381:92;44389:47;44407:28;44411:3;44416:18;;44407:3;:28::i;44381:92::-;-1:-1:-1;;;;;;44322:152:0;;;;;;44308:10;44298:21;;;;:9;:21;;;;;;;;:176;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44298:176:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44481:18;;:66;;-1:-1:-1;;;44481:66:0;;;;;;;;;44533:4;44481:66;;;;;;;;;;;;-1:-1:-1;;;;;44481:18:0;;;;:31;;:66;;;;;44298:21;;44481:66;;;;;;;;;:18;:66;;;2:2:-1;;;;27:1;24;17:12;2:2;44481:66:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44481:66:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;44559:37:0;;;44567:10;44559:37;;44481:66;44559:37;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44610:4:0;;43898:722;-1:-1:-1;;;43898:722:0:o;35660:20::-;;;;;;;;;;;;;;;-1:-1:-1;;35660:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42031:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39052:409::-;39174:10;39134:4;39166:19;;;:7;:19;;;;;;;;-1:-1:-1;;;;;39166:28:0;;;;;;;;;;39205:27;;;39201:166;;39251:10;39274:1;39243:19;;;:7;:19;;;;;;;;-1:-1:-1;;;;;39243:28:0;;;;;;;;;:32;39201:166;;;39329:30;39333:8;39343:15;39329:3;:30::i;:::-;39306:10;39298:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;39298:28:0;;;;;;;;;:61;39201:166;39387:10;39408:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;39378:59:0;;39408:28;;;;;;;;;;;39378:59;;;;;;;;;39387:10;39378:59;;;;;;;;;;;-1:-1:-1;39451:4:0;;39052:409;-1:-1:-1;;;39052:409:0:o;52656:572::-;52726:10;52690:12;52719:18;;;:6;:18;;;;;:25;52711:53;;;;;-1:-1:-1;;;52711:53:0;;;;;;;;;;;;-1:-1:-1;;;52711:53:0;;;;;;;;;;;;;;;52801:10;52771:16;52794:18;;;:6;:18;;;;;:25;52821:13;;52790:45;;52794:25;52790:3;:45::i;:::-;52842:38;;;-1:-1:-1;;;52842:38:0;;52856:10;52842:38;;;;;;;;;;;;52771:64;;-1:-1:-1;52842:4:0;;:13;;:38;;;;;;;;;;;;;;;-1:-1:-1;52842:4:0;:38;;;2:2:-1;;;;27:1;24;17:12;2:2;52842:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52842:38:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;52887:11:0;;-1:-1:-1;52901:44:0;52923:10;52935:3;52940:4;52901:21;:44::i;:::-;52887:58;;52952:17;52972:44;52976:6;52984:12;;;;;;;;;-1:-1:-1;;;;;52984:12:0;-1:-1:-1;;;;;52984:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;52972:44:0;53033:12;;:43;;;-1:-1:-1;;;53033:43:0;;53051:10;53033:43;;;;;;;;;;;;52952:64;;-1:-1:-1;;;;;;53033:12:0;;;;:17;;:43;;;;;;;;;;;;;;;:12;;:43;;;2:2:-1;;;;27:1;24;17:12;2:2;53033:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53033:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;53033:43:0;53104:50;;;;;;;;-1:-1:-1;53104:50:0;;;53033:43;53104:50;;;;;;;;;;;;;;;;;;53118:10;53104:50;;;;;;;;;;;;53090:10;53083:18;;:6;:18;;;;;;;:71;;;;;;53104:50;53083:71;;;;-1:-1:-1;;;;;;53083:71:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;53083:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53033:43;-1:-1:-1;53033:43:0;53161:31;;;;;-1:-1:-1;;;53161:31:0;;;;;;;;;;;;-1:-1:-1;;;53161:31:0;;;;;;;;;;;;;;;53204:18;;;53211:10;53204:18;;;;;;;;;;;;;52656:572;;;;:::o;41863:113::-;36389:6;;41926:4;;36389:6;;;-1:-1:-1;;;;;36389:6:0;36399:10;36389:20;36381:65;;;;;-1:-1:-1;;;36381:65:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36381:65:0;;;;;;;;;;;;;;;-1:-1:-1;41939:6:0::1;:13:::0;;-1:-1:-1;;;;;41939:13:0;::::1;;;-1:-1:-1::0;;;;;;41939:13:0;;::::1;;::::0;;:6:::1;41863:113:::0;;;:::o;41647:208::-;36389:6;;41705:4;;36389:6;;;-1:-1:-1;;;;;36389:6:0;36399:10;36389:20;36381:65;;;;;-1:-1:-1;;;36381:65:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36381:65:0;;;;;;;;;;;;;;;41720:22:::1;:29:::0;;-1:-1:-1;;;;;41720:29:0;::::1;-1:-1:-1::0;;;;;;41720:29:0;;::::1;::::0;::::1;::::0;;;41758:18:::1;:45:::0;;;;::::1;::::0;::::1;::::0;;41817:12:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;-1:-1:-1::0;41845:4:0::1;41647:208:::0;;;:::o;37784:296::-;37842:4;37855:14;37872:25;37876:5;37883:13;;37872:3;:25::i;:::-;37940:10;37931:20;;;;:8;:20;;;;;;37855:42;;-1:-1:-1;37927:36:0;;37855:42;37927:3;:36::i;:::-;37913:10;37904:20;;;;:8;:20;;;;;;:59;;;;-1:-1:-1;;;;;37989:12:0;;;;;;37985:28;;38003:9;37985:3;:28::i;:::-;-1:-1:-1;;;;;37970:12:0;;;;;;:8;:12;;;;;;;;;:43;;;;38025:31;;;;;;;37970:12;;38034:10;;38025:31;;;;;;;;;;-1:-1:-1;38070:4:0;;37784:296;-1:-1:-1;;;37784:296:0:o;35711:21::-;;;;;;-1:-1:-1;;;;;35711:21:0;;:::o;40506:26::-;;;-1:-1:-1;;;;;40506:26:0;;:::o;41399:240::-;36389:6;;41458:4;;36389:6;;;-1:-1:-1;;;;;36389:6:0;36399:10;36389:20;36381:65;;;;;-1:-1:-1;;;36381:65:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36381:65:0;;;;;;;;;;;;;;;41479:11:::1;::::0;-1:-1:-1;;;;;41479:11:0::1;:25:::0;41471:54:::1;;;::::0;;-1:-1:-1;;;41471:54:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;41471:54:0;;;;;;;;;;;;;::::1;;41532:11;:18:::0;;-1:-1:-1;;;;;41532:18:0;::::1;-1:-1:-1::0;;;;;;41532:18:0;;::::1;::::0;::::1;::::0;;;41557:12:::1;:33:::0;;;;::::1;::::0;::::1;::::0;;41602:13:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;-1:-1:-1::0;41629:4:0::1;41399:240:::0;;;:::o;41982:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47215:2521::-;47319:10;47291:4;47312:18;;;:6;:18;;;;;:25;47304:53;;;;;-1:-1:-1;;;47304:53:0;;;;;;;;;;;;-1:-1:-1;;;47304:53:0;;;;;;;;;;;;;;;47366:20;47389:45;47411:10;47423:3;47428:5;47389:21;:45::i;:::-;47493:10;47486:18;;;;:6;:18;;;;;:34;;;47437:1;47389:49;;;;;-1:-1:-1;47482:56:0;;47389:49;47482:3;:56::i;:::-;47452:10;47445:18;;;;:6;:18;;;;;:34;;:93;;;;47571:13;;47586;;47567:33;;47571:13;47567:3;:33::i;:::-;47620:10;47613:18;;;;:6;:18;;;;;:29;;;47547:53;;-1:-1:-1;47645:3:0;-1:-1:-1;47609:462:0;;;47686:1;47670:13;:17;47661:82;;;;-1:-1:-1;;;47661:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47778:1;47763:11;:16;;47754:83;;;;-1:-1:-1;;;47754:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47902:10;47848:27;47895:18;;;:6;:18;;;;;:25;47878:68;;47886:35;;:8;:35::i;47878:68::-;47964:10;47957:18;;;;:6;:18;;;;;:38;;;:60;;-1:-1:-1;;;;;;47957:60:0;;;;;;;;;;;;;48060:3;48028:29;;;;:35;-1:-1:-1;47609:462:0;48097:1;48083:11;:15;48079:430;;;48109:14;48126:37;48135:11;48149:13;;48126:3;:37::i;:::-;48211:10;48204:18;;;;:6;:18;;;;;:25;48109:54;;-1:-1:-1;48200:41:0;;48109:54;48200:3;:41::i;:::-;48179:10;48172:18;;;;:6;:18;;;;;:69;;;;48280:52;48288:19;48297:9;48288:8;:19::i;:::-;48309:22;48318:12;48309:8;:22::i;48280:52::-;48397:10;48390:18;;;;:6;:18;;;;;:38;;;48250:82;;-1:-1:-1;48382:68:0;;48390:38;;48250:82;48382:7;:68::i;:::-;48348:10;48341:18;;;;:6;:18;;;;;:38;;:109;;-1:-1:-1;;;;;;48341:109:0;;;;;;;;;;;;48459:42;48476:4;48488:11;48459:8;:42::i;:::-;;48079:430;;;48539:1;48525:11;:15;48521:483;;;48551:14;48568:38;48578:11;48577:12;;48592:13;;48568:3;:38::i;:::-;48654:10;48647:18;;;;:6;:18;;;;;:25;48551:55;;-1:-1:-1;48643:41:0;;48551:55;48643:3;:41::i;:::-;48622:10;48615:18;;;;:6;:18;;;;;:69;;;;48723:52;48731:19;48740:9;48731:8;:19::i;48723:52::-;48840:10;48833:18;;;;:6;:18;;;;;:38;;;48693:82;;-1:-1:-1;48825:68:0;;48833:38;;48693:82;48825:7;:68::i;:::-;48791:10;48784:18;;;;:6;:18;;;;;;;;:38;;;;:109;;-1:-1:-1;;;;;;48784:109:0;;;;;;;;;;;;;48902:33;;:40;;-1:-1:-1;;48902:40:0;;;;;;;48951:45;;-1:-1:-1;;;48951:45:0;;;;;;;;;48982:12;;;48951:45;;;;;;:4;;:13;;:45;;;;;48784:18;;48951:45;;;;;;;;;:4;:45;;;2:2:-1;;;;27:1;24;17:12;2:2;48951:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48951:45:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;48521:483:0;49032:1;49016:13;:17;49012:177;;;49087:10;49080:18;;;;:6;:18;;;;;:29;;;49076:56;;49116:14;;;49076:3;:56::i;:::-;49051:10;49044:18;;;;:6;:18;;;;;:29;;;:88;;;;49141:33;;:40;;-1:-1:-1;;49141:40:0;49177:4;49141:40;;;49012:177;49217:1;49201:13;:17;49197:127;;;49272:10;49265:18;;;;:6;:18;;;;;:29;;;49261:55;;49301:13;49261:3;:55::i;:::-;49236:10;49229:18;;;;:6;:18;;;;;:29;;:87;49197:127;49380:92;49388:47;49406:28;49410:3;49415:18;;49406:3;:28::i;49380:92::-;49343:10;49336:18;;;;:6;:18;;;;;:41;;;:136;;-1:-1:-1;;;;;;49336:136:0;;;;;;;;;;;;;49489:25;49481:76;;;;-1:-1:-1;;;49481:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49579:10;49572:18;;;;:6;:18;;;;;:29;;;49604:3;-1:-1:-1;49564:76:0;;;;;-1:-1:-1;;;49564:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;49658:54;;;49673:10;49658:54;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49726:4:0;;47215:2521;-1:-1:-1;;;;47215:2521:0:o;38086:123::-;-1:-1:-1;;;;;38179:15:0;;;38159:4;38179:15;;;:7;:15;;;;;;;;:24;;;;;;;;;;;;;38086:123::o;42835:225::-;36389:6;;42888:4;;36389:6;;;-1:-1:-1;;;;;36389:6:0;36399:10;36389:20;36381:65;;;;;-1:-1:-1;;;36381:65:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36381:65:0;;;;;;;;;;;;;;;42910:11:::1;::::0;::::1;;42909:12;42901:48;;;::::0;;-1:-1:-1;;;42901:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;42956:11;:18:::0;;-1:-1:-1;;42956:18:0::1;42970:4;42956:18;::::0;;43002:3:::1;42981:18;:24:::0;43017:12:::1;::::0;::::1;::::0;42956:11:::1;::::0;43017:12:::1;-1:-1:-1::0;43043:11:0::1;::::0;::::1;;42835:225:::0;:::o;40667:30::-;;;;:::o;54589:90::-;54660:13;;54589:90;:::o;34658:246::-;34716:7;34740:6;34736:47;;-1:-1:-1;34770:1:0;34763:8;;34736:47;34805:5;;;34809:1;34805;:5;:1;34829:5;;;;;:10;34821:56;;;;-1:-1:-1;;;34821:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34916:132;34974:7;35001:39;35005:1;35008;35001:39;;;;;;;;;;;;;;;;;:3;:39::i;34308:136::-;34366:7;34393:43;34397:1;34400;34393:43;;;;;;;;;;;;;;;;;:3;:43::i;34117:179::-;34175:7;34207:5;;;34231:6;;;;34223:46;;;;;-1:-1:-1;;;34223:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;45725:1482;-1:-1:-1;;;;;45892:19:0;;45839:11;45892:19;;;:9;:19;;;;;:34;;;45839:11;;45892:34;;;:81;;-1:-1:-1;;;;;;45930:19:0;;;;;;:9;:19;;;;;:30;;;:43;-1:-1:-1;45892:81:0;45889:120;;;-1:-1:-1;45997:4:0;45889:120;-1:-1:-1;;;;;46062:19:0;;46015:22;46062:19;;;:9;:19;;;;;:30;;;46040:53;;;46104:22;;46100:85;;;46158:19;;46100:85;-1:-1:-1;;;;;46229:19:0;;46191:21;46229:19;;;:9;:19;;;;;46294:1;46229:30;;;;46267:28;;;46216:43;;;46215:49;;;;:80;46310:30;;;;:84;;-1:-1:-1;;;;;;46364:19:0;;;;;;:9;:19;;;;;:30;;;46344:50;;46310:84;46302:106;;;;;-1:-1:-1;;;46302:106:0;;;;;;;;;;;;-1:-1:-1;;;46302:106:0;;;;;;;;;;;;;;;46424:246;46431:238;46439:158;46447:105;46455:60;46473:41;46477:16;46495:18;;46473:3;:41::i;46447:105::-;-1:-1:-1;;;;;46554:19:0;;;;;;:9;:19;;;;;:42;;;;;46439:7;:158::i;:::-;-1:-1:-1;;;;;46616:19:0;;;;;;:9;:19;;;;;:25;;;46599:69;;46607:35;;:8;:35::i;:::-;46644:23;46653:13;;46644:8;:23::i;46599:69::-;46431:7;:238::i;:::-;46424:6;:246::i;:::-;46415:255;;46681:16;46677:98;;;-1:-1:-1;;;;;46731:19:0;;;;;;:9;:19;;;;;:35;;;46719:48;;46723:6;;46719:3;:48::i;:::-;46710:57;;46677:98;46790:258;46797:250;46805:16;46814:6;46805:8;:16::i;:::-;46823:223;-1:-1:-1;;;46823:223:0;;46867:178;46875:30;46884:20;;46875:8;:30::i;:::-;46907:137;46915:92;46923:47;46941:28;46945:3;46950:18;;46941:3;:28::i;46923:47::-;-1:-1:-1;;;46915:7:0;:92::i;46867:178::-;46823:7;:223::i;46790:258::-;46781:267;;47064:69;47071:61;47079:16;47088:6;47079:8;:16::i;:::-;-1:-1:-1;;;47071:7:0;:61::i;47064:69::-;47055:78;;47144:10;47140:56;;;47174:14;47178:6;47186:1;47174:3;:14::i;:::-;47165:23;;47140:56;45725:1482;;;;;;;;:::o;1231:405::-;1284:7;1304:6;1300:331;;-1:-1:-1;1328:1:0;1312:18;;1300:331;1368:1;1351:14;1394:12;1368:1;1394:3;:12::i;:::-;1380:26;;1425:3;1419;:9;1415:84;;;1447:3;1441;:9;1430:20;;;;;1415:84;;;1474:3;1468;:9;1464:35;;;1496:3;1490;:9;1479:20;;;;;1464:35;1561:5;:11;1576:3;1561:18;-1:-1:-1;;;;;1519:39:0;;;;:60;1597:26;;;-1:-1:-1;1590:33:0;;11803:2702;11866:7;11923:6;11902:18;;;;:27;;;11956:18;;;;:27;;;11996:19;;11992:2508;;;12030:9;12043:6;12030:19;12026:98;;;-1:-1:-1;;;;12058:3:0;-1:-1:-1;12051:10:0;;-1:-1:-1;12051:10:0;12026:98;-1:-1:-1;;;;;;12086:38:0;;12082:42;;12075:49;;11992:2508;12142:9;12155:6;12142:19;12138:2362;;;-1:-1:-1;;;12176:38:0;;:43;12172:140;;-1:-1:-1;;;;12228:3:0;-1:-1:-1;12221:10:0;;-1:-1:-1;12221:10:0;12172:140;-1:-1:-1;;;12269:5:0;;;-1:-1:-1;;;12268:44:0;12245:67;;12138:2362;-1:-1:-1;;;;;;;12330:38:0;;12326:2174;;-1:-1:-1;;;;;;;12388:38:0;;12384:144;;-1:-1:-1;;;;12440:3:0;-1:-1:-1;12433:10:0;;-1:-1:-1;12433:10:0;12384:144;-1:-1:-1;;;12485:5:0;;;-1:-1:-1;;;12484:44:0;-1:-1:-1;;;12464:64:0;12457:71;;12326:2174;-1:-1:-1;;;;;12572:11:0;;;;:44;12629:14;12625:92;;12657:1;12645:13;;12625:92;;;-1:-1:-1;;;12672:45:0;12625:92;-1:-1:-1;;;;;12749:11:0;;;;:44;12806:14;12802:321;;12837:15;;12833:181;;12867:10;12886:16;12891:10;12886:3;:16::i;:::-;12964:1;;-1:-1:-1;12880:3:0;:22;12978:24;;;-1:-1:-1;;12978:24:0;;12917:20;;;;;-1:-1:-1;12833:181:0;12802:321;;;-1:-1:-1;;;13061:44:0;13110:3;13060:53;12802:321;13159:10;13146;:23;;;;;;;-1:-1:-1;13182:15:0;13178:130;;-1:-1:-1;;;13216:5:0;;;13215:44;:93;;550:34;13215:93;;;-1:-1:-1;;;13215:93:0;13208:100;;;;;;;;13178:130;-1:-1:-1;;;13327:10:0;:44;;13319:53;;;;13383:11;-1:-1:-1;;;13406:10:0;:45;;:196;;-1:-1:-1;;;13482:10:0;:45;;:120;;-1:-1:-1;;;13545:10:0;:45;;:57;;13599:3;13545:57;;;13593:3;13545:57;13482:120;;;13530:3;13482:120;13406:196;;;;;13454:16;13459:10;13454:3;:16::i;:::-;13383:219;;13635:9;13647:5;13635:17;13629:3;13617:9;:15;:35;13613:745;;;13689:6;13677:18;;13719:1;13706:14;;13613:745;;;13767:9;13752:3;13740:9;:15;13758:5;13740:23;:36;13736:622;;;13814:1;13802:13;;13839:1;13826:14;;13736:622;;;13887:9;13872:3;13860:9;:15;13878:5;13860:23;:36;13856:502;;;13946:9;13926;13938:5;13926:17;:29;13922:196;;;14003:9;13983;13995:5;13983:17;:29;13968:44;;;;;13922:196;;;14052:9;14032;14044:5;14032:17;:29;14028:90;;;14113:5;14101:9;14089;:21;:29;14074:44;;;;;14028:90;14143:1;14131:13;;13856:502;;;14191:3;14185;:9;14181:50;;;14228:3;14222;:9;14207:24;;;;;14181:50;-1:-1:-1;;;;;14244:44:0;;;;14339:9;14325:3;14313:9;:15;14331:5;14313:23;:35;14301:47;;13856:502;14480:10;14474:3;14461:9;:16;;14407:1;14403;:5;-1:-1:-1;;;14402:44:0;;;14393:54;;-1:-1:-1;;;;;14393:84:0;;:97;14375:117;;14368:124;;;;;;;;;33545:530;33604:11;33626:13;33642:11;33651:1;33642:8;:11::i;:::-;33626:27;-1:-1:-1;33662:16:0;33681:50;33626:27;-1:-1:-1;;;33681:7:0;:50::i;:::-;33662:69;-1:-1:-1;33740:16:0;33759:53;33662:69;-1:-1:-1;;;33759:7:0;:53::i;:::-;33740:72;;33821:14;33838:13;33842:8;33838:3;:13::i;:::-;33821:30;-1:-1:-1;33860:14:0;33877:51;-1:-1:-1;;;33821:30:0;33877:7;:51::i;:::-;33860:68;-1:-1:-1;33937:13:0;33953:51;-1:-1:-1;;;33860:68:0;33953:7;:51::i;:::-;33937:67;-1:-1:-1;34019:50:0;33937:67;-1:-1:-1;;;34019:7:0;:50::i;:::-;34013:56;33545:530;-1:-1:-1;;;;;;;;33545:530:0:o;8101:2409::-;8164:7;8221:6;8200:18;;;;:27;;;8254:18;;;;:27;;;8294:19;;8290:2215;;;8328:9;8341:6;8328:19;8324:361;;;-1:-1:-1;;;;;;8364:6:0;;;;;;;8360:164;;;-1:-1:-1;;;;;;8383:38:0;;8379:42;;8372:49;;8360:164;-1:-1:-1;;;;;;;;;8441:5:0;;;:43;;8437:87;;;-1:-1:-1;;;8493:5:0;;;8486:12;;8437:87;-1:-1:-1;;;;8521:3:0;-1:-1:-1;8514:10:0;;-1:-1:-1;8514:10:0;8324:361;-1:-1:-1;;;;;;;8555:38:0;;8551:124;;-1:-1:-1;;;;8607:3:0;-1:-1:-1;8600:10:0;;-1:-1:-1;8600:10:0;8290:2215;8702:9;8715:6;8702:19;8698:1807;;;-1:-1:-1;;;;;;;8738:38:0;;8734:124;;-1:-1:-1;;;;8790:3:0;-1:-1:-1;8783:10:0;;-1:-1:-1;8783:10:0;8734:124;-1:-1:-1;;;;;;8820:38:0;;8816:42;;8809:49;;8698:1807;-1:-1:-1;;;;;8902:11:0;;;;:44;8959:14;8955:92;;8987:1;8975:13;;8955:92;;;-1:-1:-1;;;9002:45:0;8955:92;-1:-1:-1;;;;;9079:11:0;;;;:44;9136:14;9132:92;;9164:1;9152:13;;9132:92;;;-1:-1:-1;;;9179:45:0;9132:92;9235:24;;;;9272:15;9268:130;;-1:-1:-1;;;9306:5:0;;;9305:44;:93;;550:34;9305:93;;9268:130;9409:22;;;;9442:11;-1:-1:-1;;;9465:73:0;;;:198;;-1:-1:-1;;;9556:10:0;:73;;:107;;9647:16;9652:10;9647:3;:16::i;:::-;9556:107;;;9632:3;9556:107;9465:198;;;9541:3;9465:198;9442:221;;9696:5;9690:3;9678:9;:15;:23;9674:689;;;9739:1;9727:13;;9764:1;9751:14;;9674:689;;;9803:5;9797:3;9785:9;:15;:23;9781:582;;;9850:5;9838:9;:17;9834:148;;;9891:9;9883:5;:17;9868:32;;;;;9834:148;;;9932:5;9920:9;:17;9916:66;;;9977:5;9965:9;:17;9950:32;;;;;9916:66;10005:1;9993:13;;9781:582;;;10044:5;10038:3;10026:9;:15;:23;10022:341;;;10074:6;10062:18;;10104:1;10091:14;;10022:341;;;10142:3;10136;:9;10132:116;;;10179:3;10173;:9;10158:24;;;;;10132:116;;;10208:3;10202;:9;10198:50;;;10245:3;10239;:9;10224:24;;;;;10198:50;-1:-1:-1;;;;;10261:44:0;;;;10348:5;10342:3;10330:9;:15;:23;10318:35;;10022:341;10485:10;10479:3;10466:9;:16;;10412:1;10408;:5;-1:-1:-1;;;10407:44:0;;;10398:54;;-1:-1:-1;;;;;10398:84:0;;:97;10380:117;;10373:124;;;;;;;;;44626:1091;-1:-1:-1;;;;;44791:16:0;;44737:11;44791:16;;;:6;:16;;;;;:31;;;44737:11;;44791:31;;;:75;;-1:-1:-1;;;;;;44826:16:0;;;;;;:6;:16;;;;;:27;;;:40;-1:-1:-1;44791:75:0;44787:115;;;-1:-1:-1;44890:4:0;44787:115;-1:-1:-1;;;;;44955:16:0;;44908:22;44955:16;;;:6;:16;;;;;:27;;;44933:50;;;44994:22;;44990:85;;;45048:19;;44990:85;-1:-1:-1;;;;;45119:16:0;;45081:21;45119:16;;;:6;:16;;;;;45181:1;45119:27;;;;45154:28;;;45106:40;;;45105:46;;;;:77;45197:30;;;;:81;;-1:-1:-1;;;;;;45251:16:0;;;;;;:6;:16;;;;;:27;;;45231:47;;45197:81;45189:103;;;;;-1:-1:-1;;;45189:103:0;;;;;;;;;;;;-1:-1:-1;;;45189:103:0;;;;;;;;;;;;;;;45308:210;45315:202;45323:155;45331:105;45339:60;45357:41;45361:16;45379:18;;45357:3;:41::i;45331:105::-;-1:-1:-1;;;;;45438:16:0;;;;;;:6;:16;;;;;:39;;;;;45323:7;:155::i;:::-;-1:-1:-1;;;;;45480:16:0;;;;;;:6;:16;;;;;:36;;;;;45315:7;:202::i;45308:210::-;45299:219;;45529:16;45525:95;;;-1:-1:-1;;;;;45579:16:0;;;;;;:6;:16;;;;;:32;;;45567:45;;45571:6;;45567:3;:45::i;:::-;45558:54;;45525:95;45635:14;45639:6;45647:1;45635:3;:14::i;3092:3678::-;3155:7;3212:6;3191:18;;;;:27;;;3245:18;;;;:27;;;3285:19;;3281:3484;;;3319:9;3332:6;3319:19;3315:107;;;-1:-1:-1;;;;;;3356:6:0;;;;;;;3352:46;;;3371:1;3364:8;;;;;;3315:107;3421:1;3414:8;;;;;;3281:3484;3441:9;3454:6;3441:19;3437:3328;;;3469:1;3462:8;;;;;;3437:3328;-1:-1:-1;;;3504:11:0;;;;:49;;;;;-1:-1:-1;;;;;3583:44:0;3640:14;3636:92;;3668:1;3656:13;;3636:92;;;-1:-1:-1;;;3683:45:0;3636:92;-1:-1:-1;;;3752:11:0;;;;:49;;;;;-1:-1:-1;;;;;3831:44:0;3888:14;3884:92;;3916:1;3904:13;;3884:92;;;-1:-1:-1;;;3931:45:0;3884:92;3991:15;3987:2771;;-1:-1:-1;;;;;;4015:18:0;;-1:-1:-1;;;4015:18:0;:38;;4052:1;4015:38;;;550:34;4015:38;4008:45;;;;;;;;;;3987:2771;4071:15;4067:2691;;-1:-1:-1;;;;;;4095:18:0;;-1:-1:-1;;;4095:18:0;:38;;4132:1;4095:38;;4067:2691;4173:39;;;4231:14;;;;;;;4227:2522;;;4272:3;4264:5;:11;4260:241;;;4284:1;4277:8;;;;;;;;;;;4260:241;4315:1;4307:5;:9;4303:198;;;4333:5;4318:20;;;;;;;;;;;;;4303:198;;;-1:-1:-1;;4360:5:0;:12;4356:145;;;4381:1;4374:8;;;;;;;;;;;4356:145;4412:1;4404:5;:9;4400:101;;;4446:5;4445:6;;4430:21;;;;;;;;;;;;;4478:9;4466:21;;4400:101;4517:24;;;;-1:-1:-1;;;4562:45:0;;4558:125;;4639:1;4655:14;;;;4624:16;;;;;4558:125;4703:9;4716:6;4703:19;4699:445;;;4744:5;:45;;-1:-1:-1;;;4744:45:0;;;-1:-1:-1;;;;;;4744:45:0;4737:52;;;;;;;;;;;4699:445;-1:-1:-1;;;4826:10:0;:44;4822:127;;;4884:1;4872:13;;4822:127;;;-1:-1:-1;;;;;4905:44:0;;;;4822:127;5117:10;5093:3;5080:9;:16;;5012:5;:46;;5057:1;5012:46;;;-1:-1:-1;;;5012:46:0;-1:-1:-1;;;;;5011:86:0;;:116;4975:154;;4968:161;;;;;;;;;;;4227:2522;5186:1;5178:5;:9;5174:195;;;5219:1;5204:16;;;;;5248:1;5235:14;;;;5174:195;;;5281:1;5273:5;:9;5269:100;;;5314:1;5299:16;;;;;5354:1;5342:9;:13;5330:25;;5269:100;5395:3;5387:5;:11;5383:241;;;5413:1;5400:14;;5383:241;;;5444:1;5436:5;:9;5432:192;;;5487:1;5479:5;:9;5474:1;5461:10;:14;:27;;;;;;;;;;5492:1;5460:33;5447:46;;5432:192;;;-1:-1:-1;;5515:5:0;:12;5511:113;;;5542:1;5529:14;;5511:113;;;-1:-1:-1;;5565:5:0;:10;5561:63;;;5618:1;5610:5;5609:6;;:10;5604:1;5591:10;:14;:28;;;;;;;;;;5623:1;5590:34;5577:47;;5561:63;5657:10;5643;:24;5639:165;;5683:10;5669:24;;;;5639:165;;;5752:10;5739;:23;5726:36;;5785:5;5777:13;;5639:165;5822:15;5818:54;;-1:-1:-1;550:34:0;;-1:-1:-1;5852:20:0;;-1:-1:-1;;;;;;5852:20:0;5818:54;5887:11;5901:16;5906:10;5901:3;:16::i;:::-;5887:30;;5936:3;5943;5936:10;5932:527;;;5990:1;5976:10;:15;;-1:-1:-1;;;;;5976:48:0;5963:61;;6052:1;6039:14;;;;5932:527;;;6083:3;6077;:9;6073:386;;;6119:3;:9;;;6147:17;;;6143:253;;;6210:5;6196:10;:19;;-1:-1:-1;;;;;6196:52:0;6183:65;;6278:5;6265:18;;;;6143:253;;;6379:1;;-1:-1:-1;;6337:13:0;6322:28;;;;;6143:253;6073:386;;;;-1:-1:-1;;;;;6415:44:0;;;;6073:386;6478:9;6491:6;6478:19;6474:263;;;6519:5;:45;;-1:-1:-1;;;6519:45:0;;;-1:-1:-1;;;;;;6519:45:0;6512:52;;;;;;;;;;;;6474:263;6725:10;6703:3;6690:9;:16;;6624:5;:46;;6669:1;6624:46;;;-1:-1:-1;;;6624:46:0;-1:-1:-1;;;;;6623:84:0;;:112;6589:148;;6582:155;;;;;;;;;;;;7260:142;7323:7;7346:50;7354:1;-1:-1:-1;;;7357:38:0;;7346:7;:50::i;35060:189::-;35146:7;35181:12;35174:5;35166:28;;;;-1:-1:-1;;;35166:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;35166:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35205:9;35221:1;35217;:5;;;;;;;35060:189;-1:-1:-1;;;;;35060:189:0:o;34456:190::-;34542:7;34578:12;34570:6;;;;34562:29;;;;-1:-1:-1;;;34562:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;34562:29:0;-1:-1:-1;;;34614:5:0;;;34456:190::o;2044:558::-;2095:7;2151:6;2130:18;;;;:27;2181:5;2170:16;;2166:30;;;2195:1;2188:8;;;;;2166:30;-1:-1:-1;;;2227:11:0;;;;:48;2218:58;;12:1:-1;9;2:12;2218:58:0;2318:5;2306:8;:17;;2297:27;;12:1:-1;9;2:12;2297:27:0;-1:-1:-1;;;;;;;;2369:11:0;;;;2360:54;:95;2479:5;2468:16;;2464:110;;;2497:5;:16;;;2486:27;2464:110;;;2540:5;2529:8;:16;2525:49;;;-1:-1:-1;;2558:16:0;;2547:27;2590:6;2044:558;-1:-1:-1;;;2044:558:0:o;32952:585::-;32999:7;33028:1;33024;:5;33015:15;;12:1:-1;9;2:12;33015:15:0;33039:14;-1:-1:-1;;;33070:40:0;;33066:75;;33120:3;33114:9;;;;33125:13;33066:75;-1:-1:-1;;;33151:1:0;:24;33147:57;;33185:2;33179:8;;;;33189:12;33147:57;33219:11;33214:1;:16;33210:49;;33240:2;33234:8;;;;33244:12;33210:49;33274:7;33269:1;:12;33265:45;;33291:2;33285:8;;;;33295:12;33265:45;33325:5;33320:1;:10;33316:41;;33340:1;33334:7;;;;33343:11;33316:41;33372:4;33367:1;:9;33363:40;;33386:1;33380:7;;;;33389:11;33363:40;33418:3;33413:1;:8;33409:39;;33431:1;33425:7;;;;33434:11;33409:39;33463:3;33458:1;:8;33454:25;;33478:1;33468:11;33525:6;32952:585;-1:-1:-1;;32952:585:0:o;32812:132::-;32860:7;32883:55;32890:47;32899:1;-1:-1:-1;;;32890:7:0;:47::i;:::-;14685:7;-1:-1:-1;;;14718:11:0;;;;:48;;;;14814:6;14793:18;;;;:27;;;-1:-1:-1;;;;;14848:44:0;;14905:19;;:38;;;;-1:-1:-1;14928:15:0;;;14905:38;14901:17776;;;-1:-1:-1;;;;14952:3:0;-1:-1:-1;14945:10:0;;-1:-1:-1;;14945:10:0;14901:17776;14983:5;14971:9;:17;14967:17710;;;15004:9;:45;;-1:-1:-1;;;15004:45:0;;;550:34;15004:45;14997:52;;;;;;;14967:17710;15077:5;15065:9;:17;15061:17616;;;-1:-1:-1;;;;15091:41:0;-1:-1:-1;15091:41:0;;-1:-1:-1;;15091:41:0;15061:17616;15157:14;15153:92;;15185:1;15173:13;;15153:92;;;-1:-1:-1;;;15200:45:0;15153:92;15272:5;15260:9;:17;15256:142;;;-1:-1:-1;;15303:17:0;;15288:32;15256:142;;;15350:5;15338:9;:17;15334:64;;;15381:5;:17;;;15366:32;15334:64;15413:9;:64;;;;;-1:-1:-1;;;15426:10:0;:51;15413:64;15409:99;;;-1:-1:-1;550:34:0;;-1:-1:-1;15488:20:0;;-1:-1:-1;;15488:20:0;15409:99;15524:9;15523:10;:65;;;;;15550:38;15537:10;:51;15523:65;15519:104;;;-1:-1:-1;;;;15606:17:0;-1:-1:-1;15599:24:0;;-1:-1:-1;;15599:24:0;15519:104;-1:-1:-1;;;;;15685:48:0;;;15673:3;15659:17;15746:9;:28;;;;-1:-1:-1;15759:15:0;;;15746:28;15742:109;;;15800:11;;;15840:1;15822:19;15742:109;-1:-1:-1;;;15934:47:0;;;:51;15930:135;;16023:35;16005:53;16062:3;16005:60;15930:135;-1:-1:-1;;;16078:47:0;;:51;16074:135;;16167:35;16149:53;16206:3;16149:60;16074:135;-1:-1:-1;;;16222:47:0;;:51;16218:135;;16311:35;16293:53;16350:3;16293:60;16218:135;-1:-1:-1;;;16366:47:0;;:51;16362:135;;16455:35;16437:53;16494:3;16437:60;16362:135;-1:-1:-1;;;16510:46:0;;:50;16506:134;;16598:35;16580:53;16637:3;16580:60;16506:134;-1:-1:-1;;;16653:46:0;;:50;16649:134;;16741:35;16723:53;16780:3;16723:60;16649:134;-1:-1:-1;;;16796:46:0;;:50;16792:134;;16884:35;16866:53;16923:3;16866:60;16792:134;-1:-1:-1;;;16939:46:0;;:50;16935:134;;17027:35;17009:53;17066:3;17009:60;16935:134;-1:-1:-1;;;17082:45:0;;:49;17078:133;;17169:35;17151:53;17208:3;17151:60;17078:133;-1:-1:-1;;;17224:45:0;;:49;17220:133;;17311:35;17293:53;17350:3;17293:60;17220:133;-1:-1:-1;;;17366:45:0;;:49;17362:133;;17453:35;17435:53;17492:3;17435:60;17362:133;-1:-1:-1;;;17508:45:0;;:49;17504:133;;17595:35;17577:53;17634:3;17577:60;17504:133;-1:-1:-1;;;17650:44:0;;:48;17646:132;;17736:35;17718:53;17775:3;17718:60;17646:132;-1:-1:-1;;;17791:44:0;;:48;17787:132;;17877:35;17859:53;17916:3;17859:60;17787:132;-1:-1:-1;;;17932:44:0;;:48;17928:132;;18018:35;18000:53;18057:3;18000:60;17928:132;-1:-1:-1;;;18073:44:0;;:48;18069:132;;18159:35;18141:53;18198:3;18141:60;18069:132;-1:-1:-1;;;18214:43:0;;:47;18210:131;;18299:35;18281:53;18338:3;18281:60;18210:131;-1:-1:-1;;;18354:43:0;;:47;18350:131;;18439:35;18421:53;18478:3;18421:60;18350:131;-1:-1:-1;;;18494:43:0;;:47;18490:131;;18579:35;18561:53;18618:3;18561:60;18490:131;-1:-1:-1;;;18634:43:0;;:47;18630:131;;18719:35;18701:53;18758:3;18701:60;18630:131;-1:-1:-1;;;18774:42:0;;:46;18770:130;;18858:35;18840:53;18897:3;18840:60;18770:130;-1:-1:-1;;;18913:42:0;;:46;18909:130;;18997:35;18979:53;19036:3;18979:60;18909:130;-1:-1:-1;;;19052:42:0;;:46;19048:130;;19136:35;19118:53;19175:3;19118:60;19048:130;-1:-1:-1;;;19191:42:0;;:46;19187:130;;19275:35;19257:53;19314:3;19257:60;19187:130;-1:-1:-1;;;19330:41:0;;:45;19326:129;;19413:35;19395:53;19452:3;19395:60;19326:129;-1:-1:-1;;;19468:41:0;;:45;19464:129;;19551:35;19533:53;19590:3;19533:60;19464:129;-1:-1:-1;;;19606:41:0;;:45;19602:129;;19689:35;19671:53;19728:3;19671:60;19602:129;-1:-1:-1;;;19744:41:0;;:45;19740:129;;19827:35;19809:53;19866:3;19809:60;19740:129;-1:-1:-1;;;19882:40:0;;:44;19878:128;;19964:35;19946:53;20003:3;19946:60;19878:128;-1:-1:-1;;;20019:40:0;;:44;20015:128;;20101:35;20083:53;20140:3;20083:60;20015:128;-1:-1:-1;;;20156:40:0;;:44;20152:128;;20238:35;20220:53;20277:3;20220:60;20152:128;-1:-1:-1;;;20293:40:0;;:44;20289:128;;20375:35;20357:53;20414:3;20357:60;20289:128;-1:-1:-1;;;20430:39:0;;:43;20426:127;;20511:35;20493:53;20550:3;20493:60;20426:127;-1:-1:-1;;;20566:39:0;;:43;20562:127;;20647:35;20629:53;20686:3;20629:60;20562:127;-1:-1:-1;;;20702:39:0;;:43;20698:127;;20783:35;20765:53;20822:3;20765:60;20698:127;-1:-1:-1;;;20838:39:0;;:43;20834:127;;20919:35;20901:53;20958:3;20901:60;20834:127;-1:-1:-1;;;20974:38:0;;:42;20970:126;;21054:35;21036:53;21093:3;21036:60;20970:126;-1:-1:-1;;;21109:38:0;;:42;21105:126;;21189:35;21171:53;21228:3;21171:60;21105:126;-1:-1:-1;;;21244:38:0;;:42;21240:126;;21324:35;21306:53;21363:3;21306:60;21240:126;-1:-1:-1;;;21379:38:0;;:42;21375:126;;21459:35;21441:53;21498:3;21441:60;21375:126;-1:-1:-1;;;21514:37:0;;:41;21510:125;;21593:35;21575:53;21632:3;21575:60;21510:125;-1:-1:-1;;;21648:37:0;;:41;21644:125;;21727:35;21709:53;21766:3;21709:60;21644:125;-1:-1:-1;;;21782:37:0;;:41;21778:125;;21861:35;21843:53;21900:3;21843:60;21778:125;-1:-1:-1;;;21916:37:0;;:41;21912:125;;21995:35;21977:53;22034:3;21977:60;21912:125;-1:-1:-1;;;22050:36:0;;:40;22046:124;;22128:35;22110:53;22167:3;22110:60;22046:124;-1:-1:-1;;;22183:36:0;;:40;22179:124;;22261:35;22243:53;22300:3;22243:60;22179:124;-1:-1:-1;;;22316:36:0;;:40;22312:124;;22394:35;22376:53;22433:3;22376:60;22312:124;-1:-1:-1;;;22449:36:0;;:40;22445:124;;22527:35;22509:53;22566:3;22509:60;22445:124;22595:22;22582:35;;:39;22578:123;;22659:35;22641:53;22698:3;22641:60;22578:123;22727:22;22714:35;;:39;22710:123;;22791:35;22773:53;22830:3;22773:60;22710:123;22859:22;22846:35;;:39;22842:123;;22923:35;22905:53;22962:3;22905:60;22842:123;22991:22;22978:35;;:39;22974:123;;23055:35;23037:53;23094:3;23037:60;22974:123;23123:21;23110:34;;:38;23106:122;;23186:35;23168:53;23225:3;23168:60;23106:122;23254:21;23241:34;;:38;23237:122;;23317:35;23299:53;23356:3;23299:60;23237:122;23385:21;23372:34;;:38;23368:122;;23448:35;23430:53;23487:3;23430:60;23368:122;23516:21;23503:34;;:38;23499:122;;23579:35;23561:53;23618:3;23561:60;23499:122;23647:20;23634:33;;:37;23630:121;;23709:35;23691:53;23748:3;23691:60;23630:121;23777:20;23764:33;;:37;23760:121;;23839:35;23821:53;23878:3;23821:60;23760:121;23907:20;23894:33;;:37;23890:121;;23969:35;23951:53;24008:3;23951:60;23890:121;24037:20;24024:33;;:37;24020:121;;24099:35;24081:53;24138:3;24081:60;24020:121;24167:19;24154:32;;:36;24150:120;;24228:35;24210:53;24267:3;24210:60;24150:120;24296:19;24283:32;;:36;24279:120;;24357:35;24339:53;24396:3;24339:60;24279:120;24425:19;24412:32;;:36;24408:120;;24486:35;24468:53;24525:3;24468:60;24408:120;-1:-1:-1;;;24541:32:0;;:36;24537:120;;24615:35;24597:53;24654:3;24597:60;24537:120;24683:18;24670:31;;:35;24666:119;;24743:35;24725:53;24782:3;24725:60;24666:119;24811:18;24798:31;;:35;24794:119;;24871:35;24853:53;24910:3;24853:60;24794:119;24939:18;24926:31;;:35;24922:119;;24999:35;24981:53;25038:3;24981:60;24922:119;25067:18;25054:31;;:35;25050:119;;25127:35;25109:53;25166:3;25109:60;25050:119;25195:17;25182:30;;:34;25178:118;;25254:35;25236:53;25293:3;25236:60;25178:118;25322:17;25309:30;;:34;25305:118;;25381:35;25363:53;25420:3;25363:60;25305:118;25449:17;25436:30;;:34;25432:118;;25508:35;25490:53;25547:3;25490:60;25432:118;25576:17;25563:30;;:34;25559:118;;25635:35;25617:53;25674:3;25617:60;25559:118;25703:16;25690:29;;:33;25686:117;;25761:35;25743:53;25800:3;25743:60;25686:117;25829:16;25816:29;;:33;25812:117;;25887:35;25869:53;25926:3;25869:60;25812:117;25955:16;25942:29;;:33;25938:117;;26013:35;25995:53;26052:3;25995:60;25938:117;26081:16;26068:29;;:33;26064:117;;26139:35;26121:53;26178:3;26121:60;26064:117;26207:15;26194:28;;:32;26190:116;;26264:35;26246:53;26303:3;26246:60;26190:116;26332:15;26319:28;;:32;26315:116;;26389:35;26371:53;26428:3;26371:60;26315:116;26457:15;26444:28;;:32;26440:116;;26514:35;26496:53;26553:3;26496:60;26440:116;26582:15;26569:28;;:32;26565:116;;26639:35;26621:53;26678:3;26621:60;26565:116;26707:14;26694:27;;:31;26690:115;;26763:35;26745:53;26802:3;26745:60;26690:115;26831:14;26818:27;;:31;26814:115;;26887:35;26869:53;26926:3;26869:60;26814:115;26955:14;26942:27;;:31;26938:115;;27011:35;26993:53;27050:3;26993:60;26938:115;27079:14;27066:27;;:31;27062:115;;27135:35;27117:53;27174:3;27117:60;27062:115;27203:13;27190:26;;:30;27186:114;;27258:35;27240:53;27297:3;27240:60;27186:114;27326:13;27313:26;;:30;27309:114;;27381:35;27363:53;27420:3;27363:60;27309:114;27449:13;27436:26;;:30;27432:114;;27504:35;27486:53;27543:3;27486:60;27432:114;27572:13;27559:26;;:30;27555:114;;27627:35;27609:53;27666:3;27609:60;27555:114;27695:12;27682:25;;:29;27678:113;;27749:35;27731:53;27788:3;27731:60;27678:113;27817:12;27804:25;;:29;27800:113;;27871:35;27853:53;27910:3;27853:60;27800:113;27939:12;27926:25;;:29;27922:113;;27993:35;27975:53;28032:3;27975:60;27922:113;28061:12;28048:25;;:29;28044:113;;28115:35;28097:53;28154:3;28097:60;28044:113;28183:11;28170:24;;:28;28166:112;;28236:35;28218:53;28275:3;28218:60;28166:112;28304:11;28291:24;;:28;28287:112;;28357:35;28339:53;28396:3;28339:60;28287:112;28425:11;28412:24;;:28;28408:112;;28478:35;28460:53;28517:3;28460:60;28408:112;28546:11;28533:24;;:28;28529:112;;28599:35;28581:53;28638:3;28581:60;28529:112;28667:10;28654:23;;:27;28650:111;;28719:35;28701:53;28758:3;28701:60;28650:111;28787:10;28774:23;;:27;28770:111;;28839:35;28821:53;28878:3;28821:60;28770:111;28907:10;28894:23;;:27;28890:111;;28959:35;28941:53;28998:3;28941:60;28890:111;29027:10;29014:23;;:27;29010:111;;29079:35;29061:53;29118:3;29061:60;29010:111;29147:9;29134:22;;:26;29130:110;;29198:35;29180:53;29237:3;29180:60;29130:110;29266:9;29253:22;;:26;29249:110;;29317:35;29299:53;29356:3;29299:60;29249:110;29385:9;29372:22;;:26;29368:110;;29436:35;29418:53;29475:3;29418:60;29368:110;29504:9;29491:22;;:26;29487:110;;29555:35;29537:53;29594:3;29537:60;29487:110;29623:8;29610:21;;:25;29606:109;;29673:35;29655:53;29712:3;29655:60;29606:109;29741:8;29728:21;;:25;29724:109;;29791:35;29773:53;29830:3;29773:60;29724:109;29859:8;29846:21;;:25;29842:109;;29909:35;29891:53;29948:3;29891:60;29842:109;29977:8;29964:21;;:25;29960:109;;30027:35;30009:53;30066:3;30009:60;29960:109;30095:7;30082:20;;:24;30078:108;;30144:35;30126:53;30183:3;30126:60;30078:108;30212:7;30199:20;;:24;30195:108;;30261:35;30243:53;30300:3;30243:60;30195:108;30329:7;30316:20;;:24;30312:108;;30378:35;30360:53;30417:3;30360:60;30312:108;30446:7;30433:20;;:24;30429:108;;30495:35;30477:53;30534:3;30477:60;30429:108;30563:6;30550:19;;:23;30546:107;;30611:35;30593:53;30650:3;30593:60;30546:107;30679:6;30666:19;;:23;30662:107;;30727:35;30709:53;30766:3;30709:60;30662:107;30795:6;30782:19;;:23;30778:107;;30843:35;30825:53;30882:3;30825:60;30778:107;30911:6;30898:19;;:23;30894:107;;30959:35;30941:53;30998:3;30941:60;30894:107;31027:5;31014:18;;:22;31010:106;;31074:35;31056:53;31113:3;31056:60;31010:106;31142:5;31129:18;;:22;31125:106;;31189:35;31171:53;31228:3;31171:60;31125:106;31257:5;31244:18;;:22;31240:106;;31304:35;31286:53;31343:3;31286:60;31240:106;31372:5;31359:18;;:22;31355:106;;31419:35;31401:53;31458:3;31401:60;31355:106;31487:4;31474:17;;:21;31470:105;;31533:35;31515:53;31572:3;31515:60;31470:105;31601:4;31588:17;;:21;31584:105;;31647:35;31629:53;31686:3;31629:60;31584:105;31715:4;31702:17;;:21;31698:105;;31761:35;31743:53;31800:3;31743:60;31698:105;31829:4;31816:17;;:21;31812:105;;31875:35;31857:53;31914:3;31857:60;31812:105;31943:3;31930:16;;:20;31926:104;;31988:35;31970:53;32027:3;31970:60;31926:104;32056:3;32043:16;;:20;32039:104;;32101:35;32083:53;32140:3;32083:60;32039:104;32159:9;32154:439;;32218:2;32199:15;:21;;-1:-1:-1;;;;;32199:54:0;32181:72;;32282:6;32264:24;;;;32154:439;;;32326:6;32308:14;:24;32304:289;;32382:2;32363:15;:21;;-1:-1:-1;;;;;32363:54:0;32345:72;;32454:14;32445:6;:23;32428:40;;32304:289;;;32582:1;;-1:-1:-1;;32532:22:0;32513:41;32304:289;32646:3;32628:21;;;;:39;32610:59;;;-1:-1:-1;32603:66:0;;-1:-1:-1;;;32603:66:0

Swarm Source

ipfs://45daa4d44a33f148449c5c13b1a748ef4b68f2ae3cfc5851138e685181ba5ccb
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.