Contract 0xf6d1b85af155229acd7b523601148585a1ff67c6 16

 
 
Txn Hash
Method
Block
From
To
Value [Txn Fee]
0xd88fad05d6573931200e024c12daf8d2208f78ec739def4d2973c30aa840e014Claim(pending)2023-03-26 11:51:062 secs ago0x0cd907b5d8094a48d05e8c1bd74b61f83bce19a9 IN 0xf6d1b85af155229acd7b523601148585a1ff67c60 MATIC(Pending)
0x12e389e9f0bbb7970944c6dff8d434cc87fd08956771d1d7ce227f09b3479872Claim(pending)2023-03-26 11:51:062 secs ago0x55ef459cb71cbffe9f5d5d40648c976d75325460 IN 0xf6d1b85af155229acd7b523601148585a1ff67c60 MATIC(Pending)
0xf309bb59acf7d608b653efd123d4da84b9dd08b4f4555943e8f5fe7496781753Claim Capped(pending)2023-03-26 11:51:062 secs ago0x2c99f617c8951cb4b23392526a1d1b339491902d IN 0xf6d1b85af155229acd7b523601148585a1ff67c60 MATIC(Pending)
0x34b814a0476f5dd246ea7c7ccd551a2618ab89f9c5dc4d1c54cf6d3ff0332859Claim(pending)2023-03-26 11:50:5612 secs ago0x178aab3b806bb6bb841c081e9eae5a44d8436e00 IN 0xf6d1b85af155229acd7b523601148585a1ff67c60 MATIC(Pending)
0x7a5460b69eee613f180a35159de82b265fb55248e6edb539c0e4a45a987a892cClaim(pending)2023-03-26 11:50:5612 secs ago0x9d1b6f92a7b06a3a0b8e5942b1709cd55c94aafa IN 0xf6d1b85af155229acd7b523601148585a1ff67c60 MATIC(Pending)
0x70211a2a10786893e1a051ecd667cb20b291c313e7b5ed3aa6ef4dd3130187cdClaim(pending)2023-03-26 11:50:5612 secs ago0xb9aad7fb7d0854a4bd55cca2c8c606fda499f7b9 IN 0xf6d1b85af155229acd7b523601148585a1ff67c60 MATIC(Pending)
0xbba7bdca7c15b18fe5ab98f759e8484ace65c801c7a750a8f8d3401a0e4ed1f4Claim407891112023-03-26 11:50:5414 secs ago0x5586e3549a6e7ed3278894701f1ee3ea1979bff3 IN  Galxe: Space Station 30 MATIC0.028267588212 275.746375701
0x8e14924ed3dae530cbbc41204a33fcdd7fe26168620e7f7d6334bc6058581cceClaim407891112023-03-26 11:50:5414 secs ago0x5586e3549a6e7ed3278894701f1ee3ea1979bff3 IN  Galxe: Space Station 30 MATIC0.025727363712 250.925228836
0xba0bb53526cb839262836eeae2b32c09b5559384367e03d9ca47a9ae3cf51278Claim407891112023-03-26 11:50:5414 secs ago0x5586e3549a6e7ed3278894701f1ee3ea1979bff3 IN  Galxe: Space Station 30 MATIC0.015365899566 149.892204563
0xc595377e0bf2742801a66ff34ea7118320582ceae5c267837472639c72479ecdClaim407891112023-03-26 11:50:5414 secs ago0x5586e3549a6e7ed3278894701f1ee3ea1979bff3 IN  Galxe: Space Station 30 MATIC0.013716390526 133.801474216
0xe92f7dcf0ca9e379f0d85594232343a5da5d215347f442a14e06ab615fe3a348Claim407891112023-03-26 11:50:5414 secs ago0x5586e3549a6e7ed3278894701f1ee3ea1979bff3 IN  Galxe: Space Station 30 MATIC0.013718665151 133.801474216
0x08bacc9180e7c867abba02f7f597d2a847ed933ff152b5213f68225ed3b207b6Claim407891112023-03-26 11:50:5414 secs ago jennife13523141.wallet  IN  Galxe: Space Station 30 MATIC0.014590134052 142.324720307
0x9d45ef27d7991b7e05f079f329a6b8a96b38d08faa724d35dd366b56ff75eefdClaim407891102023-03-26 11:50:5216 secs ago0x91f9ab1634abdbea83c4cea6617930d10b8f058c IN  Galxe: Space Station 30 MATIC0.016559914178 138.43998544
0x52a7f42933ca505720bcd1f2bb65333243ab891ab61aaca71b58a2d2dc559be8Claim407891092023-03-26 11:50:5018 secs ago0xab31ea5ab64539516d4a690c05075c191f2626ce IN  Galxe: Space Station 30 MATIC0.018035930294 150.785703016
0x0dcbf2565f82efe0d58968a0f228ebfa9f9f968d30e8a4294bfd5042347c6752Claim Capped407891092023-03-26 11:50:5018 secs ago0x7df4adaeaeb7497494c5ba8beacd523fc44a670a IN  Galxe: Space Station 30 MATIC0.02143959052192.324720307
0x86dd3e4cb64d88d88ddaae32108227d0c7f32810d2109844bbf2e59e06c74584Claim Capped407891082023-03-26 11:50:4820 secs ago0xaea1e3a30378454ec5def7d781a557d98b5dc8b9 IN  Galxe: Space Station 30 MATIC0.016230798112 149.148600137
0x1f58771881f4fd2ff478eb06ed968ad0707c0a3c1897d42f6f075b2a534d0971Claim407891082023-03-26 11:50:4820 secs ago0x5dd680a14a1d695deb0ebed09315ce5a1d9fdda1 IN  Galxe: Space Station 30 MATIC0.018634138946 155.786903984
0x64ed9cd3aa892395326128de1164026c85476d7eb3d8d8622a63d448f9754113Claim407891072023-03-26 11:50:4622 secs ago0xf08fb807b1062bcb1b7d42cff20850a093a7debb IN  Galxe: Space Station 30 MATIC0.015970961822 155.786903984
0x30636da023b22035501a67e15d16df3dc2a5cb7c3fbbb8b4f9c98e6ff8c16a2fClaim407891062023-03-26 11:50:4424 secs ago0xc95ad55df5cb5afad4e9a7b617fb20b7e8594317 IN  Galxe: Space Station 30 MATIC0.015292205972 149.148600137
0x4e205f91be4ab27d68cae2338ef87d1a5fa74573c2fe66b28bedddb3bc51015aClaim407891062023-03-26 11:50:4424 secs ago0x8f26e103a9e5f05128005cdb5009f9aee8e87e75 IN  Galxe: Space Station 30 MATIC0.02036652071 170.245930873
0xf7cafc4d241fd33e60d0ae41687f7d55d08ab2f73ba303a6bf62536926c027c6Claim Capped407891062023-03-26 11:50:4424 secs ago0xf663f8022250c9b958471926e8a9d2e535ca926d IN  Galxe: Space Station 30 MATIC0.021764604656195.219258186
0xf4d09c26884e7996f97cc4881ccd2baccea666758ead8c85e1b3e05df13b27a0Claim407891052023-03-26 11:50:4226 secs ago0xc491b2e396dbe34b0c8547248c7e1f7e592c1cc3 IN  Galxe: Space Station 30 MATIC0.017084414821 142.845083418
0x038474285177567fd33f698e8e4e938cd05ec22fad7c8126625b7b3e93405452Claim407891052023-03-26 11:50:4226 secs ago0xde4cf945b202235e09ef579aec216c6ef57358d5 IN  Galxe: Space Station 30 MATIC0.017404564383 145.507297562
0x3e2b8275ff662d3e14167fe392781518160fd80c6f971a471524706583f59b82Claim407891052023-03-26 11:50:4226 secs ago0x7c48d1709026fea14dc965e27914c56546e1fbb5 IN  Galxe: Space Station 30 MATIC0.020534578094 171.650740571
0xa0ddbf421dd73921e3821e22cf484a05ab609554464ca163fb1f8178b7729cf5Claim407891052023-03-26 11:50:4226 secs ago0x029bf44e693cb7a962cf2e3a6acf45eae2f3b9be IN  Galxe: Space Station 30 MATIC0.020540189469195.219258186
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x170ca9f77ffdd8b4174bff44a93df718f35ea559a5724b52f88648250e45d9b8407887562023-03-26 11:34:3616 mins ago Galxe: Space Station 3 0xade113359ebce63e7429317be1a495f3a836df650.003 MATIC
0x7438ba77a740d1a39d7cc9e9250b172a3811c67e4824fcf8924778ab9c61ce5f407842592023-03-26 8:50:503 hrs ago Galxe: Space Station 3 0xade113359ebce63e7429317be1a495f3a836df650.05 MATIC
0x29e348f74f129961ef240dc54c981ae8bbba883214fbb603554a4f3353682e88407820622023-03-26 7:32:194 hrs 18 mins ago Galxe: Space Station 3 0xade113359ebce63e7429317be1a495f3a836df650.2 MATIC
0xca0c687fe33b805b714ae296df0a0cf925583aa625ae26956a5ab671360e3a77407763152023-03-26 3:52:407 hrs 58 mins ago Galxe: Space Station 3 0xade113359ebce63e7429317be1a495f3a836df650.03 MATIC
0x5c23456c213d1aa90b41400511e6b52717e1672b8d1c906dbd21abcfb439263b407761592023-03-26 3:46:368 hrs 4 mins ago Galxe: Space Station 3 0xade113359ebce63e7429317be1a495f3a836df650.05 MATIC
0xe806978e0c26df2ae6daa6fdea4928b4e1ad3b16602d9fa7a885ab8f39ac2813407760512023-03-26 3:42:248 hrs 8 mins ago Galxe: Space Station 3 0xade113359ebce63e7429317be1a495f3a836df650.01 MATIC
0xba6dca714866f7bbfc46db454eae823efe357fd4288885e3f1546c8bf3b206c5407690092023-03-25 23:07:3312 hrs 43 mins ago Galxe: Space Station 3 0xade113359ebce63e7429317be1a495f3a836df650.04 MATIC
0xcaa836bba887adfe6aca9e73a7569cf254a4482bf23f09cb2e607f75bf85c3f1407658402023-03-25 21:10:4614 hrs 40 mins ago Galxe: Space Station 3 0xade113359ebce63e7429317be1a495f3a836df6510 MATIC
0x6850573c093393fca2185fbaff6a27e41be7056078eb9aeec57655bf256cd660407638782023-03-25 20:00:0315 hrs 51 mins ago Galxe: Space Station 3 0xade113359ebce63e7429317be1a495f3a836df650.15 MATIC
0xc4b5340a899aebd54a0ad86febe95a03ab838c9977722ac98a4bb6cc385a3f4f407616642023-03-25 18:40:0317 hrs 11 mins ago Galxe: Space Station 3 0xade113359ebce63e7429317be1a495f3a836df650.01 MATIC
0xf2eaac0af279ff919aeb9cc638f486bde72ad8c2602e117d3c4a65f8b8df4d83407612242023-03-25 18:23:4517 hrs 27 mins ago Galxe: Space Station 3 0xade113359ebce63e7429317be1a495f3a836df650.3 MATIC
0xb3ddd3bd6743891a57d827c48a1c268c3d2f7137d278b6c61266abd6a5ce2bb3407597442023-03-25 17:28:3718 hrs 22 mins ago Galxe: Space Station 3 0xade113359ebce63e7429317be1a495f3a836df651 MATIC
0xcae0f030085123e38416da03a2132f72271f8ce07c73b7aff64027c12c7cd82d407587312023-03-25 16:49:5619 hrs 1 min ago Galxe: Space Station 3 0xade113359ebce63e7429317be1a495f3a836df650.67833921 MATIC
0x7e0b8a9d64f7c969cf9c1c08f5d9fef25f45c2b24d893ad70a66378ec364f711407571342023-03-25 15:49:5820 hrs 1 min ago Galxe: Space Station 3 0xade113359ebce63e7429317be1a495f3a836df650.5 MATIC
0x4d9f39dccb6f703f7f45e8dded673acf260a85d1cc9cb524c39b05e638497a1d407563322023-03-25 15:20:1920 hrs 30 mins ago Galxe: Space Station 3 0xade113359ebce63e7429317be1a495f3a836df650.074614349773713025 MATIC
0x0a1271632e60f9b6ecab8e3111aa7e7b6cfc27398630410dfd67eca280ad4c2b407537702023-03-25 13:48:5722 hrs 2 mins ago Galxe: Space Station 3 0xade113359ebce63e7429317be1a495f3a836df650.4 MATIC
0x0c86c925778eda52115790abe8ad6f06c23012aa2a1dfe2fb335c868d5e0cecc407534882023-03-25 13:38:5722 hrs 12 mins ago Galxe: Space Station 3 0xade113359ebce63e7429317be1a495f3a836df650.5 MATIC
0x4271d12b9ae54dca5543416147fec06a53c213430328cda176fe39f4d1776331407373642023-03-25 3:53:191 day 7 hrs ago Galxe: Space Station 3 0xade113359ebce63e7429317be1a495f3a836df650.05 MATIC
0x59d0c711bc72c6f414d41a09667cbc70210d46bc1d8eddd4e47ab345c1dec4b2407287192023-03-24 22:29:541 day 13 hrs ago Galxe: Space Station 3 0xade113359ebce63e7429317be1a495f3a836df6510 MATIC
0x185e4714983e69a5277f011bc6989c9f86daec8e00ceb16486970bcf4186a032407274832023-03-24 21:43:571 day 14 hrs ago Galxe: Space Station 3 0xade113359ebce63e7429317be1a495f3a836df650.1 MATIC
0xd481197fb53b8594d9eda8ff2a5d821cefebd898f88c93be70e3975103f8e0d2407186722023-03-24 16:20:031 day 19 hrs ago Galxe: Space Station 3 0xade113359ebce63e7429317be1a495f3a836df650.1 MATIC
0x30ce01162a04a4915914964bbbc22e5202cb35e6cd513cd05bea52dba2a714ee407183532023-03-24 16:08:071 day 19 hrs ago Galxe: Space Station 3 0xade113359ebce63e7429317be1a495f3a836df652.15 MATIC
0xeec2411027e4552a6dc254d539906268b55ab1b7399c5554ed23f6f0b4c45ed5407151472023-03-24 13:46:431 day 22 hrs ago Galxe: Space Station 3 0xade113359ebce63e7429317be1a495f3a836df650.1 MATIC
0xd397e08e418940a4221e2386ad6da7ea0b454443e7dd5ef6376d3d466cedbe9b407121112023-03-24 11:35:512 days 15 mins ago Galxe: Space Station 3 0xade113359ebce63e7429317be1a495f3a836df6510 MATIC
0x238a9f0156022dc0b796cb78890491f20a0e79e28c4f05dfda39055707e5d7f1407112062023-03-24 10:59:012 days 52 mins ago Galxe: Space Station 3 0xade113359ebce63e7429317be1a495f3a836df650.1 MATIC
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SpaceStationV2

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 200 runs

