Contract 0xf57fcAB4E5B76fc49917f6AC11eac27E222ca111 1

 
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xf14b9f7db788a8e8d47966c1aa243e85e366ca7d318d1ebc3c7e3bed86f922a7Transfer119969182021-10-22 15:57:3039 mins agoProject DogeX: Deployer IN  Project DogeX: $DOGEX Token0 BNB0.000695365
0x59620fae93bb0d11fb2f8411e2b04752d0f554db78c29d6e6f9f9a81514a512eTransfer119968962021-10-22 15:56:2440 mins agoProject DogeX: Deployer IN  Project DogeX: $DOGEX Token0 BNB0.000695365
0x127e7474d6975efccb90f83070b470dac81f78dd43f2c3cadb3ef63c1db8ac43Transfer119968942021-10-22 15:56:1840 mins agoProject DogeX: Deployer IN  Project DogeX: $DOGEX Token0 BNB0.000695365
0xee858c9edab935581e713d4e1dffb8dabd71d775fc8f1030cfe2e57338d104c6Transfer119968722021-10-22 15:55:1241 mins agoProject DogeX: Deployer IN  Project DogeX: $DOGEX Token0 BNB0.000695425
0xa1e0c09e29584661064caf9a1b08cdfe2172b57c5d098071f99477cff5fef610Transfer119968502021-10-22 15:54:0642 mins agoProject DogeX: Deployer IN  Project DogeX: $DOGEX Token0 BNB0.000695365
0xb46f2c09d6d6914eb8e61c74564f0a834f3ec358e735ee2e45842efe9a6925e0Transfer119968282021-10-22 15:53:0043 mins agoProject DogeX: Deployer IN  Project DogeX: $DOGEX Token0 BNB0.000695365
0xe030b54b16c36415c3a0d93bd4850ea7e40629462feabf8b8e283c12a031d67dTransfer119968062021-10-22 15:51:5445 mins agoProject DogeX: Deployer IN  Project DogeX: $DOGEX Token0 BNB0.000695365
0x0ec6b77e6f4fb6e8403cdc231ea1ef675daf6f9be042669070c8529a60eb5c04Transfer119956352021-10-22 14:53:111 hr 43 mins agoProject DogeX: Deployer IN  Project DogeX: $DOGEX Token0 BNB0.000620365
0x12c0765cbfc11b37960c2e7993fdd48e51ed87dc4a7dc6eef4a60f8d5ef15798Transfer119956092021-10-22 14:51:531 hr 45 mins agoProject DogeX: Deployer IN  Project DogeX: $DOGEX Token0 BNB0.000620365
0xf15a9727cbd9378049b7c3262b106777d448d2d56a3a371c70b67ed84e9e310cTransfer119955882021-10-22 14:50:501 hr 46 mins ago0x69cc2480f25d69bc28a4ece7729ad9b38b4dbe04 IN  Project DogeX: $DOGEX Token0 BNB0.00062906
0x83baf1d8490c73a6496b26e701d42aca90ea687b5adbd307a912780799a6c3e2Approve119946832021-10-22 14:05:302 hrs 31 mins ago0xd387f30ae2f98508dd0f820a2a639bb0b10beb58 IN  Project DogeX: $DOGEX Token0 BNB0.000072915
0x03fa18de7dc2fb495939dae3cede3ed3c0eecfb5f49df0435f1ef76aba4c59b2Approve119887712021-10-22 9:07:527 hrs 29 mins ago0x5b23a5ee5005e25ddffbbd6eddd8a0c4310c1852 IN  Project DogeX: $DOGEX Token0 BNB0.0000743733
0x4320b37d6f8456348ce12b0a2e259c8a402e959ff846efa071326f56587579b8Transfer119857992021-10-22 6:32:5110 hrs 4 mins ago0x84cacf730bae6bcfac549ec014cf0ad28cca8871 IN  Project DogeX: $DOGEX Token0 BNB0.0003047352
0x3a9894afe709a265e14f12f84152b59c6724795f7e6265651171fcbae3e79c1eApprove119855612021-10-22 6:20:5710 hrs 15 mins ago0x0dc9ef2dfd94e6cc5a727d190ac966aafde78f12 IN  Project DogeX: $DOGEX Token0 BNB0.000311843
0x286e33b3990ce782cbc4fb4c1eee7f43a4c8b584c47a19b2bf824c92fd8a1de5Approve119842062021-10-22 5:04:0511 hrs 32 mins ago0xce013682eddefaca8c94fe56a43a04212ebe4673 IN  Project DogeX: $DOGEX Token0 BNB0.000072915
0x66db667362baeac24752a56634d3776068b38012f87e764e66c66b37196136c5Approve119832062021-10-22 4:10:1812 hrs 26 mins ago0xeeee9e0e479b6adce1d323fbc366c8bc470bfecf IN  Project DogeX: $DOGEX Token0 BNB0.000072915
0x1b4cae0a2eae4b2bb89a638a3fca7f7777657d41989fd82eac2ad8c6ffaf4268Approve119810702021-10-22 2:19:4814 hrs 17 mins ago0xeb3fc48e089ad75c397eee959b2f4c4cd337540b IN  Project DogeX: $DOGEX Token0 BNB0.000222745
0x494e8e87aa7cfed014e9268b4f244ce6dab0613ae45ad9c8eca64828809e317bApprove119797152021-10-22 1:10:5215 hrs 26 mins ago0x36c52ce7b1fd595de2b431794fefbf5d8b3ec55a IN  Project DogeX: $DOGEX Token0 BNB0.000222745
0x548e5bf076b33921170ba4f838e29c3a71e0682f9372e3a6cbafe01c7612b70bApprove119795962021-10-22 1:04:1515 hrs 32 mins ago0xa8874dc1e638d0bafb72ac03729356df612ee45a IN  Project DogeX: $DOGEX Token0 BNB0.000222745
0x1e41a49bdaaea1d8e9a2e8e447c47fa159871a2e715b2d9f75764da9c39dd8c3Approve119785502021-10-22 0:09:5416 hrs 27 mins ago0x50966feacb97bb4f9da8d66804e12107cd16d552 IN  Project DogeX: $DOGEX Token0 BNB0.000311843
0xe20c918412c4023ada1ecd54fb778d408eb660c7766d263fcaeee796e34a896fApprove119773552021-10-21 23:10:0117 hrs 26 mins ago0x650026dae569363afdd3390785594ef0db87f337 IN  Project DogeX: $DOGEX Token0 BNB0.0002271999
0xe792dfb7d494d6e594bbc2f5308da7e7626edf1c724650bdb906412974e75f19Approve119738682021-10-21 20:15:3720 hrs 21 mins ago0x04fa2630979572d538749965d0985ff56ee8a595 IN  Project DogeX: $DOGEX Token0 BNB0.000222745
0xf4d5188c2032b034c720773b2ab74e4854e8827884f9f8ddca8ac5fa448b7069Approve119719282021-10-21 18:38:3721 hrs 58 mins ago0x3bb3128709cdd21cd5ae81de8141ebefdd142e28 IN  Project DogeX: $DOGEX Token0 BNB0.000102081
0xc6b628ec6367c8ddb89b3c848f2b0cf4089260a577452e2fccd9f912ad1eecceApprove119719082021-10-21 18:37:3721 hrs 59 mins ago0x336073d3ac307bf4afeedb6be6c7bef486cd254c IN  Project DogeX: $DOGEX Token0 BNB0.000311843
0x31fa924fe171ed1a456272aa744769e76a70b8bb7d4de35780dbc8d783032770Approve119715512021-10-21 18:19:4622 hrs 17 mins ago0x5636d085336211db5efbf8be40e90a6395e9c05d IN  Project DogeX: $DOGEX Token0 BNB0.000222745
[ Download CSV Export 

OVERVIEW

DogeX utilizes trading mechanism that ensures trade chart is always a higher low with extra features such as a Fuel Stop, and Golden Hour. DogeX innovates with a Buyback function.

Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xb8c7231199b1a825c1a33d4985fc484c1a2deaafb589efe6941a47c50e2729e7116086692021-10-09 0:41:4113 days 15 hrs ago Project DogeX: $DOGEX Token0xe01f2d85a7f191acfbd4807c69cfdce5034f8d280.014624670887345763 BNB
0xb8c7231199b1a825c1a33d4985fc484c1a2deaafb589efe6941a47c50e2729e7116086692021-10-09 0:41:4113 days 15 hrs ago Project DogeX: $DOGEX Token0x4765a8f2402e4769adfa7b3e54bb30f5dd7702fd0.087748025324074578 BNB
0xb8c7231199b1a825c1a33d4985fc484c1a2deaafb589efe6941a47c50e2729e7116086692021-10-09 0:41:4113 days 15 hrs ago Project DogeX: $DOGEX Token0xa5347334af09bbc6c2456ab435f54ef8189fa7090.190120721535494919 BNB
0xb8c7231199b1a825c1a33d4985fc484c1a2deaafb589efe6941a47c50e2729e7116086692021-10-09 0:41:4113 days 15 hrs ago PancakeSwap: Router v2 Project DogeX: $DOGEX Token0.292493417746915259 BNB
0xb8c7231199b1a825c1a33d4985fc484c1a2deaafb589efe6941a47c50e2729e7116086692021-10-09 0:41:4113 days 15 hrs ago Project DogeX: $DOGEX Token PancakeSwap: Router v20.073139477918605069 BNB
0xb8c7231199b1a825c1a33d4985fc484c1a2deaafb589efe6941a47c50e2729e7116086692021-10-09 0:41:4113 days 15 hrs ago PancakeSwap: Router v2 Project DogeX: $DOGEX Token0.073139477918605069 BNB
0x9f8b3169d1ad44c276875be5f38ea64e8ef26dfdb735e40411e72537a5e9396a116086562021-10-09 0:41:0213 days 15 hrs ago Project DogeX: $DOGEX Token0xe01f2d85a7f191acfbd4807c69cfdce5034f8d280.014624670887345763 BNB
0x9f8b3169d1ad44c276875be5f38ea64e8ef26dfdb735e40411e72537a5e9396a116086562021-10-09 0:41:0213 days 15 hrs ago Project DogeX: $DOGEX Token0x4765a8f2402e4769adfa7b3e54bb30f5dd7702fd0.087748025324074578 BNB
0x9f8b3169d1ad44c276875be5f38ea64e8ef26dfdb735e40411e72537a5e9396a116086562021-10-09 0:41:0213 days 15 hrs ago Project DogeX: $DOGEX Token0xa5347334af09bbc6c2456ab435f54ef8189fa7090.190120721535494919 BNB
0x9f8b3169d1ad44c276875be5f38ea64e8ef26dfdb735e40411e72537a5e9396a116086562021-10-09 0:41:0213 days 15 hrs ago PancakeSwap: Router v2 Project DogeX: $DOGEX Token0.292493417746915259 BNB
0x9f8b3169d1ad44c276875be5f38ea64e8ef26dfdb735e40411e72537a5e9396a116086562021-10-09 0:41:0213 days 15 hrs ago Project DogeX: $DOGEX Token PancakeSwap: Router v20.073139477918605069 BNB
0x9f8b3169d1ad44c276875be5f38ea64e8ef26dfdb735e40411e72537a5e9396a116086562021-10-09 0:41:0213 days 15 hrs ago PancakeSwap: Router v2 Project DogeX: $DOGEX Token0.073139477918605069 BNB
0x6a0d23504bc7b73962623df3fb86fb181938c2f28d4465c52821c9d80663c629116086482021-10-09 0:40:3813 days 15 hrs ago Project DogeX: $DOGEX Token0xe01f2d85a7f191acfbd4807c69cfdce5034f8d280.002410304435682385 BNB
0x6a0d23504bc7b73962623df3fb86fb181938c2f28d4465c52821c9d80663c629116086482021-10-09 0:40:3813 days 15 hrs ago Project DogeX: $DOGEX Token0x4765a8f2402e4769adfa7b3e54bb30f5dd7702fd0.014461826614094312 BNB
0x6a0d23504bc7b73962623df3fb86fb181938c2f28d4465c52821c9d80663c629116086482021-10-09 0:40:3813 days 15 hrs ago Project DogeX: $DOGEX Token0xa5347334af09bbc6c2456ab435f54ef8189fa7090.031333957663871009 BNB
0x6a0d23504bc7b73962623df3fb86fb181938c2f28d4465c52821c9d80663c629116086482021-10-09 0:40:3813 days 15 hrs ago PancakeSwap: Router v2 Project DogeX: $DOGEX Token0.048206088713647707 BNB
0x6a0d23504bc7b73962623df3fb86fb181938c2f28d4465c52821c9d80663c629116086482021-10-09 0:40:3813 days 15 hrs ago Project DogeX: $DOGEX Token PancakeSwap: Router v20.012051959899698895 BNB
0x6a0d23504bc7b73962623df3fb86fb181938c2f28d4465c52821c9d80663c629116086482021-10-09 0:40:3813 days 15 hrs ago PancakeSwap: Router v2 Project DogeX: $DOGEX Token0.012051959899698895 BNB
0x8493f5cf735941ca10a72f4412bb05c27477cfddbfaea9427a9e16f4967076c1116086452021-10-09 0:40:2913 days 15 hrs ago Project DogeX: $DOGEX Token0xe01f2d85a7f191acfbd4807c69cfdce5034f8d280.011294845078079371 BNB
0x8493f5cf735941ca10a72f4412bb05c27477cfddbfaea9427a9e16f4967076c1116086452021-10-09 0:40:2913 days 15 hrs ago Project DogeX: $DOGEX Token0x4765a8f2402e4769adfa7b3e54bb30f5dd7702fd0.067769070468476226 BNB
0x8493f5cf735941ca10a72f4412bb05c27477cfddbfaea9427a9e16f4967076c1116086452021-10-09 0:40:2913 days 15 hrs ago Project DogeX: $DOGEX Token0xa5347334af09bbc6c2456ab435f54ef8189fa7090.146832986015031823 BNB
0x8493f5cf735941ca10a72f4412bb05c27477cfddbfaea9427a9e16f4967076c1116086452021-10-09 0:40:2913 days 15 hrs ago PancakeSwap: Router v2 Project DogeX: $DOGEX Token0.225896901561587418 BNB
0x8493f5cf735941ca10a72f4412bb05c27477cfddbfaea9427a9e16f4967076c1116086452021-10-09 0:40:2913 days 15 hrs ago Project DogeX: $DOGEX Token PancakeSwap: Router v20.056483836936999971 BNB
0x8493f5cf735941ca10a72f4412bb05c27477cfddbfaea9427a9e16f4967076c1116086452021-10-09 0:40:2913 days 15 hrs ago PancakeSwap: Router v2 Project DogeX: $DOGEX Token0.056483836936999971 BNB
0x85451fd6c7799311e5fa2ec16a8ce4f47e9095849da7ecaacdd12835031378b6116086422021-10-09 0:40:2013 days 15 hrs ago Project DogeX: $DOGEX Token0xe01f2d85a7f191acfbd4807c69cfdce5034f8d280.014640642911695575 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DOGEX

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2021-09-22
*/

/*
                                 ,╓▄▄#▒▒▒▒▒▒▒▒▒▄▄╓,
                            ,▄▒▓▀╙Γ              ^╙▀█▒▄╖
                         ▄▓▀╙                          ╙▀▓▄
                      ╔▓▀Γ      µ═┘ΓΓΓ¬       ¬Γ""≈▄      ^▀▓▄
                    ▄▓▀     ╓┴Γ    ,╓«═≈ⁿ──*≈═w╖,    └²╦     ╙▓▒
                  ▄▓▀    ╓┘¬  a┴▐▄æMΦΓΓΓΓΓΓΓΓΓΓτ¥w▄Σ*w,  "▄    ╙▓▄
                 ▓▀    ╓▀ ,ª▄#Φ▀\         ''       ▄▓▀W▄*╥ ╙▄    ▀▓⌐
               ╒▓▀    # ▄▓#▓▀     `, ,µ▄▄▄▄▄▄▄µ '▄▀░░^ ░Γ▓▓¼ ▀    ╙▓▄
              ╒▓Γ    ▓▄▓█Γ']      ░⌠⌡Γ░░░░░░░░░░⌡░░    ]░▓ ▀▓▄▀    └▓▄
              ▓▌    ╫▓▓Γ ' ] ,  ░░░░░░░░░░░░░░░░░░░░░≥ ░░▓'  ▀▓▓    ╙▓⌐
             ╫▓   Æ^▓▓      ▌░░░░░░░░░░░░░░░░░░░░░░░░░░░j▓    ▀▓"W   ▀▓
             ▓Γ  ▌ j▓      ╓▌░░░░░░░░░░░░░░░░░░░░░░░░░░░Γ▀⌐  ' ▓Γ ╟   ▓⌐
            ▐▓   ╟ ▐▌    '▄▀░░░░░░░ `░░░░░░░░░░"`"░░░░░░░ ╚    ^▌ ╠   ▓▌
            ▐▓   ▐ ▐∩    ▓▀░░░░░░░░░;≤░░░░░░░░░;≤░░░░░░░░░,╠∩  j▌ ▌   ▓▌
            ▐▓   j⌐ ▓   ▐▌░░░░░░░░╫▓,▓░░░░░░░░¼▓▓▀░░░░░░░░░▐▌  ╫⌐ ▌   ▓▌
             ▓∩   Θ ▓▌  ╫▌░     ░░⌠▀▀░░░░░"░░░░░░⌡░░░    └░▐▌ ]▓░▄    ▓Γ
             ▓▌     ^▓▄  ▓µ░            ▓▓▓▓▓∩           ;╓▓'.▓Γ     ╟▓
             └▓µ      ▓▄, ▀▄░         ╓,,▓▓▓╓,▄        .░▄▀ ▄▓Γ      ▓Γ
              ▐▓       ▀▓▀█▓▓▄▄        *.█╫▒Γ*       ,▄▓▓█▀▓▓`      ▓▌
               ▀▓       '▀▄,  ^▀▀▀▀▀▀██████████▀▀▀▀▀▀Γ' ,▄▀Γ       ▓▀
                ╙▓▄      ÆΓ¬▀▀▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▀▀Γ ¼      ╓▓▀
                  ▀▓     ░▄▌ ╙▄ ▀ÆÆæææææææææææææææÆ╝^▄▀,▓▄'∩    ╣▓`
                   "▓▒  ▄▀▀▓▓µ ▀           ~.       ╩ ▄▓▓▀▀▌  #▓Γ
                     ^▀▓▄   ▀▓▄ ▀   ⌐Γ ⌐Γ~⌐── ,#▒, ▌ ╣▓▀   ▄▓▀Γ
                        ╙▀▒▄ ╙▓▌ ▀                ▓ ╣▓▌ ╓▒▓▀
                           "▀▓▓▓▄ ▌              ▐,▐▓▓▓▀Γ
                                ╙▀▀▀█▒▒@▄▄▄▄@▒▒█▀▀▀^

                                                `"ⁿ=≥╦,
                                                       `"╚╬╦╦╖,
                                                             "╙╬╬▒╦╖             ,,,,,,
         ╓╦╦╦╦╓╓,       ╓╦╦╦╦╦╦╦╦╓     ,╓╦╓╓╓╦╦╓,     ╦╦╦╦╦╦╦╦╕   ╙╝╬╬▒╦╖     ╓▒▓╬╬╬▓╩
                 ╙▒     ╬⌐       ╬⌐    ╬Γ       ▀                     ╙▒╬╬▓▒╖"▀▒╬▓╩
                  ╫▌    ╬⌐       ╬⌐    ╬Γ   ╦╦╦╦╦     ######            ,"▀▓▓▓▓▄,
                 ,▓Γ    ╬⌐       ╬⌐    ╬Γ       ╬⌐                   ╓▒▓╬▒╦ ╙▀▓▓▓▓▒,
         ╚╝╝╝╝╝╝╨╙      ╙▀╝╝╝╝╝╝╝▀     ╙▀╝╝╝╝╝╝╝╜     ╝╝╝╝╝╝╝╝╩   ╔▒╬╬╬╬▓╩     ▀▓▓▓▓▓▄
                                                                ╝▀▀▀▀▀╜          ╙▀▀▀▀▀Φ

Buy tax: 14%
5% Buyback
2.5% Marketing
3% LP
2% Reflections
1% Development team
0.5% Project Maintenance

Sell Tax: 17%
6.5% Buyback
3% Marketing
4% LP
2% Reflections
1% Development team
0.5% Project Maintenance

☀️Golden Hour & Below Floor Taxes

Hour 1 (& below floor): 40%
20.5% Buyback
7% marketing
5% LP
4% Reflections
3% Development team
0.5% Project Maintenance

Hour 2: 24%
12.5% Buyback
5% Marketing
3% LP
2% Reflections
1% Development team
0.5% Project Maintenance

Smart contract developed by Alex $Saint
Reach on telegram: @Alex_Saint_Dev
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

interface AggregatorV3Interface {

  function decimals()
    external
    view
    returns (
      uint8
    );

  function description()
    external
    view
    returns (
      string memory
    );

  function version()
    external
    view
    returns (
      uint256
    );

  // getRoundData and latestRoundData should both raise "No data present"
  // if they do not have data to report, instead of returning unset values
  // which could be misinterpreted as actual reported values.
  function getRoundData(
    uint80 _roundId
  )
    external
    view
    returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    );

  function latestRoundData()
    external
    view
    returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    );

}

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }
}

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

library 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;
    }
}

contract Ownable is Context {
    address private _owner;
    address private _previousOwner;
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    constructor() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    function owner() public view returns (address) {
        return _owner;
    }

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

    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }
}

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

interface IUniswapV2Factory {
    function createPair(address tokenA, address tokenB) external returns (address pair);
}

interface IUniswapV2Router02 {
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity);
    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

abstract contract IERC20Extented is IERC20 {
    function decimals() external view virtual returns (uint8);
    function name() external view virtual returns (string memory);
    function symbol() external view virtual returns (string memory);
}

contract DOGEX is Context, IERC20, IERC20Extented, Ownable {
    using SafeMath for uint256;
    string private constant _name = "Project DogeX";
    string private constant _symbol = "$DOGEX";
    uint8 private constant _decimals = 9;
    mapping(address => uint256) private _rOwned;
    mapping(address => uint256) private _tOwned;
    mapping(address => uint256) private sellcooldown;
    mapping(address => uint256) private _sellTotal;
    mapping(address => uint256) private _firstSell;
    mapping(address => mapping(address => uint256)) private _allowances;
    mapping(address => bool) private _isExcludedFromFee;
    mapping(address => bool) private _isContractWallet; // exclude contract wallets maxWalletAmount
    mapping(address => bool) private _isExchange; // used for whitelisting exchange hot wallets
    mapping(address => bool) private _isBridge; //used for whitelisting bridges
    uint256 private constant MAX = ~uint256(0);
    uint256 private constant _tTotal = 1000000000000000 * 10**9;
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;
    uint256 public _priceImpact = 2;
    uint256 private previousClose;
    uint256 private _firstBlock;
    uint256 private _botBlocks;
    uint256 public _maxWalletAmount;
    uint256 private _maxSellAmountBNB = 20000000000000000000; // 20 BNB
    uint256 private _minBuyBNB = 10000000000000000; // 0.01 BNB
    uint256 private _minSellBNB = 10000000000000000; // 0.01 BNB
    uint256 private _taxFreeBlocks = 3600; // 1 hour
    uint256 private _cooldownBlocks = 3600; // 1 hour
    uint256 private _taxFreeWindowEnd; // block.timestamp + _taxFreeBlocks
    uint256 public _goldenHourStartBlock = 0;
    bool public _goldenHourStarted = false;
    uint256 private _slideEndBlock = 0;
    bool public _recovered = true;
    uint256 private _threshold = 10;
    uint256 private _floorPercent;
    uint256 private _ath = 0;
    
    uint256 public _floorBuybackFee = 21;
    uint256 public _floorMarketingFee = 7;
    uint256 public _floorLiquidityFee = 5;
    uint256 public _floorReflectionFee = 4;
    uint256 public _floorDevFee = 3;

    uint256 public _slideBuybackFee = 13;
    uint256 public _slideMarketingFee = 5;
    uint256 public _slideLiquidityFee = 3;
    uint256 public _slideReflectionFee = 2;
    uint256 public _slideDevFee = 1;

    //  buy fees
    uint256 public _buyBuybackFee = 5;
    uint256 private _previousBuyBuybackFee = _buyBuybackFee;
    uint256 public _buyMarketingFee = 3;
    uint256 private _previousBuyMarketingFee = _buyMarketingFee;
    uint256 public _buyReflectionFee = 2;
    uint256 private _previousBuyReflectionFee = _buyReflectionFee;
    uint256 public _buyLiquidityFee = 3;
    uint256 private _previousBuyLiquidityFee = _buyLiquidityFee;
    uint256 public _buyDevFee = 1;
    uint256 private _previousBuyDevFee = _buyDevFee;
    
    // sell fees
    uint256 public _sellBuybackFee = 7;
    uint256 private _previousSellBuybackFee = _sellBuybackFee;
    uint256 public _sellMarketingFee = 3;
    uint256 private _previousSellMarketingFee = _sellMarketingFee;
    uint256 public _sellReflectionFee = 2;
    uint256 private _previousSellReflectionFee = _sellReflectionFee;
    uint256 public _sellLiquidityFee = 4;
    uint256 private _previousSellLiquidityFee = _sellLiquidityFee;
    uint256 public _sellDevFee = 1;
    uint256 private _previousSellDevFee = _sellDevFee;
  
    struct DynamicTax {
        uint256 buyBuybackFee;
        uint256 buyMarketingFee;
        uint256 buyReflectionFee;
        uint256 buyLiquidityFee;
        uint256 buyDevFee;
        
        uint256 sellBuybackFee;
        uint256 sellMarketingFee;
        uint256 sellReflectionFee;
        uint256 sellLiquidityFee;
        uint256 sellDevFee;
    }
    
    uint256 constant private _projectMaintainencePercent = 5;
    uint256 private _devPercent = 10;
    uint256 private _marketingPercent = 25;
    uint256 private _buybackPercent = 60;

    struct BuyBreakdown {
        uint256 tTransferAmount;
        uint256 tBuyback;
        uint256 tMarketing;
        uint256 tReflection;
        uint256 tLiquidity;
        uint256 tDev;
    }

    struct SellBreakdown {
        uint256 tTransferAmount;
        uint256 tBuyback;
        uint256 tMarketing;
        uint256 tReflection;
        uint256 tLiquidity;
        uint256 tDev;
    }
    
    struct FinalFees {
        uint256 tTransferAmount;
        uint256 tBuyback;
        uint256 tMarketing;
        uint256 tReflection;
        uint256 tLiquidity;
        uint256 tDev;
        uint256 rReflection;
        uint256 rTransferAmount;
        uint256 rAmount;
    }

    mapping(address => bool) private bots;
    address payable private _marketingAddress = payable(0xA5347334AF09Bbc6C2456AB435F54ef8189FA709);
    address payable private _buybackAddress = payable(0x64Ce548B7fe68E7e23892F1f8Ff600595D74484e);
    address payable constant private _projectMaintainence = payable(0xe01F2d85a7f191aCfBd4807c69CfdcE5034f8D28);
    address payable private _developmentAddress = payable(0x4765a8F2402E4769Adfa7B3E54bb30f5dd7702FD);
    address payable constant private _burnAddress = payable(0x000000000000000000000000000000000000dEaD);
    address private presaleRouter;
    address private presaleAddress;
    IUniswapV2Router02 private uniswapV2Router;
    address public uniswapV2Pair;
    uint256 private _maxTxAmount;

    bool private tradingOpen = false;
    bool private inSwap = false;
    bool private presale = true;
    bool private pairSwapped = false;
    bool private _sellCoolDownEnabled = true;
    bool private _dailyMaxEnabled = true;

    event EndedPresale(bool presale);
    event UpdatedAllowableDip(uint256 hundredMinusDipPercent);
    event UpdatedHighLowWindows(uint256 GTblock, uint256 LTblock, uint256 blockWindow);
    event MaxTxAmountUpdated(uint256 _maxTxAmount);
    event SellOnlyUpdated(bool sellOnly);
    event PercentsUpdated(uint256 _marketingPercent, uint256 _buybackPercent, uint256 _devPercent);
    event FeesUpdated(uint256 _buyBuybackFee, uint256 _buyMarketingFee, uint256 _buyLiquidityFee, uint256 _buyReflectionFee, uint256 _buyDevFee, uint256 _sellBuyBackFee, uint256 _sellMarketingFee, uint256 _sellLiquidityFee, uint256 _sellReflectionFee, uint256 _sellDevFee);
    event PriceImpactUpdated(uint256 _priceImpact);

    AggregatorV3Interface internal priceFeed;
    address public _oraclePriceFeed = 0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE;//rinkeby 0x8A753747A1Fa494EC906cE90E9f37563A8AF630e;// bnb testnet 0x2514895c72f50D8bd4B4F9b1110F0D6bD2c97526;// bnb pricefeed 0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE;
    bool private priceOracleEnabled = true;
    int private manualETHvalue = 3000 * 10**8;

    modifier lockTheSwap {
        inSwap = true;
        _;
        inSwap = false;
    }
    constructor() {
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x10ED43C718714eb63d5aA57B78B54704E256024E);//ropstenn 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); //bsc test 0xD99D1c33F9fC3444f8101754aBC46c52416550D1);//bsc main net 0x10ED43C718714eb63d5aA57B78B54704E256024E);
        uniswapV2Router = _uniswapV2Router;
        _approve(address(this), address(uniswapV2Router), _tTotal);
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());
        IERC20(uniswapV2Pair).approve(address(uniswapV2Router),type(uint256).max);

        priceFeed = AggregatorV3Interface(_oraclePriceFeed);

        previousClose = 0;

        _maxTxAmount = _tTotal; // start off transaction limit at 100% of total supply
        _maxWalletAmount = _tTotal.div(1); // 100%

        _rOwned[_msgSender()] = _rTotal;
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;
        _isExcludedFromFee[_marketingAddress] = true;
        _isExcludedFromFee[_buybackAddress] = true;
        _isContractWallet[_buybackAddress] = true;
        _isContractWallet[_marketingAddress] = true;
        emit Transfer(address(0), _msgSender(), _tTotal);
    }

    function name() override external pure returns (string memory) {
        return _name;
    }

    function symbol() override external pure returns (string memory) {
        return _symbol;
    }

    function decimals() override external pure returns (uint8) {
        return _decimals;
    }

    function totalSupply() external pure override returns (uint256) {
        return _tTotal;
    }

    function balanceOf(address account) public view override returns (uint256) {
        return tokenFromReflection(_rOwned[account]);
    }

    function transfer(address recipient, uint256 amount) external override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(address owner, address spender) external view override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) external override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender,_msgSender(),_allowances[sender][_msgSender()].sub(amount,"ERC20: transfer amount exceeds allowance"));
        return true;
    }

    function tokenFromReflection(uint256 rAmount) private view returns (uint256) {
        require(rAmount <= _rTotal,"Amount must be less than total reflections");
        uint256 currentRate = _getRate();
        return rAmount.div(currentRate);
    }

    function removeAllFee() private {
        if (_buyMarketingFee == 0 && _buyBuybackFee == 0 && _buyReflectionFee == 0 && _buyLiquidityFee == 0 && _buyDevFee == 0 && _sellMarketingFee == 0 && _sellBuybackFee == 0 && _sellReflectionFee == 0 && _sellLiquidityFee == 0 && _sellDevFee == 0) return;
        _previousBuyMarketingFee = _buyMarketingFee;
        _previousBuyBuybackFee = _buyBuybackFee;
        _previousBuyReflectionFee = _buyReflectionFee;
        _previousBuyLiquidityFee = _buyLiquidityFee;
        _previousBuyDevFee = _buyDevFee;

        _previousSellMarketingFee = _sellMarketingFee;
        _previousSellBuybackFee = _sellBuybackFee;
        _previousSellReflectionFee = _sellReflectionFee;
        _previousSellLiquidityFee = _sellLiquidityFee;
        _previousSellDevFee = _sellDevFee;

        _buyMarketingFee = 0;
        _buyBuybackFee = 0;
        _buyReflectionFee = 0;
        _buyLiquidityFee = 0;
        _buyDevFee = 0;

        _sellMarketingFee = 0;
        _sellBuybackFee = 0;
        _sellReflectionFee = 0;
        _sellLiquidityFee = 0;
        _sellDevFee = 0;
    }

    function setBotFee() private {
        _previousBuyMarketingFee = _buyMarketingFee;
        _previousBuyBuybackFee = _buyBuybackFee;
        _previousBuyReflectionFee = _buyReflectionFee;
        _previousBuyDevFee = _buyDevFee;

        _previousSellMarketingFee = _sellMarketingFee;
        _previousSellBuybackFee = _sellBuybackFee;
        _previousSellReflectionFee = _sellReflectionFee;
        _previousSellDevFee = _sellDevFee;

        _buyMarketingFee = 45;
        _buyBuybackFee = 45;
        _buyReflectionFee = 0;
        _buyDevFee = 0;

        _sellMarketingFee = 45;
        _sellBuybackFee = 45;
        _sellReflectionFee = 0;
        _sellDevFee = 0;
    }
    
    function restoreAllFee() private {
        _buyMarketingFee = _previousBuyMarketingFee;
        _buyBuybackFee = _previousBuyBuybackFee;
        _buyReflectionFee = _previousBuyReflectionFee;
        _buyLiquidityFee = _previousBuyLiquidityFee;
        _buyDevFee = _previousBuyDevFee;

        _sellMarketingFee = _previousSellMarketingFee;
        _sellBuybackFee = _previousSellBuybackFee;
        _sellReflectionFee = _previousSellReflectionFee;
        _sellLiquidityFee = _previousSellLiquidityFee;
        _sellDevFee = _previousSellDevFee;
    }

    function _approve(address owner, address spender, uint256 amount) private {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");
        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * Returns the latest price
     */
    function getLatestPrice() external view returns (uint80, int, uint, uint,  uint80) {
        (
            uint80 roundID,
            int price,
            uint startedAt,
            uint timeStamp,
            uint80 answeredInRound
        ) = priceFeed.latestRoundData();

        return (roundID, price, startedAt, timeStamp,  answeredInRound);
    }

    // calculate price based on pair reserves
    function getTokenPrice() external view returns(uint256) {
        IERC20Extented token0 = IERC20Extented(IUniswapV2Pair(uniswapV2Pair).token0());//dogex
        IERC20Extented token1 = IERC20Extented(IUniswapV2Pair(uniswapV2Pair).token1());//bnb
        (uint112 Res0, uint112 Res1,) = IUniswapV2Pair(uniswapV2Pair).getReserves();
        if(pairSwapped) {
            token0 = IERC20Extented(IUniswapV2Pair(uniswapV2Pair).token1());//dogex
            token1 = IERC20Extented(IUniswapV2Pair(uniswapV2Pair).token0());//bnb
            (Res1, Res0,) = IUniswapV2Pair(uniswapV2Pair).getReserves();
        }
        int latestETHprice = manualETHvalue; // manualETHvalue used if oracle crashes
        if(priceOracleEnabled) {
            (,latestETHprice,,,) = this.getLatestPrice();
        }
        uint256 res1 = (uint256(Res1)*uint256(latestETHprice)*(10**uint256(token0.decimals())))/uint256(token1.decimals());

        return(res1/uint256(Res0)); // return amount of token1 needed to buy token0
    }

    // calculate price based on pair reserves
    function getTokenPriceBNB(uint256 amount) external view returns(uint256) {
        IERC20Extented token0 = IERC20Extented(IUniswapV2Pair(uniswapV2Pair).token0());//dogex
        IERC20Extented token1 = IERC20Extented(IUniswapV2Pair(uniswapV2Pair).token1());//bnb
        (uint112 Res0, uint112 Res1,) = IUniswapV2Pair(uniswapV2Pair).getReserves();
        if(pairSwapped) {
            token0 = IERC20Extented(IUniswapV2Pair(uniswapV2Pair).token1());//dogex
            token1 = IERC20Extented(IUniswapV2Pair(uniswapV2Pair).token0());//bnb
            (Res1, Res0,) = IUniswapV2Pair(uniswapV2Pair).getReserves();
        }

        uint res1 = Res1*(10**token0.decimals());
        return((amount*res1)/(Res0*(10**token0.decimals()))); // return amount of token1 needed to buy token0
    }
    
    function updateFee() private returns(DynamicTax memory) {
        
        DynamicTax memory currentTax;
        
        currentTax.buyBuybackFee = _buyBuybackFee;
        currentTax.buyMarketingFee = _buyMarketingFee;
        currentTax.buyLiquidityFee = _buyLiquidityFee;
        currentTax.buyReflectionFee = _buyReflectionFee;
        currentTax.buyDevFee = _buyDevFee;
        
        currentTax.sellBuybackFee = _sellBuybackFee;
        currentTax.sellMarketingFee = _sellMarketingFee;
        currentTax.sellLiquidityFee = _sellLiquidityFee;
        currentTax.sellReflectionFee = _sellReflectionFee;
        currentTax.sellDevFee = _sellDevFee;
        
        uint256 currentPrice = this.getTokenPrice();

        if(block.timestamp >= _goldenHourStartBlock && block.timestamp <= _taxFreeWindowEnd) {
            currentTax.buyBuybackFee = 0;
            currentTax.buyMarketingFee = 0;
            currentTax.buyLiquidityFee = 0;
            currentTax.buyReflectionFee = 0;
            currentTax.buyDevFee = 0;
            
            currentTax.sellBuybackFee = _floorBuybackFee;
            currentTax.sellMarketingFee = _floorMarketingFee;
            currentTax.sellLiquidityFee = _floorLiquidityFee;
            currentTax.sellReflectionFee = _floorReflectionFee;
            currentTax.sellDevFee = _floorDevFee;
        }
        else if (block.timestamp > _taxFreeWindowEnd && block.timestamp <= _slideEndBlock) {
            currentTax.buyBuybackFee = _buyBuybackFee;
            currentTax.buyMarketingFee = _buyMarketingFee;
            currentTax.buyLiquidityFee = _buyLiquidityFee;
            currentTax.buyReflectionFee = _buyReflectionFee;
            currentTax.buyDevFee = _buyDevFee;
            
            currentTax.sellBuybackFee = _slideBuybackFee;
            currentTax.sellMarketingFee = _slideMarketingFee;
            currentTax.sellLiquidityFee = _slideLiquidityFee;
            currentTax.sellReflectionFee = _slideReflectionFee;
            currentTax.sellDevFee = _slideDevFee;
        }
        if (block.timestamp > _taxFreeWindowEnd && _goldenHourStarted) {
            _goldenHourStarted = false;
        }
        if (currentPrice > previousClose.mul(uint256(100).add(_threshold)).div(100) && !_recovered && !_goldenHourStarted) {
            _recovered = true;
        }
        if (currentPrice <= previousClose) {
            currentTax.buyBuybackFee = _buyBuybackFee;
            currentTax.buyMarketingFee = _buyMarketingFee;
            currentTax.buyLiquidityFee = _buyLiquidityFee;
            currentTax.buyReflectionFee = _buyReflectionFee;
            currentTax.buyDevFee = _buyDevFee;
        
            currentTax.sellBuybackFee = _floorBuybackFee;
            currentTax.sellMarketingFee = _floorMarketingFee;
            currentTax.sellLiquidityFee = _floorLiquidityFee;
            currentTax.sellReflectionFee = _floorReflectionFee;
            currentTax.sellDevFee = _floorDevFee;
            
            if(block.timestamp >= _goldenHourStartBlock && block.timestamp <= _taxFreeWindowEnd) {
                currentTax.buyBuybackFee = 0;
                currentTax.buyMarketingFee = 0;
                currentTax.buyLiquidityFee = 0;
                currentTax.buyReflectionFee = 0;
                currentTax.buyDevFee = 0;
                
                currentTax.sellBuybackFee = _floorBuybackFee;
                currentTax.sellMarketingFee = _floorMarketingFee;
                currentTax.sellLiquidityFee = _floorLiquidityFee;
                currentTax.sellReflectionFee = _floorReflectionFee;
                currentTax.sellDevFee = _floorDevFee;
            }
            if(!_goldenHourStarted && _recovered) {
                startGoldenHour();
                currentTax.buyBuybackFee = 0;
                currentTax.buyMarketingFee = 0;
                currentTax.buyLiquidityFee = 0;
                currentTax.buyReflectionFee = 0;
                currentTax.buyDevFee = 0;
                
                currentTax.sellBuybackFee = _floorBuybackFee;
                currentTax.sellMarketingFee = _floorMarketingFee;
                currentTax.sellLiquidityFee = _floorLiquidityFee;
                currentTax.sellReflectionFee = _floorReflectionFee;
                currentTax.sellDevFee = _floorDevFee;
                _recovered = false;
            }
        }
        if (currentPrice > _ath) {
            _ath = currentPrice;
        }
        
        return currentTax;
    }
    
    function _transfer(address from, address to, uint256 amount) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");

        bool takeFee = true;
        
        DynamicTax memory currentTax;

        if (from != owner() && to != owner() && !presale && !_isContractWallet[from] && !_isContractWallet[to] && from != address(this) && to != address(this)) {
            require(tradingOpen);
            if (from != presaleRouter && from != presaleAddress) {
                require(amount <= _maxTxAmount);
            }
            if ((from == uniswapV2Pair || _isExchange[from]) && to != address(uniswapV2Router) && !_isExchange[to]) {//buys
                if (block.timestamp <= _firstBlock.add(_botBlocks) && from != presaleRouter && from != presaleAddress) {
                    bots[to] = true;
                }
                
                uint256 bnbAmount = this.getTokenPriceBNB(amount);
                
                require(bnbAmount >= _minBuyBNB, "you must buy at least min BNB worth of token");
                require(balanceOf(to).add(amount) <= _maxWalletAmount, "wallet balance after transfer must be less than max wallet amount");
                
                currentTax = updateFee();
                
            }
            
            if (!inSwap && from != uniswapV2Pair && !_isExchange[from]) { //sells, transfers
                require(!bots[from] && !bots[to]);
                
                if (!_isBridge[from] && !_isBridge[to]) {
                    if ((to == uniswapV2Pair || _isExchange[to]) && _sellCoolDownEnabled) {
                        require(sellcooldown[from] < block.timestamp);
                        sellcooldown[from] = block.timestamp.add(_cooldownBlocks);
                    }
                    
                    uint256 bnbAmount = this.getTokenPriceBNB(amount);
                    
                    require(bnbAmount >= _minSellBNB, "you must buy at least the min BNB worth of token");
                    
                    if(_dailyMaxEnabled) {
                        if(block.timestamp.sub(_firstSell[from]) > (1 days)) {
                            _firstSell[from] = block.timestamp;
                            _sellTotal[from] = 0;
                        }
                        require(_sellTotal[from].add(bnbAmount) <= _maxSellAmountBNB, "you cannot sell more than the max BNB amount per day");
                        _sellTotal[from] += bnbAmount;
                    }
                    else {
                        require(bnbAmount <= _maxSellAmountBNB, 'you cannot sell more than the max BNB amount per transaction');
                    }
                    
                    require(amount <= balanceOf(uniswapV2Pair).mul(_priceImpact).div(100)); // price impact limit
                    
                    if(to != uniswapV2Pair && !_isExchange[to]) {
                        require(balanceOf(to).add(amount) <= _maxWalletAmount, "wallet balance after transfer must be less than max wallet amount");
                    }

                    currentTax = updateFee();
                    
                    uint256 contractTokenBalance = balanceOf(address(this));
                    if (contractTokenBalance > 0) {

                        uint256 autoLPamount = _sellLiquidityFee.mul(contractTokenBalance).div(_sellBuybackFee.add(_sellMarketingFee).add(_sellLiquidityFee).add(_sellDevFee));
                        swapAndLiquify(autoLPamount);
                    
                        swapTokensForEth(contractTokenBalance.sub(autoLPamount));
                    }
                    uint256 contractETHBalance = address(this).balance;
                    if (contractETHBalance > 0) {
                        sendETHToFee(address(this).balance);
                    }
                    
                }
            }
        }

        if (_isExcludedFromFee[from] || _isExcludedFromFee[to] || presale || _isBridge[to] || _isBridge[from]) {
            restoreAllFee();
            takeFee = false;
        }

        if (bots[from] || bots[to]) {
            restoreAllFee();
            setBotFee();
            takeFee = true;
        }

        if (presale) {
            require(from == owner() || from == presaleRouter || from == presaleAddress);
        }
        
        _tokenTransfer(from, to, amount, takeFee, currentTax);
        restoreAllFee();
    }

    function swapTokensForEth(uint256 tokenAmount) private lockTheSwap {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(tokenAmount, 0, path, address(this), block.timestamp);
    }
    
    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // add the liquidity
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
              address(this),
              tokenAmount,
              0, // slippage is unavoidable
              0, // slippage is unavoidable
              owner(),
              block.timestamp
          );
    }
  
    function swapAndLiquify(uint256 contractTokenBalance) private lockTheSwap {
        // split the contract balance into halves
        uint256 half = contractTokenBalance.div(2);
        uint256 otherHalf = contractTokenBalance.sub(half);

        // capture the contract's current BNB balance.
        // this is so that we can capture exactly the amount of BNB that the
        // swap creates, and not make the liquidity event include any BNB that
        // has been manually sent to the contract
        uint256 initialBalance = address(this).balance;

        // swap tokens for BNB
        swapTokensForEth(half); // <- this breaks the BNB -> HATE swap when swap+liquify is triggered

        // how much BNB did we just swap into?
        uint256 newBalance = address(this).balance.sub(initialBalance);

        // add liquidity to pancakeswap
        addLiquidity(otherHalf, newBalance);
    }

    function sendETHToFee(uint256 amount) private {
        _marketingAddress.transfer(amount.mul(_marketingPercent).div(100));
        _buybackAddress.transfer(amount.mul(_buybackPercent).div(100));
        _developmentAddress.transfer(amount.mul(_devPercent).div(100));
        _projectMaintainence.transfer(amount.mul(_projectMaintainencePercent).div(100));
    }

    function openTrading(uint256 botBlocks, uint256 floorPercent) private {
        uint256 currentPrice = this.getTokenPrice();
        _floorPercent = floorPercent;
        _ath = currentPrice.mul(_floorPercent).div(100);
        previousClose = _ath;
        _firstBlock = block.timestamp;
        _botBlocks = botBlocks;
        tradingOpen = true;
    }

    function manualswap() external {
        require(_msgSender() == _marketingAddress);
        uint256 contractBalance = balanceOf(address(this));
        swapTokensForEth(contractBalance);
    }

    function manualsend() external {
        require(_msgSender() == _marketingAddress);
        uint256 contractETHBalance = address(this).balance;
        sendETHToFee(contractETHBalance);
    }

    function _tokenTransfer(address sender, address recipient, uint256 amount, bool takeFee, DynamicTax memory currentTax) private {
        if (!takeFee) { 
                currentTax.buyBuybackFee = 0;
                currentTax.buyMarketingFee = 0;
                currentTax.buyLiquidityFee = 0;
                currentTax.buyReflectionFee = 0;
                currentTax.buyDevFee = 0;
                
                currentTax.sellBuybackFee = 0;
                currentTax.sellMarketingFee = 0;
                currentTax.sellLiquidityFee = 0;
                currentTax.sellReflectionFee = 0;
                currentTax.sellDevFee = 0;
        }
        if (sender == uniswapV2Pair || _isExchange[sender]){
            _transferStandardBuy(sender, recipient, amount, currentTax);
        }
        else {
            _transferStandardSell(sender, recipient, amount, currentTax);
        }
    }

    function _transferStandardBuy(address sender, address recipient, uint256 tAmount, DynamicTax memory currentTax) private {
        FinalFees memory buyFees;
        buyFees = _getValuesBuy(tAmount, currentTax);
        _rOwned[sender] = _rOwned[sender].sub(buyFees.rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(buyFees.rTransferAmount);
        _takeBuyback(buyFees.tBuyback);
        _takeMarketing(buyFees.tMarketing);
        _reflectFee(buyFees.rReflection, buyFees.tReflection);
        _takeLiquidity(buyFees.tLiquidity);
        _takeDev(buyFees.tDev);
        emit Transfer(sender, recipient, buyFees.tTransferAmount);
    }

    function _transferStandardSell(address sender, address recipient, uint256 tAmount, DynamicTax memory currentTax) private {
        FinalFees memory sellFees;
        sellFees = _getValuesSell(tAmount, currentTax);
        _rOwned[sender] = _rOwned[sender].sub(sellFees.rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(sellFees.rTransferAmount);
        if (recipient == _burnAddress) {
            _tOwned[recipient] = _tOwned[recipient].add(sellFees.tTransferAmount);
        }
        _takeBuyback(sellFees.tBuyback);
        _takeMarketing(sellFees.tMarketing);
        _reflectFee(sellFees.rReflection, sellFees.tReflection);
        _takeLiquidity(sellFees.tLiquidity);
        _takeDev(sellFees.tDev);
        emit Transfer(sender, recipient, sellFees.tTransferAmount);
    }

    function _reflectFee(uint256 rReflection, uint256 tReflection) private {
        _rTotal = _rTotal.sub(rReflection);
        _tFeeTotal = _tFeeTotal.add(tReflection);
    }

    function _takeBuyback(uint256 tBuyback) private {
        uint256 currentRate = _getRate();
        uint256 rBuyback = tBuyback.mul(currentRate);
        _rOwned[address(this)] = _rOwned[address(this)].add(rBuyback);
    }

    function _takeMarketing(uint256 tMarketing) private {
        uint256 currentRate = _getRate();
        uint256 rMarketing = tMarketing.mul(currentRate);
        _rOwned[address(this)] = _rOwned[address(this)].add(rMarketing);
    }

    function _takeLiquidity(uint256 tLiquidity) private {
        uint256 currentRate = _getRate();
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        _rOwned[address(this)] = _rOwned[address(this)].add(rLiquidity);
    }
    
    function _takeDev(uint256 tDev) private  {
        uint256 currentRate = _getRate();
        uint256 rDev = tDev.mul(currentRate);
        _rOwned[address(this)] = _rOwned[address(this)].add(rDev);
    }
    receive() external payable {}

    // Sell GetValues
    function _getValuesSell(uint256 tAmount, DynamicTax memory currentTax) private view returns (FinalFees memory) {
        SellBreakdown memory sellFees = _getTValuesSell(tAmount, currentTax.sellBuybackFee, currentTax.sellMarketingFee, currentTax.sellReflectionFee, currentTax.sellLiquidityFee, currentTax.sellDevFee);
        FinalFees memory finalFees;
        uint256 currentRate = _getRate();
        (finalFees.rAmount, finalFees.rTransferAmount, finalFees.rReflection) = _getRValuesSell(tAmount, sellFees.tBuyback, sellFees.tMarketing, sellFees.tReflection, sellFees.tLiquidity, sellFees.tDev, currentRate);
        finalFees.tBuyback = sellFees.tBuyback;
        finalFees.tMarketing = sellFees.tMarketing;
        finalFees.tReflection = sellFees.tReflection;
        finalFees.tLiquidity = sellFees.tLiquidity;
        finalFees.tDev = sellFees.tDev;
        finalFees.tTransferAmount = sellFees.tTransferAmount;
        return (finalFees);
    }

    function _getTValuesSell(uint256 tAmount, uint256 buybackFee, uint256 marketingFee, uint256 reflectionFee, uint256 liquidityFee, uint256 devFee) private pure returns (SellBreakdown memory) {
        SellBreakdown memory tsellFees;
        tsellFees.tBuyback = tAmount.mul(buybackFee).div(100);
        tsellFees.tMarketing = tAmount.mul(marketingFee).div(100);
        tsellFees.tReflection = tAmount.mul(reflectionFee).div(100);
        tsellFees.tLiquidity = tAmount.mul(liquidityFee).div(100);
        tsellFees.tDev = tAmount.mul(devFee).div(100);
        tsellFees.tTransferAmount = tAmount.sub(tsellFees.tBuyback).sub(tsellFees.tMarketing);
        tsellFees.tTransferAmount -= tsellFees.tReflection;
        tsellFees.tTransferAmount -= tsellFees.tLiquidity;
        tsellFees.tTransferAmount -= tsellFees.tDev;
        return (tsellFees);
    }

    function _getRValuesSell(uint256 tAmount, uint256 tBuyback, uint256 tMarketing, uint256 tReflection, uint256 tLiquidity, uint256 tDev, uint256 currentRate) private pure returns (uint256, uint256, uint256) {
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rBuyback = tBuyback.mul(currentRate);
        uint256 rMarketing = tMarketing.mul(currentRate);
        uint256 rReflection = tReflection.mul(currentRate);
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        uint256 rDev = tDev.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rBuyback).sub(rMarketing).sub(rReflection);
        rTransferAmount -= rLiquidity;
        rTransferAmount -= rDev;
        return (rAmount, rTransferAmount, rReflection);
    }

    // Buy GetValues
    function _getValuesBuy(uint256 tAmount, DynamicTax memory currentTax) private view returns (FinalFees memory) {
        BuyBreakdown memory buyFees = _getTValuesBuy(tAmount, currentTax.buyBuybackFee, currentTax.buyMarketingFee, currentTax.buyReflectionFee, currentTax.buyLiquidityFee, currentTax.buyDevFee);
        FinalFees memory finalFees;
        uint256 currentRate = _getRate();
        (finalFees.rAmount, finalFees.rTransferAmount, finalFees.rReflection) = _getRValuesBuy(tAmount, buyFees.tBuyback, buyFees.tMarketing, buyFees.tReflection, buyFees.tLiquidity, buyFees.tDev, currentRate);
        finalFees.tBuyback = buyFees.tBuyback;
        finalFees.tMarketing = buyFees.tMarketing;
        finalFees.tReflection = buyFees.tReflection;
        finalFees.tLiquidity = buyFees.tLiquidity;
        finalFees.tDev = buyFees.tDev;
        finalFees.tTransferAmount = buyFees.tTransferAmount;
        return (finalFees);
    }

    function _getTValuesBuy(uint256 tAmount, uint256 buybackFee, uint256 marketingFee, uint256 reflectionFee, uint256 liquidityFee, uint256 devFee) private pure returns (BuyBreakdown memory) {
        BuyBreakdown memory tbuyFees;
        tbuyFees.tBuyback = tAmount.mul(buybackFee).div(100);
        tbuyFees.tMarketing = tAmount.mul(marketingFee).div(100);
        tbuyFees.tReflection = tAmount.mul(reflectionFee).div(100);
        tbuyFees.tLiquidity = tAmount.mul(liquidityFee).div(100);
        tbuyFees.tDev = tAmount.mul(devFee).div(100);
        tbuyFees.tTransferAmount = tAmount.sub(tbuyFees.tBuyback).sub(tbuyFees.tMarketing);
        tbuyFees.tTransferAmount -= tbuyFees.tReflection;
        tbuyFees.tTransferAmount -= tbuyFees.tLiquidity;
        tbuyFees.tTransferAmount -= tbuyFees.tDev;
        return (tbuyFees);
    }

    function _getRValuesBuy(uint256 tAmount, uint256 tBuyback, uint256 tMarketing, uint256 tReflection, uint256 tLiquidity, uint256 tDev, uint256 currentRate) private pure returns (uint256, uint256, uint256) {
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rBuyback = tBuyback.mul(currentRate);
        uint256 rMarketing = tMarketing.mul(currentRate);
        uint256 rReflection = tReflection.mul(currentRate);
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        uint256 rDev = tDev.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rBuyback).sub(rMarketing).sub(rReflection);
        rTransferAmount -= rLiquidity;
        rTransferAmount -= rDev;
        return (rAmount, rTransferAmount, rReflection);
    }

    function _getRate() private view returns (uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply.div(tSupply);
    }

    function _getCurrentSupply() private view returns (uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;
        if (_rOwned[_burnAddress] > rSupply || _tOwned[_burnAddress] > tSupply) return (_rTotal, _tTotal);
        rSupply = rSupply.sub(_rOwned[_burnAddress]);
        tSupply = tSupply.sub(_tOwned[_burnAddress]);
        if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }

    function excludeFromFee(address account) public onlyOwner() {
        _isExcludedFromFee[account] = true;
    }

    function includeInFee(address account) external onlyOwner() {
        _isExcludedFromFee[account] = false;
    }

    function removeBot(address account) external onlyOwner() {
        bots[account] = false;
    }

    function addBot(address account) external onlyOwner() {
        bots[account] = true;
    }
    
    function excludeFromContractWallet(address account) public onlyOwner() {
        _isContractWallet[account] = true;
    }

    function includeInContractWallet(address account) external onlyOwner() {
        _isContractWallet[account] = false;
    }
    
    function includeInExchange(address account) external onlyOwner() {
        _isExchange[account] = true;
    }
    
    function excludeFromExchange(address account) external onlyOwner() {
        _isExchange[account] = false;
    }

    function includeInBridge(address account) external onlyOwner() {
        _isBridge[account] = true;
    }
    
    function excludeFromBridge(address account) external onlyOwner() {
        _isBridge[account] = false;
    }
    
    function setMaxTxAmount(uint256 maxTxAmount) external onlyOwner() {
        require(maxTxAmount > 0, "Amount must be greater than 0");
        require(maxTxAmount <= _tTotal, "Amount must be less than or equal to totalSupply");
        _maxTxAmount = maxTxAmount;
        emit MaxTxAmountUpdated(_maxTxAmount);
    }

    function setMaxWalletAmount(uint256 maxWalletAmount) external onlyOwner() {
        require(maxWalletAmount > 0, "Amount must be greater than 0");
        require(maxWalletAmount <= _tTotal, "Amount must be less than or equal to totalSupply");
        _maxWalletAmount = maxWalletAmount;
    }
    
    function setPercents(uint256 marketingPercent, uint256 buybackPercent, uint256 devPercent) external onlyOwner() {
        require(marketingPercent.add(buybackPercent).add(devPercent) == 95, "Sum of percents must equal 95");
        _marketingPercent = marketingPercent;
        _buybackPercent = buybackPercent;
        _devPercent = devPercent;
        emit PercentsUpdated(_marketingPercent, _buybackPercent, _devPercent);
    }

    function setTaxes(uint256 buyMarketingFee, uint256 buyBuybackFee, uint256 buyReflectionFee, uint256 buyLiquidityFee, uint256 buyDevFee, uint256 sellMarketingFee, uint256 sellBuybackFee, uint256 sellReflectionFee, uint256 sellLiquidityFee, uint256 sellDevFee) external onlyOwner() {
        uint256 buyTax = buyMarketingFee.add(buyBuybackFee).add(buyReflectionFee);
        buyTax += buyLiquidityFee.add(buyDevFee);
        uint256 sellTax = sellMarketingFee.add(sellBuybackFee).add(sellReflectionFee);
        sellTax += sellLiquidityFee.add(sellDevFee);
        require(buyTax < 50, "Sum of sell fees must be less than 50");
        require(sellTax < 50, "Sum of buy fees must be less than 50");
        _buyMarketingFee = buyMarketingFee;
        _buyBuybackFee = buyBuybackFee;
        _buyReflectionFee = buyReflectionFee;
        _buyLiquidityFee = buyLiquidityFee;
        _buyDevFee = buyDevFee;
        _sellMarketingFee = sellMarketingFee;
        _sellBuybackFee = sellBuybackFee;
        _sellReflectionFee = sellReflectionFee;
        _sellLiquidityFee = sellLiquidityFee;
        _sellDevFee = sellDevFee;
        
        _previousBuyMarketingFee = _buyMarketingFee;
        _previousBuyBuybackFee = _buyBuybackFee;
        _previousBuyReflectionFee = _buyReflectionFee;
        _previousBuyLiquidityFee = _buyLiquidityFee;
        _previousBuyDevFee = _buyDevFee;
        _previousSellMarketingFee = _sellMarketingFee;
        _previousSellBuybackFee = _sellBuybackFee;
        _previousSellReflectionFee = _sellReflectionFee;
        _previousSellLiquidityFee = _sellLiquidityFee;
        _previousSellDevFee = _sellDevFee;
        
        emit FeesUpdated(_buyBuybackFee, _buyMarketingFee, _buyLiquidityFee, _buyReflectionFee, _buyDevFee, _sellBuybackFee, _sellMarketingFee, _sellLiquidityFee, _sellReflectionFee, _sellDevFee);
    }

    function setPriceImpact(uint256 priceImpact) external onlyOwner() {
        require(priceImpact <= 100, "max price impact must be less than or equal to 100");
        require(priceImpact > 0, "cant prevent sells, choose value greater than 0");
        _priceImpact = priceImpact;
        emit PriceImpactUpdated(_priceImpact);
    }

    function setManualETHvalue(uint256 val) external onlyOwner() {
        manualETHvalue = int(val.mul(10**8));//18));
    }

    function updateOraclePriceFeed(address feed) external onlyOwner() {
        _oraclePriceFeed = feed;
    }

    function setPresaleRouterAndAddress(address router, address wallet) external onlyOwner() {
        presaleRouter = router;
        presaleAddress = wallet;
        excludeFromFee(presaleRouter);
        excludeFromFee(presaleAddress);
    }

    function endPresale(uint256 botBlocks, uint256 floorPercent) external onlyOwner() {
        require(presale == true, "presale already ended");
        presale = false;
        openTrading(botBlocks, floorPercent);
        emit EndedPresale(presale);
    }

    function enablePriceOracle() external onlyOwner() {
        require(priceOracleEnabled == false, "price oracle already enabled");
        priceOracleEnabled = true;
    }

    function disablePriceOracle() external onlyOwner() {
        require(priceOracleEnabled == true, "price oracle already disabled");
        priceOracleEnabled = false;
    }

    function setFloor() external onlyOwner() {
        previousClose = _ath.mul(_floorPercent).div(100);
        _ath = previousClose;
    }
    
    function setFloorPercent(uint256 floorPercent) external onlyOwner() {
        require(floorPercent > 0 && floorPercent <= 100, 'floorPercent needs to be between 0 and 100');
        _floorPercent = floorPercent;
    }
    function updateTaxFreeBlocks(uint256 taxFreeBlocks) external onlyOwner() {
        _taxFreeBlocks = taxFreeBlocks;
    }

    function updatePairSwapped(bool swapped) external onlyOwner() {
        pairSwapped = swapped;
    }
    
    function updateMinBuySellBNB(uint256 minBuyBNB, uint256 minSellBNB) external onlyOwner() {
        _minBuyBNB = minBuyBNB;
        _minSellBNB = minSellBNB;
    }
    
    function updateMaxSellAmountBNB(uint256 maxSellBNB) external onlyOwner() {
        _maxSellAmountBNB = maxSellBNB;
    }
    
    function startGoldenHour() private {
        _goldenHourStartBlock = block.timestamp;
        _goldenHourStarted = true;
        _taxFreeWindowEnd = block.timestamp.add(_taxFreeBlocks);
        _slideEndBlock = _taxFreeWindowEnd.add(_taxFreeBlocks);
    }

    function enableSellCoolDown() external onlyOwner() {
        require(!_sellCoolDownEnabled, "already enabled");
        _sellCoolDownEnabled = true;
    }
    
    function disableSellCoolDown() external onlyOwner() {
        require(_sellCoolDownEnabled, "already disabled");
        _sellCoolDownEnabled = false;
    }
    
    function enableDailyMax() external onlyOwner() {
        require(!_dailyMaxEnabled, 'already enabled');
        _dailyMaxEnabled = true;
    }
    
    function disableDailyMax() external onlyOwner() {
        require(_dailyMaxEnabled, 'already diabled');
        _dailyMaxEnabled = false;
    }
    
    function setFloorFees(uint256 floorMarketingFee, uint256 floorBuybackFee, uint256 floorReflectionFee, uint256 floorLiquidityFee, uint256 floorDevFee) external onlyOwner() {
        require(floorMarketingFee.add(floorBuybackFee).add(floorReflectionFee).add(floorLiquidityFee).add(floorDevFee) < 50, "sum of fees must be less than 50");
        _floorMarketingFee = floorMarketingFee;
        _floorBuybackFee = floorBuybackFee;
        _floorReflectionFee = floorReflectionFee;
        _floorLiquidityFee = floorLiquidityFee;
        _floorDevFee = floorDevFee;
    }
    
    function setSlideFees(uint256 slideMarketingFee, uint256 slideBuybackFee, uint256 slideReflectionFee, uint256 slideLiquidityFee, uint256 slideDevFee) external onlyOwner() {
        require(slideMarketingFee.add(slideBuybackFee).add(slideReflectionFee).add(slideLiquidityFee).add(slideDevFee) < 50, "sum of fees must be less than 50");
        _slideMarketingFee = slideMarketingFee;
        _slideBuybackFee = slideBuybackFee;
        _slideReflectionFee = slideReflectionFee;
        _slideLiquidityFee = slideLiquidityFee;
        _slideDevFee = slideDevFee;
    }
    
    function setCoolDownBlocks(uint256 cooldownBlocks) external onlyOwner() {
        _cooldownBlocks = cooldownBlocks;
    }
    
    function updateBuyBackAddress(address payable buybackAddress) external onlyOwner() {
        _buybackAddress = buybackAddress;
    }
    
    function updateMarketingAddress(address payable marketingAddress) external onlyOwner() {
        _marketingAddress = marketingAddress;
    }
    
    function updateDevelopmentAddress(address payable developmentAddress) external onlyOwner() {
        _developmentAddress = developmentAddress;
    }
    
    function getRemainingSellLimit(address payable account) external view returns (uint256) {
        if (_dailyMaxEnabled) {
            return _maxSellAmountBNB.sub(_sellTotal[account]);
        }
        return _maxSellAmountBNB;
    }
    
    function getTimeLimit(address payable account) external view returns (uint256) {
        if (_sellCoolDownEnabled && !_dailyMaxEnabled) {
            if(sellcooldown[account] < block.timestamp) {
                return block.timestamp.sub(sellcooldown[account]); // seconds remaining until cooldown is over
            }
            return 0; // not in cooldown, can sell now
        }
        else if (_sellCoolDownEnabled && _dailyMaxEnabled) {
            if (_maxSellAmountBNB.sub(_sellTotal[account]) > 0) {
                if (sellcooldown[account] > block.timestamp) {
                    return sellcooldown[account].sub(block.timestamp); // seconds remaining until cooldown is over
                }
                else {
                    return 0; // not in cooldown, can sell now
                }
            }
            else {
                if (block.timestamp > _firstSell[account].add(1 days)) {
                    return 0; // it's been more than 24 hours, can sell now
                }
                else {
                    return (uint256(1 days).add(_firstSell[account])).sub(block.timestamp); // seconds remaining until 24 hours have passed
                }
            }
            
        }
        else {
            return 0; // can sell now
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"presale","type":"bool"}],"name":"EndedPresale","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_buyBuybackFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_buyMarketingFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_buyLiquidityFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_buyReflectionFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_buyDevFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_sellBuyBackFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_sellMarketingFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_sellLiquidityFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_sellReflectionFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_sellDevFee","type":"uint256"}],"name":"FeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_maxTxAmount","type":"uint256"}],"name":"MaxTxAmountUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_marketingPercent","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_buybackPercent","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_devPercent","type":"uint256"}],"name":"PercentsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_priceImpact","type":"uint256"}],"name":"PriceImpactUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"sellOnly","type":"bool"}],"name":"SellOnlyUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"hundredMinusDipPercent","type":"uint256"}],"name":"UpdatedAllowableDip","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"GTblock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"LTblock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"blockWindow","type":"uint256"}],"name":"UpdatedHighLowWindows","type":"event"},{"inputs":[],"name":"_buyBuybackFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_buyDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_buyMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_buyReflectionFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_floorBuybackFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_floorDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_floorLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_floorMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_floorReflectionFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_goldenHourStartBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_goldenHourStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_oraclePriceFeed","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_priceImpact","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_recovered","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_sellBuybackFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_sellDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_sellMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_sellReflectionFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_slideBuybackFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_slideDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_slideLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_slideMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_slideReflectionFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addBot","outputs":[],"stateMutability":"nonpayable","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":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"disableDailyMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disablePriceOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableSellCoolDown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableDailyMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enablePriceOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableSellCoolDown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"botBlocks","type":"uint256"},{"internalType":"uint256","name":"floorPercent","type":"uint256"}],"name":"endPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromBridge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromContractWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromExchange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getLatestPrice","outputs":[{"internalType":"uint80","name":"","type":"uint80"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint80","name":"","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"getRemainingSellLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"getTimeLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"getTokenPriceBNB","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInBridge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInContractWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInExchange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manualsend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manualswap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"cooldownBlocks","type":"uint256"}],"name":"setCoolDownBlocks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setFloor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"floorMarketingFee","type":"uint256"},{"internalType":"uint256","name":"floorBuybackFee","type":"uint256"},{"internalType":"uint256","name":"floorReflectionFee","type":"uint256"},{"internalType":"uint256","name":"floorLiquidityFee","type":"uint256"},{"internalType":"uint256","name":"floorDevFee","type":"uint256"}],"name":"setFloorFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"floorPercent","type":"uint256"}],"name":"setFloorPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"val","type":"uint256"}],"name":"setManualETHvalue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTxAmount","type":"uint256"}],"name":"setMaxTxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxWalletAmount","type":"uint256"}],"name":"setMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketingPercent","type":"uint256"},{"internalType":"uint256","name":"buybackPercent","type":"uint256"},{"internalType":"uint256","name":"devPercent","type":"uint256"}],"name":"setPercents","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"router","type":"address"},{"internalType":"address","name":"wallet","type":"address"}],"name":"setPresaleRouterAndAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"priceImpact","type":"uint256"}],"name":"setPriceImpact","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"slideMarketingFee","type":"uint256"},{"internalType":"uint256","name":"slideBuybackFee","type":"uint256"},{"internalType":"uint256","name":"slideReflectionFee","type":"uint256"},{"internalType":"uint256","name":"slideLiquidityFee","type":"uint256"},{"internalType":"uint256","name":"slideDevFee","type":"uint256"}],"name":"setSlideFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"buyMarketingFee","type":"uint256"},{"internalType":"uint256","name":"buyBuybackFee","type":"uint256"},{"internalType":"uint256","name":"buyReflectionFee","type":"uint256"},{"internalType":"uint256","name":"buyLiquidityFee","type":"uint256"},{"internalType":"uint256","name":"buyDevFee","type":"uint256"},{"internalType":"uint256","name":"sellMarketingFee","type":"uint256"},{"internalType":"uint256","name":"sellBuybackFee","type":"uint256"},{"internalType":"uint256","name":"sellReflectionFee","type":"uint256"},{"internalType":"uint256","name":"sellLiquidityFee","type":"uint256"},{"internalType":"uint256","name":"sellDevFee","type":"uint256"}],"name":"setTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"buybackAddress","type":"address"}],"name":"updateBuyBackAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"developmentAddress","type":"address"}],"name":"updateDevelopmentAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"marketingAddress","type":"address"}],"name":"updateMarketingAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxSellBNB","type":"uint256"}],"name":"updateMaxSellAmountBNB","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minBuyBNB","type":"uint256"},{"internalType":"uint256","name":"minSellBNB","type":"uint256"}],"name":"updateMinBuySellBNB","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"feed","type":"address"}],"name":"updateOraclePriceFeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"swapped","type":"bool"}],"name":"updatePairSwapped","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"taxFreeBlocks","type":"uint256"}],"name":"updateTaxFreeBlocks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526200001c69d3c21bcecceda10000006000196200086c565b6200002a9060001962000848565b600c556002600e8190556801158e460913d00000601355662386f26fc1000060148190556015908155610e10601681905560175560006019818155601a805460ff19908116909155601b839055601c80549091166001908117909155600a601d819055601f9390935560209390935560076021819055600560228190556004602381905560036024819055600d6025556026839055602781905560288890556029879055602a839055602b92909255602c829055602d829055602e879055602f8790556030829055603182905560328690556033869055603483905560359290925560368190556037556038859055603994909455603a849055603b93909355603c828155603d92909255603e55603f919091556040556042805473a5347334af09bbc6c2456ab435f54ef8189fa7096001600160a01b031991821617909155604380547364ce548b7fe68e7e23892f1f8ff600595d74484e90831617905560448054734765a8f2402e4769adfa7b3e54bb30f5dd7702fd9216919091179055604a805465ffffffffffff191665010100010000179055604b80546001600160a81b03191674010567f2323251f0aab15c8dfb1967e4e8a7d42aee1790556445d964b800604c55348015620001fe57600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350604780546001600160a01b0319167310ed43c718714eb63d5aa57b78b54704e256024e90811790915562000280308269d3c21bcecceda1000000620005d7565b806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015620002ba57600080fd5b505afa158015620002cf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002f5919062000790565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200033e57600080fd5b505afa15801562000353573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000379919062000790565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015620003c257600080fd5b505af1158015620003d7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003fd919062000790565b604880546001600160a01b0319166001600160a01b0392831690811790915560475460405163095ea7b360e01b81529216600483015260001960248301529063095ea7b390604401602060405180830381600087803b1580156200046057600080fd5b505af115801562000475573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200049b9190620007b9565b50604b54604a8054600160301b600160d01b0319166001600160a01b039092166601000000000000029190911790556000600f5569d3c21bcecceda10000006049819055620004f890600162000703602090811b62002ddd17901c565b601255600c543360008181526002602090815260408083209490945581546001600160a01b039081168352600882528483208054600160ff1991821681179092553085528685208054821683179055604280548416865287862080548316841790556043805485168752888720805484168517905554841686526009855287862080548316841790555490921684528584208054909216179055925169d3c21bcecceda10000008152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35062000899565b6001600160a01b0383166200063f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084015b60405180910390fd5b6001600160a01b038216620006a25760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840162000636565b6001600160a01b0383811660008181526007602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006200074d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506200075460201b60201c565b9392505050565b60008183620007785760405162461bcd60e51b8152600401620006369190620007db565b50600062000787848662000831565b95945050505050565b600060208284031215620007a2578081fd5b81516001600160a01b03811681146200074d578182fd5b600060208284031215620007cb578081fd5b815180151581146200074d578182fd5b6000602080835283518082850152825b818110156200080957858101830151858201604001528201620007eb565b818111156200081b5783604083870101525b50601f01601f1916929092016040019392505050565b60008262000843576200084362000883565b500490565b6000828210156200086757634e487b7160e01b81526011600452602481fd5b500390565b6000826200087e576200087e62000883565b500690565b634e487b7160e01b600052601260045260246000fd5b6153e580620008a96000396000f3fe60806040526004361061048d5760003560e01c80637ddf864311610255578063bfa91ba111610144578063dbdc3209116100c1578063ea2f0b3711610085578063ea2f0b3714610d70578063ec28438a14610d90578063efe8a45e14610db0578063f97fc2e714610dd0578063fefa5ce314610de6578063ffecf51614610e0657600080fd5b8063dbdc320914610cd3578063dc44b6a014610ce9578063dc484b2814610cff578063dd1e1ca914610d15578063dd62ed3e14610d2a57600080fd5b8063c5d2418911610108578063c5d2418914610c62578063c860795214610c78578063c862c28b14610c8e578063c9cf778914610ca3578063d582a70f14610cb957600080fd5b8063bfa91ba114610bd7578063c11e176214610bf7578063c193e75814610c17578063c2f77e4114610c2d578063c3c8cd8014610c4d57600080fd5b806393b9517f116101d2578063a9059cbb11610196578063a9059cbb14610b56578063ac53817414610b76578063aecace8114610b8c578063bba9215514610ba1578063bfa31ff914610bc157600080fd5b806393b9517f14610abc57806395d89b4114610ad15780639ffc608b14610b00578063a1d8dd9614610b20578063a734cef714610b3657600080fd5b80638ae1cf22116102195780638ae1cf22146109fd5780638b7ccac014610a1d5780638da5cb5b14610a325780638e15f47314610a50578063905e292314610a9c57600080fd5b80637ddf86431461097d5780637ec84cfa1461099257806388359561146109a757806388790a68146109c7578063899c9469146109dd57600080fd5b80634919f1ce1161037c5780636235e93f116102f957806370a08231116102bd57806370a08231146108dc578063715018a6146108fc57806373b8a8fa146109115780637598f8bc146109275780637a6d43981461093d5780637d9d1d711461095d57600080fd5b80636235e93f14610851578063694d9d17146108715780636c0a24eb146108915780636d77ecd1146108a75780636fc3eaec146108c757600080fd5b8063543f8f7811610340578063543f8f78146107c5578063550221f5146107e55780635c0220d7146108055780635fecd9261461081b578063620158521461083b57600080fd5b80634919f1ce1461072857806349bd5a5e146107485780634b94f50e146107805780634de439701461079557806353243761146107ab57600080fd5b80632b929aa81161040a5780633f5e0c05116103ce5780633f5e0c051461069c57806340177983146106bc578063401aa5c0146106dc57806341d05b08146106f2578063437823ec1461070857600080fd5b80632b929aa81461061457806330b5654c14610634578063313ce5671461064a57806334596c16146106665780633a6738be1461068657600080fd5b806318160ddd1161045157806318160ddd146105775780632369bf831461059457806323b872dd146105b457806323bf4c86146105d457806327a14fc2146105f457600080fd5b806301c4eaac1461049957806306fdde03146104bb578063095ea7b314610503578063099a65b51461053357806311577a011461055757600080fd5b3661049457005b600080fd5b3480156104a557600080fd5b506104b96104b4366004614f33565b610e26565b005b3480156104c757600080fd5b5060408051808201909152600d81526c0a0e4ded4cac6e84088dececab609b1b60208201525b6040516104fa9190615044565b60405180910390f35b34801561050f57600080fd5b5061052361051e366004614df1565b610ed7565b60405190151581526020016104fa565b34801561053f57600080fd5b5061054960255481565b6040519081526020016104fa565b34801561056357600080fd5b506104b9610572366004614d41565b610eee565b34801561058357600080fd5b5069d3c21bcecceda1000000610549565b3480156105a057600080fd5b506104b96105af366004614d41565b610f3c565b3480156105c057600080fd5b506105236105cf366004614db1565b610f88565b3480156105e057600080fd5b506104b96105ef366004614d41565b610ff1565b34801561060057600080fd5b506104b961060f366004614e8a565b61103d565b34801561062057600080fd5b506104b961062f366004614e8a565b6110e6565b34801561064057600080fd5b5061054960285481565b34801561065657600080fd5b50604051600981526020016104fa565b34801561067257600080fd5b506104b9610681366004614e1c565b611220565b34801561069257600080fd5b5061054960225481565b3480156106a857600080fd5b506104b96106b7366004614eba565b611268565b3480156106c857600080fd5b506104b96106d7366004614f6d565b61129d565b3480156106e857600080fd5b50610549602e5481565b3480156106fe57600080fd5b5061054960345481565b34801561071457600080fd5b506104b9610723366004614d41565b6114b8565b34801561073457600080fd5b506104b9610743366004614d41565b611506565b34801561075457600080fd5b50604854610768906001600160a01b031681565b6040516001600160a01b0390911681526020016104fa565b34801561078c57600080fd5b50610549611551565b3480156107a157600080fd5b5061054960235481565b3480156107b757600080fd5b50601c546105239060ff1681565b3480156107d157600080fd5b506104b96107e0366004614e8a565b611a6d565b3480156107f157600080fd5b506104b9610800366004614e8a565b611a9c565b34801561081157600080fd5b5061054960275481565b34801561082757600080fd5b506104b9610836366004614d41565b611acb565b34801561084757600080fd5b5061054960325481565b34801561085d57600080fd5b506104b961086c366004614e8a565b611b16565b34801561087d57600080fd5b506104b961088c366004614d41565b611b45565b34801561089d57600080fd5b5061054960125481565b3480156108b357600080fd5b50604b54610768906001600160a01b031681565b3480156108d357600080fd5b506104b9611b91565b3480156108e857600080fd5b506105496108f7366004614d41565b611bbe565b34801561090857600080fd5b506104b9611be0565b34801561091d57600080fd5b5061054960205481565b34801561093357600080fd5b5061054960385481565b34801561094957600080fd5b506104b9610958366004614d79565b611c54565b34801561096957600080fd5b506104b9610978366004614d41565b611cce565b34801561098957600080fd5b506104b9611d19565b34801561099e57600080fd5b506104b9611da0565b3480156109b357600080fd5b506104b96109c2366004614f33565b611e2e565b3480156109d357600080fd5b50610549603a5481565b3480156109e957600080fd5b506104b96109f8366004614d41565b611ed0565b348015610a0957600080fd5b506104b9610a18366004614d41565b611f1e565b348015610a2957600080fd5b506104b9611f6a565b348015610a3e57600080fd5b506000546001600160a01b0316610768565b348015610a5c57600080fd5b50610a65611fc0565b6040805169ffffffffffffffffffff968716815260208101959095528401929092526060830152909116608082015260a0016104fa565b348015610aa857600080fd5b50610549610ab7366004614d41565b61206b565b348015610ac857600080fd5b506104b96120ad565b348015610add57600080fd5b50604080518082019091526006815265048889e8e8ab60d31b60208201526104ed565b348015610b0c57600080fd5b506104b9610b1b366004614d41565b612133565b348015610b2c57600080fd5b5061054960295481565b348015610b4257600080fd5b50610549610b51366004614d41565b612181565b348015610b6257600080fd5b50610523610b71366004614df1565b6122fc565b348015610b8257600080fd5b5061054960245481565b348015610b9857600080fd5b506104b9612309565b348015610bad57600080fd5b506104b9610bbc366004614eba565b612396565b348015610bcd57600080fd5b50610549600e5481565b348015610be357600080fd5b506104b9610bf2366004614d41565b612470565b348015610c0357600080fd5b506104b9610c12366004614e8a565b6124bb565b348015610c2357600080fd5b50610549602a5481565b348015610c3957600080fd5b50610549610c48366004614e8a565b61255a565b348015610c5957600080fd5b506104b96129ed565b348015610c6e57600080fd5b50610549602c5481565b348015610c8457600080fd5b5061054960365481565b348015610c9a57600080fd5b506104b9612a23565b348015610caf57600080fd5b50610549603c5481565b348015610cc557600080fd5b50601a546105239060ff1681565b348015610cdf57600080fd5b5061054960215481565b348015610cf557600080fd5b5061054960305481565b348015610d0b57600080fd5b5061054960265481565b348015610d2157600080fd5b506104b9612abc565b348015610d3657600080fd5b50610549610d45366004614d79565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b348015610d7c57600080fd5b506104b9610d8b366004614d41565b612b53565b348015610d9c57600080fd5b506104b9610dab366004614e8a565b612b9e565b348015610dbc57600080fd5b506104b9610dcb366004614edb565b612c77565b348015610ddc57600080fd5b5061054960195481565b348015610df257600080fd5b506104b9610e01366004614e8a565b612d51565b348015610e1257600080fd5b506104b9610e21366004614d41565b612d8f565b6000546001600160a01b03163314610e595760405162461bcd60e51b8152600401610e50906150fe565b60405180910390fd5b6032610e7382610e6d858188818c8c612e26565b90612e26565b10610ec05760405162461bcd60e51b815260206004820181905260248201527f73756d206f662066656573206d757374206265206c657373207468616e2035306044820152606401610e50565b602694909455602592909255602855602755602955565b6000610ee4338484612e85565b5060015b92915050565b6000546001600160a01b03163314610f185760405162461bcd60e51b8152600401610e50906150fe565b6001600160a01b03166000908152600b60205260409020805460ff19166001179055565b6000546001600160a01b03163314610f665760405162461bcd60e51b8152600401610e50906150fe565b604280546001600160a01b0319166001600160a01b0392909216919091179055565b6000610f95848484612fa9565b610fe78433610fe285604051806060016040528060288152602001615388602891396001600160a01b038a1660009081526007602090815260408083203384529091529020549190613ad4565b612e85565b5060019392505050565b6000546001600160a01b0316331461101b5760405162461bcd60e51b8152600401610e50906150fe565b604b80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146110675760405162461bcd60e51b8152600401610e50906150fe565b600081116110b75760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610e50565b69d3c21bcecceda10000008111156110e15760405162461bcd60e51b8152600401610e5090615133565b601255565b6000546001600160a01b031633146111105760405162461bcd60e51b8152600401610e50906150fe565b606481111561117c5760405162461bcd60e51b815260206004820152603260248201527f6d617820707269636520696d70616374206d757374206265206c6573732074686044820152710616e206f7220657175616c20746f203130360741b6064820152608401610e50565b600081116111e45760405162461bcd60e51b815260206004820152602f60248201527f63616e742070726576656e742073656c6c732c2063686f6f73652076616c756560448201526e02067726561746572207468616e203608c1b6064820152608401610e50565b600e8190556040518181527f585981c0db15e25002a67c38e62f983f189bb219fae23eb213566640fbae5e3c906020015b60405180910390a150565b6000546001600160a01b0316331461124a5760405162461bcd60e51b8152600401610e50906150fe565b604a805491151563010000000263ff00000019909216919091179055565b6000546001600160a01b031633146112925760405162461bcd60e51b8152600401610e50906150fe565b601491909155601555565b6000546001600160a01b031633146112c75760405162461bcd60e51b8152600401610e50906150fe565b60006112d789610e6d8d8d612e26565b90506112e38888612e26565b6112ed90826151f3565b905060006112ff85610e6d8989612e26565b905061130b8484612e26565b61131590826151f3565b9050603282106113755760405162461bcd60e51b815260206004820152602560248201527f53756d206f662073656c6c2066656573206d757374206265206c6573732074686044820152640616e2035360dc1b6064820152608401610e50565b603281106113d15760405162461bcd60e51b8152602060048201526024808201527f53756d206f66206275792066656573206d757374206265206c6573732074686160448201526306e2035360e41b6064820152608401610e50565b602c8c9055602a8b9055602e8a905560308990556032889055603687905560348690556038859055603a849055603c839055602d8c9055602b8b9055602f8a905560318990556033889055603787905560358690556039859055603b849055603d839055604080518c8152602081018e90529081018a9052606081018b90526080810189905260a0810187905260c0810188905260e08101859052610100810186905261012081018490527fb1c1aa9a8102a96f0a74512c201053ebbee946dc4ed37a8a48910d0100e086b2906101400160405180910390a1505050505050505050505050565b6000546001600160a01b031633146114e25760405162461bcd60e51b8152600401610e50906150fe565b6001600160a01b03166000908152600860205260409020805460ff19166001179055565b6000546001600160a01b031633146115305760405162461bcd60e51b8152600401610e50906150fe565b6001600160a01b03166000908152600b60205260409020805460ff19169055565b600080604860009054906101000a90046001600160a01b03166001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156115a257600080fd5b505afa1580156115b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115da9190614d5d565b90506000604860009054906101000a90046001600160a01b03166001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561162c57600080fd5b505afa158015611640573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116649190614d5d565b9050600080604860009054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156116b757600080fd5b505afa1580156116cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ef9190614e3c565b50604a5491935091506301000000900460ff16156118a357604860009054906101000a90046001600160a01b03166001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561175557600080fd5b505afa158015611769573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178d9190614d5d565b9350604860009054906101000a90046001600160a01b03166001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156117dd57600080fd5b505afa1580156117f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118159190614d5d565b9250604860009054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561186557600080fd5b505afa158015611879573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061189d9190614e3c565b50925090505b604c54604b54600160a01b900460ff161561193157306001600160a01b0316638e15f4736040518163ffffffff1660e01b815260040160a06040518083038186803b1580156118f157600080fd5b505afa158015611905573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119299190614fd4565b509193505050505b6000846001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561196c57600080fd5b505afa158015611980573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119a49190615023565b60ff16866001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156119e057600080fd5b505afa1580156119f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a189190615023565b611a269060ff16600a61526e565b611a39846001600160701b038716615326565b611a439190615326565b611a4d919061520b565b9050611a626001600160701b0385168261520b565b965050505050505090565b6000546001600160a01b03163314611a975760405162461bcd60e51b8152600401610e50906150fe565b601755565b6000546001600160a01b03163314611ac65760405162461bcd60e51b8152600401610e50906150fe565b601655565b6000546001600160a01b03163314611af55760405162461bcd60e51b8152600401610e50906150fe565b6001600160a01b03166000908152604160205260409020805460ff19169055565b6000546001600160a01b03163314611b405760405162461bcd60e51b8152600401610e50906150fe565b601355565b6000546001600160a01b03163314611b6f5760405162461bcd60e51b8152600401610e50906150fe565b604480546001600160a01b0319166001600160a01b0392909216919091179055565b6042546001600160a01b0316336001600160a01b031614611bb157600080fd5b47611bbb81613b0e565b50565b6001600160a01b038116600090815260026020526040812054610ee890613c51565b6000546001600160a01b03163314611c0a5760405162461bcd60e51b8152600401610e50906150fe565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b03163314611c7e5760405162461bcd60e51b8152600401610e50906150fe565b604580546001600160a01b038085166001600160a01b031992831681179093556046805491851691909216179055611cb5906114b8565b604654611cca906001600160a01b03166114b8565b5050565b6000546001600160a01b03163314611cf85760405162461bcd60e51b8152600401610e50906150fe565b6001600160a01b03166000908152600960205260409020805460ff19169055565b6000546001600160a01b03163314611d435760405162461bcd60e51b8152600401610e50906150fe565b604a54640100000000900460ff16611d905760405162461bcd60e51b815260206004820152601060248201526f185b1c9958591e48191a5cd8589b195960821b6044820152606401610e50565b604a805464ff0000000019169055565b6000546001600160a01b03163314611dca5760405162461bcd60e51b8152600401610e50906150fe565b604a54640100000000900460ff1615611e175760405162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e48195b98589b1959608a1b6044820152606401610e50565b604a805464ff000000001916640100000000179055565b6000546001600160a01b03163314611e585760405162461bcd60e51b8152600401610e50906150fe565b6032611e6c82610e6d858188818c8c612e26565b10611eb95760405162461bcd60e51b815260206004820181905260248201527f73756d206f662066656573206d757374206265206c657373207468616e2035306044820152606401610e50565b602194909455602092909255602355602255602455565b6000546001600160a01b03163314611efa5760405162461bcd60e51b8152600401610e50906150fe565b6001600160a01b03166000908152600a60205260409020805460ff19166001179055565b6000546001600160a01b03163314611f485760405162461bcd60e51b8152600401610e50906150fe565b604380546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611f945760405162461bcd60e51b8152600401610e50906150fe565b611fb66064611fb0601e54601f54613cce90919063ffffffff16565b90612ddd565b600f819055601f55565b600080600080600080600080600080604a60069054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b15801561201d57600080fd5b505afa158015612031573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120559190614fd4565b939e929d50909b50995090975095505050505050565b604a54600090600160281b900460ff16156120a5576001600160a01b038216600090815260056020526040902054601354610ee891613d4d565b505060135490565b6000546001600160a01b031633146120d75760405162461bcd60e51b8152600401610e50906150fe565b604a54600160281b900460ff166121225760405162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e48191a58589b1959608a1b6044820152606401610e50565b604a805465ff000000000019169055565b6000546001600160a01b0316331461215d5760405162461bcd60e51b8152600401610e50906150fe565b6001600160a01b03166000908152600960205260409020805460ff19166001179055565b604a54600090640100000000900460ff1680156121a85750604a54600160281b900460ff16155b156121f9576001600160a01b0382166000908152600460205260409020544211156121f1576001600160a01b038216600090815260046020526040902054610ee8904290613d4d565b506000919050565b604a54640100000000900460ff16801561221c5750604a54600160281b900460ff165b156121f1576001600160a01b03821660009081526005602052604081205460135461224691613d4d565b111561228f576001600160a01b0382166000908152600460205260409020544210156121f1576001600160a01b038216600090815260046020526040902054610ee89042613d4d565b6001600160a01b0382166000908152600660205260409020546122b59062015180612e26565b4211156122c457506000919050565b6001600160a01b038216600090815260066020526040902054610ee89042906122f1906201518090612e26565b90613d4d565b919050565b6000610ee4338484612fa9565b6000546001600160a01b031633146123335760405162461bcd60e51b8152600401610e50906150fe565b604a54600160281b900460ff161561237f5760405162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e48195b98589b1959608a1b6044820152606401610e50565b604a805465ff00000000001916600160281b179055565b6000546001600160a01b031633146123c05760405162461bcd60e51b8152600401610e50906150fe565b604a5462010000900460ff1615156001146124155760405162461bcd60e51b81526020600482015260156024820152741c1c995cd85b1948185b1c9958591e48195b991959605a1b6044820152606401610e50565b604a805462ff00001916905561242b8282613d8f565b604a546040516201000090910460ff16151581527fbad30b8287730cfd8b6df18f878abbd745dc20365bfec848056cad8e6c17b91b9060200160405180910390a15050565b6000546001600160a01b0316331461249a5760405162461bcd60e51b8152600401610e50906150fe565b6001600160a01b03166000908152600a60205260409020805460ff19169055565b6000546001600160a01b031633146124e55760405162461bcd60e51b8152600401610e50906150fe565b6000811180156124f6575060648111155b6125555760405162461bcd60e51b815260206004820152602a60248201527f666c6f6f7250657263656e74206e6565647320746f206265206265747765656e6044820152690203020616e64203130360b41b6064820152608401610e50565b601e55565b600080604860009054906101000a90046001600160a01b03166001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156125ab57600080fd5b505afa1580156125bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125e39190614d5d565b90506000604860009054906101000a90046001600160a01b03166001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561263557600080fd5b505afa158015612649573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061266d9190614d5d565b9050600080604860009054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156126c057600080fd5b505afa1580156126d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126f89190614e3c565b50604a5491935091506301000000900460ff16156128ac57604860009054906101000a90046001600160a01b03166001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561275e57600080fd5b505afa158015612772573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127969190614d5d565b9350604860009054906101000a90046001600160a01b03166001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156127e657600080fd5b505afa1580156127fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061281e9190614d5d565b9250604860009054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561286e57600080fd5b505afa158015612882573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128a69190614e3c565b50925090505b6000846001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156128e757600080fd5b505afa1580156128fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061291f9190615023565b61292a90600a61527a565b61293d906001600160701b038416615326565b9050846001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561297857600080fd5b505afa15801561298c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129b09190615023565b6129bb90600a61527a565b6129ce906001600160701b038516615326565b6129d88289615326565b6129e2919061520b565b979650505050505050565b6042546001600160a01b0316336001600160a01b031614612a0d57600080fd5b6000612a1830611bbe565b9050611bbb81613e38565b6000546001600160a01b03163314612a4d5760405162461bcd60e51b8152600401610e50906150fe565b604b54600160a01b900460ff1615612aa75760405162461bcd60e51b815260206004820152601c60248201527f7072696365206f7261636c6520616c726561647920656e61626c6564000000006044820152606401610e50565b604b805460ff60a01b1916600160a01b179055565b6000546001600160a01b03163314612ae65760405162461bcd60e51b8152600401610e50906150fe565b604b54600160a01b900460ff161515600114612b445760405162461bcd60e51b815260206004820152601d60248201527f7072696365206f7261636c6520616c72656164792064697361626c65640000006044820152606401610e50565b604b805460ff60a01b19169055565b6000546001600160a01b03163314612b7d5760405162461bcd60e51b8152600401610e50906150fe565b6001600160a01b03166000908152600860205260409020805460ff19169055565b6000546001600160a01b03163314612bc85760405162461bcd60e51b8152600401610e50906150fe565b60008111612c185760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610e50565b69d3c21bcecceda1000000811115612c425760405162461bcd60e51b8152600401610e5090615133565b60498190556040518181527f947f344d56e1e8c70dc492fb94c4ddddd490c016aab685f5e7e47b2e85cb44cf90602001611215565b6000546001600160a01b03163314612ca15760405162461bcd60e51b8152600401610e50906150fe565b612caf81610e6d8585612e26565b605f14612cfe5760405162461bcd60e51b815260206004820152601d60248201527f53756d206f662070657263656e7473206d75737420657175616c2039350000006044820152606401610e50565b603f8390556040828155603e8290558051848152602081018490529081018290527f27224e2696b8b5ac8d85f4e227d20f3116a7d3b066e62b3d355dfeebd302231a9060600160405180910390a1505050565b6000546001600160a01b03163314612d7b5760405162461bcd60e51b8152600401610e50906150fe565b612d89816305f5e100613cce565b604c5550565b6000546001600160a01b03163314612db95760405162461bcd60e51b8152600401610e50906150fe565b6001600160a01b03166000908152604160205260409020805460ff19166001179055565b6000612e1f83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613fd7565b9392505050565b600080612e3383856151f3565b905083811015612e1f5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610e50565b6001600160a01b038316612ee75760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610e50565b6001600160a01b038216612f485760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610e50565b6001600160a01b0383811660008181526007602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831661300d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610e50565b6001600160a01b03821661306f5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610e50565b600081116130d15760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610e50565b60016130db614c71565b6000546001600160a01b0386811691161480159061310757506000546001600160a01b03858116911614155b801561311c5750604a5462010000900460ff16155b801561314157506001600160a01b03851660009081526009602052604090205460ff16155b801561316657506001600160a01b03841660009081526009602052604090205460ff16155b801561317b57506001600160a01b0385163014155b801561319057506001600160a01b0384163014155b1561390557604a5460ff166131a457600080fd5b6045546001600160a01b038681169116148015906131d057506046546001600160a01b03868116911614155b156131e4576049548311156131e457600080fd5b6048546001600160a01b038681169116148061321857506001600160a01b0385166000908152600a602052604090205460ff165b801561323257506047546001600160a01b03858116911614155b801561325757506001600160a01b0384166000908152600a602052604090205460ff16155b156133e05760115460105461326b91612e26565b421115801561328857506045546001600160a01b03868116911614155b80156132a257506046546001600160a01b03868116911614155b156132cb576001600160a01b0384166000908152604160205260409020805460ff191660011790555b60405163c2f77e4160e01b815260048101849052600090309063c2f77e419060240160206040518083038186803b15801561330557600080fd5b505afa158015613319573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061333d9190614ea2565b90506014548110156133a65760405162461bcd60e51b815260206004820152602c60248201527f796f75206d75737420627579206174206c65617374206d696e20424e4220776f60448201526b393a341037b3103a37b5b2b760a11b6064820152608401610e50565b6012546133b685610e6d88611bbe565b11156133d45760405162461bcd60e51b8152600401610e5090615097565b6133dc614005565b9150505b604a54610100900460ff1615801561340657506048546001600160a01b03868116911614155b801561342b57506001600160a01b0385166000908152600a602052604090205460ff16155b15613905576001600160a01b03851660009081526041602052604090205460ff1615801561347257506001600160a01b03841660009081526041602052604090205460ff16155b61347b57600080fd5b6001600160a01b0385166000908152600b602052604090205460ff161580156134bd57506001600160a01b0384166000908152600b602052604090205460ff16155b15613905576048546001600160a01b03858116911614806134f657506001600160a01b0384166000908152600a602052604090205460ff165b801561350c5750604a54640100000000900460ff165b1561355d576001600160a01b038516600090815260046020526040902054421161353557600080fd5b601754613543904290612e26565b6001600160a01b0386166000908152600460205260409020555b60405163c2f77e4160e01b815260048101849052600090309063c2f77e419060240160206040518083038186803b15801561359757600080fd5b505afa1580156135ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135cf9190614ea2565b905060155481101561363c5760405162461bcd60e51b815260206004820152603060248201527f796f75206d75737420627579206174206c6561737420746865206d696e20424e60448201526f21103bb7b93a341037b3103a37b5b2b760811b6064820152608401610e50565b604a54600160281b900460ff1615613768576001600160a01b0386166000908152600660205260409020546201518090613677904290613d4d565b11156136a4576001600160a01b038616600090815260066020908152604080832042905560059091528120555b6013546001600160a01b0387166000908152600560205260409020546136ca9083612e26565b11156137355760405162461bcd60e51b815260206004820152603460248201527f796f752063616e6e6f742073656c6c206d6f7265207468616e20746865206d616044820152737820424e4220616d6f756e74207065722064617960601b6064820152608401610e50565b6001600160a01b0386166000908152600560205260408120805483929061375d9084906151f3565b909155506137e09050565b6013548111156137e05760405162461bcd60e51b815260206004820152603c60248201527f796f752063616e6e6f742073656c6c206d6f7265207468616e20746865206d6160448201527f7820424e4220616d6f756e7420706572207472616e73616374696f6e000000006064820152608401610e50565b600e5460485461380a91606491611fb09190613804906001600160a01b0316611bbe565b90613cce565b84111561381657600080fd5b6048546001600160a01b0386811691161480159061384d57506001600160a01b0385166000908152600a602052604090205460ff16155b156138805760125461386285610e6d88611bbe565b11156138805760405162461bcd60e51b8152600401610e5090615097565b613888614005565b9150600061389530611bbe565b905080156138f15760006138d26138c5603c54610e6d603a54610e6d603654603454612e2690919063ffffffff16565b603a54611fb09085613cce565b90506138dd81614375565b6138ef6138ea8383613d4d565b613e38565b505b4780156139015761390147613b0e565b5050505b6001600160a01b03851660009081526008602052604090205460ff168061394457506001600160a01b03841660009081526008602052604090205460ff165b806139575750604a5462010000900460ff165b8061397a57506001600160a01b0384166000908152600b602052604090205460ff165b8061399d57506001600160a01b0385166000908152600b602052604090205460ff165b156139af576139aa6143d5565b600091505b6001600160a01b03851660009081526041602052604090205460ff16806139ee57506001600160a01b03841660009081526041602052604090205460ff165b15613a5d576139fb6143d5565b613a58602c8054602d908155602a8054602b55602e8054602f5560328054603355603680546037556034805460355560388054603955603c8054603d55978790559486905560009384905591839055849055929092558190559055565b600191505b604a5462010000900460ff1615613ab8576000546001600160a01b0386811691161480613a9757506045546001600160a01b038681169116145b80613aaf57506046546001600160a01b038681169116145b613ab857600080fd5b613ac58585858585614413565b613acd6143d5565b5050505050565b60008184841115613af85760405162461bcd60e51b8152600401610e509190615044565b506000613b058486615345565b95945050505050565b604254603f546001600160a01b03909116906108fc90613b3690606490611fb0908690613cce565b6040518115909202916000818181858888f19350505050158015613b5e573d6000803e3d6000fd5b506043546040546001600160a01b03909116906108fc90613b8790606490611fb0908690613cce565b6040518115909202916000818181858888f19350505050158015613baf573d6000803e3d6000fd5b50604454603e546001600160a01b03909116906108fc90613bd890606490611fb0908690613cce565b6040518115909202916000818181858888f19350505050158015613c00573d6000803e3d6000fd5b5073e01f2d85a7f191acfbd4807c69cfdce5034f8d286108fc613c296064611fb0856005613cce565b6040518115909202916000818181858888f19350505050158015611cca573d6000803e3d6000fd5b6000600c54821115613cb85760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610e50565b6000613cc26144b3565b9050612e1f8382612ddd565b600082613cdd57506000610ee8565b6000613ce98385615326565b905082613cf6858361520b565b14612e1f5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610e50565b6000612e1f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613ad4565b6000306001600160a01b0316634b94f50e6040518163ffffffff1660e01b815260040160206040518083038186803b158015613dca57600080fd5b505afa158015613dde573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e029190614ea2565b601e8390559050613e186064611fb08385613cce565b601f819055600f55505042601055601155604a805460ff19166001179055565b604a805461ff0019166101001790556040805160028082526060820183526000926020830190803683370190505090503081600081518110613e8a57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152604754604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015613ede57600080fd5b505afa158015613ef2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f169190614d5d565b81600181518110613f3757634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152604754613f5d9130911684612e85565b60475460405163791ac94760e01b81526001600160a01b039091169063791ac94790613f96908590600090869030904290600401615183565b600060405180830381600087803b158015613fb057600080fd5b505af1158015613fc4573d6000803e3d6000fd5b5050604a805461ff001916905550505050565b60008183613ff85760405162461bcd60e51b8152600401610e509190615044565b506000613b05848661520b565b61400d614c71565b614015614c71565b602a548152602c546020808301919091526030546060830152602e54604080840191909152603254608084015260345460a084015260365460c0840152603a5461010084015260385460e0840152603c5461012084015280516325ca7a8760e11b815290516000923092634b94f50e9260048083019392829003018186803b1580156140a057600080fd5b505afa1580156140b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140d89190614ea2565b905060195442101580156140ee57506018544211155b156141435760008083526020808401829052606084018290526040840182905260808401919091525460a083015260215460c083015260225461010083015260235460e08301526024546101208301526141ab565b601854421180156141565750601b544211155b156141ab57602a548252602c5460208301526030546060830152602e546040830152603254608083015260255460a083015260265460c083015260275461010083015260285460e08301526029546101208301525b601854421180156141be5750601a5460ff165b156141ce57601a805460ff191690555b6141f56064611fb06141ec601d546064612e2690919063ffffffff16565b600f5490613cce565b811180156142065750601c5460ff16155b80156142155750601a5460ff16155b1561422857601c805460ff191660011790555b600f54811161435f57602a548252602c546020808401919091526030546060840152602e54604084015260325460808401525460a083015260215460c083015260225461010083015260235460e0830152602454610120830152601954421080159061429657506018544211155b156142e75760008083526020808401829052606084018290526040840182905260808401919091525460a083015260215460c083015260225461010083015260235460e08301526024546101208301525b601a5460ff161580156142fc5750601c5460ff165b1561435f576143096144d6565b60008083526020808401829052606084018290526040840182905260808401919091525460a083015260215460c083015260225461010083015260235460e0830152602454610120830152601c805460ff191690555b601f5481111561436f57601f8190555b50919050565b604a805461ff0019166101001790556000614391826002612ddd565b9050600061439f8383613d4d565b9050476143ab83613e38565b60006143b74783613d4d565b90506143c3838261450d565b5050604a805461ff0019169055505050565b602d54602c55602b54602a55602f54602e55603154603055603354603255603754603655603554603455603954603855603b54603a55603d54603c55565b8161445d5760008082526020820181905260608201819052604082018190526080820181905260a0820181905260c08201819052610100820181905260e082018190526101208201525b6048546001600160a01b038681169116148061449157506001600160a01b0385166000908152600a602052604090205460ff165b156144a7576144a2858585846145ea565b613acd565b613acd8585858461471a565b60008060006144c06147fe565b90925090506144cf8282612ddd565b9250505090565b426019819055601a805460ff191660011790556016546144f69190612e26565b60188190556016546145089190612e26565b601b55565b6047546145259030906001600160a01b031684612e85565b6047546001600160a01b031663f305d71982308560008061454e6000546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c4016060604051808303818588803b1580156145b157600080fd5b505af11580156145c5573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613acd9190614f06565b6145f2614cc4565b6145fc8383614948565b6101008101516001600160a01b0387166000908152600260205260409020549192506146289190613d4d565b6001600160a01b038087166000908152600260205260408082209390935560e08401519187168152919091205461465e91612e26565b6001600160a01b038516600090815260026020908152604090912091909155810151614689906149fb565b61469681604001516149fb565b6146a88160c001518260600151614a45565b6146b581608001516149fb565b6146c28160a001516149fb565b836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836000015160405161470b91815260200190565b60405180910390a35050505050565b614722614cc4565b61472c8383614a69565b6101008101516001600160a01b0387166000908152600260205260409020549192506147589190613d4d565b6001600160a01b038087166000908152600260205260408082209390935560e08401519187168152919091205461478e91612e26565b6001600160a01b03851660008181526002602052604090209190915561dead14156147f15780516001600160a01b0385166000908152600360205260409020546147d791612e26565b6001600160a01b0385166000908152600360205260409020555b61468981602001516149fb565b600c5461dead600090815260026020527f6a9609baa168169acaea398c4407efea4be641bb08e21e88806d9836fd9333cc549091829169d3c21bcecceda100000090821080614878575061dead60005260036020527f262bb27bbdd95c1cdc8e16957e36e38579ea44f7f6413dd7a9c75939def06b2c5481105b15614894575050600c549269d3c21bcecceda100000092509050565b61dead60005260026020527f6a9609baa168169acaea398c4407efea4be641bb08e21e88806d9836fd9333cc546148cc908390613d4d565b61dead60005260036020527f262bb27bbdd95c1cdc8e16957e36e38579ea44f7f6413dd7a9c75939def06b2c54909250614907908290613d4d565b600c549091506149219069d3c21bcecceda1000000612ddd565b82101561493f575050600c549269d3c21bcecceda100000092509050565b90939092509050565b614950614cc4565b60006149748484600001518560200151866040015187606001518860800151614a93565b905061497e614cc4565b60006149886144b3565b90506149ad8684602001518560400151866060015187608001518860a0015187614bd5565b60c085015260e0840152610100830152506020828101519082015260408083015190820152606080830151908201526080808301519082015260a08083015190820152905181529392505050565b6000614a056144b3565b90506000614a138383613cce565b30600090815260026020526040902054909150614a309082612e26565b30600090815260026020526040902055505050565b600c54614a529083613d4d565b600c55600d54614a629082612e26565b600d555050565b614a71614cc4565b6000614974848460a001518560c001518660e001518761010001518861012001515b614acc6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b614b056040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b614b146064611fb08a8a613cce565b6020820152614b286064611fb08a89613cce565b6040820152614b3c6064611fb08a88613cce565b6060820152614b506064611fb08a87613cce565b6080820152614b646064611fb08a86613cce565b60a082015260408101516020820151614b8391906122f1908b90613d4d565b8082526060820151908290614b99908390615345565b905250608081015181518290614bb0908390615345565b90525060a081015181518290614bc7908390615345565b905250979650505050505050565b6000808080614be48b86613cce565b90506000614bf28b87613cce565b90506000614c008b88613cce565b90506000614c0e8b89613cce565b90506000614c1c8b8a613cce565b90506000614c2a8b8b613cce565b90506000614c3e846122f187818b8b613d4d565b9050614c4a8382615345565b9050614c568282615345565b96995095975091955050505050509750975097945050505050565b604051806101400160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b80516001600160701b03811681146122f757600080fd5b805169ffffffffffffffffffff811681146122f757600080fd5b600060208284031215614d52578081fd5b8135612e1f81615372565b600060208284031215614d6e578081fd5b8151612e1f81615372565b60008060408385031215614d8b578081fd5b8235614d9681615372565b91506020830135614da681615372565b809150509250929050565b600080600060608486031215614dc5578081fd5b8335614dd081615372565b92506020840135614de081615372565b929592945050506040919091013590565b60008060408385031215614e03578182fd5b8235614e0e81615372565b946020939093013593505050565b600060208284031215614e2d578081fd5b81358015158114612e1f578182fd5b600080600060608486031215614e50578283fd5b614e5984614d10565b9250614e6760208501614d10565b9150604084015163ffffffff81168114614e7f578182fd5b809150509250925092565b600060208284031215614e9b578081fd5b5035919050565b600060208284031215614eb3578081fd5b5051919050565b60008060408385031215614ecc578182fd5b50508035926020909101359150565b600080600060608486031215614eef578283fd5b505081359360208301359350604090920135919050565b600080600060608486031215614f1a578283fd5b8351925060208401519150604084015190509250925092565b600080600080600060a08688031215614f4a578283fd5b505083359560208501359550604085013594606081013594506080013592509050565b6000806000806000806000806000806101408b8d031215614f8c578788fd5b505088359a60208a01359a5060408a013599606081013599506080810135985060a0810135975060c0810135965060e081013595506101008101359450610120013592509050565b600080600080600060a08688031215614feb578283fd5b614ff486614d27565b945060208601519350604086015192506060860151915061501760808701614d27565b90509295509295909350565b600060208284031215615034578081fd5b815160ff81168114612e1f578182fd5b6000602080835283518082850152825b8181101561507057858101830151858201604001528201615054565b818111156150815783604083870101525b50601f01601f1916929092016040019392505050565b60208082526041908201527f77616c6c65742062616c616e6365206166746572207472616e73666572206d7560408201527f7374206265206c657373207468616e206d61782077616c6c657420616d6f756e6060820152601d60fa1b608082015260a00190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526030908201527f416d6f756e74206d757374206265206c657373207468616e206f72206571756160408201526f6c20746f20746f74616c537570706c7960801b606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b818110156151d25784516001600160a01b0316835293830193918301916001016151ad565b50506001600160a01b03969096166060850152505050608001529392505050565b600082198211156152065761520661535c565b500190565b60008261522657634e487b7160e01b81526012600452602481fd5b500490565b600181815b8085111561526657816000190482111561524c5761524c61535c565b8085161561525957918102915b93841c9390800290615230565b509250929050565b6000612e1f8383615285565b6000612e1f60ff8416835b60008261529457506001610ee8565b816152a157506000610ee8565b81600181146152b757600281146152c1576152dd565b6001915050610ee8565b60ff8411156152d2576152d261535c565b50506001821b610ee8565b5060208310610133831016604e8410600b8410161715615300575081810a610ee8565b61530a838361522b565b806000190482111561531e5761531e61535c565b029392505050565b60008160001904831182151516156153405761534061535c565b500290565b6000828210156153575761535761535c565b500390565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114611bbb57600080fdfe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a26469706673582212207ba6cfac08c6c8d36a00540745b696cfbfaca87fc4434190edfa51e12b0d6cb064736f6c63430008040033

Deployed ByteCode Sourcemap

12873:47629:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57738:573;;;;;;;;;;-1:-1:-1;57738:573:0;;;;;:::i;:::-;;:::i;:::-;;21154:94;;;;;;;;;;-1:-1:-1;21235:5:0;;;;;;;;;;;;-1:-1:-1;;;21235:5:0;;;;21154:94;;;;;;;:::i;:::-;;;;;;;;22045:163;;;;;;;;;;-1:-1:-1;22045:163:0;;;;;:::i;:::-;;:::i;:::-;;;7529:14:1;;7522:22;7504:41;;7492:2;7477:18;22045:163:0;7459:92:1;15058:36:0;;;;;;;;;;;;;;;;;;;19671:25:1;;;19659:2;19644:18;15058:36:0;19626:76:1;50609:107:0;;;;;;;;;;-1:-1:-1;50609:107:0;;;;;:::i;:::-;;:::i;21464:97::-;;;;;;;;;;-1:-1:-1;13874:24:0;21464:97;;58604:142;;;;;;;;;;-1:-1:-1;58604:142:0;;;;;:::i;:::-;;:::i;22216:312::-;;;;;;;;;;-1:-1:-1;22216:312:0;;;;;:::i;:::-;;:::i;54297:108::-;;;;;;;;;;-1:-1:-1;54297:108:0;;;;;:::i;:::-;;:::i;51179:297::-;;;;;;;;;;-1:-1:-1;51179:297:0;;;;;:::i;:::-;;:::i;53821:337::-;;;;;;;;;;-1:-1:-1;53821:337:0;;;;;:::i;:::-;;:::i;15189:38::-;;;;;;;;;;;;;;;;21362:94;;;;;;;;;;-1:-1:-1;21362:94:0;;13110:1;22510:36:1;;22498:2;22483:18;21362:94:0;22465:87:1;55805:102:0;;;;;;;;;;-1:-1:-1;55805:102:0;;;;;:::i;:::-;;:::i;14929:37::-;;;;;;;;;;;;;;;;55919:165;;;;;;;;;;-1:-1:-1;55919:165:0;;;;;:::i;:::-;;:::i;51932:1881::-;;;;;;;;;;-1:-1:-1;51932:1881:0;;;;;:::i;:::-;;:::i;15502:36::-;;;;;;;;;;;;;;;;15835:34;;;;;;;;;;;;;;;;49644:113;;;;;;;;;;-1:-1:-1;49644:113:0;;;;;:::i;:::-;;:::i;50728:110::-;;;;;;;;;;-1:-1:-1;50728:110:0;;;;;:::i;:::-;;:::i;18352:28::-;;;;;;;;;;-1:-1:-1;18352:28:0;;;;-1:-1:-1;;;;;18352:28:0;;;;;;-1:-1:-1;;;;;6708:32:1;;;6690:51;;6678:2;6663:18;18352:28:0;6645:102:1;26032:1023:0;;;;;;;;;;;;;:::i;14973:38::-;;;;;;;;;;;;;;;;14695:29;;;;;;;;;;-1:-1:-1;14695:29:0;;;;;;;;58323:123;;;;;;;;;;-1:-1:-1;58323:123:0;;;;;:::i;:::-;;:::i;55675:122::-;;;;;;;;;;-1:-1:-1;55675:122:0;;;;;:::i;:::-;;:::i;15145:37::-;;;;;;;;;;;;;;;;49887:97;;;;;;;;;;-1:-1:-1;49887:97:0;;;;;:::i;:::-;;:::i;15721:29::-;;;;;;;;;;;;;;;;56096:122;;;;;;;;;;-1:-1:-1;56096:122:0;;;;;:::i;:::-;;:::i;58758:150::-;;;;;;;;;;-1:-1:-1;58758:150:0;;;;;:::i;:::-;;:::i;14135:31::-;;;;;;;;;;;;;;;;19428:76;;;;;;;;;;-1:-1:-1;19428:76:0;;;;-1:-1:-1;;;;;19428:76:0;;;39968:196;;;;;;;;;;;;;:::i;21569:138::-;;;;;;;;;;-1:-1:-1;21569:138:0;;;;;:::i;:::-;;:::i;8446:148::-;;;;;;;;;;;;;:::i;14842:36::-;;;;;;;;;;;;;;;;16051:37;;;;;;;;;;;;;;;;54413:245;;;;;;;;;;-1:-1:-1;54413:245:0;;;;;:::i;:::-;;:::i;50228:124::-;;;;;;;;;;-1:-1:-1;50228:124:0;;;;;:::i;:::-;;:::i;56667:159::-;;;;;;;;;;;;;:::i;56498:157::-;;;;;;;;;;;;;:::i;57153:573::-;;;;;;;;;;-1:-1:-1;57153:573:0;;;;;:::i;:::-;;:::i;16165:36::-;;;;;;;;;;;;;;;;50364:111;;;;;;;;;;-1:-1:-1;50364:111:0;;;;;:::i;:::-;;:::i;58458:134::-;;;;;;;;;;-1:-1:-1;58458:134:0;;;;;:::i;:::-;;:::i;55298:139::-;;;;;;;;;;;;;:::i;8232:79::-;;;;;;;;;;-1:-1:-1;8270:7:0;8297:6;-1:-1:-1;;;;;8297:6:0;8232:79;;25610:367;;;;;;;;;;;;;:::i;:::-;;;;22110:22:1;22159:15;;;22141:34;;22206:2;22191:18;;22184:34;;;;22234:18;;22227:34;;;;22292:2;22277:18;;22270:34;22341:15;;;22335:3;22320:19;;22313:44;22087:3;22072:19;25610:367:0;22054:309:1;58920:239:0;;;;;;;;;;-1:-1:-1;58920:239:0;;;;;:::i;:::-;;:::i;56995:146::-;;;;;;;;;;;;;:::i;21256:98::-;;;;;;;;;;-1:-1:-1;21339:7:0;;;;;;;;;;;;-1:-1:-1;;;21339:7:0;;;;21256:98;;50097:123;;;;;;;;;;-1:-1:-1;50097:123:0;;;;;:::i;:::-;;:::i;15234:31::-;;;;;;;;;;;;;;;;59171:1328;;;;;;;;;;-1:-1:-1;59171:1328:0;;;;;:::i;:::-;;:::i;21715:169::-;;;;;;;;;;-1:-1:-1;21715:169:0;;;;;:::i;:::-;;:::i;15018:31::-;;;;;;;;;;;;;;;;56838:145;;;;;;;;;;;;;:::i;54666:260::-;;;;;;;;;;-1:-1:-1;54666:260:0;;;;;:::i;:::-;;:::i;13994:31::-;;;;;;;;;;;;;;;;50487:114;;;;;;;;;;-1:-1:-1;50487:114:0;;;;;:::i;:::-;;:::i;55449:220::-;;;;;;;;;;-1:-1:-1;55449:220:0;;;;;:::i;:::-;;:::i;15292:33::-;;;;;;;;;;;;;;;;27110:801;;;;;;;;;;-1:-1:-1;27110:801:0;;;;;:::i;:::-;;:::i;39763:197::-;;;;;;;;;;;;;:::i;15394:35::-;;;;;;;;;;;;;;;;15940:36;;;;;;;;;;;;;;;;54934:173;;;;;;;;;;;;;:::i;16276:30::-;;;;;;;;;;;;;;;;14609:38;;;;;;;;;;-1:-1:-1;14609:38:0;;;;;;;;14885:37;;;;;;;;;;;;;;;;15613:35;;;;;;;;;;;;;;;;15101:37;;;;;;;;;;;;;;;;55115:175;;;;;;;;;;;;;:::i;21892:145::-;;;;;;;;;;-1:-1:-1;21892:145:0;;;;;:::i;:::-;-1:-1:-1;;;;;22002:18:0;;;21975:7;22002:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;21892:145;49765:114;;;;;;;;;;-1:-1:-1;49765:114:0;;;;;:::i;:::-;;:::i;50850:321::-;;;;;;;;;;-1:-1:-1;50850:321:0;;;;;:::i;:::-;;:::i;51488:436::-;;;;;;;;;;-1:-1:-1;51488:436:0;;;;;:::i;:::-;;:::i;14562:40::-;;;;;;;;;;;;;;;;54166:123;;;;;;;;;;-1:-1:-1;54166:123:0;;;;;:::i;:::-;;:::i;49992:93::-;;;;;;;;;;-1:-1:-1;49992:93:0;;;;;:::i;:::-;;:::i;57738:573::-;8359:6;;-1:-1:-1;;;;;8359:6:0;6033:10;8359:22;8351:67;;;;-1:-1:-1;;;8351:67:0;;;;;;;:::i;:::-;;;;;;;;;58033:2:::1;57928:102;58018:11:::0;57928:85:::1;57995:17:::0;57928:85;57971:18;57928:85;:17;57950:15;57928:21:::1;:38::i;:::-;:42:::0;::::1;:62::i;:102::-;:107;57920:152;;;::::0;-1:-1:-1;;;57920:152:0;;8770:2:1;57920:152:0::1;::::0;::::1;8752:21:1::0;;;8789:18;;;8782:30;8848:34;8828:18;;;8821:62;8900:18;;57920:152:0::1;8742:182:1::0;57920:152:0::1;58083:18;:38:::0;;;;58132:16:::1;:34:::0;;;;58177:19:::1;:40:::0;58228:18:::1;:38:::0;58277:12:::1;:26:::0;57738:573::o;22045:163::-;22122:4;22139:39;6033:10;22162:7;22171:6;22139:8;:39::i;:::-;-1:-1:-1;22196:4:0;22045:163;;;;;:::o;50609:107::-;8359:6;;-1:-1:-1;;;;;8359:6:0;6033:10;8359:22;8351:67;;;;-1:-1:-1;;;8351:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50683:18:0::1;;::::0;;;:9:::1;:18;::::0;;;;:25;;-1:-1:-1;;50683:25:0::1;50704:4;50683:25;::::0;;50609:107::o;58604:142::-;8359:6;;-1:-1:-1;;;;;8359:6:0;6033:10;8359:22;8351:67;;;;-1:-1:-1;;;8351:67:0;;;;;;;:::i;:::-;58702:17:::1;:36:::0;;-1:-1:-1;;;;;;58702:36:0::1;-1:-1:-1::0;;;;;58702:36:0;;;::::1;::::0;;;::::1;::::0;;58604:142::o;22216:312::-;22316:4;22333:36;22343:6;22351:9;22362:6;22333:9;:36::i;:::-;22380:118;22389:6;6033:10;22409:88;22447:6;22409:88;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22409:19:0;;;;;;:11;:19;;;;;;;;6033:10;22409:33;;;;;;;;;;:37;:88::i;:::-;22380:8;:118::i;:::-;-1:-1:-1;22516:4:0;22216:312;;;;;:::o;54297:108::-;8359:6;;-1:-1:-1;;;;;8359:6:0;6033:10;8359:22;8351:67;;;;-1:-1:-1;;;8351:67:0;;;;;;;:::i;:::-;54374:16:::1;:23:::0;;-1:-1:-1;;;;;;54374:23:0::1;-1:-1:-1::0;;;;;54374:23:0;;;::::1;::::0;;;::::1;::::0;;54297:108::o;51179:297::-;8359:6;;-1:-1:-1;;;;;8359:6:0;6033:10;8359:22;8351:67;;;;-1:-1:-1;;;8351:67:0;;;;;;;:::i;:::-;51290:1:::1;51272:15;:19;51264:61;;;::::0;-1:-1:-1;;;51264:61:0;;10990:2:1;51264:61:0::1;::::0;::::1;10972:21:1::0;11029:2;11009:18;;;11002:30;11068:31;11048:18;;;11041:59;11117:18;;51264:61:0::1;10962:179:1::0;51264:61:0::1;13874:24;51344:15;:26;;51336:87;;;;-1:-1:-1::0;;;51336:87:0::1;;;;;;;:::i;:::-;51434:16;:34:::0;51179:297::o;53821:337::-;8359:6;;-1:-1:-1;;;;;8359:6:0;6033:10;8359:22;8351:67;;;;-1:-1:-1;;;8351:67:0;;;;;;;:::i;:::-;53921:3:::1;53906:11;:18;;53898:81;;;::::0;-1:-1:-1;;;53898:81:0;;17708:2:1;53898:81:0::1;::::0;::::1;17690:21:1::0;17747:2;17727:18;;;17720:30;17786:34;17766:18;;;17759:62;-1:-1:-1;;;17837:18:1;;;17830:48;17895:19;;53898:81:0::1;17680:240:1::0;53898:81:0::1;54012:1;53998:11;:15;53990:75;;;::::0;-1:-1:-1;;;53990:75:0;;18548:2:1;53990:75:0::1;::::0;::::1;18530:21:1::0;18587:2;18567:18;;;18560:30;18626:34;18606:18;;;18599:62;-1:-1:-1;;;18677:18:1;;;18670:45;18732:19;;53990:75:0::1;18520:237:1::0;53990:75:0::1;54076:12;:26:::0;;;54118:32:::1;::::0;19671:25:1;;;54118:32:0::1;::::0;19659:2:1;19644:18;54118:32:0::1;;;;;;;;53821:337:::0;:::o;55805:102::-;8359:6;;-1:-1:-1;;;;;8359:6:0;6033:10;8359:22;8351:67;;;;-1:-1:-1;;;8351:67:0;;;;;;;:::i;:::-;55878:11:::1;:21:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;55878:21:0;;::::1;::::0;;;::::1;::::0;;55805:102::o;55919:165::-;8359:6;;-1:-1:-1;;;;;8359:6:0;6033:10;8359:22;8351:67;;;;-1:-1:-1;;;8351:67:0;;;;;;;:::i;:::-;56019:10:::1;:22:::0;;;;56052:11:::1;:24:::0;55919:165::o;51932:1881::-;8359:6;;-1:-1:-1;;;;;8359:6:0;6033:10;8359:22;8351:67;;;;-1:-1:-1;;;8351:67:0;;;;;;;:::i;:::-;52223:14:::1;52240:56;52279:16:::0;52240:34:::1;:15:::0;52260:13;52240:19:::1;:34::i;:56::-;52223:73:::0;-1:-1:-1;52317:30:0::1;:15:::0;52337:9;52317:19:::1;:30::i;:::-;52307:40;::::0;;::::1;:::i;:::-;::::0;-1:-1:-1;52358:15:0::1;52376:59;52417:17:::0;52376:36:::1;:16:::0;52397:14;52376:20:::1;:36::i;:59::-;52358:77:::0;-1:-1:-1;52457:32:0::1;:16:::0;52478:10;52457:20:::1;:32::i;:::-;52446:43;::::0;;::::1;:::i;:::-;;;52517:2;52508:6;:11;52500:61;;;::::0;-1:-1:-1;;;52500:61:0;;14871:2:1;52500:61:0::1;::::0;::::1;14853:21:1::0;14910:2;14890:18;;;14883:30;14949:34;14929:18;;;14922:62;-1:-1:-1;;;15000:18:1;;;14993:35;15045:19;;52500:61:0::1;14843:227:1::0;52500:61:0::1;52590:2;52580:7;:12;52572:61;;;::::0;-1:-1:-1;;;52572:61:0;;19322:2:1;52572:61:0::1;::::0;::::1;19304:21:1::0;19361:2;19341:18;;;19334:30;19400:34;19380:18;;;19373:62;-1:-1:-1;;;19451:18:1;;;19444:34;19495:19;;52572:61:0::1;19294:226:1::0;52572:61:0::1;52644:16;:34:::0;;;52689:14:::1;:30:::0;;;52730:17:::1;:36:::0;;;52777:16:::1;:34:::0;;;52822:10:::1;:22:::0;;;52855:17:::1;:36:::0;;;52902:15:::1;:32:::0;;;52945:18:::1;:38:::0;;;52994:17:::1;:36:::0;;;53041:11:::1;:24:::0;;;53086::::1;:43:::0;;;53140:22:::1;:39:::0;;;53190:25:::1;:45:::0;;;53246:24:::1;:43:::0;;;53300:18:::1;:31:::0;;;53342:25:::1;:45:::0;;;53398:23:::1;:41:::0;;;53450:26:::1;:47:::0;;;53508:25:::1;:45:::0;;;53564:19:::1;:33:::0;;;53623:182:::1;::::0;;21418:25:1;;;21474:2;21459:18;;21452:34;;;21502:18;;;21495:34;;;21560:2;21545:18;;21538:34;;;21603:3;21588:19;;21581:35;;;21647:3;21632:19;;21625:35;;;21691:3;21676:19;;21669:35;;;21735:3;21720:19;;21713:35;;;21779:3;21764:19;;21757:35;;;21823:3;21808:19;;21801:35;;;53623:182:0::1;::::0;21405:3:1;21390:19;53623:182:0::1;;;;;;;8429:1;;51932:1881:::0;;;;;;;;;;:::o;49644:113::-;8359:6;;-1:-1:-1;;;;;8359:6:0;6033:10;8359:22;8351:67;;;;-1:-1:-1;;;8351:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49715:27:0::1;;::::0;;;:18:::1;:27;::::0;;;;:34;;-1:-1:-1;;49715:34:0::1;49745:4;49715:34;::::0;;49644:113::o;50728:110::-;8359:6;;-1:-1:-1;;;;;8359:6:0;6033:10;8359:22;8351:67;;;;-1:-1:-1;;;8351:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50804:18:0::1;50825:5;50804:18:::0;;;:9:::1;:18;::::0;;;;:26;;-1:-1:-1;;50804:26:0::1;::::0;;50728:110::o;26032:1023::-;26079:7;26099:21;26153:13;;;;;;;;;-1:-1:-1;;;;;26153:13:0;-1:-1:-1;;;;;26138:36:0;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26099:78;;26195:21;26249:13;;;;;;;;;-1:-1:-1;;;;;26249:13:0;-1:-1:-1;;;;;26234:36:0;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26195:78;;26290:12;26304;26336:13;;;;;;;;;-1:-1:-1;;;;;26336:13:0;-1:-1:-1;;;;;26321:41:0;;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;26378:11:0;;26289:75;;-1:-1:-1;26289:75:0;-1:-1:-1;26378:11:0;;;;;26375:270;;;26445:13;;;;;;;;;-1:-1:-1;;;;;26445:13:0;-1:-1:-1;;;;;26430:36:0;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26406:63;;26530:13;;;;;;;;;-1:-1:-1;;;;;26530:13:0;-1:-1:-1;;;;;26515:36:0;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26491:63;;26605:13;;;;;;;;;-1:-1:-1;;;;;26605:13:0;-1:-1:-1;;;;;26590:41:0;;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;26574:59:0;-1:-1:-1;26574:59:0;-1:-1:-1;26375:270:0;26676:14;;26745:18;;-1:-1:-1;;;26745:18:0;;;;26742:94;;;26803:4;-1:-1:-1;;;;;26803:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;26780:44:0;;-1:-1:-1;;;;26742:94:0;26846:12;26942:6;-1:-1:-1;;;;;26942:15:0;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26934:26;;26913:6;-1:-1:-1;;;;;26913:15:0;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26901:30;;26905:26;;26901:2;:30;:::i;:::-;26862:37;26884:14;-1:-1:-1;;;;;26862:13:0;;:37;:::i;:::-;:70;;;;:::i;:::-;26861:99;;;;:::i;:::-;26846:114;-1:-1:-1;26980:18:0;-1:-1:-1;;;;;26985:13:0;;26846:114;26980:18;:::i;:::-;26973:26;;;;;;;;26032:1023;:::o;58323:123::-;8359:6;;-1:-1:-1;;;;;8359:6:0;6033:10;8359:22;8351:67;;;;-1:-1:-1;;;8351:67:0;;;;;;;:::i;:::-;58406:15:::1;:32:::0;58323:123::o;55675:122::-;8359:6;;-1:-1:-1;;;;;8359:6:0;6033:10;8359:22;8351:67;;;;-1:-1:-1;;;8351:67:0;;;;;;;:::i;:::-;55759:14:::1;:30:::0;55675:122::o;49887:97::-;8359:6;;-1:-1:-1;;;;;8359:6:0;6033:10;8359:22;8351:67;;;;-1:-1:-1;;;8351:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49955:13:0::1;49971:5;49955:13:::0;;;:4:::1;:13;::::0;;;;:21;;-1:-1:-1;;49955:21:0::1;::::0;;49887:97::o;56096:122::-;8359:6;;-1:-1:-1;;;;;8359:6:0;6033:10;8359:22;8351:67;;;;-1:-1:-1;;;8351:67:0;;;;;;;:::i;:::-;56180:17:::1;:30:::0;56096:122::o;58758:150::-;8359:6;;-1:-1:-1;;;;;8359:6:0;6033:10;8359:22;8351:67;;;;-1:-1:-1;;;8351:67:0;;;;;;;:::i;:::-;58860:19:::1;:40:::0;;-1:-1:-1;;;;;;58860:40:0::1;-1:-1:-1::0;;;;;58860:40:0;;;::::1;::::0;;;::::1;::::0;;58758:150::o;39968:196::-;40034:17;;-1:-1:-1;;;;;40034:17:0;6033:10;-1:-1:-1;;;;;40018:33:0;;40010:42;;;;;;40092:21;40124:32;40092:21;40124:12;:32::i;:::-;39968:196;:::o;21569:138::-;-1:-1:-1;;;;;21682:16:0;;21635:7;21682:16;;;:7;:16;;;;;;21662:37;;:19;:37::i;8446:148::-;8359:6;;-1:-1:-1;;;;;8359:6:0;6033:10;8359:22;8351:67;;;;-1:-1:-1;;;8351:67:0;;;;;;;:::i;:::-;8553:1:::1;8537:6:::0;;8516:40:::1;::::0;-1:-1:-1;;;;;8537:6:0;;::::1;::::0;8516:40:::1;::::0;8553:1;;8516:40:::1;8584:1;8567:19:::0;;-1:-1:-1;;;;;;8567:19:0::1;::::0;;8446:148::o;54413:245::-;8359:6;;-1:-1:-1;;;;;8359:6:0;6033:10;8359:22;8351:67;;;;-1:-1:-1;;;8351:67:0;;;;;;;:::i;:::-;54513:13:::1;:22:::0;;-1:-1:-1;;;;;54513:22:0;;::::1;-1:-1:-1::0;;;;;;54513:22:0;;::::1;::::0;::::1;::::0;;;54546:14:::1;:23:::0;;;;::::1;::::0;;;::::1;;::::0;;54580:29:::1;::::0;:14:::1;:29::i;:::-;54635:14;::::0;54620:30:::1;::::0;-1:-1:-1;;;;;54635:14:0::1;54620;:30::i;:::-;54413:245:::0;;:::o;50228:124::-;8359:6;;-1:-1:-1;;;;;8359:6:0;6033:10;8359:22;8351:67;;;;-1:-1:-1;;;8351:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50310:26:0::1;50339:5;50310:26:::0;;;:17:::1;:26;::::0;;;;:34;;-1:-1:-1;;50310:34:0::1;::::0;;50228:124::o;56667:159::-;8359:6;;-1:-1:-1;;;;;8359:6:0;6033:10;8359:22;8351:67;;;;-1:-1:-1;;;8351:67:0;;;;;;;:::i;:::-;56738:20:::1;::::0;;;::::1;;;56730:49;;;::::0;-1:-1:-1;;;56730:49:0;;10645:2:1;56730:49:0::1;::::0;::::1;10627:21:1::0;10684:2;10664:18;;;10657:30;-1:-1:-1;;;10703:18:1;;;10696:46;10759:18;;56730:49:0::1;10617:166:1::0;56730:49:0::1;56790:20;:28:::0;;-1:-1:-1;;56790:28:0::1;::::0;;56667:159::o;56498:157::-;8359:6;;-1:-1:-1;;;;;8359:6:0;6033:10;8359:22;8351:67;;;;-1:-1:-1;;;8351:67:0;;;;;;;:::i;:::-;56569:20:::1;::::0;;;::::1;;;56568:21;56560:49;;;::::0;-1:-1:-1;;;56560:49:0;;14527:2:1;56560:49:0::1;::::0;::::1;14509:21:1::0;14566:2;14546:18;;;14539:30;-1:-1:-1;;;14585:18:1;;;14578:45;14640:18;;56560:49:0::1;14499:165:1::0;56560:49:0::1;56620:20;:27:::0;;-1:-1:-1;;56620:27:0::1;::::0;::::1;::::0;;56498:157::o;57153:573::-;8359:6;;-1:-1:-1;;;;;8359:6:0;6033:10;8359:22;8351:67;;;;-1:-1:-1;;;8351:67:0;;;;;;;:::i;:::-;57448:2:::1;57343:102;57433:11:::0;57343:85:::1;57410:17:::0;57343:85;57386:18;57343:85;:17;57365:15;57343:21:::1;:38::i;:102::-;:107;57335:152;;;::::0;-1:-1:-1;;;57335:152:0;;8770:2:1;57335:152:0::1;::::0;::::1;8752:21:1::0;;;8789:18;;;8782:30;8848:34;8828:18;;;8821:62;8900:18;;57335:152:0::1;8742:182:1::0;57335:152:0::1;57498:18;:38:::0;;;;57547:16:::1;:34:::0;;;;57592:19:::1;:40:::0;57643:18:::1;:38:::0;57692:12:::1;:26:::0;57153:573::o;50364:111::-;8359:6;;-1:-1:-1;;;;;8359:6:0;6033:10;8359:22;8351:67;;;;-1:-1:-1;;;8351:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50440:20:0::1;;::::0;;;:11:::1;:20;::::0;;;;:27;;-1:-1:-1;;50440:27:0::1;50463:4;50440:27;::::0;;50364:111::o;58458:134::-;8359:6;;-1:-1:-1;;;;;8359:6:0;6033:10;8359:22;8351:67;;;;-1:-1:-1;;;8351:67:0;;;;;;;:::i;:::-;58552:15:::1;:32:::0;;-1:-1:-1;;;;;;58552:32:0::1;-1:-1:-1::0;;;;;58552:32:0;;;::::1;::::0;;;::::1;::::0;;58458:134::o;55298:139::-;8359:6;;-1:-1:-1;;;;;8359:6:0;6033:10;8359:22;8351:67;;;;-1:-1:-1;;;8351:67:0;;;;;;;:::i;:::-;55366:32:::1;55394:3;55366:23;55375:13;;55366:4;;:8;;:23;;;;:::i;:::-;:27:::0;::::1;:32::i;:::-;55350:13;:48:::0;;;55409:4:::1;:20:::0;55298:139::o;25610:367::-;25659:6;25667:3;25672:4;25678;25685:6;25719:14;25748:9;25772:14;25801;25830:22;25866:9;;;;;;;;;-1:-1:-1;;;;;25866:9:0;-1:-1:-1;;;;;25866:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25704:189;;;;-1:-1:-1;25704:189:0;;-1:-1:-1;25704:189:0;-1:-1:-1;25704:189:0;;-1:-1:-1;25610:367:0;-1:-1:-1;;;;;;25610:367:0:o;58920:239::-;59023:16;;58999:7;;-1:-1:-1;;;59023:16:0;;;;59019:98;;;-1:-1:-1;;;;;59085:19:0;;;;;;:10;:19;;;;;;59063:17;;:42;;:21;:42::i;59019:98::-;-1:-1:-1;;59134:17:0;;;58920:239::o;56995:146::-;8359:6;;-1:-1:-1;;;;;8359:6:0;6033:10;8359:22;8351:67;;;;-1:-1:-1;;;8351:67:0;;;;;;;:::i;:::-;57062:16:::1;::::0;-1:-1:-1;;;57062:16:0;::::1;;;57054:44;;;::::0;-1:-1:-1;;;57054:44:0;;9131:2:1;57054:44:0::1;::::0;::::1;9113:21:1::0;9170:2;9150:18;;;9143:30;-1:-1:-1;;;9189:18:1;;;9182:45;9244:18;;57054:44:0::1;9103:165:1::0;57054:44:0::1;57109:16;:24:::0;;-1:-1:-1;;57109:24:0::1;::::0;;56995:146::o;50097:123::-;8359:6;;-1:-1:-1;;;;;8359:6:0;6033:10;8359:22;8351:67;;;;-1:-1:-1;;;8351:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50179:26:0::1;;::::0;;;:17:::1;:26;::::0;;;;:33;;-1:-1:-1;;50179:33:0::1;50208:4;50179:33;::::0;;50097:123::o;59171:1328::-;59265:20;;59241:7;;59265:20;;;;;:41;;;;-1:-1:-1;59290:16:0;;-1:-1:-1;;;59290:16:0;;;;59289:17;59265:41;59261:1231;;;-1:-1:-1;;;;;59326:21:0;;;;;;:12;:21;;;;;;59350:15;-1:-1:-1;59323:172:0;;;-1:-1:-1;;;;;59413:21:0;;;;;;:12;:21;;;;;;59393:42;;:15;;:19;:42::i;59323:172::-;-1:-1:-1;59516:1:0;;59171:1328;-1:-1:-1;59171:1328:0:o;59261:1231::-;59581:20;;;;;;;:40;;;;-1:-1:-1;59605:16:0;;-1:-1:-1;;;59605:16:0;;;;59581:40;59577:915;;;-1:-1:-1;;;;;59664:19:0;;59687:1;59664:19;;;:10;:19;;;;;;59642:17;;:42;;:21;:42::i;:::-;:46;59638:763;;;-1:-1:-1;;;;;59713:21:0;;;;;;:12;:21;;;;;;59737:15;-1:-1:-1;59709:288:0;;;-1:-1:-1;;;;;59784:21:0;;;;;;:12;:21;;;;;;:42;;59810:15;59784:25;:42::i;59638:763::-;-1:-1:-1;;;;;60072:19:0;;;;;;:10;:19;;;;;;:31;;60096:6;60072:23;:31::i;:::-;60054:15;:49;60050:336;;;-1:-1:-1;60135:1:0;;59171:1328;-1:-1:-1;59171:1328:0:o;60050:336::-;-1:-1:-1;;;;;60276:19:0;;;;;;:10;:19;;;;;;60255:63;;60302:15;;60256:40;;60264:6;;60256:19;:40::i;:::-;60255:46;;:63::i;59577:915::-;59171:1328;;;:::o;21715:169::-;21795:4;21812:42;6033:10;21836:9;21847:6;21812:9;:42::i;56838:145::-;8359:6;;-1:-1:-1;;;;;8359:6:0;6033:10;8359:22;8351:67;;;;-1:-1:-1;;;8351:67:0;;;;;;;:::i;:::-;56905:16:::1;::::0;-1:-1:-1;;;56905:16:0;::::1;;;56904:17;56896:45;;;::::0;-1:-1:-1;;;56896:45:0;;14527:2:1;56896:45:0::1;::::0;::::1;14509:21:1::0;14566:2;14546:18;;;14539:30;-1:-1:-1;;;14585:18:1;;;14578:45;14640:18;;56896:45:0::1;14499:165:1::0;56896:45:0::1;56952:16;:23:::0;;-1:-1:-1;;56952:23:0::1;-1:-1:-1::0;;;56952:23:0::1;::::0;;56838:145::o;54666:260::-;8359:6;;-1:-1:-1;;;;;8359:6:0;6033:10;8359:22;8351:67;;;;-1:-1:-1;;;8351:67:0;;;;;;;:::i;:::-;54767:7:::1;::::0;;;::::1;;;:15;;54778:4;54767:15;54759:49;;;::::0;-1:-1:-1;;;54759:49:0;;11348:2:1;54759:49:0::1;::::0;::::1;11330:21:1::0;11387:2;11367:18;;;11360:30;-1:-1:-1;;;11406:18:1;;;11399:51;11467:18;;54759:49:0::1;11320:171:1::0;54759:49:0::1;54819:7;:15:::0;;-1:-1:-1;;54819:15:0::1;::::0;;54845:36:::1;54857:9:::0;54868:12;54845:11:::1;:36::i;:::-;54910:7;::::0;54897:21:::1;::::0;54910:7;;;::::1;;;7529:14:1::0;7522:22;7504:41;;54897:21:0::1;::::0;7492:2:1;7477:18;54897:21:0::1;;;;;;;54666:260:::0;;:::o;50487:114::-;8359:6;;-1:-1:-1;;;;;8359:6:0;6033:10;8359:22;8351:67;;;;-1:-1:-1;;;8351:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50565:20:0::1;50588:5;50565:20:::0;;;:11:::1;:20;::::0;;;;:28;;-1:-1:-1;;50565:28:0::1;::::0;;50487:114::o;55449:220::-;8359:6;;-1:-1:-1;;;;;8359:6:0;6033:10;8359:22;8351:67;;;;-1:-1:-1;;;8351:67:0;;;;;;;:::i;:::-;55551:1:::1;55536:12;:16;:39;;;;;55572:3;55556:12;:19;;55536:39;55528:94;;;::::0;-1:-1:-1;;;55528:94:0;;11698:2:1;55528:94:0::1;::::0;::::1;11680:21:1::0;11737:2;11717:18;;;11710:30;11776:34;11756:18;;;11749:62;-1:-1:-1;;;11827:18:1;;;11820:40;11877:19;;55528:94:0::1;11670:232:1::0;55528:94:0::1;55633:13;:28:::0;55449:220::o;27110:801::-;27174:7;27194:21;27248:13;;;;;;;;;-1:-1:-1;;;;;27248:13:0;-1:-1:-1;;;;;27233:36:0;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27194:78;;27290:21;27344:13;;;;;;;;;-1:-1:-1;;;;;27344:13:0;-1:-1:-1;;;;;27329:36:0;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27290:78;;27385:12;27399;27431:13;;;;;;;;;-1:-1:-1;;;;;27431:13:0;-1:-1:-1;;;;;27416:41:0;;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;27473:11:0;;27384:75;;-1:-1:-1;27384:75:0;-1:-1:-1;27473:11:0;;;;;27470:270;;;27540:13;;;;;;;;;-1:-1:-1;;;;;27540:13:0;-1:-1:-1;;;;;27525:36:0;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27501:63;;27625:13;;;;;;;;;-1:-1:-1;;;;;27625:13:0;-1:-1:-1;;;;;27610:36:0;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27586:63;;27700:13;;;;;;;;;-1:-1:-1;;;;;27700:13:0;-1:-1:-1;;;;;27685:41:0;;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;27669:59:0;-1:-1:-1;27669:59:0;-1:-1:-1;27470:270:0;27752:9;27774:6;-1:-1:-1;;;;;27774:15:0;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27770:21;;:2;:21;:::i;:::-;27764:28;;-1:-1:-1;;;;;27764:28:0;;;:::i;:::-;27752:40;;27835:6;-1:-1:-1;;;;;27835:15:0;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27831:21;;:2;:21;:::i;:::-;27825:28;;-1:-1:-1;;;;;27825:28:0;;;:::i;:::-;27811:11;27818:4;27811:6;:11;:::i;:::-;27810:44;;;;:::i;:::-;27803:52;27110:801;-1:-1:-1;;;;;;;27110:801:0:o;39763:197::-;39829:17;;-1:-1:-1;;;;;39829:17:0;6033:10;-1:-1:-1;;;;;39813:33:0;;39805:42;;;;;;39858:23;39884:24;39902:4;39884:9;:24::i;:::-;39858:50;;39919:33;39936:15;39919:16;:33::i;54934:173::-;8359:6;;-1:-1:-1;;;;;8359:6:0;6033:10;8359:22;8351:67;;;;-1:-1:-1;;;8351:67:0;;;;;;;:::i;:::-;55003:18:::1;::::0;-1:-1:-1;;;55003:18:0;::::1;;;:27;54995:68;;;::::0;-1:-1:-1;;;54995:68:0;;17351:2:1;54995:68:0::1;::::0;::::1;17333:21:1::0;17390:2;17370:18;;;17363:30;17429;17409:18;;;17402:58;17477:18;;54995:68:0::1;17323:178:1::0;54995:68:0::1;55074:18;:25:::0;;-1:-1:-1;;;;55074:25:0::1;-1:-1:-1::0;;;55074:25:0::1;::::0;;54934:173::o;55115:175::-;8359:6;;-1:-1:-1;;;;;8359:6:0;6033:10;8359:22;8351:67;;;;-1:-1:-1;;;8351:67:0;;;;;;;:::i;:::-;55185:18:::1;::::0;-1:-1:-1;;;55185:18:0;::::1;;;:26;;55207:4;55185:26;55177:68;;;::::0;-1:-1:-1;;;55177:68:0;;12109:2:1;55177:68:0::1;::::0;::::1;12091:21:1::0;12148:2;12128:18;;;12121:30;12187:31;12167:18;;;12160:59;12236:18;;55177:68:0::1;12081:179:1::0;55177:68:0::1;55256:18;:26:::0;;-1:-1:-1;;;;55256:26:0::1;::::0;;55115:175::o;49765:114::-;8359:6;;-1:-1:-1;;;;;8359:6:0;6033:10;8359:22;8351:67;;;;-1:-1:-1;;;8351:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49836:27:0::1;49866:5;49836:27:::0;;;:18:::1;:27;::::0;;;;:35;;-1:-1:-1;;49836:35:0::1;::::0;;49765:114::o;50850:321::-;8359:6;;-1:-1:-1;;;;;8359:6:0;6033:10;8359:22;8351:67;;;;-1:-1:-1;;;8351:67:0;;;;;;;:::i;:::-;50949:1:::1;50935:11;:15;50927:57;;;::::0;-1:-1:-1;;;50927:57:0;;10990:2:1;50927:57:0::1;::::0;::::1;10972:21:1::0;11029:2;11009:18;;;11002:30;11068:31;11048:18;;;11041:59;11117:18;;50927:57:0::1;10962:179:1::0;50927:57:0::1;13874:24;51003:11;:22;;50995:83;;;;-1:-1:-1::0;;;50995:83:0::1;;;;;;;:::i;:::-;51089:12;:26:::0;;;51131:32:::1;::::0;19671:25:1;;;51131:32:0::1;::::0;19659:2:1;19644:18;51131:32:0::1;19626:76:1::0;51488:436:0;8359:6;;-1:-1:-1;;;;;8359:6:0;6033:10;8359:22;8351:67;;;;-1:-1:-1;;;8351:67:0;;;;;;;:::i;:::-;51619:52:::1;51660:10:::0;51619:36:::1;:16:::0;51640:14;51619:20:::1;:36::i;:52::-;51675:2;51619:58;51611:100;;;::::0;-1:-1:-1;;;51611:100:0;;18964:2:1;51611:100:0::1;::::0;::::1;18946:21:1::0;19003:2;18983:18;;;18976:30;19042:31;19022:18;;;19015:59;19091:18;;51611:100:0::1;18936:179:1::0;51611:100:0::1;51722:17;:36:::0;;;51769:15:::1;:32:::0;;;51812:11:::1;:24:::0;;;51852:64;;20897:25:1;;;20953:2;20938:18;;20931:34;;;20981:18;;;20974:34;;;51852:64:0::1;::::0;20885:2:1;20870:18;51852:64:0::1;;;;;;;51488:436:::0;;;:::o;54166:123::-;8359:6;;-1:-1:-1;;;;;8359:6:0;6033:10;8359:22;8351:67;;;;-1:-1:-1;;;8351:67:0;;;;;;;:::i;:::-;54259:14:::1;:3:::0;54267:5:::1;54259:7;:14::i;:::-;54238;:36:::0;-1:-1:-1;54166:123:0:o;49992:93::-;8359:6;;-1:-1:-1;;;;;8359:6:0;6033:10;8359:22;8351:67;;;;-1:-1:-1;;;8351:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50057:13:0::1;;::::0;;;:4:::1;:13;::::0;;;;:20;;-1:-1:-1;;50057:20:0::1;50073:4;50057:20;::::0;;49992:93::o;7542:132::-;7600:7;7627:39;7631:1;7634;7627:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;7620:46;7542:132;-1:-1:-1;;;7542:132:0:o;6759:179::-;6817:7;;6849:5;6853:1;6849;:5;:::i;:::-;6837:17;;6878:1;6873;:6;;6865:46;;;;-1:-1:-1;;;6865:46:0;;10289:2:1;6865:46:0;;;10271:21:1;10328:2;10308:18;;;10301:30;10367:29;10347:18;;;10340:57;10414:18;;6865:46:0;10261:177:1;25216:335:0;-1:-1:-1;;;;;25309:19:0;;25301:68;;;;-1:-1:-1;;;25301:68:0;;16946:2:1;25301:68:0;;;16928:21:1;16985:2;16965:18;;;16958:30;17024:34;17004:18;;;16997:62;-1:-1:-1;;;17075:18:1;;;17068:34;17119:19;;25301:68:0;16918:226:1;25301:68:0;-1:-1:-1;;;;;25388:21:0;;25380:68;;;;-1:-1:-1;;;25380:68:0;;9886:2:1;25380:68:0;;;9868:21:1;9925:2;9905:18;;;9898:30;9964:34;9944:18;;;9937:62;-1:-1:-1;;;10015:18:1;;;10008:32;10057:19;;25380:68:0;9858:224:1;25380:68:0;-1:-1:-1;;;;;25459:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;25511:32;;19671:25:1;;;25511:32:0;;19644:18:1;25511:32:0;;;;;;;25216:335;;;:::o;32514:4679::-;-1:-1:-1;;;;;32602:18:0;;32594:68;;;;-1:-1:-1;;;32594:68:0;;16540:2:1;32594:68:0;;;16522:21:1;16579:2;16559:18;;;16552:30;16618:34;16598:18;;;16591:62;-1:-1:-1;;;16669:18:1;;;16662:35;16714:19;;32594:68:0;16512:227:1;32594:68:0;-1:-1:-1;;;;;32681:16:0;;32673:64;;;;-1:-1:-1;;;32673:64:0;;8366:2:1;32673:64:0;;;8348:21:1;8405:2;8385:18;;;8378:30;8444:34;8424:18;;;8417:62;-1:-1:-1;;;8495:18:1;;;8488:33;8538:19;;32673:64:0;8338:225:1;32673:64:0;32765:1;32756:6;:10;32748:64;;;;-1:-1:-1;;;32748:64:0;;14117:2:1;32748:64:0;;;14099:21:1;14156:2;14136:18;;;14129:30;14195:34;14175:18;;;14168:62;-1:-1:-1;;;14246:18:1;;;14239:39;14295:19;;32748:64:0;14089:231:1;32748:64:0;32840:4;32865:28;;:::i;:::-;8270:7;8297:6;-1:-1:-1;;;;;32910:15:0;;;8297:6;;32910:15;;;;:32;;-1:-1:-1;8270:7:0;8297:6;-1:-1:-1;;;;;32929:13:0;;;8297:6;;32929:13;;32910:32;:44;;;;-1:-1:-1;32947:7:0;;;;;;;32946:8;32910:44;:72;;;;-1:-1:-1;;;;;;32959:23:0;;;;;;:17;:23;;;;;;;;32958:24;32910:72;:98;;;;-1:-1:-1;;;;;;32987:21:0;;;;;;:17;:21;;;;;;;;32986:22;32910:98;:123;;;;-1:-1:-1;;;;;;33012:21:0;;33028:4;33012:21;;32910:123;:146;;;;-1:-1:-1;;;;;;33037:19:0;;33051:4;33037:19;;32910:146;32906:3729;;;33081:11;;;;33073:20;;;;;;33120:13;;-1:-1:-1;;;;;33112:21:0;;;33120:13;;33112:21;;;;:47;;-1:-1:-1;33145:14:0;;-1:-1:-1;;;;;33137:22:0;;;33145:14;;33137:22;;33112:47;33108:119;;;33198:12;;33188:6;:22;;33180:31;;;;;;33254:13;;-1:-1:-1;;;;;33246:21:0;;;33254:13;;33246:21;;:42;;-1:-1:-1;;;;;;33271:17:0;;;;;;:11;:17;;;;;;;;33246:42;33245:78;;;;-1:-1:-1;33307:15:0;;-1:-1:-1;;;;;33293:30:0;;;33307:15;;33293:30;;33245:78;:98;;;;-1:-1:-1;;;;;;33328:15:0;;;;;;:11;:15;;;;;;;;33327:16;33245:98;33241:729;;;33409:10;;33393:11;;:27;;:15;:27::i;:::-;33374:15;:46;;:71;;;;-1:-1:-1;33432:13:0;;-1:-1:-1;;;;;33424:21:0;;;33432:13;;33424:21;;33374:71;:97;;;;-1:-1:-1;33457:14:0;;-1:-1:-1;;;;;33449:22:0;;;33457:14;;33449:22;;33374:97;33370:161;;;-1:-1:-1;;;;;33496:8:0;;;;;;:4;:8;;;;;:15;;-1:-1:-1;;33496:15:0;33507:4;33496:15;;;33370:161;33587:29;;-1:-1:-1;;;33587:29:0;;;;;19671:25:1;;;33567:17:0;;33587:4;;:21;;19644:18:1;;33587:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33567:49;;33674:10;;33661:9;:23;;33653:80;;;;-1:-1:-1;;;33653:80:0;;12941:2:1;33653:80:0;;;12923:21:1;12980:2;12960:18;;;12953:30;13019:34;12999:18;;;12992:62;-1:-1:-1;;;13070:18:1;;;13063:42;13122:19;;33653:80:0;12913:234:1;33653:80:0;33789:16;;33760:25;33778:6;33760:13;33770:2;33760:9;:13::i;:25::-;:45;;33752:123;;;;-1:-1:-1;;;33752:123:0;;;;;;;:::i;:::-;33925:11;:9;:11::i;:::-;33912:24;;33241:729;;34003:6;;;;;;;34002:7;:32;;;;-1:-1:-1;34021:13:0;;-1:-1:-1;;;;;34013:21:0;;;34021:13;;34013:21;;34002:32;:54;;;;-1:-1:-1;;;;;;34039:17:0;;;;;;:11;:17;;;;;;;;34038:18;34002:54;33998:2626;;;-1:-1:-1;;;;;34105:10:0;;;;;;:4;:10;;;;;;;;34104:11;:24;;;;-1:-1:-1;;;;;;34120:8:0;;;;;;:4;:8;;;;;;;;34119:9;34104:24;34096:33;;;;;;-1:-1:-1;;;;;34171:15:0;;;;;;:9;:15;;;;;;;;34170:16;:34;;;;-1:-1:-1;;;;;;34191:13:0;;;;;;:9;:13;;;;;;;;34190:14;34170:34;34166:2443;;;34240:13;;-1:-1:-1;;;;;34234:19:0;;;34240:13;;34234:19;;:38;;-1:-1:-1;;;;;;34257:15:0;;;;;;:11;:15;;;;;;;;34234:38;34233:64;;;;-1:-1:-1;34277:20:0;;;;;;;34233:64;34229:250;;;-1:-1:-1;;;;;34334:18:0;;;;;;:12;:18;;;;;;34355:15;-1:-1:-1;34326:45:0;;;;;;34439:15;;34419:36;;:15;;:19;:36::i;:::-;-1:-1:-1;;;;;34398:18:0;;;;;;:12;:18;;;;;:57;34229:250;34543:29;;-1:-1:-1;;;34543:29:0;;;;;19671:25:1;;;34523:17:0;;34543:4;;:21;;19644:18:1;;34543:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34523:49;;34638:11;;34625:9;:24;;34617:85;;;;-1:-1:-1;;;34617:85:0;;16123:2:1;34617:85:0;;;16105:21:1;16162:2;16142:18;;;16135:30;16201:34;16181:18;;;16174:62;-1:-1:-1;;;16252:18:1;;;16245:46;16308:19;;34617:85:0;16095:238:1;34617:85:0;34750:16;;-1:-1:-1;;;34750:16:0;;;;34747:649;;;-1:-1:-1;;;;;34818:16:0;;;;;;:10;:16;;;;;;34839:6;;34798:37;;:15;;:19;:37::i;:::-;:48;34795:197;;;-1:-1:-1;;;;;34879:16:0;;;;;;:10;:16;;;;;;;;34898:15;34879:34;;34944:10;:16;;;;;:20;34795:197;35061:17;;-1:-1:-1;;;;;35026:16:0;;;;;;:10;:16;;;;;;:31;;35047:9;35026:20;:31::i;:::-;:52;;35018:117;;;;-1:-1:-1;;;35018:117:0;;18127:2:1;35018:117:0;;;18109:21:1;18166:2;18146:18;;;18139:30;18205:34;18185:18;;;18178:62;-1:-1:-1;;;18256:18:1;;;18249:50;18316:19;;35018:117:0;18099:242:1;35018:117:0;-1:-1:-1;;;;;35162:16:0;;;;;;:10;:16;;;;;:29;;35182:9;;35162:16;:29;;35182:9;;35162:29;:::i;:::-;;;;-1:-1:-1;34747:649:0;;-1:-1:-1;34747:649:0;;35290:17;;35277:9;:30;;35269:103;;;;-1:-1:-1;;;35269:103:0;;15277:2:1;35269:103:0;;;15259:21:1;15316:2;15296:18;;;15289:30;15355:34;15335:18;;;15328:62;15426:30;15406:18;;;15399:58;15474:19;;35269:103:0;15249:250:1;35269:103:0;35487:12;;35468:13;;35458:51;;35505:3;;35458:42;;35487:12;35458:24;;-1:-1:-1;;;;;35468:13:0;35458:9;:24::i;:::-;:28;;:42::i;:51::-;35448:6;:61;;35440:70;;;;;;35586:13;;-1:-1:-1;;;;;35580:19:0;;;35586:13;;35580:19;;;;:39;;-1:-1:-1;;;;;;35604:15:0;;;;;;:11;:15;;;;;;;;35603:16;35580:39;35577:218;;;35685:16;;35656:25;35674:6;35656:13;35666:2;35656:9;:13::i;:25::-;:45;;35648:123;;;;-1:-1:-1;;;35648:123:0;;;;;;;:::i;:::-;35832:11;:9;:11::i;:::-;35819:24;;35888:28;35919:24;35937:4;35919:9;:24::i;:::-;35888:55;-1:-1:-1;35970:24:0;;35966:393;;36025:20;36048:127;36096:78;36162:11;;36096:61;36139:17;;36096:38;36116:17;;36096:15;;:19;;:38;;;;:::i;:78::-;36048:17;;:43;;36070:20;36048:21;:43::i;:127::-;36025:150;;36202:28;36217:12;36202:14;:28::i;:::-;36279:56;36296:38;:20;36321:12;36296:24;:38::i;:::-;36279:16;:56::i;:::-;35966:393;;36410:21;36458:22;;36454:114;;36509:35;36522:21;36509:12;:35::i;:::-;34166:2443;;;;-1:-1:-1;;;;;36651:24:0;;;;;;:18;:24;;;;;;;;;:50;;-1:-1:-1;;;;;;36679:22:0;;;;;;:18;:22;;;;;;;;36651:50;:61;;;-1:-1:-1;36705:7:0;;;;;;;36651:61;:78;;;-1:-1:-1;;;;;;36716:13:0;;;;;;:9;:13;;;;;;;;36651:78;:97;;;-1:-1:-1;;;;;;36733:15:0;;;;;;:9;:15;;;;;;;;36651:97;36647:175;;;36765:15;:13;:15::i;:::-;36805:5;36795:15;;36647:175;-1:-1:-1;;;;;36838:10:0;;;;;;:4;:10;;;;;;;;;:22;;-1:-1:-1;;;;;;36852:8:0;;;;;;:4;:8;;;;;;;;36838:22;36834:125;;;36877:15;:13;:15::i;:::-;36907:11;24001:16;;;23974:24;:43;;;24053:14;;;24028:22;:39;24106:17;;;24078:25;:45;24155:10;;;24134:18;:31;24206:17;;;24178:25;:45;24260:15;;;24234:23;:41;24315:18;;;24286:26;:47;24366:11;;;24344:19;:33;24390:21;;;;24422:19;;;;-1:-1:-1;24452:21:0;;;;24484:14;;;;24511:22;;;24544:20;;;;24575:22;;;24608:15;;23934:697;36907:11;36943:4;36933:14;;36834:125;36975:7;;;;;;;36971:115;;;8270:7;8297:6;-1:-1:-1;;;;;37007:15:0;;;8297:6;;37007:15;;:40;;-1:-1:-1;37034:13:0;;-1:-1:-1;;;;;37026:21:0;;;37034:13;;37026:21;37007:40;:66;;;-1:-1:-1;37059:14:0;;-1:-1:-1;;;;;37051:22:0;;;37059:14;;37051:22;37007:66;36999:75;;;;;;37106:53;37121:4;37127:2;37131:6;37139:7;37148:10;37106:14;:53::i;:::-;37170:15;:13;:15::i;:::-;32514:4679;;;;;:::o;7090:190::-;7176:7;7212:12;7204:6;;;;7196:29;;;;-1:-1:-1;;;7196:29:0;;;;;;;;:::i;:::-;-1:-1:-1;7236:9:0;7248:5;7252:1;7248;:5;:::i;:::-;7236:17;7090:190;-1:-1:-1;;;;;7090:190:0:o;39018:367::-;39075:17;;39113;;-1:-1:-1;;;;;39075:17:0;;;;:66;;39102:38;;39136:3;;39102:29;;:6;;:10;:29::i;:38::-;39075:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39152:15:0;;39188;;-1:-1:-1;;;;;39152:15:0;;;;:62;;39177:36;;39209:3;;39177:27;;:6;;:10;:27::i;:36::-;39152:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39225:19:0;;39265:11;;-1:-1:-1;;;;;39225:19:0;;;;:62;;39254:32;;39282:3;;39254:23;;:6;;:10;:23::i;:32::-;39225:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17970:42:0;39298:79;39328:48;39372:3;39328:39;:6;16807:1;39328:10;:39::i;:48::-;39298:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22536:253;22604:7;22643;;22632;:18;;22624:72;;;;-1:-1:-1;;;22624:72:0;;9475:2:1;22624:72:0;;;9457:21:1;9514:2;9494:18;;;9487:30;9553:34;9533:18;;;9526:62;-1:-1:-1;;;9604:18:1;;;9597:40;9654:19;;22624:72:0;9447:232:1;22624:72:0;22707:19;22729:10;:8;:10::i;:::-;22707:32;-1:-1:-1;22757:24:0;:7;22707:32;22757:11;:24::i;7288:246::-;7346:7;7370:6;7366:47;;-1:-1:-1;7400:1:0;7393:8;;7366:47;7423:9;7435:5;7439:1;7435;:5;:::i;:::-;7423:17;-1:-1:-1;7468:1:0;7459:5;7463:1;7423:17;7459:5;:::i;:::-;:10;7451:56;;;;-1:-1:-1;;;7451:56:0;;13354:2:1;7451:56:0;;;13336:21:1;13393:2;13373:18;;;13366:30;13432:34;13412:18;;;13405:62;-1:-1:-1;;;13483:18:1;;;13476:31;13524:19;;7451:56:0;13326:223:1;6946:136:0;7004:7;7031:43;7035:1;7038;7031:43;;;;;;;;;;;;;;;;;:3;:43::i;39393:362::-;39474:20;39497:4;-1:-1:-1;;;;;39497:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39528:13;:28;;;39474:43;-1:-1:-1;39574:40:0;39610:3;39574:31;39474:43;39544:12;39574:16;:31::i;:40::-;39567:4;:47;;;39625:13;:20;-1:-1:-1;;39670:15:0;-1:-1:-1;39656:29:0;39696:10;:22;39729:11;:18;;-1:-1:-1;;39729:18:0;39743:4;39729:18;;;39393:362::o;37201:407::-;19809:6;:13;;-1:-1:-1;;19809:13:0;;;;;37303:16:::1;::::0;;37317:1:::1;37303:16:::0;;;;;::::1;::::0;;-1:-1:-1;;37303:16:0::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;37303:16:0::1;37279:40;;37348:4;37330;37335:1;37330:7;;;;;;-1:-1:-1::0;;;37330:7:0::1;;;;;;;;;-1:-1:-1::0;;;;;37330:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;;:23;;;;37374:15:::1;::::0;:22:::1;::::0;;-1:-1:-1;;;37374:22:0;;;;:15;;;::::1;::::0;:20:::1;::::0;:22:::1;::::0;;::::1;::::0;37330:7;;37374:22;;;;;:15;:22;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37364:4;37369:1;37364:7;;;;;;-1:-1:-1::0;;;37364:7:0::1;;;;;;;;;-1:-1:-1::0;;;;;37364:32:0;;::::1;:7;::::0;;::::1;::::0;;;;;:32;37439:15:::1;::::0;37407:62:::1;::::0;37424:4:::1;::::0;37439:15:::1;37457:11:::0;37407:8:::1;:62::i;:::-;37480:15;::::0;:120:::1;::::0;-1:-1:-1;;;37480:120:0;;-1:-1:-1;;;;;37480:15:0;;::::1;::::0;:66:::1;::::0;:120:::1;::::0;37547:11;;37480:15:::1;::::0;37563:4;;37577::::1;::::0;37584:15:::1;::::0;37480:120:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;19845:6:0;:14;;-1:-1:-1;;19845:14:0;;;-1:-1:-1;;;;37201:407:0:o;7682:189::-;7768:7;7803:12;7796:5;7788:28;;;;-1:-1:-1;;;7788:28:0;;;;;;;;:::i;:::-;-1:-1:-1;7827:9:0;7839:5;7843:1;7839;:5;:::i;27923:4579::-;27960:17;;:::i;:::-;28000:28;;:::i;:::-;28076:14;;28049:41;;28130:16;;28101:26;;;;:45;;;;28186:16;;28157:26;;;:45;28243:17;;28213:27;;;;:47;;;;28294:10;;28271:20;;;:33;28353:15;;28325:25;;;:43;28409:17;;28379:27;;;:47;28467:17;;28437:27;;;:47;28526:18;;28495:28;;;:49;28579:11;;28555:21;;;:35;28634:20;;-1:-1:-1;;;28634:20:0;;;;28049:24;;28634:4;;:18;;:20;;;;;28101:26;28634:20;;;;;:4;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28611:43;;28689:21;;28670:15;:40;;:80;;;;;28733:17;;28714:15;:36;;28670:80;28667:1336;;;28794:1;28767:28;;;28810:26;;;;:30;;;28855:26;;;:30;;;28900:27;;;:31;;;28946:20;;;:24;;;;29027:16;28999:25;;;:44;29088:18;;29058:27;;;:48;29151:18;;29121:27;;;:48;29215:19;;29184:28;;;:50;29273:12;;29249:21;;;:36;28667:1336;;;29334:17;;29316:15;:35;:72;;;;;29374:14;;29355:15;:33;;29316:72;29312:691;;;29432:14;;29405:41;;29490:16;;29461:26;;;:45;29550:16;;29521:26;;;:45;29611:17;;29581:27;;;:47;29666:10;;29643:20;;;:33;29733:16;;29705:25;;;:44;29794:18;;29764:27;;;:48;29857:18;;29827:27;;;:48;29921:19;;29890:28;;;:50;29979:12;;29955:21;;;:36;29312:691;30035:17;;30017:15;:35;:57;;;;-1:-1:-1;30056:18:0;;;;30017:57;30013:116;;;30091:18;:26;;-1:-1:-1;;30091:26:0;;;30013:116;30158:56;30210:3;30158:47;30176:28;30193:10;;30184:3;30176:16;;:28;;;;:::i;:::-;30158:13;;;:17;:47::i;:56::-;30143:12;:71;:86;;;;-1:-1:-1;30219:10:0;;;;30218:11;30143:86;:109;;;;-1:-1:-1;30234:18:0;;;;30233:19;30143:109;30139:159;;;30269:10;:17;;-1:-1:-1;;30269:17:0;30282:4;30269:17;;;30139:159;30328:13;;30312:12;:29;30308:2068;;30385:14;;30358:41;;30443:16;;30414:26;;;;:45;;;;30503:16;;30474:26;;;:45;30564:17;;30534:27;;;:47;30619:10;;30596:20;;;:33;30682:16;30654:25;;;:44;30743:18;;30713:27;;;:48;30806:18;;30776:27;;;:48;30870:19;;30839:28;;;:50;30928:12;;30904:21;;;:36;30991:21;;30972:15;:40;;;;:80;;;31035:17;;31016:15;:36;;30972:80;30969:678;;;31100:1;31073:28;;;31120:26;;;;:30;;;31169:26;;;:30;;;31218:27;;;:31;;;31268:20;;;:24;;;;31357:16;31329:25;;;:44;31422:18;;31392:27;;;:48;31489:18;;31459:27;;;:48;31557:19;;31526:28;;;:50;31619:12;;31595:21;;;:36;30969:678;31665:18;;;;31664:19;:33;;;;-1:-1:-1;31687:10:0;;;;31664:33;31661:704;;;31718:17;:15;:17::i;:::-;31781:1;31754:28;;;31801:26;;;;:30;;;31850:26;;;:30;;;31899:27;;;:31;;;31949:20;;;:24;;;;32038:16;32010:25;;;:44;32103:18;;32073:27;;;:48;32170:18;;32140:27;;;:48;32238:19;;32207:28;;;:50;32300:12;;32276:21;;;:36;32331:10;:18;;-1:-1:-1;;32331:18:0;;;31661:704;32405:4;;32390:12;:19;32386:71;;;32426:4;:19;;;32386:71;-1:-1:-1;32484:10:0;27923:4579;-1:-1:-1;27923:4579:0:o;38090:920::-;19809:6;:13;;-1:-1:-1;;19809:13:0;;;;;;38241:27:::1;:20:::0;38266:1:::1;38241:24;:27::i;:::-;38226:42:::0;-1:-1:-1;38279:17:0::1;38299:30;:20:::0;38226:42;38299:24:::1;:30::i;:::-;38279:50:::0;-1:-1:-1;38632:21:0::1;38698:22;38715:4:::0;38698:16:::1;:22::i;:::-;38851:18;38872:41;:21;38898:14:::0;38872:25:::1;:41::i;:::-;38851:62;;38967:35;38980:9;38991:10;38967:12;:35::i;:::-;-1:-1:-1::0;;19845:6:0;:14;;-1:-1:-1;;19845:14:0;;;-1:-1:-1;;;38090:920:0:o;24643:565::-;24706:24;;24687:16;:43;24758:22;;24741:14;:39;24811:25;;24791:17;:45;24866:24;;24847:16;:43;24914:18;;24901:10;:31;24965:25;;24945:17;:45;25019:23;;25001:15;:41;25074:26;;25053:18;:47;25131:25;;25111:17;:45;25181:19;;25167:11;:33;24643:565::o;40172:920::-;40315:7;40310:526;;40371:1;40344:28;;;40391:26;;;:30;;;40440:26;;;:30;;;40489:27;;;:31;;;40539:20;;;:24;;;40600:25;;;:29;;;40648:27;;;:31;;;40698:27;;;:31;;;40748:28;;;:32;;;40799:21;;;:25;40310:526;40860:13;;-1:-1:-1;;;;;40850:23:0;;;40860:13;;40850:23;;:46;;-1:-1:-1;;;;;;40877:19:0;;;;;;:11;:19;;;;;;;;40850:46;40846:239;;;40912:59;40933:6;40941:9;40952:6;40960:10;40912:20;:59::i;:::-;40846:239;;;41013:60;41035:6;41043:9;41054:6;41062:10;41013:21;:60::i;48989:164::-;49031:7;49052:15;49069;49088:19;:17;:19::i;:::-;49051:56;;-1:-1:-1;49051:56:0;-1:-1:-1;49125:20:0;49051:56;;49125:11;:20::i;:::-;49118:27;;;;48989:164;:::o;56230:260::-;56300:15;56276:21;:39;;;56326:18;:25;;-1:-1:-1;;56326:25:0;56347:4;56326:25;;;56402:14;;56382:35;;56300:15;56382:19;:35::i;:::-;56362:17;:55;;;56467:14;;56445:37;;56362:55;56445:21;:37::i;:::-;56428:14;:54;56230:260::o;37620:460::-;37733:15;;37701:62;;37718:4;;-1:-1:-1;;;;;37733:15:0;37751:11;37701:8;:62::i;:::-;37806:15;;-1:-1:-1;;;;;37806:15:0;:31;37845:9;37880:4;37902:11;37806:15;;38020:7;8270;8297:6;-1:-1:-1;;;;;8297:6:0;;8232:79;38020:7;37806:266;;;;;;-1:-1:-1;;;;;;37806:266:0;;;-1:-1:-1;;;;;7111:15:1;;;37806:266:0;;;7093:34:1;7143:18;;;7136:34;;;;7186:18;;;7179:34;;;;7229:18;;;7222:34;7293:15;;;7272:19;;;7265:44;38044:15:0;7325:19:1;;;7318:35;7027:19;;37806:266:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;41100:658::-;41231:24;;:::i;:::-;41276:34;41290:7;41299:10;41276:13;:34::i;:::-;41359:15;;;;-1:-1:-1;;;;;41339:15:0;;;;;;:7;:15;;;;;;41266:44;;-1:-1:-1;41339:36:0;;:15;:19;:36::i;:::-;-1:-1:-1;;;;;41321:15:0;;;;;;;:7;:15;;;;;;:54;;;;41430:23;;;;41407:18;;;;;;;;;;:47;;:22;:47::i;:::-;-1:-1:-1;;;;;41386:18:0;;;;;;:7;:18;;;;;;;;:68;;;;41478:16;;;41465:30;;:12;:30::i;:::-;41506:34;41521:7;:18;;;41506:14;:34::i;:::-;41551:53;41563:7;:19;;;41584:7;:19;;;41551:11;:53::i;:::-;41615:34;41630:7;:18;;;41615:14;:34::i;:::-;41660:22;41669:7;:12;;;41660:8;:22::i;:::-;41715:9;-1:-1:-1;;;;;41698:52:0;41707:6;-1:-1:-1;;;;;41698:52:0;;41726:7;:23;;;41698:52;;;;19671:25:1;;19659:2;19644:18;;19626:76;41698:52:0;;;;;;;;41100:658;;;;;:::o;41766:808::-;41898:25;;:::i;:::-;41945:35;41960:7;41969:10;41945:14;:35::i;:::-;42029:16;;;;-1:-1:-1;;;;;42009:15:0;;;;;;:7;:15;;;;;;41934:46;;-1:-1:-1;42009:37:0;;:15;:19;:37::i;:::-;-1:-1:-1;;;;;41991:15:0;;;;;;;:7;:15;;;;;;:55;;;;42101:24;;;;42078:18;;;;;;;;;;:48;;:22;:48::i;:::-;-1:-1:-1;;;;;42057:18:0;;;;;;:7;:18;;;;;:69;;;;18180:42;42141:25;42137:127;;;42227:24;;-1:-1:-1;;;;;42204:18:0;;42227:24;42204:18;;;:7;:18;;;;;;:48;;:22;:48::i;:::-;-1:-1:-1;;;;;42183:18:0;;;;;;:7;:18;;;;;:69;42137:127;42274:31;42287:8;:17;;;42274:12;:31::i;49161:475::-;49259:7;;18180:42;49212:7;49317:21;;;:7;:21;;;;49212:7;;;;13874:24;;49317:31;-1:-1:-1;49317:31:0;:66;;-1:-1:-1;18180:42:0;49352:21;;:7;:21;;;;:31;-1:-1:-1;49317:66:0;49313:97;;;-1:-1:-1;;49393:7:0;;;13874:24;;-1:-1:-1;49161:475:0;-1:-1:-1;49161:475:0:o;49313:97::-;18180:42;49443:21;;:7;:21;;;;49431:34;;:7;;:11;:34::i;:::-;18180:42;49498:21;;:7;:21;;;;49421:44;;-1:-1:-1;49486:34:0;;:7;;:11;:34::i;:::-;49545:7;;49476:44;;-1:-1:-1;49545:20:0;;13874:24;49545:11;:20::i;:::-;49535:7;:30;49531:61;;;-1:-1:-1;;49575:7:0;;;13874:24;;-1:-1:-1;49161:475:0;-1:-1:-1;49161:475:0:o;49531:61::-;49611:7;;49620;;-1:-1:-1;49161:475:0;-1:-1:-1;49161:475:0:o;46408:944::-;46500:16;;:::i;:::-;46529:27;46559:156;46574:7;46583:10;:24;;;46609:10;:26;;;46637:10;:27;;;46666:10;:26;;;46694:10;:20;;;46559:14;:156::i;:::-;46529:186;;46726:26;;:::i;:::-;46763:19;46785:10;:8;:10::i;:::-;46763:32;;46878:129;46893:7;46902;:16;;;46920:7;:18;;;46940:7;:19;;;46961:7;:18;;;46981:7;:12;;;46995:11;46878:14;:129::i;:::-;46853:21;;;46806:201;46826:25;;;46806:201;46807:17;;;46806:201;-1:-1:-1;47039:16:0;;;;;47018:18;;;:37;47089:18;;;;;47066:20;;;:41;47142:19;;;;;47118:21;;;:43;-1:-1:-1;47195:18:0;;;;47172:20;;;:41;-1:-1:-1;47241:12:0;;;;47224:14;;;:29;47292:23;;47264:51;;46853:21;46408:944;-1:-1:-1;;;46408:944:0:o;42765:226::-;42824:19;42846:10;:8;:10::i;:::-;42824:32;-1:-1:-1;42867:16:0;42886:25;:8;42824:32;42886:12;:25::i;:::-;42963:4;42947:22;;;;:7;:22;;;;;;42867:44;;-1:-1:-1;42947:36:0;;42867:44;42947:26;:36::i;:::-;42938:4;42922:22;;;;:7;:22;;;;;:61;-1:-1:-1;;;42765:226:0:o;42582:175::-;42674:7;;:24;;42686:11;42674;:24::i;:::-;42664:7;:34;42722:10;;:27;;42737:11;42722:14;:27::i;:::-;42709:10;:40;-1:-1:-1;;42582:175:0:o;43764:965::-;43857:16;;:::i;:::-;43886:29;43918:162;43934:7;43943:10;:25;;;43970:10;:27;;;43999:10;:28;;;44029:10;:27;;;44058:10;:21;;;47360:845;47526:19;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47526:19:0;47558:28;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47558:28:0;47617:32;47645:3;47617:23;:7;47629:10;47617:11;:23::i;:32::-;47597:17;;;:52;47682:34;47712:3;47682:25;:7;47694:12;47682:11;:25::i;:34::-;47660:19;;;:56;47750:35;47781:3;47750:26;:7;47762:13;47750:11;:26::i;:35::-;47727:20;;;:58;47818:34;47848:3;47818:25;:7;47830:12;47818:11;:25::i;:34::-;47796:19;;;:56;47879:28;47903:3;47879:19;:7;47891:6;47879:11;:19::i;:28::-;47863:13;;;:44;47980:19;;;;47957:17;;;;47945:55;;47980:19;47945:30;;:7;;:11;:30::i;:55::-;47918:82;;;48039:20;;;;;47918:8;;48011:48;;48039:20;;48011:48;:::i;:::-;;;-1:-1:-1;48098:19:0;;;;48070:47;;48098:8;;48070:47;;48098:19;;48070:47;:::i;:::-;;;-1:-1:-1;48156:13:0;;;;48128:41;;48156:8;;48128:41;;48156:13;;48128:41;:::i;:::-;;;-1:-1:-1;48188:8:0;47360:845;-1:-1:-1;;;;;;;47360:845:0:o;48213:768::-;48390:7;;;;48446:24;:7;48458:11;48446;:24::i;:::-;48428:42;-1:-1:-1;48481:16:0;48500:25;:8;48513:11;48500:12;:25::i;:::-;48481:44;-1:-1:-1;48536:18:0;48557:27;:10;48572:11;48557:14;:27::i;:::-;48536:48;-1:-1:-1;48595:19:0;48617:28;:11;48633;48617:15;:28::i;:::-;48595:50;-1:-1:-1;48656:18:0;48677:27;:10;48692:11;48677:14;:27::i;:::-;48656:48;-1:-1:-1;48715:12:0;48730:21;:4;48739:11;48730:8;:21::i;:::-;48715:36;-1:-1:-1;48762:23:0;48788:54;48830:11;48788:37;48814:10;48788:37;:7;48800:8;48788:11;:21::i;:54::-;48762:80;-1:-1:-1;48853:29:0;48872:10;48762:80;48853:29;:::i;:::-;;-1:-1:-1;48893:23:0;48912:4;48853:29;48893:23;:::i;:::-;48935:7;;-1:-1:-1;48893:23:0;;-1:-1:-1;48961:11:0;;-1:-1:-1;;;;;;48213:768:0;;;;;;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:188:1:-;93:13;;-1:-1:-1;;;;;135:42:1;;125:53;;115:2;;192:1;189;182:12;207:179;285:13;;338:22;327:34;;317:45;;307:2;;376:1;373;366:12;391:257;450:6;503:2;491:9;482:7;478:23;474:32;471:2;;;524:6;516;509:22;471:2;568:9;555:23;587:31;612:5;587:31;:::i;653:261::-;723:6;776:2;764:9;755:7;751:23;747:32;744:2;;;797:6;789;782:22;744:2;834:9;828:16;853:31;878:5;853:31;:::i;1189:398::-;1257:6;1265;1318:2;1306:9;1297:7;1293:23;1289:32;1286:2;;;1339:6;1331;1324:22;1286:2;1383:9;1370:23;1402:31;1427:5;1402:31;:::i;:::-;1452:5;-1:-1:-1;1509:2:1;1494:18;;1481:32;1522:33;1481:32;1522:33;:::i;:::-;1574:7;1564:17;;;1276:311;;;;;:::o;1592:466::-;1669:6;1677;1685;1738:2;1726:9;1717:7;1713:23;1709:32;1706:2;;;1759:6;1751;1744:22;1706:2;1803:9;1790:23;1822:31;1847:5;1822:31;:::i;:::-;1872:5;-1:-1:-1;1929:2:1;1914:18;;1901:32;1942:33;1901:32;1942:33;:::i;:::-;1696:362;;1994:7;;-1:-1:-1;;;2048:2:1;2033:18;;;;2020:32;;1696:362::o;2063:325::-;2131:6;2139;2192:2;2180:9;2171:7;2167:23;2163:32;2160:2;;;2213:6;2205;2198:22;2160:2;2257:9;2244:23;2276:31;2301:5;2276:31;:::i;:::-;2326:5;2378:2;2363:18;;;;2350:32;;-1:-1:-1;;;2150:238:1:o;2393:293::-;2449:6;2502:2;2490:9;2481:7;2477:23;2473:32;2470:2;;;2523:6;2515;2508:22;2470:2;2567:9;2554:23;2620:5;2613:13;2606:21;2599:5;2596:32;2586:2;;2647:6;2639;2632:22;2691:470;2778:6;2786;2794;2847:2;2835:9;2826:7;2822:23;2818:32;2815:2;;;2868:6;2860;2853:22;2815:2;2896:40;2926:9;2896:40;:::i;:::-;2886:50;;2955:49;3000:2;2989:9;2985:18;2955:49;:::i;:::-;2945:59;;3047:2;3036:9;3032:18;3026:25;3091:10;3084:5;3080:22;3073:5;3070:33;3060:2;;3122:6;3114;3107:22;3060:2;3150:5;3140:15;;;2805:356;;;;;:::o;3166:190::-;3225:6;3278:2;3266:9;3257:7;3253:23;3249:32;3246:2;;;3299:6;3291;3284:22;3246:2;-1:-1:-1;3327:23:1;;3236:120;-1:-1:-1;3236:120:1:o;3361:194::-;3431:6;3484:2;3472:9;3463:7;3459:23;3455:32;3452:2;;;3505:6;3497;3490:22;3452:2;-1:-1:-1;3533:16:1;;3442:113;-1:-1:-1;3442:113:1:o;3560:258::-;3628:6;3636;3689:2;3677:9;3668:7;3664:23;3660:32;3657:2;;;3710:6;3702;3695:22;3657:2;-1:-1:-1;;3738:23:1;;;3808:2;3793:18;;;3780:32;;-1:-1:-1;3647:171:1:o;3823:326::-;3900:6;3908;3916;3969:2;3957:9;3948:7;3944:23;3940:32;3937:2;;;3990:6;3982;3975:22;3937:2;-1:-1:-1;;4018:23:1;;;4088:2;4073:18;;4060:32;;-1:-1:-1;4139:2:1;4124:18;;;4111:32;;3927:222;-1:-1:-1;3927:222:1:o;4154:316::-;4242:6;4250;4258;4311:2;4299:9;4290:7;4286:23;4282:32;4279:2;;;4332:6;4324;4317:22;4279:2;4366:9;4360:16;4350:26;;4416:2;4405:9;4401:18;4395:25;4385:35;;4460:2;4449:9;4445:18;4439:25;4429:35;;4269:201;;;;;:::o;4475:464::-;4570:6;4578;4586;4594;4602;4655:3;4643:9;4634:7;4630:23;4626:33;4623:2;;;4677:6;4669;4662:22;4623:2;-1:-1:-1;;4705:23:1;;;4775:2;4760:18;;4747:32;;-1:-1:-1;4826:2:1;4811:18;;4798:32;;4877:2;4862:18;;4849:32;;-1:-1:-1;4928:3:1;4913:19;4900:33;;-1:-1:-1;4613:326:1;-1:-1:-1;4613:326:1:o;4944:809::-;5084:6;5092;5100;5108;5116;5124;5132;5140;5148;5156;5209:3;5197:9;5188:7;5184:23;5180:33;5177:2;;;5231:6;5223;5216:22;5177:2;-1:-1:-1;;5259:23:1;;;5329:2;5314:18;;5301:32;;-1:-1:-1;5380:2:1;5365:18;;5352:32;;5431:2;5416:18;;5403:32;;-1:-1:-1;5482:3:1;5467:19;;5454:33;;-1:-1:-1;5534:3:1;5519:19;;5506:33;;-1:-1:-1;5586:3:1;5571:19;;5558:33;;-1:-1:-1;5638:3:1;5623:19;;5610:33;;-1:-1:-1;5690:3:1;5675:19;;5662:33;;-1:-1:-1;5742:3:1;5727:19;5714:33;;-1:-1:-1;5167:586:1;-1:-1:-1;5167:586:1:o;5758:483::-;5861:6;5869;5877;5885;5893;5946:3;5934:9;5925:7;5921:23;5917:33;5914:2;;;5968:6;5960;5953:22;5914:2;5996:39;6025:9;5996:39;:::i;:::-;5986:49;;6075:2;6064:9;6060:18;6054:25;6044:35;;6119:2;6108:9;6104:18;6098:25;6088:35;;6163:2;6152:9;6148:18;6142:25;6132:35;;6186:49;6230:3;6219:9;6215:19;6186:49;:::i;:::-;6176:59;;5904:337;;;;;;;;:::o;6246:293::-;6314:6;6367:2;6355:9;6346:7;6342:23;6338:32;6335:2;;;6388:6;6380;6373:22;6335:2;6425:9;6419:16;6475:4;6468:5;6464:16;6457:5;6454:27;6444:2;;6500:6;6492;6485:22;7556:603;7668:4;7697:2;7726;7715:9;7708:21;7758:6;7752:13;7801:6;7796:2;7785:9;7781:18;7774:34;7826:4;7839:140;7853:6;7850:1;7847:13;7839:140;;;7948:14;;;7944:23;;7938:30;7914:17;;;7933:2;7910:26;7903:66;7868:10;;7839:140;;;7997:6;7994:1;7991:13;7988:2;;;8067:4;8062:2;8053:6;8042:9;8038:22;8034:31;8027:45;7988:2;-1:-1:-1;8143:2:1;8122:15;-1:-1:-1;;8118:29:1;8103:45;;;;8150:2;8099:54;;7677:482;-1:-1:-1;;;7677:482:1:o;12265:469::-;12467:2;12449:21;;;12506:2;12486:18;;;12479:30;12545:34;12540:2;12525:18;;12518:62;12616:34;12611:2;12596:18;;12589:62;-1:-1:-1;;;12682:3:1;12667:19;;12660:32;12724:3;12709:19;;12439:295::o;13554:356::-;13756:2;13738:21;;;13775:18;;;13768:30;13834:34;13829:2;13814:18;;13807:62;13901:2;13886:18;;13728:182::o;15504:412::-;15706:2;15688:21;;;15745:2;15725:18;;;15718:30;15784:34;15779:2;15764:18;;15757:62;-1:-1:-1;;;15850:2:1;15835:18;;15828:46;15906:3;15891:19;;15678:238::o;19707:983::-;19969:4;20017:3;20006:9;20002:19;20048:6;20037:9;20030:25;20074:2;20112:6;20107:2;20096:9;20092:18;20085:34;20155:3;20150:2;20139:9;20135:18;20128:31;20179:6;20214;20208:13;20245:6;20237;20230:22;20283:3;20272:9;20268:19;20261:26;;20322:2;20314:6;20310:15;20296:29;;20343:4;20356:195;20370:6;20367:1;20364:13;20356:195;;;20435:13;;-1:-1:-1;;;;;20431:39:1;20419:52;;20526:15;;;;20491:12;;;;20467:1;20385:9;20356:195;;;-1:-1:-1;;;;;;;20607:32:1;;;;20602:2;20587:18;;20580:60;-1:-1:-1;;;20671:3:1;20656:19;20649:35;20568:3;19978:712;-1:-1:-1;;;19978:712:1:o;22557:128::-;22597:3;22628:1;22624:6;22621:1;22618:13;22615:2;;;22634:18;;:::i;:::-;-1:-1:-1;22670:9:1;;22605:80::o;22690:217::-;22730:1;22756;22746:2;;-1:-1:-1;;;22781:31:1;;22835:4;22832:1;22825:15;22863:4;22788:1;22853:15;22746:2;-1:-1:-1;22892:9:1;;22736:171::o;22912:422::-;23001:1;23044:5;23001:1;23058:270;23079:7;23069:8;23066:21;23058:270;;;23138:4;23134:1;23130:6;23126:17;23120:4;23117:27;23114:2;;;23147:18;;:::i;:::-;23197:7;23187:8;23183:22;23180:2;;;23217:16;;;;23180:2;23296:22;;;;23256:15;;;;23058:270;;;23062:3;22976:358;;;;;:::o;23339:131::-;23399:5;23428:36;23455:8;23449:4;23428:36;:::i;23475:140::-;23533:5;23562:47;23603:4;23593:8;23589:19;23583:4;23620:806;23669:5;23699:8;23689:2;;-1:-1:-1;23740:1:1;23754:5;;23689:2;23788:4;23778:2;;-1:-1:-1;23825:1:1;23839:5;;23778:2;23870:4;23888:1;23883:59;;;;23956:1;23951:130;;;;23863:218;;23883:59;23913:1;23904:10;;23927:5;;;23951:130;23988:3;23978:8;23975:17;23972:2;;;23995:18;;:::i;:::-;-1:-1:-1;;24051:1:1;24037:16;;24066:5;;23863:218;;24165:2;24155:8;24152:16;24146:3;24140:4;24137:13;24133:36;24127:2;24117:8;24114:16;24109:2;24103:4;24100:12;24096:35;24093:77;24090:2;;;-1:-1:-1;24202:19:1;;;24234:5;;24090:2;24281:34;24306:8;24300:4;24281:34;:::i;:::-;24351:6;24347:1;24343:6;24339:19;24330:7;24327:32;24324:2;;;24362:18;;:::i;:::-;24400:20;;23679:747;-1:-1:-1;;;23679:747:1:o;24431:168::-;24471:7;24537:1;24533;24529:6;24525:14;24522:1;24519:21;24514:1;24507:9;24500:17;24496:45;24493:2;;;24544:18;;:::i;:::-;-1:-1:-1;24584:9:1;;24483:116::o;24604:125::-;24644:4;24672:1;24669;24666:8;24663:2;;;24677:18;;:::i;:::-;-1:-1:-1;24714:9:1;;24653:76::o;24734:127::-;24795:10;24790:3;24786:20;24783:1;24776:31;24826:4;24823:1;24816:15;24850:4;24847:1;24840:15;24866:131;-1:-1:-1;;;;;24941:31:1;;24931:42;;24921:2;;24987:1;24984;24977:12

Swarm Source

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