Other Settings:
istanbul EvmVersion, Apache-2.0 license

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 7 : SpaceStationV2.sol
/*
    Copyright 2021 Project Galaxy.

    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.

    SPDX-License-Identifier: Apache License, Version 2.0
*/

pragma solidity 0.7.6;

import {Address} from "Address.sol";
import {SafeMath} from "SafeMath.sol";
import {IERC20} from "IERC20.sol";
import {EIP712} from "EIP712.sol";
import {ECDSA} from "ECDSA.sol";
import {IStarNFT} from "IStarNFT.sol"; //0.7.6

/**
 * @title SpaceStation
 * @author Galaxy Protocol
 *
 * Campaign contract that allows privileged DAOs to initiate campaigns for members to claim StarNFTs.
 */
contract SpaceStationV2 is EIP712 {
    using Address for address;
    using SafeMath for uint256;

    /* ============ Events ============ */
    event EventActivateCampaign(uint256 _cid);
    event EventClaim(
        uint256 _cid,
        uint256 _dummyId,
        uint256 _nftID,
        IStarNFT _starNFT,
        address _sender
    );
    event EventClaimCapped(
        uint256 _cid,
        uint256 _dummyId,
        uint256 _nftID,
        IStarNFT _starNFT,
        address _sender,
        uint256 _minted,
        uint256 _cap
    );
    event EventClaimBatch(
        uint256 _cid,
        uint256[] _dummyIdArr,
        uint256[] _nftIDArr,
        IStarNFT _starNFT,
        address _sender
    );
    event EventClaimBatchCapped(
        uint256 _cid,
        uint256[] _dummyIdArr,
        uint256[] _nftIDArr,
        IStarNFT _starNFT,
        address _sender,
        uint256 _minted,
        uint256 _cap
    );
    event EventForge(
        uint256 _cid,
        uint256 _dummyId,
        uint256 _nftID,
        IStarNFT _starNFT,
        address _sender
    );

    /* ============ Modifiers ============ */
    /**
     * Throws if the sender is not a campaign setter, gnosis
     */
    modifier onlyCampaignSetter() {
        _validateOnlyCampaignSetter();
        _;
    }
    /**
     * Throws if the sender is not a manager: pauser_role and upgrader_role, gnosis
     */
    modifier onlyManager() {
        _validateOnlyManager();
        _;
    }
    /**
     * Throws if the sender is not a Treasury's manager, gnosis safe
     */
    modifier onlyTreasuryManager() {
        _validateOnlyTreasuryManager();
        _;
    }
    /**
     * Throws if the contract paused
     */
    modifier onlyNoPaused() {
        _validateOnlyNotPaused();
        _;
    }

    /* ============ Enums ================ */

    /* ============ Structs ============ */

    struct CampaignFeeConfig {
        address erc20; // Address of token asset if required
        uint256 erc20Fee; // Amount of token if required
        uint256 platformFee; // Amount of fee for using the service if applicable
    }

    /* ============ State Variables ============ */
    // Is contract paused.
    bool public paused;

    // The galaxy signer(EOA): used to verify EIP-712.
    address public galaxy_signer;
    // A campaign setter. TODO: mapping of EOAs to reduce multisig tx gas cost.
    address public campaign_setter;
    // The manager which has privilege to do upgrades, pause/unpause.
    address public manager;
    // Treasury manager which receives fees.
    address public treasury_manager;

    // Mapping that stores all fee requirements for a given activated campaign.
    // If no fee is required at all, should set to all zero values except for `isActive`.
    mapping(uint256 => CampaignFeeConfig) public campaignFeeConfigs;
    // hasMinted(dummyID(signature) => bool) that records if the user account has already used the dummyID(signature).
    mapping(uint256 => bool) public hasMinted;
    // for capped campaign usage only
    mapping(uint256 => uint256) public numMinted;

    /* ============ Constructor ============ */
    constructor(
        address _galaxy_signer,
        address _campaign_setter,
        address _contract_manager,
        address _treasury_manager
    ) EIP712("Galaxy", "1.0.0") {
        // require(galaxy_signer != address(0), "Galaxy signer address must not be null address");
        // require(campaign_setter != address(0), "Campaign setter address must not be null address");
        // require(contract_manager != address(0), "Contract manager address must not be null address");
        // require(treasury_manager != address(0), "Treasury manager address must not be null address");
        galaxy_signer = _galaxy_signer;
        campaign_setter = _campaign_setter;
        manager = _contract_manager;
        treasury_manager = _treasury_manager;
    }

    /* ============ External Functions ============ */
    function activateCampaign(
        uint256 _cid,
        uint256 _platformFee,
        uint256 _erc20Fee,
        address _erc20
    ) external onlyCampaignSetter {
        _setFees(_cid, _platformFee, _erc20Fee, _erc20);
        emit EventActivateCampaign(_cid);
    }

    function claim(
        uint256 _cid,
        IStarNFT _starNFT,
        uint256 _dummyId,
        uint256 _powah,
        address _mintTo,
        bytes calldata _signature
    ) public payable onlyNoPaused {
        require(!hasMinted[_dummyId], "Already minted");
        require(
            _verify(
                _hash(_cid, _starNFT, _dummyId, _powah, _mintTo),
                _signature
            ),
            "Invalid signature"
        );
        hasMinted[_dummyId] = true;
        _payFees(_cid, 1);
        uint256 nftID = _starNFT.mint(_mintTo, _powah);
        emit EventClaim(_cid, _dummyId, nftID, _starNFT, _mintTo);
    }

    function claim(
        uint256 _cid,
        IStarNFT _starNFT,
        uint256 _dummyId,
        uint256 _powah,
        bytes calldata _signature
    ) external payable onlyNoPaused {
        claim(_cid, _starNFT, _dummyId, _powah, msg.sender, _signature);
    }

    function claimBatch(
        uint256 _cid,
        IStarNFT _starNFT,
        uint256[] calldata _dummyIdArr,
        uint256[] calldata _powahArr,
        address _mintTo,
        bytes calldata _signature
    ) public payable onlyNoPaused {
        require(
            _dummyIdArr.length > 0,
            "Array(_dummyIdArr) should not be empty"
        );
        require(
            _powahArr.length == _dummyIdArr.length,
            "Array(_powahArr) length mismatch"
        );

        for (uint256 i = 0; i < _dummyIdArr.length; i++) {
            require(!hasMinted[_dummyIdArr[i]], "Already minted");
            hasMinted[_dummyIdArr[i]] = true;
        }

        require(
            _verify(
                _hashBatch(_cid, _starNFT, _dummyIdArr, _powahArr, _mintTo),
                _signature
            ),
            "Invalid signature"
        );
        _payFees(_cid, _dummyIdArr.length);

        uint256[] memory nftIdArr = _starNFT.mintBatch(
            _mintTo,
            _powahArr.length,
            _powahArr
        );
        emit EventClaimBatch(_cid, _dummyIdArr, nftIdArr, _starNFT, _mintTo);
    }

    function claimBatch(
        uint256 _cid,
        IStarNFT _starNFT,
        uint256[] calldata _dummyIdArr,
        uint256[] calldata _powahArr,
        bytes calldata _signature
    ) external payable onlyNoPaused {
        claimBatch(_cid, _starNFT, _dummyIdArr, _powahArr, msg.sender, _signature);
    }

    function claimCapped(
        uint256 _cid,
        IStarNFT _starNFT,
        uint256 _dummyId,
        uint256 _powah,
        uint256 _cap,
        address _mintTo,
        bytes calldata _signature
    ) public payable onlyNoPaused {
        require(!hasMinted[_dummyId], "Already minted");
        require(numMinted[_cid] < _cap, "Reached cap limit");
        require(
            _verify(
                _hashCapped(_cid, _starNFT, _dummyId, _powah, _cap, _mintTo),
                _signature
            ),
            "Invalid signature"
        );
        hasMinted[_dummyId] = true;
        numMinted[_cid] = numMinted[_cid] + 1;
        _payFees(_cid, 1);
        uint256 nftID = _starNFT.mint(_mintTo, _powah);
        uint256 minted = numMinted[_cid];
        emit EventClaimCapped(_cid, _dummyId, nftID, _starNFT, _mintTo, minted, _cap);
    }

    function claimCapped(
        uint256 _cid,
        IStarNFT _starNFT,
        uint256 _dummyId,
        uint256 _powah,
        uint256 _cap,
        bytes calldata _signature
    ) external payable onlyNoPaused {
        claimCapped(_cid, _starNFT, _dummyId, _powah, _cap, msg.sender, _signature);
    }

    function claimBatchCapped(
        uint256 _cid,
        IStarNFT _starNFT,
        uint256[] calldata _dummyIdArr,
        uint256[] calldata _powahArr,
        uint256 _cap,
        address _mintTo,
        bytes calldata _signature
    ) public payable onlyNoPaused {
        require(
            _dummyIdArr.length > 0,
            "Array(_dummyIdArr) should not be empty"
        );
        require(
            _powahArr.length == _dummyIdArr.length,
            "Array(_powahArr) length mismatch"
        );
        require(
            numMinted[_cid] + _dummyIdArr.length <= _cap,
            "Reached cap limit"
        );

        for (uint256 i = 0; i < _dummyIdArr.length; i++) {
            require(!hasMinted[_dummyIdArr[i]], "Already minted");
            hasMinted[_dummyIdArr[i]] = true;
        }

        require(
            _verify(
                _hashBatchCapped(
                    _cid,
                    _starNFT,
                    _dummyIdArr,
                    _powahArr,
                    _cap,
                    _mintTo
                ),
                _signature
            ),
            "Invalid signature"
        );
        numMinted[_cid] = numMinted[_cid] + _dummyIdArr.length;
        _payFees(_cid, _dummyIdArr.length);
        uint256[] memory nftIdArr = _starNFT.mintBatch(
            _mintTo,
            _powahArr.length,
            _powahArr
        );
        uint256 minted = numMinted[_cid];
        emit EventClaimBatchCapped(_cid, _dummyIdArr, nftIdArr, _starNFT, _mintTo, minted, _cap);
    }

    function claimBatchCapped(
        uint256 _cid,
        IStarNFT _starNFT,
        uint256[] calldata _dummyIdArr,
        uint256[] calldata _powahArr,
        uint256 _cap,
        bytes calldata _signature
    ) external payable onlyNoPaused {
        claimBatchCapped(_cid, _starNFT, _dummyIdArr, _powahArr, _cap, msg.sender, _signature);
    }

    function forge(
        uint256 _cid,
        IStarNFT _starNFT,
        uint256[] calldata _nftIDs,
        uint256 _dummyId,
        uint256 _powah,
        address _mintTo,
        bytes calldata _signature
    ) public payable onlyNoPaused {
        require(!hasMinted[_dummyId], "Already minted");
        require(
            _verify(
                _hashForge(
                    _cid,
                    _starNFT,
                    _nftIDs,
                    _dummyId,
                    _powah,
                    _mintTo
                ),
                _signature
            ),
            "Invalid signature"
        );
        hasMinted[_dummyId] = true;
        for (uint256 i = 0; i < _nftIDs.length; i++) {
            require(
                _starNFT.isOwnerOf(_mintTo, _nftIDs[i]),
                "Not the owner"
            );
        }
        _starNFT.burnBatch(_mintTo, _nftIDs);
        _payFees(_cid, 1);
        uint256 nftID = _starNFT.mint(_mintTo, _powah);
        emit EventForge(_cid, _dummyId, nftID, _starNFT, _mintTo);
    }

    function forge(
        uint256 _cid,
        IStarNFT _starNFT,
        uint256[] calldata _nftIDs,
        uint256 _dummyId,
        uint256 _powah,
        bytes calldata _signature
    ) external payable onlyNoPaused {
        forge(_cid, _starNFT, _nftIDs, _dummyId, _powah, msg.sender, _signature);
    }

    receive() external payable {
        // anonymous transfer: to treasury_manager
        (bool success, ) = treasury_manager.call{value: msg.value}(
            new bytes(0)
        );
        require(success, "Transfer failed");
    }

    fallback() external payable {
        if (msg.value > 0) {
            // call non exist function: send to treasury_manager
            (bool success, ) = treasury_manager.call{value: msg.value}(new bytes(0));
            require(success, "Transfer failed");
        }
    }

    /**
     * PRIVILEGED MODULE FUNCTION. Function that update galaxy signer address.
     */
    function updateGalaxySigner(address newAddress) external onlyManager {
        require(
            newAddress != address(0),
            "Galaxy signer address must not be null address"
        );
        galaxy_signer = newAddress;
    }

    /**
     * PRIVILEGED MODULE FUNCTION. Function that update galaxy signer address.
     */
    function updateCampaignSetter(address newAddress) external onlyManager {
        require(
            newAddress != address(0),
            "Campaign setter address must not be null address"
        );
        campaign_setter = newAddress;
    }

    /**
     * PRIVILEGED MODULE FUNCTION. Function that update manager address.
     */
    function updateManager(address newAddress) external onlyManager {
        require(
            newAddress != address(0),
            "Manager address must not be null address"
        );
        manager = newAddress;
    }

    /**
     * PRIVILEGED MODULE FUNCTION. Function that update treasure manager address.
     */
    function updateTreasureManager(address payable newAddress)
    external
    onlyTreasuryManager
    {
        require(
            newAddress != address(0),
            "Treasure manager must not be null address"
        );
        treasury_manager = newAddress;
    }

    /**
     * PRIVILEGED MODULE FUNCTION. Function that pause the contract.
     */
    function setPause(bool _paused) external onlyManager {
        paused = _paused;
    }

    /* ============ Internal Functions ============ */
    function _hash(
        uint256 _cid,
        IStarNFT _starNFT,
        uint256 _dummyId,
        uint256 _powah,
        address _account
    ) public view returns (bytes32) {
        return
        _hashTypedDataV4(
            keccak256(
                abi.encode(
                    keccak256(
                        "NFT(uint256 cid,address starNFT,uint256 dummyId,uint256 powah,address account)"
                    ),
                    _cid,
                    _starNFT,
                    _dummyId,
                    _powah,
                    _account
                )
            )
        );
    }

    function _hashCapped(
        uint256 _cid,
        IStarNFT _starNFT,
        uint256 _dummyId,
        uint256 _powah,
        uint256 _cap,
        address _account
    ) public view returns (bytes32) {
        return
        _hashTypedDataV4(
            keccak256(
                abi.encode(
                    keccak256(
                        "NFT(uint256 cid,address starNFT,uint256 dummyId,uint256 powah,uint256 cap,address account)"
                    ),
                    _cid,
                    _starNFT,
                    _dummyId,
                    _powah,
                    _cap,
                    _account
                )
            )
        );
    }

    function _hashBatch(
        uint256 _cid,
        IStarNFT _starNFT,
        uint256[] calldata _dummyIdArr,
        uint256[] calldata _powahArr,
        address _account
    ) public view returns (bytes32) {
        return
        _hashTypedDataV4(
            keccak256(
                abi.encode(
                    keccak256(
                        "NFT(uint256 cid,address starNFT,uint256[] dummyIdArr,uint256[] powahArr,address account)"
                    ),
                    _cid,
                    _starNFT,
                    keccak256(abi.encodePacked(_dummyIdArr)),
                    keccak256(abi.encodePacked(_powahArr)),
                    _account
                )
            )
        );
    }

    function _hashBatchCapped(
        uint256 _cid,
        IStarNFT _starNFT,
        uint256[] calldata _dummyIdArr,
        uint256[] calldata _powahArr,
        uint256 _cap,
        address _account
    ) public view returns (bytes32) {
        return
        _hashTypedDataV4(
            keccak256(
                abi.encode(
                    keccak256(
                        "NFT(uint256 cid,address starNFT,uint256[] dummyIdArr,uint256[] powahArr,uint256 cap,address account)"
                    ),
                    _cid,
                    _starNFT,
                    keccak256(abi.encodePacked(_dummyIdArr)),
                    keccak256(abi.encodePacked(_powahArr)),
                    _cap,
                    _account
                )
            )
        );
    }

    // todo: change to internal on PRD
    function _hashForge(
        uint256 _cid,
        IStarNFT _starNFT,
        uint256[] calldata _nftIDs,
        uint256 _dummyId,
        uint256 _powah,
        address _account
    ) public view returns (bytes32) {
        return
        _hashTypedDataV4(
            keccak256(
                abi.encode(
                    keccak256(
                        "NFT(uint256 cid,address starNFT,uint256[] nftIDs,uint256 dummyId,uint256 powah,address account)"
                    ),
                    _cid,
                    _starNFT,
                    keccak256(abi.encodePacked(_nftIDs)),
                    _dummyId,
                    _powah,
                    _account
                )
            )
        );
    }

    // todo: change to internal on PRD
    function _verify(bytes32 hash, bytes calldata signature)
    public
    view
    returns (bool)
    {
        return ECDSA.recover(hash, signature) == galaxy_signer;
    }

    function _setFees(
        uint256 _cid,
        uint256 _platformFee,
        uint256 _erc20Fee,
        address _erc20
    ) private {
        require(
            (_erc20 == address(0) && _erc20Fee == 0) ||
            (_erc20 != address(0) && _erc20Fee != 0),
            "Invalid erc20 fee requirement arguments"
        );
        campaignFeeConfigs[_cid] = CampaignFeeConfig(
            _erc20,
            _erc20Fee,
            _platformFee
        );
    }

    function _payFees(uint256 _cid, uint256 amount) private {
        require(amount > 0, "Must mint more than 0");
        CampaignFeeConfig memory feeConf = campaignFeeConfigs[_cid];
        // 1. pay platformFee if needed
        if (feeConf.platformFee > 0) {
            require(
                msg.value >= feeConf.platformFee.mul(amount),
                "Insufficient Payment"
            );
            (bool success, ) = treasury_manager.call{value: msg.value}(
                new bytes(0)
            );
            require(success, "Transfer platformFee failed");
        }
        // 2. pay erc20_fee if needed
        if (feeConf.erc20Fee > 0) {
            // user wallet transfer <erc20> of <feeConf.erc20Fee> to <this contract>.
            require(
                IERC20(feeConf.erc20).transferFrom(
                    msg.sender,
                    treasury_manager,
                    feeConf.erc20Fee.mul(amount)
                ),
                "Transfer erc20Fee failed"
            );
        }
    }

    /**
     * Due to reason error bloat, internal functions are used to reduce bytecode size
     */
    function _validateOnlyCampaignSetter() internal view {
        require(msg.sender == campaign_setter, "Only campaignSetter can call");
    }

    function _validateOnlyManager() internal view {
        require(msg.sender == manager, "Only manager can call");
    }

    function _validateOnlyTreasuryManager() internal view {
        require(
            msg.sender == treasury_manager,
            "Only treasury manager can call"
        );
    }

    function _validateOnlyNotPaused() internal view {
        require(!paused, "Contract paused");
    }
}

File 2 of 7 : Address.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.2 <0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 3 of 7 : SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

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

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

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

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

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

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

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

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

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

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

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

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

File 4 of 7 : IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

File 5 of 7 : EIP712.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.
 *
 * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,
 * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding
 * they need in their contracts using a combination of `abi.encode` and `keccak256`.
 *
 * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding
 * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA
 * ({_hashTypedDataV4}).
 *
 * The implementation of the domain separator was designed to be as efficient as possible while still properly updating
 * the chain id to protect against replay attacks on an eventual fork of the chain.
 *
 * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method
 * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].
 *
 * _Available since v3.4._
 */
abstract contract EIP712 {
    /* solhint-disable var-name-mixedcase */
    // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to
    // invalidate the cached domain separator if the chain id changes.
    bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;
    uint256 private immutable _CACHED_CHAIN_ID;

    bytes32 private immutable _HASHED_NAME;
    bytes32 private immutable _HASHED_VERSION;
    bytes32 private immutable _TYPE_HASH;
    /* solhint-enable var-name-mixedcase */

    /**
     * @dev Initializes the domain separator and parameter caches.
     *
     * The meaning of `name` and `version` is specified in
     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:
     *
     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.
     * - `version`: the current major version of the signing domain.
     *
     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
     * contract upgrade].
     */
    constructor(string memory name, string memory version) internal {
        bytes32 hashedName = keccak256(bytes(name));
        bytes32 hashedVersion = keccak256(bytes(version));
        bytes32 typeHash = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)");
        _HASHED_NAME = hashedName;
        _HASHED_VERSION = hashedVersion;
        _CACHED_CHAIN_ID = _getChainId();
        _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);
        _TYPE_HASH = typeHash;
    }

    /**
     * @dev Returns the domain separator for the current chain.
     */
    function _domainSeparatorV4() internal view virtual returns (bytes32) {
        if (_getChainId() == _CACHED_CHAIN_ID) {
            return _CACHED_DOMAIN_SEPARATOR;
        } else {
            return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);
        }
    }

    function _buildDomainSeparator(bytes32 typeHash, bytes32 name, bytes32 version) private view returns (bytes32) {
        return keccak256(
            abi.encode(
                typeHash,
                name,
                version,
                _getChainId(),
                address(this)
            )
        );
    }

    /**
     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this
     * function returns the hash of the fully encoded EIP712 message for this domain.
     *
     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:
     *
     * ```solidity
     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
     *     keccak256("Mail(address to,string contents)"),
     *     mailTo,
     *     keccak256(bytes(mailContents))
     * )));
     * address signer = ECDSA.recover(digest, signature);
     * ```
     */
    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", _domainSeparatorV4(), structHash));
    }

    function _getChainId() private view returns (uint256 chainId) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        // solhint-disable-next-line no-inline-assembly
        assembly {
            chainId := chainid()
        }
    }
}

File 6 of 7 : ECDSA.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        // Check the signature length
        if (signature.length != 65) {
            revert("ECDSA: invalid signature length");
        }

        // Divide the signature in r, s and v variables
        bytes32 r;
        bytes32 s;
        uint8 v;

        // ecrecover takes the signature parameters, and the only way to get them
        // currently is to use assembly.
        // solhint-disable-next-line no-inline-assembly
        assembly {
            r := mload(add(signature, 0x20))
            s := mload(add(signature, 0x40))
            v := byte(0, mload(add(signature, 0x60)))
        }

        return recover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover-bytes32-bytes-} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, "ECDSA: invalid signature 's' value");
        require(v == 27 || v == 28, "ECDSA: invalid signature 'v' value");

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        require(signer != address(0), "ECDSA: invalid signature");

        return signer;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * replicates the behavior of the
     * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]
     * JSON-RPC method.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }
}

File 7 of 7 : IStarNFT.sol
/*
    Copyright 2021 Project Galaxy.

    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.

    SPDX-License-Identifier: Apache License, Version 2.0
*/
pragma solidity 0.7.6;

/**
 * @title IStarNFT
 * @author Galaxy Protocol
 *
 * Interface for operating with StarNFTs.
 */
interface IStarNFT {
    /* ============ Events =============== */

    /* ============ Functions ============ */

    function isOwnerOf(address, uint256) external view returns (bool);
    function getNumMinted() external view returns (uint256);
    // mint
    function mint(address account, uint256 powah) external returns (uint256);
    function mintBatch(address account, uint256 amount, uint256[] calldata powahArr) external returns (uint256[] memory);
    function burn(address account, uint256 id) external;
    function burnBatch(address account, uint256[] calldata ids) external;
}

Settings
{
  "evmVersion": "istanbul",
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "libraries": {
    "SpaceStationV2.sol": {}
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_galaxy_signer","type":"address"},{"internalType":"address","name":"_campaign_setter","type":"address"},{"internalType":"address","name":"_contract_manager","type":"address"},{"internalType":"address","name":"_treasury_manager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_cid","type":"uint256"}],"name":"EventActivateCampaign","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_cid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_dummyId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_nftID","type":"uint256"},{"indexed":false,"internalType":"contract IStarNFT","name":"_starNFT","type":"address"},{"indexed":false,"internalType":"address","name":"_sender","type":"address"}],"name":"EventClaim","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_cid","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"_dummyIdArr","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"_nftIDArr","type":"uint256[]"},{"indexed":false,"internalType":"contract IStarNFT","name":"_starNFT","type":"address"},{"indexed":false,"internalType":"address","name":"_sender","type":"address"}],"name":"EventClaimBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_cid","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"_dummyIdArr","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"_nftIDArr","type":"uint256[]"},{"indexed":false,"internalType":"contract IStarNFT","name":"_starNFT","type":"address"},{"indexed":false,"internalType":"address","name":"_sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_minted","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_cap","type":"uint256"}],"name":"EventClaimBatchCapped","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_cid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_dummyId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_nftID","type":"uint256"},{"indexed":false,"internalType":"contract IStarNFT","name":"_starNFT","type":"address"},{"indexed":false,"internalType":"address","name":"_sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_minted","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_cap","type":"uint256"}],"name":"EventClaimCapped","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_cid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_dummyId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_nftID","type":"uint256"},{"indexed":false,"internalType":"contract IStarNFT","name":"_starNFT","type":"address"},{"indexed":false,"internalType":"address","name":"_sender","type":"address"}],"name":"EventForge","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"uint256","name":"_cid","type":"uint256"},{"internalType":"contract IStarNFT","name":"_starNFT","type":"address"},{"internalType":"uint256","name":"_dummyId","type":"uint256"},{"internalType":"uint256","name":"_powah","type":"uint256"},{"internalType":"address","name":"_account","type":"address"}],"name":"_hash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cid","type":"uint256"},{"internalType":"contract IStarNFT","name":"_starNFT","type":"address"},{"internalType":"uint256[]","name":"_dummyIdArr","type":"uint256[]"},{"internalType":"uint256[]","name":"_powahArr","type":"uint256[]"},{"internalType":"address","name":"_account","type":"address"}],"name":"_hashBatch","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cid","type":"uint256"},{"internalType":"contract IStarNFT","name":"_starNFT","type":"address"},{"internalType":"uint256[]","name":"_dummyIdArr","type":"uint256[]"},{"internalType":"uint256[]","name":"_powahArr","type":"uint256[]"},{"internalType":"uint256","name":"_cap","type":"uint256"},{"internalType":"address","name":"_account","type":"address"}],"name":"_hashBatchCapped","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cid","type":"uint256"},{"internalType":"contract IStarNFT","name":"_starNFT","type":"address"},{"internalType":"uint256","name":"_dummyId","type":"uint256"},{"internalType":"uint256","name":"_powah","type":"uint256"},{"internalType":"uint256","name":"_cap","type":"uint256"},{"internalType":"address","name":"_account","type":"address"}],"name":"_hashCapped","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cid","type":"uint256"},{"internalType":"contract IStarNFT","name":"_starNFT","type":"address"},{"internalType":"uint256[]","name":"_nftIDs","type":"uint256[]"},{"internalType":"uint256","name":"_dummyId","type":"uint256"},{"internalType":"uint256","name":"_powah","type":"uint256"},{"internalType":"address","name":"_account","type":"address"}],"name":"_hashForge","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"_verify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cid","type":"uint256"},{"internalType":"uint256","name":"_platformFee","type":"uint256"},{"internalType":"uint256","name":"_erc20Fee","type":"uint256"},{"internalType":"address","name":"_erc20","type":"address"}],"name":"activateCampaign","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"campaignFeeConfigs","outputs":[{"internalType":"address","name":"erc20","type":"address"},{"internalType":"uint256","name":"erc20Fee","type":"uint256"},{"internalType":"uint256","name":"platformFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"campaign_setter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cid","type":"uint256"},{"internalType":"contract IStarNFT","name":"_starNFT","type":"address"},{"internalType":"uint256","name":"_dummyId","type":"uint256"},{"internalType":"uint256","name":"_powah","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"claim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cid","type":"uint256"},{"internalType":"contract IStarNFT","name":"_starNFT","type":"address"},{"internalType":"uint256","name":"_dummyId","type":"uint256"},{"internalType":"uint256","name":"_powah","type":"uint256"},{"internalType":"address","name":"_mintTo","type":"address"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"claim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cid","type":"uint256"},{"internalType":"contract IStarNFT","name":"_starNFT","type":"address"},{"internalType":"uint256[]","name":"_dummyIdArr","type":"uint256[]"},{"internalType":"uint256[]","name":"_powahArr","type":"uint256[]"},{"internalType":"address","name":"_mintTo","type":"address"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"claimBatch","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cid","type":"uint256"},{"internalType":"contract IStarNFT","name":"_starNFT","type":"address"},{"internalType":"uint256[]","name":"_dummyIdArr","type":"uint256[]"},{"internalType":"uint256[]","name":"_powahArr","type":"uint256[]"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"claimBatch","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cid","type":"uint256"},{"internalType":"contract IStarNFT","name":"_starNFT","type":"address"},{"internalType":"uint256[]","name":"_dummyIdArr","type":"uint256[]"},{"internalType":"uint256[]","name":"_powahArr","type":"uint256[]"},{"internalType":"uint256","name":"_cap","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"claimBatchCapped","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cid","type":"uint256"},{"internalType":"contract IStarNFT","name":"_starNFT","type":"address"},{"internalType":"uint256[]","name":"_dummyIdArr","type":"uint256[]"},{"internalType":"uint256[]","name":"_powahArr","type":"uint256[]"},{"internalType":"uint256","name":"_cap","type":"uint256"},{"internalType":"address","name":"_mintTo","type":"address"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"claimBatchCapped","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cid","type":"uint256"},{"internalType":"contract IStarNFT","name":"_starNFT","type":"address"},{"internalType":"uint256","name":"_dummyId","type":"uint256"},{"internalType":"uint256","name":"_powah","type":"uint256"},{"internalType":"uint256","name":"_cap","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"claimCapped","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cid","type":"uint256"},{"internalType":"contract IStarNFT","name":"_starNFT","type":"address"},{"internalType":"uint256","name":"_dummyId","type":"uint256"},{"internalType":"uint256","name":"_powah","type":"uint256"},{"internalType":"uint256","name":"_cap","type":"uint256"},{"internalType":"address","name":"_mintTo","type":"address"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"claimCapped","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cid","type":"uint256"},{"internalType":"contract IStarNFT","name":"_starNFT","type":"address"},{"internalType":"uint256[]","name":"_nftIDs","type":"uint256[]"},{"internalType":"uint256","name":"_dummyId","type":"uint256"},{"internalType":"uint256","name":"_powah","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"forge","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cid","type":"uint256"},{"internalType":"contract IStarNFT","name":"_starNFT","type":"address"},{"internalType":"uint256[]","name":"_nftIDs","type":"uint256[]"},{"internalType":"uint256","name":"_dummyId","type":"uint256"},{"internalType":"uint256","name":"_powah","type":"uint256"},{"internalType":"address","name":"_mintTo","type":"address"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"forge","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"galaxy_signer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"hasMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"numMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury_manager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateCampaignSetter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateGalaxySigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newAddress","type":"address"}],"name":"updateTreasureManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6101206040523480156200001257600080fd5b506040516200366e3803806200366e833981810160405260808110156200003857600080fd5b50805160208083015160408085015160609095015181518083018352600681526547616c61787960d01b818601908152835180850190945260058452640312e302e360dc1b95840195909552805190942060c08190527f06c015bd22b4c69690933c1058878ebdfef31f9aaae40bbe86d8a09fe1b2972c60e081905295969395939491939192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ea62000166565b60a052620000fa8184846200016a565b608052610100908152600080546001600160a01b039a8b16909202610100600160a81b03199092169190911790555050600180549587166001600160a01b03199687161790555050600280549285169284169290921790915560038054919093169116179055620001ce565b4690565b60008383836200017962000166565b3060405160200180868152602001858152602001848152602001838152602001826001600160a01b03168152602001955050505050506040516020818303038152906040528051906020012090509392505050565b60805160a05160c05160e051610100516134606200020e600039806130795250806130bb52508061309a52508061302052508061305052506134606000f3fe6080604052600436106101d15760003560e01c8063b693d144116100f7578063d65459c911610095578063e5b9559511610064578063e5b9559514611079578063ef6c5996146110a3578063f02592411461113a578063f2b1251b1461117f576102f6565b8063d65459c914610f3a578063db6514dc14610fdf578063dd289b0d14610ff4578063e32ead2d14611027576102f6565b8063c100521c116100d1578063c100521c14610d16578063c105f53a14610d2b578063cfa8ba4f14610e63578063d60ef5c314610ee5576102f6565b8063b693d14414610c8d578063bd105b2214610cc0578063bedb86fb14610cea576102f6565b806358aba00f1161016f57806387bb0bdb1161013e57806387bb0bdb146108e85780639a1b6b08146109c7578063a53ddd2814610ab6578063a7fec7b114610ba4576102f6565b806358aba00f146108445780635c975abb146108775780636c329308146108a05780636c8f8b1a146108b5576102f6565b80632e4dbe8f116101ab5780632e4dbe8f146105cb578063331239261461065a578063481c6a751461077d5780634d8eb822146107ae576102f6565b806305880110146103155780630e2fbc541461043c5780631bf1d45c1461056c576102f6565b366102f6576003546000906001600160a01b03163482805b506040519080825280601f01601f191660200182016040528015610214576020820181803683370190505b506040518082805190602001908083835b602083106102445780518252601f199092019160209182019101610225565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146102a6576040519150601f19603f3d011682016040523d82523d6000602084013e6102ab565b606091505b50509050806102f3576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b50005b3415610313576003546000906001600160a01b03163482806101e9565b005b610313600480360360c081101561032b57600080fd5b8135916001600160a01b0360208201351691810190606081016040820135600160201b81111561035a57600080fd5b82018360208201111561036c57600080fd5b803590602001918460208302840111600160201b8311171561038d57600080fd5b919390929091602081019035600160201b8111156103aa57600080fd5b8201836020820111156103bc57600080fd5b803590602001918460208302840111600160201b831117156103dd57600080fd5b91939092823592604081019060200135600160201b8111156103fe57600080fd5b82018360208201111561041057600080fd5b803590602001918460018302840111600160201b8311171561043157600080fd5b50909250905061121f565b610313600480360360c081101561045257600080fd5b8135916001600160a01b0360208201351691810190606081016040820135600160201b81111561048157600080fd5b82018360208201111561049357600080fd5b803590602001918460208302840111600160201b831117156104b457600080fd5b919390929091602081019035600160201b8111156104d157600080fd5b8201836020820111156104e357600080fd5b803590602001918460208302840111600160201b8311171561050457600080fd5b919390926001600160a01b0383351692604081019060200135600160201b81111561052e57600080fd5b82018360208201111561054057600080fd5b803590602001918460018302840111600160201b8311171561056157600080fd5b509092509050611244565b34801561057857600080fd5b506105b9600480360360a081101561058f57600080fd5b508035906001600160a01b036020820135811691604081013591606082013591608001351661163d565b60408051918252519081900360200190f35b610313600480360360a08110156105e157600080fd5b8135916001600160a01b036020820135169160408201359160608101359181019060a081016080820135600160201b81111561061c57600080fd5b82018360208201111561062e57600080fd5b803590602001918460018302840111600160201b8311171561064f57600080fd5b5090925090506116d2565b610313600480360360a081101561067057600080fd5b8135916001600160a01b0360208201351691810190606081016040820135600160201b81111561069f57600080fd5b8201836020820111156106b157600080fd5b803590602001918460208302840111600160201b831117156106d257600080fd5b919390929091602081019035600160201b8111156106ef57600080fd5b82018360208201111561070157600080fd5b803590602001918460208302840111600160201b8311171561072257600080fd5b919390929091602081019035600160201b81111561073f57600080fd5b82018360208201111561075157600080fd5b803590602001918460018302840111600160201b8311171561077257600080fd5b5090925090506116f1565b34801561078957600080fd5b50610792611714565b604080516001600160a01b039092168252519081900360200190f35b610313600480360360c08110156107c457600080fd5b8135916001600160a01b03602082013516916040820135916060810135916080820135919081019060c0810160a0820135600160201b81111561080657600080fd5b82018360208201111561081857600080fd5b803590602001918460018302840111600160201b8311171561083957600080fd5b509092509050611723565b34801561085057600080fd5b506103136004803603602081101561086757600080fd5b50356001600160a01b0316611744565b34801561088357600080fd5b5061088c6117b3565b604080519115158252519081900360200190f35b3480156108ac57600080fd5b506107926117bc565b3480156108c157600080fd5b50610313600480360360208110156108d857600080fd5b50356001600160a01b03166117cb565b610313600480360360c08110156108fe57600080fd5b8135916001600160a01b0360208201351691810190606081016040820135600160201b81111561092d57600080fd5b82018360208201111561093f57600080fd5b803590602001918460208302840111600160201b8311171561096057600080fd5b919390928235926020810135929190606081019060400135600160201b81111561098957600080fd5b82018360208201111561099b57600080fd5b803590602001918460018302840111600160201b831117156109bc57600080fd5b50909250905061183a565b3480156109d357600080fd5b506105b9600480360360c08110156109ea57600080fd5b8135916001600160a01b0360208201351691810190606081016040820135600160201b811115610a1957600080fd5b820183602082011115610a2b57600080fd5b803590602001918460208302840111600160201b83111715610a4c57600080fd5b919390929091602081019035600160201b811115610a6957600080fd5b820183602082011115610a7b57600080fd5b803590602001918460208302840111600160201b83111715610a9c57600080fd5b9193509150803590602001356001600160a01b0316611853565b610313600480360360e0811015610acc57600080fd5b8135916001600160a01b0360208201351691810190606081016040820135600160201b811115610afb57600080fd5b820183602082011115610b0d57600080fd5b803590602001918460208302840111600160201b83111715610b2e57600080fd5b919390928235926020810135926001600160a01b03604083013516929091608081019060600135600160201b811115610b6657600080fd5b820183602082011115610b7857600080fd5b803590602001918460018302840111600160201b83111715610b9957600080fd5b509092509050611957565b348015610bb057600080fd5b506105b9600480360360a0811015610bc757600080fd5b8135916001600160a01b0360208201351691810190606081016040820135600160201b811115610bf657600080fd5b820183602082011115610c0857600080fd5b803590602001918460208302840111600160201b83111715610c2957600080fd5b919390929091602081019035600160201b811115610c4657600080fd5b820183602082011115610c5857600080fd5b803590602001918460208302840111600160201b83111715610c7957600080fd5b9193509150356001600160a01b0316611c9f565b348015610c9957600080fd5b5061031360048036036020811015610cb057600080fd5b50356001600160a01b0316611d9a565b348015610ccc57600080fd5b506105b960048036036020811015610ce357600080fd5b5035611e0f565b348015610cf657600080fd5b5061031360048036036020811015610d0d57600080fd5b50351515611e21565b348015610d2257600080fd5b50610792611e3c565b610313600480360360e0811015610d4157600080fd5b8135916001600160a01b0360208201351691810190606081016040820135600160201b811115610d7057600080fd5b820183602082011115610d8257600080fd5b803590602001918460208302840111600160201b83111715610da357600080fd5b919390929091602081019035600160201b811115610dc057600080fd5b820183602082011115610dd257600080fd5b803590602001918460208302840111600160201b83111715610df357600080fd5b919390928235926001600160a01b03602082013516929190606081019060400135600160201b811115610e2557600080fd5b820183602082011115610e3757600080fd5b803590602001918460018302840111600160201b83111715610e5857600080fd5b509092509050611e4b565b348015610e6f57600080fd5b5061088c60048036036040811015610e8657600080fd5b81359190810190604081016020820135600160201b811115610ea757600080fd5b820183602082011115610eb957600080fd5b803590602001918460018302840111600160201b83111715610eda57600080fd5b5090925090506122d5565b348015610ef157600080fd5b506105b9600480360360c0811015610f0857600080fd5b508035906001600160a01b03602082013581169160408101359160608201359160808101359160a09091013516612347565b348015610f4657600080fd5b506105b9600480360360c0811015610f5d57600080fd5b8135916001600160a01b0360208201351691810190606081016040820135600160201b811115610f8c57600080fd5b820183602082011115610f9e57600080fd5b803590602001918460208302840111600160201b83111715610fbf57600080fd5b9193509150803590602081013590604001356001600160a01b03166123e5565b348015610feb57600080fd5b506107926124aa565b34801561100057600080fd5b506103136004803603602081101561101757600080fd5b50356001600160a01b03166124be565b34801561103357600080fd5b506110516004803603602081101561104a57600080fd5b503561252d565b604080516001600160a01b039094168452602084019290925282820152519081900360600190f35b34801561108557600080fd5b5061088c6004803603602081101561109c57600080fd5b5035612558565b610313600480360360c08110156110b957600080fd5b8135916001600160a01b0360208201358116926040830135926060810135926080820135169181019060c0810160a0820135600160201b8111156110fc57600080fd5b82018360208201111561110e57600080fd5b803590602001918460018302840111600160201b8311171561112f57600080fd5b50909250905061256d565b34801561114657600080fd5b506103136004803603608081101561115d57600080fd5b50803590602081013590604081013590606001356001600160a01b0316612730565b610313600480360360e081101561119557600080fd5b8135916001600160a01b03602082013581169260408301359260608101359260808201359260a0830135909116919081019060e0810160c0820135600160201b8111156111e157600080fd5b8201836020820111156111f357600080fd5b803590602001918460018302840111600160201b8311171561121457600080fd5b50909250905061277d565b6112276129cc565b61123989898989898989338a8a611e4b565b505050505050505050565b61124c6129cc565b856112885760405162461bcd60e51b81526004018080602001828103825260268152602001806132ca6026913960400191505060405180910390fd5b8386146112dc576040805162461bcd60e51b815260206004820181905260248201527f4172726179285f706f77616841727229206c656e677468206d69736d61746368604482015290519081900360640190fd5b60005b8681101561139957600560008989848181106112f757fe5b602090810292909201358352508101919091526040016000205460ff1615611357576040805162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e481b5a5b9d195960921b604482015290519081900360640190fd5b6001600560008a8a8581811061136957fe5b60209081029290920135835250810191909152604001600020805460ff19169115159190911790556001016112df565b506113b36113ac8a8a8a8a8a8a8a611c9f565b83836122d5565b6113f8576040805162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b604482015290519081900360640190fd5b6114028987612a18565b6000886001600160a01b03166370c2f239858888905089896040518563ffffffff1660e01b815260040180856001600160a01b03168152602001848152602001806020018281038252848482818152602001925060200280828437600081840152601f19601f82011690508083019250505095505050505050600060405180830381600087803b15801561149557600080fd5b505af11580156114a9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156114d257600080fd5b8101908080516040519392919084600160201b8211156114f157600080fd5b90830190602082018581111561150657600080fd5b82518660208202830111600160201b8211171561152257600080fd5b82525081516020918201928201910280838360005b8381101561154f578181015183820152602001611537565b5050505090500160405250505090507f6d1a724eb51109bab7cb15159844ea8ad6bdc38107874eb466124f61604ccac88a8989848d89604051808781526020018060200180602001856001600160a01b03168152602001846001600160a01b0316815260200183810383528888828181526020019250602002808284376000838201819052601f909101601f19169092018581038452885181528851602091820193828b0193509102908190849084905b83811015611618578181015183820152602001611600565b505050509050019850505050505050505060405180910390a150505050505050505050565b60006116c87fab24fc7f8acd203d6001ca43a3e2f9954f0e9c8939ff9c48ba3cb56b750c6486878787878760405160200180878152602001868152602001856001600160a01b03168152602001848152602001838152602001826001600160a01b03168152602001965050505050505060405160208183030381529060405280519060200120612d1a565b9695505050505050565b6116da6129cc565b6116e98686868633878761256d565b505050505050565b6116f96129cc565b61170a888888888888338989611244565b5050505050505050565b6002546001600160a01b031681565b61172b6129cc565b61173b878787878733888861277d565b50505050505050565b61174c612d66565b6001600160a01b0381166117915760405162461bcd60e51b81526004018080602001828103825260288152602001806133da6028913960400191505060405180910390fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b60005460ff1681565b6001546001600160a01b031681565b6117d3612dbd565b6001600160a01b0381166118185760405162461bcd60e51b81526004018080602001828103825260298152602001806134026029913960400191505060405180910390fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6118426129cc565b61170a888888888888338989611957565b600061194a7f09a55e4c87879c353562e63d49fd633fd9c7db016c278d02a30be5e537e7f1b38a8a8a8a60405160200180838360200280828437808301925050509250505060405160208183030381529060405280519060200120898960405160200180838360200280828437808301925050509250505060405160208183030381529060405280519060200120888860405160200180888152602001878152602001866001600160a01b03168152602001858152602001848152602001838152602001826001600160a01b0316815260200197505050505050505060405160208183030381529060405280519060200120612d1a565b9998505050505050505050565b61195f6129cc565b60008581526005602052604090205460ff16156119b4576040805162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e481b5a5b9d195960921b604482015290519081900360640190fd5b6119c66113ac8a8a8a8a8a8a8a6123e5565b611a0b576040805162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b604482015290519081900360640190fd5b6000858152600560205260408120805460ff191660011790555b86811015611b0957886001600160a01b031663c5b8f772858a8a85818110611a4957fe5b905060200201356040518363ffffffff1660e01b815260040180836001600160a01b031681526020018281526020019250505060206040518083038186803b158015611a9457600080fd5b505afa158015611aa8573d6000803e3d6000fd5b505050506040513d6020811015611abe57600080fd5b5051611b01576040805162461bcd60e51b815260206004820152600d60248201526c2737ba103a34329037bbb732b960991b604482015290519081900360640190fd5b600101611a25565b50876001600160a01b031663b2dc5dc38489896040518463ffffffff1660e01b815260040180846001600160a01b03168152602001806020018281038252848482818152602001925060200280828437600081840152601f19601f820116905080830192505050945050505050600060405180830381600087803b158015611b9057600080fd5b505af1158015611ba4573d6000803e3d6000fd5b50505050611bb3896001612a18565b6000886001600160a01b03166340c10f1985876040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611c0c57600080fd5b505af1158015611c20573d6000803e3d6000fd5b505050506040513d6020811015611c3657600080fd5b5051604080518c8152602081018990528082018390526001600160a01b03808d1660608301528716608082015290519192507f50962162de36c97c4a6729213a0c77fff7cf6a875a028bf56fdf727c1f507e13919081900360a00190a150505050505050505050565b6000611d8e7fa2b5e2092d704820495ab7eec44641e53c37a2160be0cf18b4fc7426b24379a089898989604051602001808383602002808284378083019250505092505050604051602081830303815290604052805190602001208888604051602001808383602002808284378083019250505092505050604051602081830303815290604052805190602001208760405160200180878152602001868152602001856001600160a01b03168152602001848152602001838152602001826001600160a01b03168152602001965050505050505060405160208183030381529060405280519060200120612d1a565b98975050505050505050565b611da2612d66565b6001600160a01b038116611de75760405162461bcd60e51b815260040180806020018281038252602e8152602001806133ac602e913960400191505060405180910390fd5b600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b60066020526000908152604090205481565b611e29612d66565b6000805460ff1916911515919091179055565b6003546001600160a01b031681565b611e536129cc565b86611e8f5760405162461bcd60e51b81526004018080602001828103825260268152602001806132ca6026913960400191505060405180910390fd5b848714611ee3576040805162461bcd60e51b815260206004820181905260248201527f4172726179285f706f77616841727229206c656e677468206d69736d61746368604482015290519081900360640190fd5b60008a8152600660205260409020548701841015611f3c576040805162461bcd60e51b815260206004820152601160248201527014995858da19590818d85c081b1a5b5a5d607a1b604482015290519081900360640190fd5b60005b87811015611ff957600560008a8a84818110611f5757fe5b602090810292909201358352508101919091526040016000205460ff1615611fb7576040805162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e481b5a5b9d195960921b604482015290519081900360640190fd5b6001600560008b8b85818110611fc957fe5b60209081029290920135835250810191909152604001600020805460ff1916911515919091179055600101611f3f565b5061200d6113ac8b8b8b8b8b8b8b8b611853565b612052576040805162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b604482015290519081900360640190fd5b60008a81526006602052604090208054880190556120708a88612a18565b6000896001600160a01b03166370c2f23985898990508a8a6040518563ffffffff1660e01b815260040180856001600160a01b03168152602001848152602001806020018281038252848482818152602001925060200280828437600081840152601f19601f82011690508083019250505095505050505050600060405180830381600087803b15801561210357600080fd5b505af1158015612117573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561214057600080fd5b8101908080516040519392919084600160201b82111561215f57600080fd5b90830190602082018581111561217457600080fd5b82518660208202830111600160201b8211171561219057600080fd5b82525081516020918201928201910280838360005b838110156121bd5781810151838201526020016121a5565b5050505090500160405250505090506000600660008d81526020019081526020016000205490507f7ed7dd9159dd87aba95f61ba8d6294a95b86f09529767b7b96f807ef0ee6b6858c8b8b858f8a878d604051808981526020018060200180602001876001600160a01b03168152602001866001600160a01b0316815260200185815260200184815260200183810383528a8a828181526020019250602002808284376000838201819052601f909101601f191690920185810384528a5181528a51602091820193828d0193509102908190849084905b838110156122ac578181015183820152602001612294565b505050509050019a505050505050505050505060405180910390a1505050505050505050505050565b60008060019054906101000a90046001600160a01b03166001600160a01b03166123358585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612e1c92505050565b6001600160a01b031614949350505050565b60006123da7fbbb8b5e4f3c5684f4babe8411ac3f214c0fd78fde59aee4566ee7413e2f6583288888888888860405160200180888152602001878152602001866001600160a01b03168152602001858152602001848152602001838152602001826001600160a01b0316815260200197505050505050505060405160208183030381529060405280519060200120612d1a565b979650505050505050565b6000611d8e7fef2801ffde4aa9ac6363337a19b517d3794a53bf91419192c9beaa971e0735e0898989896040516020018083836020028082843780830192505050925050506040516020818303038152906040528051906020012088888860405160200180888152602001878152602001866001600160a01b03168152602001858152602001848152602001838152602001826001600160a01b0316815260200197505050505050505060405160208183030381529060405280519060200120612d1a565b60005461010090046001600160a01b031681565b6124c6612d66565b6001600160a01b03811661250b5760405162461bcd60e51b81526004018080602001828103825260308152602001806133126030913960400191505060405180910390fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6004602052600090815260409020805460018201546002909201546001600160a01b03909116919083565b60056020526000908152604090205460ff1681565b6125756129cc565b60008581526005602052604090205460ff16156125ca576040805162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e481b5a5b9d195960921b604482015290519081900360640190fd5b6125da6113ac888888888861163d565b61261f576040805162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b604482015290519081900360640190fd5b6000858152600560205260409020805460ff19166001908117909155612646908890612a18565b6000866001600160a01b03166340c10f1985876040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561269f57600080fd5b505af11580156126b3573d6000803e3d6000fd5b505050506040513d60208110156126c957600080fd5b5051604080518a8152602081018990528082018390526001600160a01b03808b1660608301528716608082015290519192507f055a181b27c0ef897e8c559755721e45a372d5ac946a2ae3905b8a4364e8745b919081900360a00190a15050505050505050565b612738612e9e565b61274484848484612efd565b6040805185815290517fd3e69059f9a273aa74e99eaa1d2f96fd3ca637806bcc4cd1ba6b7e3908c7801f9181900360200190a150505050565b6127856129cc565b60008681526005602052604090205460ff16156127da576040805162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e481b5a5b9d195960921b604482015290519081900360640190fd5b6000888152600660205260409020548411612830576040805162461bcd60e51b815260206004820152601160248201527014995858da19590818d85c081b1a5b5a5d607a1b604482015290519081900360640190fd5b6128416113ac898989898989612347565b612886576040805162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b604482015290519081900360640190fd5b6000868152600560209081526040808320805460ff191660019081179091558b845260069092529091208054820190556128c1908990612a18565b6000876001600160a01b03166340c10f1985886040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561291a57600080fd5b505af115801561292e573d6000803e3d6000fd5b505050506040513d602081101561294457600080fd5b505160008a8152600660209081526040918290205482518d81529182018b90528183018490526001600160a01b03808d1660608401528816608083015260a0820181905260c08201899052915192935090917f414361146a747b426f3699fe6ddf11d6cca501ab3fdcc6af49e67df686c8fdc69181900360e00190a150505050505050505050565b60005460ff1615612a16576040805162461bcd60e51b815260206004820152600f60248201526e10dbdb9d1c9858dd081c185d5cd959608a1b604482015290519081900360640190fd5b565b60008111612a65576040805162461bcd60e51b815260206004820152601560248201527404d757374206d696e74206d6f7265207468616e203605c1b604482015290519081900360640190fd5b600082815260046020908152604091829020825160608101845281546001600160a01b03168152600182015492810192909252600201549181018290529015612c0d576040810151612ab79083612fbc565b341015612b02576040805162461bcd60e51b8152602060048201526014602482015273125b9cdd59999a58da595b9d0814185e5b595b9d60621b604482015290519081900360640190fd5b6003546040805160008082526020820192839052815190936001600160a01b031692349291819081908082805b60208310612b4e5780518252601f199092019160209182019101612b2f565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612bb0576040519150601f19603f3d011682016040523d82523d6000602084013e612bb5565b606091505b5050905080612c0b576040805162461bcd60e51b815260206004820152601b60248201527f5472616e7366657220706c6174666f726d466565206661696c65640000000000604482015290519081900360640190fd5b505b602081015115612d1557805160035460208301516001600160a01b03928316926323b872dd923392911690612c429087612fbc565b6040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050602060405180830381600087803b158015612c9857600080fd5b505af1158015612cac573d6000803e3d6000fd5b505050506040513d6020811015612cc257600080fd5b5051612d15576040805162461bcd60e51b815260206004820152601860248201527f5472616e73666572206572633230466565206661696c65640000000000000000604482015290519081900360640190fd5b505050565b6000612d2461301c565b82604051602001808061190160f01b81525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050919050565b6002546001600160a01b03163314612a16576040805162461bcd60e51b815260206004820152601560248201527413db9b1e481b585b9859d95c8818d85b8818d85b1b605a1b604482015290519081900360640190fd5b6003546001600160a01b03163314612a16576040805162461bcd60e51b815260206004820152601e60248201527f4f6e6c79207472656173757279206d616e616765722063616e2063616c6c0000604482015290519081900360640190fd5b60008151604114612e74576040805162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015290519081900360640190fd5b60208201516040830151606084015160001a612e92868285856130e5565b93505050505b92915050565b6001546001600160a01b03163314612a16576040805162461bcd60e51b815260206004820152601c60248201527f4f6e6c792063616d706169676e5365747465722063616e2063616c6c00000000604482015290519081900360640190fd5b6001600160a01b038116158015612f12575081155b80612f2f57506001600160a01b03811615801590612f2f57508115155b612f6a5760405162461bcd60e51b81526004018080602001828103825260278152602001806133426027913960400191505060405180910390fd5b604080516060810182526001600160a01b03928316815260208082019485528183019586526000968752600490529420935184546001600160a01b031916911617835551600183015551600290910155565b600082612fcb57506000612e98565b82820282848281612fd857fe5b04146130155760405162461bcd60e51b815260040180806020018281038252602181526020018061338b6021913960400191505060405180910390fd5b9392505050565b60007f0000000000000000000000000000000000000000000000000000000000000000613047613263565b141561307457507f00000000000000000000000000000000000000000000000000000000000000006130e2565b6130df7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000613267565b90505b90565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156131465760405162461bcd60e51b81526004018080602001828103825260228152602001806132f06022913960400191505060405180910390fd5b8360ff16601b148061315b57508360ff16601c145b6131965760405162461bcd60e51b81526004018080602001828103825260228152602001806133696022913960400191505060405180910390fd5b600060018686868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156131f2573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661325a576040805162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015290519081900360640190fd5b95945050505050565b4690565b6000838383613274613263565b3060405160200180868152602001858152602001848152602001838152602001826001600160a01b0316815260200195505050505050604051602081830303815290604052805190602001209050939250505056fe4172726179285f64756d6d794964417272292073686f756c64206e6f7420626520656d70747945434453413a20696e76616c6964207369676e6174757265202773272076616c756543616d706169676e207365747465722061646472657373206d757374206e6f74206265206e756c6c2061646472657373496e76616c69642065726332302066656520726571756972656d656e7420617267756d656e747345434453413a20696e76616c6964207369676e6174757265202776272076616c7565536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7747616c617879207369676e65722061646472657373206d757374206e6f74206265206e756c6c20616464726573734d616e616765722061646472657373206d757374206e6f74206265206e756c6c20616464726573735472656173757265206d616e61676572206d757374206e6f74206265206e756c6c2061646472657373a26469706673582212209974e947e2da612241cc14c2640fc287225c03db50f386d48162611371aa208164736f6c63430007060033000000000000000000000000111ae6fe1ad173def8dc36e9dff5144c713f2880000000000000000000000000111ae6fe1ad173def8dc36e9dff5144c713f2880000000000000000000000000111ae6fe1ad173def8dc36e9dff5144c713f2880000000000000000000000000ade113359ebce63e7429317be1a495f3a836df65

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000111ae6fe1ad173def8dc36e9dff5144c713f2880000000000000000000000000111ae6fe1ad173def8dc36e9dff5144c713f2880000000000000000000000000111ae6fe1ad173def8dc36e9dff5144c713f2880000000000000000000000000ade113359ebce63e7429317be1a495f3a836df65

-----Decoded View---------------
Arg [0] : _galaxy_signer (address): 0x111ae6fe1ad173def8dc36e9dff5144c713f2880
Arg [1] : _campaign_setter (address): 0x111ae6fe1ad173def8dc36e9dff5144c713f2880
Arg [2] : _contract_manager (address): 0x111ae6fe1ad173def8dc36e9dff5144c713f2880
Arg [3] : _treasury_manager (address): 0xade113359ebce63e7429317be1a495f3a836df65

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000111ae6fe1ad173def8dc36e9dff5144c713f2880
Arg [1] : 000000000000000000000000111ae6fe1ad173def8dc36e9dff5144c713f2880
Arg [2] : 000000000000000000000000111ae6fe1ad173def8dc36e9dff5144c713f2880
Arg [3] : 000000000000000000000000ade113359ebce63e7429317be1a495f3a836df65


Deployed ByteCode Sourcemap

1071:19274:6:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12313:16;;12295:12;;-1:-1:-1;;;;;12313:16:6;12342:9;12295:12;;12366;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12366:12:6;;12313:75;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;12313:75:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12294:94;;;12406:7;12398:35;;;;;-1:-1:-1;;;12398:35:6;;;;;;;;;;;;-1:-1:-1;;;12398:35:6;;;;;;;;;;;;;;;12206:234;1071:19274;;12488:9;:13;12484:230;;12601:16;;12583:12;;-1:-1:-1;;;;;12601:16:6;12630:9;12583:12;;12641;;12484:230;1071:19274;10458:349;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10458:349:6;;;;;;;;;;;;;;;;-1:-1:-1;;;10458:349:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10458:349:6;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10458:349:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10458:349:6;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10458:349:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10458:349:6;;;;;;;;;;-1:-1:-1;10458:349:6;;-1:-1:-1;10458:349:6;-1:-1:-1;10458:349:6;:::i;6257:1139::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6257:1139:6;;;;;;;;;;;;;;;;-1:-1:-1;;;6257:1139:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;6257:1139:6;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;6257:1139:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;6257:1139:6;;;;;;;;;;;;;;-1:-1:-1;;;;;6257:1139:6;;;;;;;;;;;-1:-1:-1;;;6257:1139:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;6257:1139:6;;;;;;;;;;-1:-1:-1;6257:1139:6;;-1:-1:-1;6257:1139:6;-1:-1:-1;6257:1139:6;:::i;14333:620::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14333:620:6;;;-1:-1:-1;;;;;14333:620:6;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;5986:265;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5986:265:6;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5986:265:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5986:265:6;;;;;;;;;;-1:-1:-1;5986:265:6;;-1:-1:-1;5986:265:6;-1:-1:-1;5986:265:6;:::i;7402:309::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7402:309:6;;;;;;;;;;;;;;;;-1:-1:-1;;;7402:309:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7402:309:6;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7402:309:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7402:309:6;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7402:309:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7402:309:6;;;;;;;;;;-1:-1:-1;7402:309:6;;-1:-1:-1;7402:309:6;-1:-1:-1;7402:309:6;:::i;3578:22::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;3578:22:6;;;;;;;;;;;;;;8581:305;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8581:305:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8581:305:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8581:305:6;;;;;;;;;;-1:-1:-1;8581:305:6;;-1:-1:-1;8581:305:6;-1:-1:-1;8581:305:6;:::i;13501:222::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13501:222:6;-1:-1:-1;;;;;13501:222:6;;:::i;3278:18::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;3472:30;;;;;;;;;;;;;:::i;13827:268::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13827:268:6;-1:-1:-1;;;;;13827:268:6;;:::i;11890:310::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11890:310:6;;;;;;;;;;;;;;;;-1:-1:-1;;;11890:310:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11890:310:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11890:310:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11890:310:6;;;;;;;;;;-1:-1:-1;11890:310:6;;-1:-1:-1;11890:310:6;-1:-1:-1;11890:310:6;:::i;16384:793::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16384:793:6;;;;;;;;;;;;;;;;-1:-1:-1;;;16384:793:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16384:793:6;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16384:793:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16384:793:6;;;;;;;;;;;;-1:-1:-1;16384:793:6;-1:-1:-1;16384:793:6;;;;;;-1:-1:-1;;;;;16384:793:6;;:::i;10813:1071::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10813:1071:6;;;;;;;;;;;;;;;;-1:-1:-1;;;10813:1071:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10813:1071:6;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10813:1071:6;;;;;;;;;;;;;;;-1:-1:-1;;;10813:1071:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10813:1071:6;;;;;;;;;;-1:-1:-1;10813:1071:6;;-1:-1:-1;10813:1071:6;-1:-1:-1;10813:1071:6;:::i;15651:727::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15651:727:6;;;;;;;;;;;;;;;;-1:-1:-1;;;15651:727:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;15651:727:6;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;15651:727:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;15651:727:6;;;;;;;;;;;;-1:-1:-1;15651:727:6;-1:-1:-1;15651:727:6;-1:-1:-1;;;;;15651:727:6;;:::i;12821:239::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12821:239:6;-1:-1:-1;;;;;12821:239:6;;:::i;4132:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4132:44:6;;:::i;14186:86::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14186:86:6;;;;:::i;3651:31::-;;;;;;;;;;;;;:::i;8892:1560::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8892:1560:6;;;;;;;;;;;;;;;;-1:-1:-1;;;8892:1560:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8892:1560:6;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8892:1560:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8892:1560:6;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8892:1560:6;;;;;;;;;;;;;;;-1:-1:-1;;;8892:1560:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8892:1560:6;;;;;;;;;;-1:-1:-1;8892:1560:6;;-1:-1:-1;8892:1560:6;-1:-1:-1;8892:1560:6;:::i;18003:171::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;18003:171:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;18003:171:6;;;;;;;;;;-1:-1:-1;18003:171:6;;-1:-1:-1;18003:171:6;-1:-1:-1;18003:171:6;:::i;14959:686::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14959:686:6;;;-1:-1:-1;;;;;14959:686:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;17222:736::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17222:736:6;;;;;;;;;;;;;;;;-1:-1:-1;;;17222:736:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17222:736:6;;;;;;;;;;;;-1:-1:-1;17222:736:6;-1:-1:-1;17222:736:6;;;;;;;;;;;-1:-1:-1;;;;;17222:736:6;;:::i;3358:28::-;;;;;;;;;;;;;:::i;13161:245::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13161:245:6;-1:-1:-1;;;;;13161:245:6;;:::i;3859:63::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3859:63:6;;:::i;:::-;;;;-1:-1:-1;;;;;3859:63:6;;;;;;;;;;;;;;;;;;;;;;;;;4047:41;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4047:41:6;;:::i;5333:647::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5333:647:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5333:647:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5333:647:6;;;;;;;;;;-1:-1:-1;5333:647:6;;-1:-1:-1;5333:647:6;-1:-1:-1;5333:647:6;:::i;5058:269::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5058:269:6;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5058:269:6;;:::i;7717:858::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7717:858:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7717:858:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7717:858:6;;;;;;;;;;-1:-1:-1;7717:858:6;;-1:-1:-1;7717:858:6;-1:-1:-1;7717:858:6;:::i;10458:349::-;2821:24;:22;:24::i;:::-;10714:86:::1;10731:4;10737:8;10747:11;;10760:9;;10771:4;10777:10;10789;;10714:16;:86::i;:::-;10458:349:::0;;;;;;;;;:::o;6257:1139::-;2821:24;:22;:24::i;:::-;6529:22;6508:107:::1;;;;-1:-1:-1::0;;;6508:107:6::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6646:38:::0;;::::1;6625:117;;;::::0;;-1:-1:-1;;;6625:117:6;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;6758:9;6753:173;6773:22:::0;;::::1;6753:173;;;6825:9;:25;6835:11;;6847:1;6835:14;;;;;;;;::::0;;::::1;::::0;;;::::1;;6825:25:::0;;-1:-1:-1;6825:25:6;::::1;::::0;;;;;;-1:-1:-1;6825:25:6;;::::1;;6824:26;6816:53;;;::::0;;-1:-1:-1;;;6816:53:6;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;6816:53:6;;;;;;;;;;;;;::::1;;6911:4;6883:9;:25;6893:11;;6905:1;6893:14;;;;;;;;::::0;;::::1;::::0;;;::::1;;6883:25:::0;;-1:-1:-1;6883:25:6;::::1;::::0;;;;;;-1:-1:-1;6883:25:6;:32;;-1:-1:-1;;6883:32:6::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;6797:3:6::1;6753:173;;;;6957:126;6982:59;6993:4;6999:8;7009:11;;7022:9;;7033:7;6982:10;:59::i;:::-;7059:10;;6957:7;:126::i;:::-;6936:190;;;::::0;;-1:-1:-1;;;6936:190:6;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;6936:190:6;;;;;;;;;;;;;::::1;;7136:34;7145:4:::0;7151:11;7136:8:::1;:34::i;:::-;7181:25;7209:8;-1:-1:-1::0;;;;;7209:18:6::1;;7241:7;7262:9;;:16;;7292:9;;7209:102;;;;;;;;;;;;;-1:-1:-1::0;;;;;7209:102:6::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;7209:102:6::1;::::0;::::1;;::::0;::::1;::::0;::::1;;;;;::::0;::::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;7209:102:6::1;;;;;;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;;;;;::::0;::::1;;;;;;;;;;;-1:-1:-1::0;;;7209:102:6::1;;;;;;;::::0;::::1;;::::0;;-1:-1:-1;7209:102:6;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;::::0;::::1;;7181:130;;7326:63;7342:4;7348:11;;7361:8;7371;7381:7;7326:63;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;7326:63:6::1;;;;;;-1:-1:-1::0;;;;;7326:63:6::1;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;;::::1;-1:-1:-1::0;;7326:63:6::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;-1:-1:-1;7326:63:6;::::1;::::0;;;;;;;::::1;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2855:1;6257:1139:::0;;;;;;;;;:::o;14333:620::-;14500:7;14534:412;14623:137;14782:4;14808:8;14838;14868:6;14896:8;14591:331;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14591:331:6;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14591:331:6;;;;;;;;;;;;;;;;;;;;;;;;;14564:372;;;;;;14534:16;:412::i;:::-;14519:427;14333:620;-1:-1:-1;;;;;;14333:620:6:o;5986:265::-;2821:24;:22;:24::i;:::-;6181:63:::1;6187:4;6193:8;6203;6213:6;6221:10;6233;;6181:5;:63::i;:::-;5986:265:::0;;;;;;:::o;7402:309::-;2821:24;:22;:24::i;:::-;7630:74:::1;7641:4;7647:8;7657:11;;7670:9;;7681:10;7693;;7630;:74::i;:::-;7402:309:::0;;;;;;;;:::o;3578:22::-;;;-1:-1:-1;;;;;3578:22:6;;:::o;8581:305::-;2821:24;:22;:24::i;:::-;8804:75:::1;8816:4;8822:8;8832;8842:6;8850:4;8856:10;8868;;8804:11;:75::i;:::-;8581:305:::0;;;;;;;:::o;13501:222::-;2510:22;:20;:22::i;:::-;-1:-1:-1;;;;;13596:24:6;::::1;13575:111;;;;-1:-1:-1::0;;;13575:111:6::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13696:7;:20:::0;;-1:-1:-1;;;;;;13696:20:6::1;-1:-1:-1::0;;;;;13696:20:6;;;::::1;::::0;;;::::1;::::0;;13501:222::o;3278:18::-;;;;;;:::o;3472:30::-;;;-1:-1:-1;;;;;3472:30:6;;:::o;13827:268::-;2681:30;:28;:30::i;:::-;-1:-1:-1;;;;;13958:24:6;::::1;13937:112;;;;-1:-1:-1::0;;;13937:112:6::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14059:16;:29:::0;;-1:-1:-1;;;;;;14059:29:6::1;-1:-1:-1::0;;;;;14059:29:6;;;::::1;::::0;;;::::1;::::0;;13827:268::o;11890:310::-;2821:24;:22;:24::i;:::-;12121:72:::1;12127:4;12133:8;12143:7;;12152:8;12162:6;12170:10;12182;;12121:5;:72::i;16384:793::-:0;16612:7;16646:524;16735:159;16916:4;16942:8;16999:11;;16982:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16972:40;;;;;;17061:9;;17044:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17034:38;;;;;;17094:4;17120:8;16703:443;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16703:443:6;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16703:443:6;;;;;;;;;;;;;;;;;;;;;;;;;;16676:484;;;;;;16646:16;:524::i;:::-;16631:539;16384:793;-1:-1:-1;;;;;;;;;16384:793:6:o;10813:1071::-;2821:24;:22;:24::i;:::-;11076:19:::1;::::0;;;:9:::1;:19;::::0;;;;;::::1;;11075:20;11067:47;;;::::0;;-1:-1:-1;;;11067:47:6;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;11067:47:6;;;;;;;;;;;;;::::1;;11145:267;11170:200;11202:4;11228:8;11258:7;;11287:8;11317:6;11345:7;11170:10;:200::i;11145:267::-;11124:331;;;::::0;;-1:-1:-1;;;11124:331:6;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;11124:331:6;;;;;;;;;;;;;::::1;;11465:19;::::0;;;:9:::1;:19;::::0;;;;:26;;-1:-1:-1;;11465:26:6::1;11487:4;11465:26;::::0;;11501:181:::1;11521:18:::0;;::::1;11501:181;;;11585:8;-1:-1:-1::0;;;;;11585:18:6::1;;11604:7;11613;;11621:1;11613:10;;;;;;;;;;;;;11585:39;;;;;;;;;;;;;-1:-1:-1::0;;;;;11585:39:6::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;11585:39:6;11560:111:::1;;;::::0;;-1:-1:-1;;;11560:111:6;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;11560:111:6;;;;;;;;;;;;;::::1;;11541:3;;11501:181;;;;11691:8;-1:-1:-1::0;;;;;11691:18:6::1;;11710:7;11719;;11691:36;;;;;;;;;;;;;-1:-1:-1::0;;;;;11691:36:6::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;11737:17;11746:4;11752:1;11737:8;:17::i;:::-;11764:13;11780:8;-1:-1:-1::0;;;;;11780:13:6::1;;11794:7;11803:6;11780:30;;;;;;;;;;;;;-1:-1:-1::0;;;;;11780:30:6::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;11780:30:6;11825:52:::1;::::0;;;;;11780:30:::1;11825:52:::0;::::1;::::0;;;;;;;;;-1:-1:-1;;;;;11825:52:6;;::::1;::::0;;;;;::::1;::::0;;;;;;11780:30;;-1:-1:-1;11825:52:6::1;::::0;;;;;;;;::::1;2855:1;10813:1071:::0;;;;;;;;;:::o;15651:727::-;15851:7;15885:486;15974:147;16143:4;16169:8;16226:11;;16209:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16199:40;;;;;;16288:9;;16271:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16261:38;;;;;;16321:8;15942:405;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15942:405:6;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15942:405:6;;;;;;;;;;;;;;;;;;;;;;;;;15915:446;;;;;;15885:16;:486::i;:::-;15870:501;15651:727;-1:-1:-1;;;;;;;;15651:727:6:o;12821:239::-;2510:22;:20;:22::i;:::-;-1:-1:-1;;;;;12921:24:6;::::1;12900:117;;;;-1:-1:-1::0;;;12900:117:6::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13027:13;:26:::0;;-1:-1:-1;;;;;13027:26:6;;::::1;;;-1:-1:-1::0;;;;;;13027:26:6;;::::1;::::0;;;::::1;::::0;;12821:239::o;4132:44::-;;;;;;;;;;;;;:::o;14186:86::-;2510:22;:20;:22::i;:::-;14249:6:::1;:16:::0;;-1:-1:-1;;14249:16:6::1;::::0;::::1;;::::0;;;::::1;::::0;;14186:86::o;3651:31::-;;;-1:-1:-1;;;;;3651:31:6;;:::o;8892:1560::-;2821:24;:22;:24::i;:::-;9192:22;9171:107:::1;;;;-1:-1:-1::0;;;9171:107:6::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9309:38:::0;;::::1;9288:117;;;::::0;;-1:-1:-1;;;9288:117:6;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;9436:15;::::0;;;:9:::1;:15;::::0;;;;;:36;::::1;:44:::0;-1:-1:-1;9436:44:6::1;9415:108;;;::::0;;-1:-1:-1;;;9415:108:6;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;9415:108:6;;;;;;;;;;;;;::::1;;9539:9;9534:173;9554:22:::0;;::::1;9534:173;;;9606:9;:25;9616:11;;9628:1;9616:14;;;;;;;;::::0;;::::1;::::0;;;::::1;;9606:25:::0;;-1:-1:-1;9606:25:6;::::1;::::0;;;;;;-1:-1:-1;9606:25:6;;::::1;;9605:26;9597:53;;;::::0;;-1:-1:-1;;;9597:53:6;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;9597:53:6;;;;;;;;;;;;;::::1;;9692:4;9664:9;:25;9674:11;;9686:1;9674:14;;;;;;;;::::0;;::::1;::::0;;;::::1;;9664:25:::0;;-1:-1:-1;9664:25:6;::::1;::::0;;;;;;-1:-1:-1;9664:25:6;:32;;-1:-1:-1;;9664:32:6::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;9578:3:6::1;9534:173;;;;9738:276;9763:209;9801:4;9827:8;9857:11;;9890:9;;9921:4;9947:7;9763:16;:209::i;9738:276::-;9717:340;;;::::0;;-1:-1:-1;;;9717:340:6;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;9717:340:6;;;;;;;;;;;;;::::1;;10085:15;::::0;;;:9:::1;:15;::::0;;;;;;:36;::::1;10067:54:::0;;10131:34:::1;10095:4:::0;10103:11;10131:8:::1;:34::i;:::-;10175:25;10203:8;-1:-1:-1::0;;;;;10203:18:6::1;;10235:7;10256:9;;:16;;10286:9;;10203:102;;;;;;;;;;;;;-1:-1:-1::0;;;;;10203:102:6::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;10203:102:6::1;::::0;::::1;;::::0;::::1;::::0;::::1;;;;;::::0;::::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;10203:102:6::1;;;;;;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;;;;;::::0;::::1;;;;;;;;;;;-1:-1:-1::0;;;10203:102:6::1;;;;;;;::::0;::::1;;::::0;;-1:-1:-1;10203:102:6;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;::::0;::::1;;10175:130;;10315:14;10332:9;:15;10342:4;10332:15;;;;;;;;;;;;10315:32;;10362:83;10384:4;10390:11;;10403:8;10413;10423:7;10432:6;10440:4;10362:83;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;10362:83:6::1;;;;;;-1:-1:-1::0;;;;;10362:83:6::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;;::::1;-1:-1:-1::0;;10362:83:6::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;-1:-1:-1;10362:83:6;::::1;::::0;;;;;;;::::1;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2855:1;;8892:1560:::0;;;;;;;;;;:::o;18003:171::-;18093:4;18154:13;;;;;;;;;-1:-1:-1;;;;;18154:13:6;-1:-1:-1;;;;;18120:47:6;:30;18134:4;18140:9;;18120:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18120:13:6;;-1:-1:-1;;;18120:30:6:i;:::-;-1:-1:-1;;;;;18120:47:6;;;18003:171;-1:-1:-1;;;;18003:171:6:o;14959:686::-;15154:7;15188:450;15277:149;15448:4;15474:8;15504;15534:6;15562:4;15588:8;15245:369;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15245:369:6;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15245:369:6;;;;;;;;;;;;;;;;;;;;;;;;;;15218:410;;;;;;15188:16;:450::i;:::-;15173:465;14959:686;-1:-1:-1;;;;;;;14959:686:6:o;17222:736::-;17430:7;17464:487;17553:154;17729:4;17755:8;17812:7;;17795:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17785:36;;;;;;17843:8;17873:6;17901:8;17521:406;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17521:406:6;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17521:406:6;;;;;;;;;;;;;;;;;;;;;;;;;;17494:447;;;;;;17464:16;:487::i;3358:28::-;;;;;;-1:-1:-1;;;;;3358:28:6;;:::o;13161:245::-;2510:22;:20;:22::i;:::-;-1:-1:-1;;;;;13263:24:6;::::1;13242:119;;;;-1:-1:-1::0;;;13242:119:6::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13371:15;:28:::0;;-1:-1:-1;;;;;;13371:28:6::1;-1:-1:-1::0;;;;;13371:28:6;;;::::1;::::0;;;::::1;::::0;;13161:245::o;3859:63::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3859:63:6;;;;;;:::o;4047:41::-;;;;;;;;;;;;;;;:::o;5333:647::-;2821:24;:22;:24::i;:::-;5560:19:::1;::::0;;;:9:::1;:19;::::0;;;;;::::1;;5559:20;5551:47;;;::::0;;-1:-1:-1;;;5551:47:6;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;5551:47:6;;;;;;;;;;;;;::::1;;5629:115;5654:48;5660:4;5666:8;5676;5686:6;5694:7;5654:5;:48::i;5629:115::-;5608:179;;;::::0;;-1:-1:-1;;;5608:179:6;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;5608:179:6;;;;;;;;;;;;;::::1;;5797:19;::::0;;;:9:::1;:19;::::0;;;;:26;;-1:-1:-1;;5797:26:6::1;5819:4;5797:26:::0;;::::1;::::0;;;5833:17:::1;::::0;5842:4;;5833:8:::1;:17::i;:::-;5860:13;5876:8;-1:-1:-1::0;;;;;5876:13:6::1;;5890:7;5899:6;5876:30;;;;;;;;;;;;;-1:-1:-1::0;;;;;5876:30:6::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;5876:30:6;5921:52:::1;::::0;;;;;5876:30:::1;5921:52:::0;::::1;::::0;;;;;;;;;-1:-1:-1;;;;;5921:52:6;;::::1;::::0;;;;;::::1;::::0;;;;;;5876:30;;-1:-1:-1;5921:52:6::1;::::0;;;;;;;;::::1;2855:1;5333:647:::0;;;;;;;:::o;5058:269::-;2325:29;:27;:29::i;:::-;5231:47:::1;5240:4;5246:12;5260:9;5271:6;5231:8;:47::i;:::-;5293:27;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;5058:269:::0;;;;:::o;7717:858::-;2821:24;:22;:24::i;:::-;7972:19:::1;::::0;;;:9:::1;:19;::::0;;;;;::::1;;7971:20;7963:47;;;::::0;;-1:-1:-1;;;7963:47:6;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;7963:47:6;;;;;;;;;;;;;::::1;;8028:15;::::0;;;:9:::1;:15;::::0;;;;;:22;-1:-1:-1;8020:52:6::1;;;::::0;;-1:-1:-1;;;8020:52:6;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;8020:52:6;;;;;;;;;;;;;::::1;;8103:127;8128:60;8140:4;8146:8;8156;8166:6;8174:4;8180:7;8128:11;:60::i;8103:127::-;8082:191;;;::::0;;-1:-1:-1;;;8082:191:6;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;8082:191:6;;;;;;;;;;;;;::::1;;8283:19;::::0;;;:9:::1;:19;::::0;;;;;;;:26;;-1:-1:-1;;8283:26:6::1;8305:4;8283:26:::0;;::::1;::::0;;;8337:15;;;:9:::1;:15:::0;;;;;;;;:19;::::1;8319:37:::0;;8366:17:::1;::::0;8347:4;;8366:8:::1;:17::i;:::-;8393:13;8409:8;-1:-1:-1::0;;;;;8409:13:6::1;;8423:7;8432:6;8409:30;;;;;;;;;;;;;-1:-1:-1::0;;;;;8409:30:6::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;8409:30:6;8449:14:::1;8466:15:::0;;;:9:::1;8409:30;8466:15:::0;;;;;;;;;8496:72;;;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;;;;;8496:72:6;;::::1;::::0;;;;;::::1;::::0;;;;;;;;;;;;;;;;;;8409:30;;-1:-1:-1;8466:15:6;;8496:72:::1;::::0;;;;;;;::::1;2855:1;;7717:858:::0;;;;;;;;:::o;20243:100::-;20310:6;;;;20309:7;20301:35;;;;;-1:-1:-1;;;20301:35:6;;;;;;;;;;;;-1:-1:-1;;;20301:35:6;;;;;;;;;;;;;;;20243:100::o;18653:1028::-;18736:1;18727:6;:10;18719:44;;;;;-1:-1:-1;;;18719:44:6;;;;;;;;;;;;-1:-1:-1;;;18719:44:6;;;;;;;;;;;;;;;18773:32;18808:24;;;:18;:24;;;;;;;;;18773:59;;;;;;;;;-1:-1:-1;;;;;18773:59:6;;;;;;;;;;;;;;;;;;;;;;;;18886:23;18882:354;;18963:19;;;;:31;;18987:6;18963:23;:31::i;:::-;18950:9;:44;;18925:123;;;;;-1:-1:-1;;;18925:123:6;;;;;;;;;;;;-1:-1:-1;;;18925:123:6;;;;;;;;;;;;;;;19081:16;;19138:12;;;19063;19138;;;;;;;;;;19081:83;;19063:12;;-1:-1:-1;;;;;19081:16:6;;19110:9;;19138:12;;;;;19081:83;19138:12;;19081:83;;;;;;;;;;-1:-1:-1;;19081:83:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19062:102;;;19186:7;19178:47;;;;;-1:-1:-1;;;19178:47:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;18882:354;;19287:16;;;;:20;19283:392;;19441:13;;19522:16;;19560;;;;-1:-1:-1;;;;;19434:34:6;;;;;;19490:10;;19522:16;;;19560:28;;19581:6;19560:20;:28::i;:::-;19434:172;;;;;;;;;;;;;-1:-1:-1;;;;;19434:172:6;;;;;;-1:-1:-1;;;;;19434:172:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19434:172:6;19409:255;;;;;-1:-1:-1;;;19409:255:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;18653:1028;;;:::o;4202:183:2:-;4279:7;4344:20;:18;:20::i;:::-;4366:10;4315:62;;;;;;-1:-1:-1;;;4315:62:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4305:73;;;;;;4298:80;;4202:183;;;:::o;19935:118:6:-;20013:7;;-1:-1:-1;;;;;20013:7:6;19999:10;:21;19991:55;;;;;-1:-1:-1;;;19991:55:6;;;;;;;;;;;;-1:-1:-1;;;19991:55:6;;;;;;;;;;;;;;20059:178;20158:16;;-1:-1:-1;;;;;20158:16:6;20144:10;:30;20123:107;;;;;-1:-1:-1;;;20123:107:6;;;;;;;;;;;;;;;;;;;;;;;;;;;1072:740:1;1150:7;1211:9;:16;1231:2;1211:22;1207:94;;1249:41;;;-1:-1:-1;;;1249:41:1;;;;;;;;;;;;;;;;;;;;;;;;;;;1207:94;1651:4;1636:20;;1630:27;1696:4;1681:20;;1675:27;1749:4;1734:20;;1728:27;1367:9;1720:36;1783:22;1791:4;1720:36;1630:27;1675;1783:7;:22::i;:::-;1776:29;;;;;1072:740;;;;;:::o;19789:140:6:-;19874:15;;-1:-1:-1;;;;;19874:15:6;19860:10;:29;19852:70;;;;;-1:-1:-1;;;19852:70:6;;;;;;;;;;;;;;;;;;;;;;;;;;;18180:467;-1:-1:-1;;;;;18347:20:6;;;:38;;;;-1:-1:-1;18371:14:6;;18347:38;18346:96;;;-1:-1:-1;;;;;;18403:20:6;;;;;;:38;;-1:-1:-1;18427:14:6;;;18403:38;18325:182;;;;-1:-1:-1;;;18325:182:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18544:96;;;;;;;;-1:-1:-1;;;;;18544:96:6;;;;;;;;;;;;;;;;;;-1:-1:-1;18517:24:6;;;:18;:24;;;;:123;;;;-1:-1:-1;;;;;;18517:123:6;;;;;;;-1:-1:-1;18517:123:6;;;;;;;;;18180:467::o;3538:215:5:-;3596:7;3619:6;3615:20;;-1:-1:-1;3634:1:5;3627:8;;3615:20;3657:5;;;3661:1;3657;:5;:1;3680:5;;;;;:10;3672:56;;;;-1:-1:-1;;;3672:56:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3745:1;3538:215;-1:-1:-1;;;3538:215:5:o;2961:283:2:-;3022:7;3062:16;3045:13;:11;:13::i;:::-;:33;3041:197;;;-1:-1:-1;3101:24:2;3094:31;;3041:197;3163:64;3185:10;3197:12;3211:15;3163:21;:64::i;:::-;3156:71;;3041:197;2961:283;:::o;1960:1414:1:-;2045:7;2960:66;2946:80;;;2938:127;;;;-1:-1:-1;;;2938:127:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3083:1;:7;;3088:2;3083:7;:18;;;;3094:1;:7;;3099:2;3094:7;3083:18;3075:65;;;;-1:-1:-1;;;3075:65:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3235:14;3252:24;3262:4;3268:1;3271;3274;3252:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3252:24:1;;-1:-1:-1;;3252:24:1;;;-1:-1:-1;;;;;;;3294:20:1;;3286:57;;;;;-1:-1:-1;;;3286:57:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;3361:6;1960:1414;-1:-1:-1;;;;;1960:1414:1:o;4391:320:2:-;4686:9;;4661:44::o;3250:327::-;3352:7;3429:8;3455:4;3477:7;3502:13;:11;:13::i;:::-;3541:4;3401:159;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3401:159:2;;;;;;;;;;;;;;;;;;;;;;;;3378:192;;;;;;3371:199;;3250:327;;;;;:::o

Swarm Source

ipfs://9974e947e2da612241cc14c2640fc287225c03db50f386d48162611371aa2081
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.