{
  "contractName": "ERC20Sale",
  "abi": [
    {
      "constant": true,
      "inputs": [
        {
          "name": "_interfaceId",
          "type": "bytes4"
        }
      ],
      "name": "supportsInterface",
      "outputs": [
        {
          "name": "",
          "type": "bool"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "name",
      "outputs": [
        {
          "name": "",
          "type": "string"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "numberOfStrategies",
      "outputs": [
        {
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [],
      "name": "activate",
      "outputs": [
        {
          "name": "",
          "type": "bool"
        }
      ],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "name": "index",
          "type": "uint256"
        }
      ],
      "name": "strategyAt",
      "outputs": [
        {
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "activated",
      "outputs": [
        {
          "name": "",
          "type": "bool"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "InterfaceId_ERC165",
      "outputs": [
        {
          "name": "",
          "type": "bytes4"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "started",
      "outputs": [
        {
          "name": "",
          "type": "bool"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "InterfaceId_ERC20Sale",
      "outputs": [
        {
          "name": "",
          "type": "bytes4"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "whitepaperUrl",
      "outputs": [
        {
          "name": "",
          "type": "string"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "numberOfActivatedStrategies",
      "outputs": [
        {
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [],
      "name": "withdraw",
      "outputs": [
        {
          "name": "",
          "type": "bool"
        }
      ],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "weiRaised",
      "outputs": [
        {
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "name": "index",
          "type": "uint256"
        }
      ],
      "name": "activatedStrategyAt",
      "outputs": [
        {
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "numberOfPurchasers",
      "outputs": [
        {
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "template",
      "outputs": [
        {
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [],
      "name": "renounceOwnership",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "videoUrl",
      "outputs": [
        {
          "name": "",
          "type": "string"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "projectDescription",
      "outputs": [
        {
          "name": "",
          "type": "string"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "name": "_template",
          "type": "address"
        },
        {
          "name": "_bytecode",
          "type": "bytes"
        }
      ],
      "name": "addStrategy",
      "outputs": [],
      "payable": true,
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "name": "_index",
          "type": "uint256"
        }
      ],
      "name": "purchaserAt",
      "outputs": [
        {
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "logoUrl",
      "outputs": [
        {
          "name": "",
          "type": "string"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "projectName",
      "outputs": [
        {
          "name": "",
          "type": "string"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "successful",
      "outputs": [
        {
          "name": "",
          "type": "bool"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "projectSummary",
      "outputs": [
        {
          "name": "",
          "type": "string"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "websiteUrl",
      "outputs": [
        {
          "name": "",
          "type": "string"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [],
      "name": "claimRefund",
      "outputs": [
        {
          "name": "",
          "type": "bool"
        }
      ],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "finished",
      "outputs": [
        {
          "name": "",
          "type": "bool"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "withdrawn",
      "outputs": [
        {
          "name": "",
          "type": "bool"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "name": "_purchaser",
          "type": "address"
        }
      ],
      "name": "paymentOf",
      "outputs": [
        {
          "name": "weiAmount",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "InterfaceId_Sale",
      "outputs": [
        {
          "name": "",
          "type": "bytes4"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "coverImageUrl",
      "outputs": [
        {
          "name": "",
          "type": "string"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "name": "_newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "InterfaceId_Contract",
      "outputs": [
        {
          "name": "",
          "type": "bytes4"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "token",
      "outputs": [
        {
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "name": "_owner",
          "type": "address"
        },
        {
          "name": "_projectName",
          "type": "string"
        },
        {
          "name": "_name",
          "type": "string"
        },
        {
          "name": "_token",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "payable": true,
      "stateMutability": "payable",
      "type": "fallback"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "name": "purchaser",
          "type": "address"
        },
        {
          "indexed": false,
          "name": "weiAmount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "name": "tokenAmount",
          "type": "uint256"
        }
      ],
      "name": "TokenPurchase",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "name": "previousOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipRenounced",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "name": "previousOwner",
          "type": "address"
        },
        {
          "indexed": true,
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipTransferred",
      "type": "event"
    },
    {
      "constant": true,
      "inputs": [
        {
          "name": "_purchaser",
          "type": "address"
        }
      ],
      "name": "tokenAmountOf",
      "outputs": [
        {
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "name": "_projectName",
          "type": "string"
        },
        {
          "name": "_projectSummary",
          "type": "string"
        },
        {
          "name": "_projectDescription",
          "type": "string"
        },
        {
          "name": "_logoUrl",
          "type": "string"
        },
        {
          "name": "_coverImageUrl",
          "type": "string"
        },
        {
          "name": "_websiteUrl",
          "type": "string"
        },
        {
          "name": "_whitepaperUrl",
          "type": "string"
        },
        {
          "name": "_videoUrl",
          "type": "string"
        },
        {
          "name": "_name",
          "type": "string"
        }
      ],
      "name": "update",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "name": "_projectName",
          "type": "string"
        },
        {
          "name": "_projectSummary",
          "type": "string"
        },
        {
          "name": "_projectDescription",
          "type": "string"
        },
        {
          "name": "_logoUrl",
          "type": "string"
        },
        {
          "name": "_coverImageUrl",
          "type": "string"
        },
        {
          "name": "_websiteUrl",
          "type": "string"
        },
        {
          "name": "_whitepaperUrl",
          "type": "string"
        },
        {
          "name": "_videoUrl",
          "type": "string"
        },
        {
          "name": "_name",
          "type": "string"
        },
        {
          "name": "_token",
          "type": "address"
        }
      ],
      "name": "update",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "name": "_weiAmount",
          "type": "uint256"
        }
      ],
      "name": "purchasable",
      "outputs": [
        {
          "name": "",
          "type": "bool"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "name": "_weiAmount",
          "type": "uint256"
        }
      ],
      "name": "getTokenAmount",
      "outputs": [
        {
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "bytecode": "0x60806040523480156200001157600080fd5b5060405162002608380380620026088339810160409081528151602083015191830151606084015160008054600160a060020a031916331790559193928301920190838383826200008b7f01ffc9a700000000000000000000000000000000000000000000000000000000640100000000620001d1810204565b600160a060020a0381161515620000a157600080fd5b6002805433600160a060020a03199182161790915560008054909116600160a060020a038316179055620000fe7f6125ede500000000000000000000000000000000000000000000000000000000640100000000620001d1810204565b5081516200011490600390602085019062000241565b5080516200012a90600b90602084019062000241565b506200015f7f5efbb02200000000000000000000000000000000000000000000000000000000640100000000620001d1810204565b505050600160a060020a03811615156200017857600080fd5b60138054600160a060020a031916600160a060020a038316179055620001c77f90e2f49400000000000000000000000000000000000000000000000000000000640100000000620001d1810204565b50505050620002e6565b7fffffffff0000000000000000000000000000000000000000000000000000000080821614156200020157600080fd5b7fffffffff00000000000000000000000000000000000000000000000000000000166000908152600160208190526040909120805460ff19169091179055565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200028457805160ff1916838001178555620002b4565b82800160010185558215620002b4579182015b82811115620002b457825182559160200191906001019062000297565b50620002c2929150620002c6565b5090565b620002e391905b80821115620002c25760008155600101620002cd565b90565b61231280620002f66000396000f3006080604052600436106101df5763ffffffff60e060020a60003504166301ffc9a781146102c357806306fdde031461030e5780630956e5a6146103985780630f15f4c0146103bf5780630fc8c0b6146103d4578063184efbb014610408578063186601ca1461065357806319fa8f50146106685780631f2698ab146106af57806327f6c75a146106c45780632c7a72f8146106d9578063334ff632146106ee5780633ccfd60b146107035780634042b66f146107185780635027a9161461072d578063580c2ae914610745578063655ded031461075a5780636f2ddd9314610772578063715018a61461078757806373c9fbe21461079c578063755f047b146107b15780637aeedf2a146107c65780638da5cb5b1461082057806391c62b791461083557806397b150ca1461084d578063993d77af1461086e5780639a33e300146108835780639a9e3fd8146108985780639ec318bf146108ad578063abb5ca09146108c2578063b5545a3c146108d7578063bef4876b146108ec578063c2507ac114610901578063c80ec52214610919578063cdd5fce51461092e578063cf7c2b3114610b82578063d04be2da14610ba3578063dea53c2014610bb8578063f2fde38b14610bcd578063fbf964eb14610bee578063fc0c546a14610c03575b6000806000600260149054906101000a900460ff1615156101ff57600080fd5b610207610c18565b1561021157600080fd5b610219610cf5565b151561022457600080fd5b61022d34610dd1565b151561023857600080fd5b3392506102458334610ebd565b61024e34610fe9565b915061025a83836110e5565b610264838361112e565b90506102708183611217565b151561027b57600080fd5b60408051348152602081018490528151600160a060020a038616927fcd60aa75dea3072fbc07ae6d7d856b5dc5f4eee88854f5b4abf7b680ef8bc50f928290030190a2505050005b3480156102cf57600080fd5b506102fa7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19600435166112f5565b604080519115158252519081900360200190f35b34801561031a57600080fd5b50610323611329565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561035d578181015183820152602001610345565b50505050905090810190601f16801561038a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103a457600080fd5b506103ad6113b7565b60408051918252519081900360200190f35b3480156103cb57600080fd5b506102fa6113be565b3480156103e057600080fd5b506103ec6004356114f9565b60408051600160a060020a039092168252519081900360200190f35b34801561041457600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261065194369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a9998810197919650918201945092508291508401838280828437509497506115259650505050505050565b005b34801561065f57600080fd5b506102fa611612565b34801561067457600080fd5b5061067d611622565b604080517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff199092168252519081900360200190f35b3480156106bb57600080fd5b506102fa610cf5565b3480156106d057600080fd5b5061067d611646565b3480156106e557600080fd5b5061032361166a565b3480156106fa57600080fd5b506103ad6116c5565b34801561070f57600080fd5b506102fa6116cb565b34801561072457600080fd5b506103ad611774565b34801561073957600080fd5b506103ec60043561177a565b34801561075157600080fd5b506103ad61178b565b34801561076657600080fd5b506102fa600435610dd1565b34801561077e57600080fd5b506103ec611791565b34801561079357600080fd5b506106516117a0565b3480156107a857600080fd5b5061032361180c565b3480156107bd57600080fd5b50610323611867565b60408051602060046024803582810135601f8101859004850286018501909652858552610651958335600160a060020a03169536956044949193909101919081908401838280828437509497506118c29650505050505050565b34801561082c57600080fd5b506103ec611c35565b34801561084157600080fd5b506103ec600435611c44565b34801561085957600080fd5b506103ad600160a060020a0360043516611c55565b34801561087a57600080fd5b50610323611c70565b34801561088f57600080fd5b50610323611ccb565b3480156108a457600080fd5b506102fa611d26565b3480156108b957600080fd5b50610323611dfa565b3480156108ce57600080fd5b50610323611e55565b3480156108e357600080fd5b506102fa611eb0565b3480156108f857600080fd5b506102fa610c18565b34801561090d57600080fd5b506103ad600435610fe9565b34801561092557600080fd5b506102fa611f54565b34801561093a57600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261065194369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375094975050509235600160a060020a03169350611f5d92505050565b348015610b8e57600080fd5b506103ad600160a060020a0360043516611fa6565b348015610baf57600080fd5b5061067d611fc1565b348015610bc457600080fd5b50610323611fe5565b348015610bd957600080fd5b50610651600160a060020a0360043516612040565b348015610bfa57600080fd5b5061067d612063565b348015610c0f57600080fd5b506103ec612087565b6000806000610c25610cf5565b1515610c345760009250610cf0565b5060009050805b600f54811015610cec578180610ce25750600f805482908110610c5a57fe5b9060005260206000200160009054906101000a9004600160a060020a0316600160a060020a031663bef4876b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610cb557600080fd5b505af1158015610cc9573d6000803e3d6000fd5b505050506040513d6020811015610cdf57600080fd5b50515b9150600101610c3b565b8192505b505090565b6000806000600260149054906101000a900460ff161515610d195760009250610cf0565b5060009050805b600f54811015610cec578180610dc75750600f805482908110610d3f57fe5b9060005260206000200160009054906101000a9004600160a060020a0316600160a060020a0316631f2698ab6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610d9a57600080fd5b505af1158015610dae573d6000803e3d6000fd5b505050506040513d6020811015610dc457600080fd5b50515b9150600101610d20565b6000600181805b600f54821015610eb157600f805483908110610df057fe5b600091825260209091200154600160a060020a03169050828015610ea45750604080517f4f9a82d6000000000000000000000000000000000000000000000000000000008152336004820152602481018790529051600160a060020a03831691634f9a82d69160448083019260209291908290030181600087803b158015610e7757600080fd5b505af1158015610e8b573d6000803e3d6000fd5b505050506040513d6020811015610ea157600080fd5b50515b9250600190910190610dd8565b8293505b505050919050565b6000610ec7610c18565b15610ed157600080fd5b610ed9610cf5565b1515610ee457600080fd5b600160a060020a038316600090815260106020526040902054610f0d908363ffffffff61209616565b600160a060020a038416600090815260106020526040902055600c54610f39908363ffffffff61209616565b600c555060005b601154811015610f8b5782600160a060020a0316601182815481101515610f6357fe5b600091825260209091200154600160a060020a03161415610f8357610fe4565b600101610f40565b601180546001810182556000919091527f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6801805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0385161790555b505050565b60008080805b600f548310156110da57600f80548490811061100757fe5b6000918252602080832090910154604080517f5589530e000000000000000000000000000000000000000000000000000000008152336004820152602481018a90529051600160a060020a0390921695508593635589530e9360448084019491939192918390030190829087803b15801561108157600080fd5b505af1158015611095573d6000803e3d6000fd5b505050506040513d60208110156110ab57600080fd5b5051905060008111156110cf576110c8858263ffffffff6120a916565b9350610eb5565b600190920191610fef565b506000949350505050565b600160a060020a03821660009081526012602052604090205461110e908263ffffffff61209616565b600160a060020a0390921660009081526012602052604090209190915550565b600080805b600f5482101561120b57600f80548390811061114b57fe5b6000918252602080832090910154604080517fe67c8646000000000000000000000000000000000000000000000000000000008152600160a060020a038a81166004830152602482018a90529151919092169450849363e67c864693604480850194919392918390030190829087803b1580156111c757600080fd5b505af11580156111db573d6000803e3d6000fd5b505050506040513d60208110156111f157600080fd5b5051156112005780925061120f565b600190910190611133565b8492505b505092915050565b600080805b600f548210156110da57600f80548390811061123457fe5b6000918252602080832090910154604080517f587775e8000000000000000000000000000000000000000000000000000000008152600160a060020a038a81166004830152602482018a90529151919092169450849363587775e893604480850194919392918390030190829087803b1580156112b057600080fd5b505af11580156112c4573d6000803e3d6000fd5b505050506040513d60208110156112da57600080fd5b5051156112ea576001925061120f565b60019091019061121c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191660009081526001602052604090205460ff1690565b600b805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156113af5780601f10611384576101008083540402835291602001916113af565b820191906000526020600020905b81548152906001019060200180831161139257829003601f168201915b505050505081565b600e545b90565b6000805481908190600160a060020a031633146113da57600080fd5b600091505b600e548210156114ea57600e8054839081106113f757fe5b9060005260206000200160009054906101000a9004600160a060020a0316905080600160a060020a031663186601ca6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561145557600080fd5b505af1158015611469573d6000803e3d6000fd5b505050506040513d602081101561147f57600080fd5b5051156114df57600f80546001810182556000919091527f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac80201805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b6001909101906113df565b6114f26120d2565b9250505090565b6000600e8281548110151561150a57fe5b600091825260209091200154600160a060020a031692915050565b600054600160a060020a0316331461153c57600080fd5b60025460a060020a900460ff161561155357600080fd5b88516115669060039060208c0190612258565b50875161157a9060049060208b0190612258565b50865161158e9060059060208a0190612258565b5085516115a2906006906020890190612258565b5084516115b6906007906020880190612258565b5083516115ca906008906020870190612258565b5082516115de906009906020860190612258565b5081516115f290600a906020850190612258565b50805161160690600b906020840190612258565b50505050505050505050565b60025460a060020a900460ff1681565b7f01ffc9a70000000000000000000000000000000000000000000000000000000081565b7f90e2f4940000000000000000000000000000000000000000000000000000000081565b6009805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156113af5780601f10611384576101008083540402835291602001916113af565b600f5490565b60008054600160a060020a031633146116e357600080fd5b60025460a060020a900460ff1615156116fb57600080fd5b600d5460ff161561170b57600080fd5b611713610c18565b151561171e57600080fd5b611726611d26565b151561173157600080fd5b600d805460ff19166001179055600c54604051339180156108fc02916000818181858888f1935050505015801561176c573d6000803e3d6000fd5b506001905090565b600c5481565b6000600f8281548110151561150a57fe5b60115490565b600254600160a060020a031681565b600054600160a060020a031633146117b757600080fd5b60008054604051600160a060020a03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a26000805473ffffffffffffffffffffffffffffffffffffffff19169055565b600a805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156113af5780601f10611384576101008083540402835291602001916113af565b6005805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156113af5780601f10611384576101008083540402835291602001916113af565b6000805460609190600160a060020a031633146118de57600080fd5b60025460a060020a900460ff16156118f557600080fd5b604080517f01ffc9a70000000000000000000000000000000000000000000000000000000080825260048201529051600160a060020a038616916301ffc9a79160248083019260209291908290030181600087803b15801561195657600080fd5b505af115801561196a573d6000803e3d6000fd5b505050506040513d602081101561198057600080fd5b5051151561198d57600080fd5b604080517f01ffc9a70000000000000000000000000000000000000000000000000000000081527fd48445ff0000000000000000000000000000000000000000000000000000000060048201529051600160a060020a038616916301ffc9a79160248083019260209291908290030181600087803b158015611a0e57600080fd5b505af1158015611a22573d6000803e3d6000fd5b505050506040513d6020811015611a3857600080fd5b50511515611a4557600080fd5b611a4e846120fb565b1515611a5957600080fd5b60408051336020808301919091523082840152825180830384018152606083018085527f6535b4a500000000000000000000000000000000000000000000000000000000905260648301938452865160a48401528651909550600160a060020a03881693636535b4a593349389938993928392608482019260c4909201919087019080838360005b83811015611af9578181015183820152602001611ae1565b50505050905090810190601f168015611b265780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b83811015611b59578181015183820152602001611b41565b50505050905090810190601f168015611b865780820380516001836020036101000a031916815260200191505b509450505050506020604051808303818588803b158015611ba657600080fd5b505af1158015611bba573d6000803e3d6000fd5b50505050506040513d6020811015611bd157600080fd5b5051600e80546001810182556000919091527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0390921691909117905550505050565b600054600160a060020a031681565b600060118281548110151561150a57fe5b600160a060020a031660009081526012602052604090205490565b6006805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156113af5780601f10611384576101008083540402835291602001916113af565b6003805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156113af5780601f10611384576101008083540402835291602001916113af565b6000806000611d33610cf5565b1515611d425760009250610cf0565b5060009050805b600f54811015610cec578180611df05750600f805482908110611d6857fe5b9060005260206000200160009054906101000a9004600160a060020a0316600160a060020a0316639a9e3fd86040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611dc357600080fd5b505af1158015611dd7573d6000803e3d6000fd5b505050506040513d6020811015611ded57600080fd5b50515b9150600101611d49565b6004805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156113af5780601f10611384576101008083540402835291602001916113af565b6008805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156113af5780601f10611384576101008083540402835291602001916113af565b600254600090819060a060020a900460ff161515611ecd57600080fd5b611ed5610c18565b1515611ee057600080fd5b611ee8611d26565b15611ef257600080fd5b5033600090815260106020526040812054908111611f0f57600080fd5b336000818152601060205260408082208290555183156108fc0291849190818181858888f19350505050158015611f4a573d6000803e3d6000fd5b50600191505b5090565b600d5460ff1681565b611f6e8a8a8a8a8a8a8a8a8a611525565b6013805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055505050505050505050565b600160a060020a031660009081526010602052604090205490565b7f5efbb0220000000000000000000000000000000000000000000000000000000081565b6007805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156113af5780601f10611384576101008083540402835291602001916113af565b600054600160a060020a0316331461205757600080fd5b612060816121db565b50565b7f6125ede50000000000000000000000000000000000000000000000000000000081565b601354600160a060020a031681565b818101828110156120a357fe5b92915050565b60008215156120ba575060006120a3565b508181028183828115156120ca57fe5b04146120a357fe5b6002805474ff0000000000000000000000000000000000000000191660a060020a179055600190565b600080805b600e548210156121cf57600e80548390811061211857fe5b9060005260206000200160009054906101000a9004600160a060020a0316905083600160a060020a031681600160a060020a0316636f2ddd936040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561218057600080fd5b505af1158015612194573d6000803e3d6000fd5b505050506040513d60208110156121aa57600080fd5b5051600160a060020a031614156121c457600092506121d4565b600190910190612100565b600192505b5050919050565b600160a060020a03811615156121f057600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061229957805160ff19168380011785556122c6565b828001600101855582156122c6579182015b828111156122c65782518255916020019190600101906122ab565b50611f50926113bb9250905b80821115611f5057600081556001016122d25600a165627a7a72305820cbd5739f1c2b2f344e9fc6d51fc0c43b412f857feefe99b39356fbb825d0ddbe0029",
  "deployedBytecode": "0x6080604052600436106101df5763ffffffff60e060020a60003504166301ffc9a781146102c357806306fdde031461030e5780630956e5a6146103985780630f15f4c0146103bf5780630fc8c0b6146103d4578063184efbb014610408578063186601ca1461065357806319fa8f50146106685780631f2698ab146106af57806327f6c75a146106c45780632c7a72f8146106d9578063334ff632146106ee5780633ccfd60b146107035780634042b66f146107185780635027a9161461072d578063580c2ae914610745578063655ded031461075a5780636f2ddd9314610772578063715018a61461078757806373c9fbe21461079c578063755f047b146107b15780637aeedf2a146107c65780638da5cb5b1461082057806391c62b791461083557806397b150ca1461084d578063993d77af1461086e5780639a33e300146108835780639a9e3fd8146108985780639ec318bf146108ad578063abb5ca09146108c2578063b5545a3c146108d7578063bef4876b146108ec578063c2507ac114610901578063c80ec52214610919578063cdd5fce51461092e578063cf7c2b3114610b82578063d04be2da14610ba3578063dea53c2014610bb8578063f2fde38b14610bcd578063fbf964eb14610bee578063fc0c546a14610c03575b6000806000600260149054906101000a900460ff1615156101ff57600080fd5b610207610c18565b1561021157600080fd5b610219610cf5565b151561022457600080fd5b61022d34610dd1565b151561023857600080fd5b3392506102458334610ebd565b61024e34610fe9565b915061025a83836110e5565b610264838361112e565b90506102708183611217565b151561027b57600080fd5b60408051348152602081018490528151600160a060020a038616927fcd60aa75dea3072fbc07ae6d7d856b5dc5f4eee88854f5b4abf7b680ef8bc50f928290030190a2505050005b3480156102cf57600080fd5b506102fa7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19600435166112f5565b604080519115158252519081900360200190f35b34801561031a57600080fd5b50610323611329565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561035d578181015183820152602001610345565b50505050905090810190601f16801561038a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103a457600080fd5b506103ad6113b7565b60408051918252519081900360200190f35b3480156103cb57600080fd5b506102fa6113be565b3480156103e057600080fd5b506103ec6004356114f9565b60408051600160a060020a039092168252519081900360200190f35b34801561041457600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261065194369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a9998810197919650918201945092508291508401838280828437509497506115259650505050505050565b005b34801561065f57600080fd5b506102fa611612565b34801561067457600080fd5b5061067d611622565b604080517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff199092168252519081900360200190f35b3480156106bb57600080fd5b506102fa610cf5565b3480156106d057600080fd5b5061067d611646565b3480156106e557600080fd5b5061032361166a565b3480156106fa57600080fd5b506103ad6116c5565b34801561070f57600080fd5b506102fa6116cb565b34801561072457600080fd5b506103ad611774565b34801561073957600080fd5b506103ec60043561177a565b34801561075157600080fd5b506103ad61178b565b34801561076657600080fd5b506102fa600435610dd1565b34801561077e57600080fd5b506103ec611791565b34801561079357600080fd5b506106516117a0565b3480156107a857600080fd5b5061032361180c565b3480156107bd57600080fd5b50610323611867565b60408051602060046024803582810135601f8101859004850286018501909652858552610651958335600160a060020a03169536956044949193909101919081908401838280828437509497506118c29650505050505050565b34801561082c57600080fd5b506103ec611c35565b34801561084157600080fd5b506103ec600435611c44565b34801561085957600080fd5b506103ad600160a060020a0360043516611c55565b34801561087a57600080fd5b50610323611c70565b34801561088f57600080fd5b50610323611ccb565b3480156108a457600080fd5b506102fa611d26565b3480156108b957600080fd5b50610323611dfa565b3480156108ce57600080fd5b50610323611e55565b3480156108e357600080fd5b506102fa611eb0565b3480156108f857600080fd5b506102fa610c18565b34801561090d57600080fd5b506103ad600435610fe9565b34801561092557600080fd5b506102fa611f54565b34801561093a57600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261065194369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375094975050509235600160a060020a03169350611f5d92505050565b348015610b8e57600080fd5b506103ad600160a060020a0360043516611fa6565b348015610baf57600080fd5b5061067d611fc1565b348015610bc457600080fd5b50610323611fe5565b348015610bd957600080fd5b50610651600160a060020a0360043516612040565b348015610bfa57600080fd5b5061067d612063565b348015610c0f57600080fd5b506103ec612087565b6000806000610c25610cf5565b1515610c345760009250610cf0565b5060009050805b600f54811015610cec578180610ce25750600f805482908110610c5a57fe5b9060005260206000200160009054906101000a9004600160a060020a0316600160a060020a031663bef4876b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610cb557600080fd5b505af1158015610cc9573d6000803e3d6000fd5b505050506040513d6020811015610cdf57600080fd5b50515b9150600101610c3b565b8192505b505090565b6000806000600260149054906101000a900460ff161515610d195760009250610cf0565b5060009050805b600f54811015610cec578180610dc75750600f805482908110610d3f57fe5b9060005260206000200160009054906101000a9004600160a060020a0316600160a060020a0316631f2698ab6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610d9a57600080fd5b505af1158015610dae573d6000803e3d6000fd5b505050506040513d6020811015610dc457600080fd5b50515b9150600101610d20565b6000600181805b600f54821015610eb157600f805483908110610df057fe5b600091825260209091200154600160a060020a03169050828015610ea45750604080517f4f9a82d6000000000000000000000000000000000000000000000000000000008152336004820152602481018790529051600160a060020a03831691634f9a82d69160448083019260209291908290030181600087803b158015610e7757600080fd5b505af1158015610e8b573d6000803e3d6000fd5b505050506040513d6020811015610ea157600080fd5b50515b9250600190910190610dd8565b8293505b505050919050565b6000610ec7610c18565b15610ed157600080fd5b610ed9610cf5565b1515610ee457600080fd5b600160a060020a038316600090815260106020526040902054610f0d908363ffffffff61209616565b600160a060020a038416600090815260106020526040902055600c54610f39908363ffffffff61209616565b600c555060005b601154811015610f8b5782600160a060020a0316601182815481101515610f6357fe5b600091825260209091200154600160a060020a03161415610f8357610fe4565b600101610f40565b601180546001810182556000919091527f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6801805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0385161790555b505050565b60008080805b600f548310156110da57600f80548490811061100757fe5b6000918252602080832090910154604080517f5589530e000000000000000000000000000000000000000000000000000000008152336004820152602481018a90529051600160a060020a0390921695508593635589530e9360448084019491939192918390030190829087803b15801561108157600080fd5b505af1158015611095573d6000803e3d6000fd5b505050506040513d60208110156110ab57600080fd5b5051905060008111156110cf576110c8858263ffffffff6120a916565b9350610eb5565b600190920191610fef565b506000949350505050565b600160a060020a03821660009081526012602052604090205461110e908263ffffffff61209616565b600160a060020a0390921660009081526012602052604090209190915550565b600080805b600f5482101561120b57600f80548390811061114b57fe5b6000918252602080832090910154604080517fe67c8646000000000000000000000000000000000000000000000000000000008152600160a060020a038a81166004830152602482018a90529151919092169450849363e67c864693604480850194919392918390030190829087803b1580156111c757600080fd5b505af11580156111db573d6000803e3d6000fd5b505050506040513d60208110156111f157600080fd5b5051156112005780925061120f565b600190910190611133565b8492505b505092915050565b600080805b600f548210156110da57600f80548390811061123457fe5b6000918252602080832090910154604080517f587775e8000000000000000000000000000000000000000000000000000000008152600160a060020a038a81166004830152602482018a90529151919092169450849363587775e893604480850194919392918390030190829087803b1580156112b057600080fd5b505af11580156112c4573d6000803e3d6000fd5b505050506040513d60208110156112da57600080fd5b5051156112ea576001925061120f565b60019091019061121c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191660009081526001602052604090205460ff1690565b600b805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156113af5780601f10611384576101008083540402835291602001916113af565b820191906000526020600020905b81548152906001019060200180831161139257829003601f168201915b505050505081565b600e545b90565b6000805481908190600160a060020a031633146113da57600080fd5b600091505b600e548210156114ea57600e8054839081106113f757fe5b9060005260206000200160009054906101000a9004600160a060020a0316905080600160a060020a031663186601ca6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561145557600080fd5b505af1158015611469573d6000803e3d6000fd5b505050506040513d602081101561147f57600080fd5b5051156114df57600f80546001810182556000919091527f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac80201805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b6001909101906113df565b6114f26120d2565b9250505090565b6000600e8281548110151561150a57fe5b600091825260209091200154600160a060020a031692915050565b600054600160a060020a0316331461153c57600080fd5b60025460a060020a900460ff161561155357600080fd5b88516115669060039060208c0190612258565b50875161157a9060049060208b0190612258565b50865161158e9060059060208a0190612258565b5085516115a2906006906020890190612258565b5084516115b6906007906020880190612258565b5083516115ca906008906020870190612258565b5082516115de906009906020860190612258565b5081516115f290600a906020850190612258565b50805161160690600b906020840190612258565b50505050505050505050565b60025460a060020a900460ff1681565b7f01ffc9a70000000000000000000000000000000000000000000000000000000081565b7f90e2f4940000000000000000000000000000000000000000000000000000000081565b6009805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156113af5780601f10611384576101008083540402835291602001916113af565b600f5490565b60008054600160a060020a031633146116e357600080fd5b60025460a060020a900460ff1615156116fb57600080fd5b600d5460ff161561170b57600080fd5b611713610c18565b151561171e57600080fd5b611726611d26565b151561173157600080fd5b600d805460ff19166001179055600c54604051339180156108fc02916000818181858888f1935050505015801561176c573d6000803e3d6000fd5b506001905090565b600c5481565b6000600f8281548110151561150a57fe5b60115490565b600254600160a060020a031681565b600054600160a060020a031633146117b757600080fd5b60008054604051600160a060020a03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a26000805473ffffffffffffffffffffffffffffffffffffffff19169055565b600a805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156113af5780601f10611384576101008083540402835291602001916113af565b6005805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156113af5780601f10611384576101008083540402835291602001916113af565b6000805460609190600160a060020a031633146118de57600080fd5b60025460a060020a900460ff16156118f557600080fd5b604080517f01ffc9a70000000000000000000000000000000000000000000000000000000080825260048201529051600160a060020a038616916301ffc9a79160248083019260209291908290030181600087803b15801561195657600080fd5b505af115801561196a573d6000803e3d6000fd5b505050506040513d602081101561198057600080fd5b5051151561198d57600080fd5b604080517f01ffc9a70000000000000000000000000000000000000000000000000000000081527fd48445ff0000000000000000000000000000000000000000000000000000000060048201529051600160a060020a038616916301ffc9a79160248083019260209291908290030181600087803b158015611a0e57600080fd5b505af1158015611a22573d6000803e3d6000fd5b505050506040513d6020811015611a3857600080fd5b50511515611a4557600080fd5b611a4e846120fb565b1515611a5957600080fd5b60408051336020808301919091523082840152825180830384018152606083018085527f6535b4a500000000000000000000000000000000000000000000000000000000905260648301938452865160a48401528651909550600160a060020a03881693636535b4a593349389938993928392608482019260c4909201919087019080838360005b83811015611af9578181015183820152602001611ae1565b50505050905090810190601f168015611b265780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b83811015611b59578181015183820152602001611b41565b50505050905090810190601f168015611b865780820380516001836020036101000a031916815260200191505b509450505050506020604051808303818588803b158015611ba657600080fd5b505af1158015611bba573d6000803e3d6000fd5b50505050506040513d6020811015611bd157600080fd5b5051600e80546001810182556000919091527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0390921691909117905550505050565b600054600160a060020a031681565b600060118281548110151561150a57fe5b600160a060020a031660009081526012602052604090205490565b6006805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156113af5780601f10611384576101008083540402835291602001916113af565b6003805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156113af5780601f10611384576101008083540402835291602001916113af565b6000806000611d33610cf5565b1515611d425760009250610cf0565b5060009050805b600f54811015610cec578180611df05750600f805482908110611d6857fe5b9060005260206000200160009054906101000a9004600160a060020a0316600160a060020a0316639a9e3fd86040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611dc357600080fd5b505af1158015611dd7573d6000803e3d6000fd5b505050506040513d6020811015611ded57600080fd5b50515b9150600101611d49565b6004805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156113af5780601f10611384576101008083540402835291602001916113af565b6008805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156113af5780601f10611384576101008083540402835291602001916113af565b600254600090819060a060020a900460ff161515611ecd57600080fd5b611ed5610c18565b1515611ee057600080fd5b611ee8611d26565b15611ef257600080fd5b5033600090815260106020526040812054908111611f0f57600080fd5b336000818152601060205260408082208290555183156108fc0291849190818181858888f19350505050158015611f4a573d6000803e3d6000fd5b50600191505b5090565b600d5460ff1681565b611f6e8a8a8a8a8a8a8a8a8a611525565b6013805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055505050505050505050565b600160a060020a031660009081526010602052604090205490565b7f5efbb0220000000000000000000000000000000000000000000000000000000081565b6007805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156113af5780601f10611384576101008083540402835291602001916113af565b600054600160a060020a0316331461205757600080fd5b612060816121db565b50565b7f6125ede50000000000000000000000000000000000000000000000000000000081565b601354600160a060020a031681565b818101828110156120a357fe5b92915050565b60008215156120ba575060006120a3565b508181028183828115156120ca57fe5b04146120a357fe5b6002805474ff0000000000000000000000000000000000000000191660a060020a179055600190565b600080805b600e548210156121cf57600e80548390811061211857fe5b9060005260206000200160009054906101000a9004600160a060020a0316905083600160a060020a031681600160a060020a0316636f2ddd936040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561218057600080fd5b505af1158015612194573d6000803e3d6000fd5b505050506040513d60208110156121aa57600080fd5b5051600160a060020a031614156121c457600092506121d4565b600190910190612100565b600192505b5050919050565b600160a060020a03811615156121f057600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061229957805160ff19168380011785556122c6565b828001600101855582156122c6579182015b828111156122c65782518255916020019190600101906122ab565b50611f50926113bb9250905b80821115611f5057600081556001016122d25600a165627a7a72305820cbd5739f1c2b2f344e9fc6d51fc0c43b412f857feefe99b39356fbb825d0ddbe0029",
  "sourceMap": "257:4946:0:-;;;1871:279;8:9:-1;5:2;;;30:1;27;20:12;5:2;1871:279:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;567:5:27;:18;;-1:-1:-1;;;;;;567:18:27;575:10;567:18;;;1871:279:0;;;;;;;;;;;;649:38:25;668:18;649;;;;:38;:::i;:::-;-1:-1:-1;;;;;568:20:7;;;;560:29;;;;;;600:8;:31;;620:10;-1:-1:-1;;;;;;600:31:7;;;;;;;-1:-1:-1;641:14:7;;;;;-1:-1:-1;;;;;641:14:7;;;;;666:40;685:20;666:18;;;;:40;:::i;:::-;-1:-1:-1;1972:26:8;;;;:11;;:26;;;;;:::i;:::-;-1:-1:-1;2008:12:8;;;;:4;;:12;;;;;:::i;:::-;-1:-1:-1;2031:36:8;2050:16;2031:18;;;;:36;:::i;:::-;-1:-1:-1;;;;;;;;2045:20:0;;;;2037:29;;;;;;2077:5;:14;;-1:-1:-1;;;;;;2077:14:0;-1:-1:-1;;;;;2077:14:0;;;;;2102:41;2121:21;2102:18;;;;:41;:::i;:::-;1871:279;;;;257:4946;;987:156:25;1065:26;;;;;;1057:35;;;;;;1098:33;;;;;;1134:4;1098:33;;;;;;;;:40;;-1:-1:-1;;1098:40:25;;;;;;987:156::o;257:4946:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;257:4946:0;;;-1:-1:-1;257:4946:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;",
  "deployedSourceMap": "257:4946:0:-;;;;;;;;;-1:-1:-1;;;257:4946:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3058:17;3148:19;3258:21;122:9:6;;;;;;;;;;;114:18;;;;;;;;2967:10:0;:8;:10::i;:::-;2966:11;2958:20;;;;;;2996:9;:7;:9::i;:::-;2988:18;;;;;;;;3024:22;3036:9;3024:11;:22::i;:::-;3016:31;;;;;;;;3078:10;3058:30;;3098:39;3116:9;3127;3098:17;:39::i;:::-;3170:25;3185:9;3170:14;:25::i;:::-;3148:47;;3205:42;3224:9;3235:11;3205:18;:42::i;:::-;3282:38;3297:9;3308:11;3282:14;:38::i;:::-;3258:62;;3338:41;3352:13;3367:11;3338:13;:41::i;:::-;3330:50;;;;;;;;3396:48;;;3421:9;3396:48;;;;;;;;;;-1:-1:-1;;;;;3396:48:0;;;;;;;;;;;2906:545;;;257:4946;775:142:25;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;775:142:25;-1:-1:-1;;775:142:25;;;;;;;;;;;;;;;;;;;;;;;1612:18:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1612:18:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;1612:18:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3639:101;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3639:101:8;;;;;;;;;;;;;;;;;;;;4113:314;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4113:314:8;;;;3746:106;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3746:106:8;;;;;;;;;-1:-1:-1;;;;;3746:106:8;;;;;;;;;;;;;;2080:645;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2080:645:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2080:645:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2080:645:8;;;;-1:-1:-1;2080:645:8;-1:-1:-1;2080:645:8;;-1:-1:-1;2080:645:8;;;;;;;;-1:-1:-1;;2080:645:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2080:645:8;;;;-1:-1:-1;2080:645:8;-1:-1:-1;2080:645:8;;-1:-1:-1;2080:645:8;;;;;;;;-1:-1:-1;;2080:645:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2080:645:8;;;;-1:-1:-1;2080:645:8;-1:-1:-1;2080:645:8;;-1:-1:-1;2080:645:8;;;;;;;;-1:-1:-1;;2080:645:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2080:645:8;;;;-1:-1:-1;2080:645:8;-1:-1:-1;2080:645:8;;-1:-1:-1;2080:645:8;;;;;;;;-1:-1:-1;;2080:645:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2080:645:8;;;;-1:-1:-1;2080:645:8;-1:-1:-1;2080:645:8;;-1:-1:-1;2080:645:8;;;;;;;;-1:-1:-1;;2080:645:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2080:645:8;;;;-1:-1:-1;2080:645:8;-1:-1:-1;2080:645:8;;-1:-1:-1;2080:645:8;;;;;;;;-1:-1:-1;;2080:645:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2080:645:8;;;;-1:-1:-1;2080:645:8;-1:-1:-1;2080:645:8;;-1:-1:-1;2080:645:8;;;;;;;;-1:-1:-1;;2080:645:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2080:645:8;;;;-1:-1:-1;2080:645:8;-1:-1:-1;2080:645:8;;-1:-1:-1;2080:645:8;;;;;;;;-1:-1:-1;2080:645:8;;-1:-1:-1;2080:645:8;;-1:-1:-1;;;;;;;2080:645:8;;;53:21:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53:21:6;;;;230:54:25;;8:9:-1;5:2;;;30:1;27;20:12;5:2;230:54:25;;;;;;;;-1:-1:-1;;230:54:25;;;;;;;;;;;;;;4433:263:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4433:263:8;;;;1603:57:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1603:57:0;;;;1551:27:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1551:27:8;;;;3858:119;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3858:119:8;;;;6112:251;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6112:251:8;;;;1637:24;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1637:24:8;;;;3983:124;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3983:124:8;;;;;5890:101;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5890:101:8;;;;3457:341:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3457:341:0;;;;;484:24:7;;8:9:-1;5:2;;;30:1;27;20:12;5:2;484:24:7;;;;1001:111:27;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1001:111:27;;;;1584:22:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1584:22:8;;;;1423:32;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1423:32:8;;;;2731:551;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2731:551:8;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2731:551:8;;-1:-1:-1;2731:551:8;;-1:-1:-1;;;;;;;2731:551:8;238:20:27;;8:9:-1;5:2;;;30:1;27;20:12;5:2;238:20:27;;;;5997:109:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;5997:109:8;;;;;2156:131:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2156:131:0;-1:-1:-1;;;;;2156:131:0;;;;;1461:21:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1461:21:8;;;;1358:25;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1358:25:8;;;;4702:268;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4702:268:8;;;;1389:28;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1389:28:8;;;;1521:24;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1521:24:8;;;;6369:318;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6369:318:8;;;;4976:264;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4976:264:8;;;;3804:415:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3804:415:0;;;;;1667:21:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1667:21:8;;;;2293:607:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2293:607:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2293:607:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2293:607:0;;;;-1:-1:-1;2293:607:0;-1:-1:-1;2293:607:0;;-1:-1:-1;2293:607:0;;;;;;;;-1:-1:-1;;2293:607:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2293:607:0;;;;-1:-1:-1;2293:607:0;-1:-1:-1;2293:607:0;;-1:-1:-1;2293:607:0;;;;;;;;-1:-1:-1;;2293:607:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2293:607:0;;;;-1:-1:-1;2293:607:0;-1:-1:-1;2293:607:0;;-1:-1:-1;2293:607:0;;;;;;;;-1:-1:-1;;2293:607:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2293:607:0;;;;-1:-1:-1;2293:607:0;-1:-1:-1;2293:607:0;;-1:-1:-1;2293:607:0;;;;;;;;-1:-1:-1;;2293:607:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2293:607:0;;;;-1:-1:-1;2293:607:0;-1:-1:-1;2293:607:0;;-1:-1:-1;2293:607:0;;;;;;;;-1:-1:-1;;2293:607:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2293:607:0;;;;-1:-1:-1;2293:607:0;-1:-1:-1;2293:607:0;;-1:-1:-1;2293:607:0;;;;;;;;-1:-1:-1;;2293:607:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2293:607:0;;;;-1:-1:-1;2293:607:0;-1:-1:-1;2293:607:0;;-1:-1:-1;2293:607:0;;;;;;;;-1:-1:-1;;2293:607:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2293:607:0;;;;-1:-1:-1;2293:607:0;-1:-1:-1;2293:607:0;;-1:-1:-1;2293:607:0;;;;;;;;-1:-1:-1;2293:607:0;;-1:-1:-1;;;2293:607:0;;-1:-1:-1;;;;;2293:607:0;;-1:-1:-1;2293:607:0;;-1:-1:-1;;;2293:607:0;5751:133:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;5751:133:8;-1:-1:-1;;;;;5751:133:8;;;;;1299:52;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1299:52:8;;;;1488:27;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1488:27:8;;;;1274:103:27;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1274:103:27;-1:-1:-1;;;;;1274:103:27;;;;;421:56:7;;8:9:-1;5:2;;;30:1;27;20:12;5:2;421:56:7;;;;1846:18:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1846:18:0;;;;4976:264:8;5017:4;5071:6;5100;5037:9;:7;:9::i;:::-;5036:10;5032:28;;;5055:5;5048:12;;;;5032:28;-1:-1:-1;5080:5:8;;-1:-1:-1;5080:5:8;5095:121;5116:19;:26;5112:30;;5095:121;;;5167:1;:38;;;-1:-1:-1;5172:19:8;:22;;5192:1;;5172:22;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5172:22:8;-1:-1:-1;;;;;5172:31:8;;:33;;;;;-1:-1:-1;;;5172:33:8;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5172:33:8;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5172:33:8;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5172:33:8;5167:38;5163:42;-1:-1:-1;5144:3:8;;5095:121;;;5232:1;5225:8;;4976:264;;;;:::o;4433:263::-;4473:4;4528:6;4557;4494:9;;;;;;;;;;;4493:10;4489:28;;;4512:5;4505:12;;;;4489:28;-1:-1:-1;4537:5:8;;-1:-1:-1;4537:5:8;4552:120;4573:19;:26;4569:30;;4552:120;;;4624:1;:37;;;-1:-1:-1;4629:19:8;:22;;4649:1;;4629:22;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4629:22:8;-1:-1:-1;;;;;4629:30:8;;:32;;;;;-1:-1:-1;;;4629:32:8;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4629:32:8;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4629:32:8;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4629:32:8;4624:37;4620:41;-1:-1:-1;4601:3:8;;4552:120;;3457:341:0;3519:4;3544;3519;;3558:216;3579:19;:26;3575:30;;3558:216;;;3673:19;:22;;3693:1;;3673:22;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3673:22:0;;-1:-1:-1;3714:1:0;:49;;;;-1:-1:-1;3719:44:0;;;;;;3740:10;3719:44;;;;;;;;;;;;-1:-1:-1;;;;;3719:20:0;;;;;:44;;;;;;;;;;;;;;-1:-1:-1;3719:20:0;:44;;;5:2:-1;;;;30:1;27;20:12;5:2;3719:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3719:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3719:44:0;3714:49;3710:53;-1:-1:-1;3607:3:0;;;;;3558:216;;;3790:1;3783:8;;3457:341;;;;;;;:::o;5280:465:8:-;5566:6;5375:10;:8;:10::i;:::-;5374:11;5366:20;;;;;;5404:9;:7;:9::i;:::-;5396:18;;;;;;;;-1:-1:-1;;;;;5458:30:8;;;;;;:18;:30;;;;;;:46;;5493:10;5458:46;:34;:46;:::i;:::-;-1:-1:-1;;;;;5425:30:8;;;;;;:18;:30;;;;;:79;5526:9;;:25;;5540:10;5526:25;:13;:25;:::i;:::-;5514:9;:37;-1:-1:-1;5575:1:8;5561:141;5582:10;:17;5578:21;;5561:141;;;5641:10;-1:-1:-1;;;;;5624:27:8;:10;5635:1;5624:13;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5624:13:8;:27;5620:72;;;5671:7;;5620:72;5601:3;;5561:141;;;5711:10;27::-1;;39:1;23:18;;45:23;;-1:-1;5711:27:8;;;;;;;;-1:-1:-1;;5711:27:8;-1:-1:-1;;;;;5711:27:8;;;;;5280:465;;;;:::o;3804:415:0:-;3869:7;;;;3888:307;3909:19;:26;3905:30;;3888:307;;;4003:19;:22;;4023:1;;4003:22;;;;;;;;;;;;;;;;;;4055:42;;;;;;4074:10;4055:42;;;;;;;;;;;;-1:-1:-1;;;;;4003:22:0;;;;-1:-1:-1;4003:22:0;;4055:18;;:42;;;;;4003:22;;4055:42;;;;;;;;;;4003:22;4055:42;;;5:2:-1;;;;30:1;27;20:12;5:2;4055:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4055:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4055:42:0;;-1:-1:-1;4122:1:0;4115:8;;4111:74;;;4150:20;:10;4165:4;4150:20;:14;:20;:::i;:::-;4143:27;;;;4111:74;3937:3;;;;;3888:307;;;-1:-1:-1;4211:1:0;;3804:415;-1:-1:-1;;;;3804:415:0:o;4225:184::-;-1:-1:-1;;;;;4350:34:0;;;;;;:22;:34;;;;;;:52;;4389:12;4350:52;:38;:52;:::i;:::-;-1:-1:-1;;;;;4313:34:0;;;;;;;:22;:34;;;;;:89;;;;-1:-1:-1;4225:184:0:o;4415:409::-;4498:7;;;4517:274;4538:19;:26;4534:30;;4517:274;;;4632:19;:22;;4652:1;;4632:22;;;;;;;;;;;;;;;;;;4673:49;;;;;;-1:-1:-1;;;;;4673:49:0;;;;;;;;;;;;;;;4632:22;;;;;-1:-1:-1;4632:22:0;;4673:23;;:49;;;;;4632:22;;4673:49;;;;;;;;;4632:22;4673:49;;;5:2:-1;;;;30:1;27;20:12;5:2;4673:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4673:49:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4673:49:0;4669:112;;;4757:8;4742:24;;;;4669:112;4566:3;;;;;4517:274;;;4807:10;4800:17;;4415:409;;;;;;;:::o;4830:371::-;4905:4;;;4921:252;4942:19;:26;4938:30;;4921:252;;;5036:19;:22;;5056:1;;5036:22;;;;;;;;;;;;;;;;;;5077:40;;;;;;-1:-1:-1;;;;;5077:40:0;;;;;;;;;;;;;;;5036:22;;;;;-1:-1:-1;5036:22:0;;5077:21;;:40;;;;;5036:22;;5077:40;;;;;;;;;5036:22;5077:40;;;5:2:-1;;;;30:1;27;20:12;5:2;5077:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5077:40:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5077:40:0;5073:90;;;5144:4;5137:11;;;;5073:90;4970:3;;;;;4921:252;;775:142:25;-1:-1:-1;;879:33:25;858:4;879:33;;;:19;:33;;;;;;;;;775:142::o;1612:18:8:-;;;;;;;;;;;;;;;-1:-1:-1;;1612:18:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3639:101::-;3716:10;:17;3639:101;;:::o;4113:314::-;4159:4;719:5:27;;4159:4:8;;;;-1:-1:-1;;;;;719:5:27;705:10;:19;697:28;;;;;;4189:1:8;4180:10;;4175:213;4196:10;:17;4192:21;;4175:213;;;4258:10;:13;;4269:1;;4258:13;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4258:13:8;4234:37;;4289:8;-1:-1:-1;;;;;4289:18:8;;:20;;;;;-1:-1:-1;;;4289:20:8;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4289:20:8;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4289:20:8;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4289:20:8;4285:93;;;4329:19;27:10:-1;;39:1;23:18;;45:23;;-1:-1;4329:34:8;;;;;;;;-1:-1:-1;;4329:34:8;-1:-1:-1;;;;;4329:34:8;;;;;4285:93;4215:3;;;;;4175:213;;;4404:16;:14;:16::i;:::-;4397:23;;4113:314;;;:::o;3746:106::-;3802:7;3828:10;3839:5;3828:17;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3828:17:8;;3746:106;-1:-1:-1;;3746:106:8:o;2080:645::-;719:5:27;;-1:-1:-1;;;;;719:5:27;705:10;:19;697:28;;;;;;201:9:6;;-1:-1:-1;;;201:9:6;;;;200:10;192:19;;;;;;2406:26:8;;;;:11;;:26;;;;;:::i;:::-;-1:-1:-1;2442:32:8;;;;:14;;:32;;;;;:::i;:::-;-1:-1:-1;2484:40:8;;;;:18;;:40;;;;;:::i;:::-;-1:-1:-1;2534:18:8;;;;:7;;:18;;;;;:::i;:::-;-1:-1:-1;2562:30:8;;;;:13;;:30;;;;;:::i;:::-;-1:-1:-1;2602:24:8;;;;:10;;:24;;;;;:::i;:::-;-1:-1:-1;2636:30:8;;;;:13;;:30;;;;;:::i;:::-;-1:-1:-1;2676:20:8;;;;:8;;:20;;;;;:::i;:::-;-1:-1:-1;2706:12:8;;;;:4;;:12;;;;;:::i;:::-;;2080:645;;;;;;;;;:::o;53:21:6:-;;;-1:-1:-1;;;53:21:6;;;;;:::o;230:54:25:-;;;:::o;1603:57:0:-;;;:::o;1551:27:8:-;;;;;;;;;;;;;;;-1:-1:-1;;1551:27:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3858:119;3944:19;:26;3858:119;:::o;6112:251::-;6172:4;719:5:27;;-1:-1:-1;;;;;719:5:27;705:10;:19;697:28;;;;;;122:9:6;;-1:-1:-1;;;122:9:6;;;;114:18;;;;;;;;6197:9:8;;;;6196:10;6188:19;;;;;;6225:10;:8;:10::i;:::-;6217:19;;;;;;;;6254:12;:10;:12::i;:::-;6246:21;;;;;;;;6278:9;:16;;-1:-1:-1;;6278:16:8;6290:4;6278:16;;;6324:9;;6304:30;;:10;;:30;;;;;6278:9;6304:30;6278:9;6304:30;6324:9;6304:10;:30;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6304:30:8;6352:4;6345:11;;6112:251;:::o;1637:24::-;;;;:::o;3983:124::-;4048:7;4074:19;4094:5;4074:26;;;;;;;;;5890:101;5967:10;:17;5890:101;:::o;484:24:7:-;;;-1:-1:-1;;;;;484:24:7;;:::o;1001:111:27:-;719:5;;-1:-1:-1;;;;;719:5:27;705:10;:19;697:28;;;;;;1077:5;;;1058:25;;-1:-1:-1;;;;;1077:5:27;;;;1058:25;;;1105:1;1089:18;;-1:-1:-1;;1089:18:27;;;1001:111::o;1584:22:8:-;;;;;;;;;;;;;;;-1:-1:-1;;1584:22:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1423:32;;;;;;;;;;;;;;;-1:-1:-1;;1423:32:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2731:551;3147:21;719:5:27;;3080:17:8;;3147:21;-1:-1:-1;;;;;719:5:27;705:10;:19;697:28;;;;;;201:9:6;;-1:-1:-1;;;201:9:6;;;;200:10;192:19;;;;;;2891:39:8;;;;;;;;;;;;;-1:-1:-1;;;;;2891:27:8;;;;;:39;;;;;;;;;;;;;;-1:-1:-1;2891:27:8;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;2891:39:8;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2891:39:8;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2891:39:8;2883:48;;;;;;;;2981:39;;;;;;;;;;;;;-1:-1:-1;;;;;2981:27:8;;;;;:39;;;;;;;;;;;;;;-1:-1:-1;2981:27:8;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;2981:39:8;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2981:39:8;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2981:39:8;2973:48;;;;;;;;3040:28;3058:9;3040:17;:28::i;:::-;3032:37;;;;;;;;3100;;;3111:10;3100:37;;;;;;;;3131:4;3100:37;;;;;;26:21:-1;;;22:32;;6:49;;3100:37:8;;;;;;3184:55;;;;;;;;;;;;;;;;;3100:37;;-1:-1:-1;;;;;;3184:21:8;;;;;3212:9;;3223;;3100:37;;3184:55;;;;;;;;;;;;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;3184:55:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3184:55:8;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;3184:55:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3184:55:8;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3184:55:8;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3184:55:8;3250:10;27::-1;;39:1;23:18;;45:23;;-1:-1;3250:25:8;;;;;;;;-1:-1:-1;;3250:25:8;-1:-1:-1;;;;;3250:25:8;;;;;;;;;-1:-1:-1;;;;2731:551:8:o;238:20:27:-;;;-1:-1:-1;;;;;238:20:27;;:::o;5997:109:8:-;6055:7;6081:10;6092:6;6081:18;;;;;;;;;2156:131:0;-1:-1:-1;;;;;2246:34:0;2220:7;2246:34;;;:22;:34;;;;;;;2156:131::o;1461:21:8:-;;;;;;;;;;;;;;;-1:-1:-1;;1461:21:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1358:25;;;;;;;;;;;;;;;-1:-1:-1;;1358:25:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4702:268;4745:4;4799:6;4828;4765:9;:7;:9::i;:::-;4764:10;4760:28;;;4783:5;4776:12;;;;4760:28;-1:-1:-1;4808:5:8;;-1:-1:-1;4808:5:8;4823:123;4844:19;:26;4840:30;;4823:123;;;4895:1;:40;;;-1:-1:-1;4900:19:8;:22;;4920:1;;4900:22;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4900:22:8;-1:-1:-1;;;;;4900:33:8;;:35;;;;;-1:-1:-1;;;4900:35:8;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4900:35:8;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4900:35:8;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4900:35:8;4895:40;4891:44;-1:-1:-1;4872:3:8;;4823:123;;1389:28;;;;;;;;;;;;;;;-1:-1:-1;;1389:28:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1521:24;;;;;;;;;;;;;;;-1:-1:-1;;1521:24:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6369:318;122:9:6;;6422:4:8;;;;-1:-1:-1;;;122:9:6;;;;114:18;;;;;;;;6446:10:8;:8;:10::i;:::-;6438:19;;;;;;;;6476:12;:10;:12::i;:::-;6475:13;6467:22;;;;;;-1:-1:-1;6536:10:8;6517:30;;;;:18;:30;;;;;;;6565:10;;6557:19;;;;;;6606:10;6620:1;6587:30;;;:18;:30;;;;;;:34;;;6631:27;;;;;;6651:6;;6631:27;;6620:1;6631:27;6651:6;6606:10;6631:27;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6631:27:8;6676:4;6669:11;;142:1:6;6369:318:8;;:::o;1667:21::-;;;;;;:::o;2293:607:0:-;2614:255;2640:12;2666:15;2695:19;2728:8;2750:14;2778:11;2803:14;2831:9;2854:5;2614:12;:255::i;:::-;2879:5;:14;;-1:-1:-1;;2879:14:0;-1:-1:-1;;;;;2879:14:0;;;;;;;;;;-1:-1:-1;;;;;;;;;2293:607:0:o;5751:133:8:-;-1:-1:-1;;;;;5847:30:8;5811:17;5847:30;;;:18;:30;;;;;;;5751:133::o;1299:52::-;;;:::o;1488:27::-;;;;;;;;;;;;;;;-1:-1:-1;;1488:27:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1274:103:27;719:5;;-1:-1:-1;;;;;719:5:27;705:10;:19;697:28;;;;;;1343:29;1362:9;1343:18;:29::i;:::-;1274:103;:::o;421:56:7:-;;;:::o;1846:18:0:-;;;-1:-1:-1;;;;;1846:18:0;;:::o;1238:128:26:-;1319:7;;;1339;;;;1332:15;;;;1238:128;;;;:::o;203:380::-;263:9;489:7;;485:36;;;-1:-1:-1;513:1:26;506:8;;485:36;-1:-1:-1;531:7:26;;;536:2;531;:7;551:6;;;;;;;;:12;544:20;;;235:96:6;287:9;:16;;-1:-1:-1;;287:16:6;-1:-1:-1;;;287:16:6;;;299:4;235:96;:::o;3288:345:8:-;3369:4;;;3385:221;3406:10;:17;3402:21;;3385:221;;;3468:10;:13;;3479:1;;3468:13;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3468:13:8;3444:37;;3539:9;-1:-1:-1;;;;;3499:50:8;3507:8;-1:-1:-1;;;;;3507:17:8;;:19;;;;;-1:-1:-1;;;3507:19:8;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3507:19:8;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3507:19:8;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3507:19:8;-1:-1:-1;;;;;3499:50:8;;3495:101;;;3576:5;3569:12;;;;3495:101;3425:3;;;;;3385:221;;;3622:4;3615:11;;3288:345;;;;;;:::o;1512:171:27:-;-1:-1:-1;;;;;1582:23:27;;;;1574:32;;;;;;1638:5;;;1617:38;;-1:-1:-1;;;;;1617:38:27;;;;1638:5;;;1617:38;;;1661:5;:17;;-1:-1:-1;;1661:17:27;-1:-1:-1;;;;;1661:17:27;;;;;;;;;;1512:171::o;257:4946:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;257:4946:0;;;;-1:-1:-1;257:4946:0;;;;;;;;;;;;;;",
  "source": "pragma solidity ^0.4.24;\n\nimport \"tokenboost-solidity/contracts/sale/Sale.sol\";\nimport \"tokenboost-solidity/contracts/utils/strings.sol\";\nimport \"zeppelin-solidity/contracts/token/ERC20/ERC20.sol\";\nimport \"../../strategy/sale/erc20/ERC20SaleStrategy.sol\";\n\ncontract ERC20Sale is Sale {\n    using SafeMath for uint256;\n    using strings for *;\n\n    /**\n     * @notice this.owner.selector ^ this.renounceOwnership.selector ^ this.transferOwnership.selector\n        ^ this.template.selector ^ this.activate.selector\n        ^ this.projectName.selector ^ this.projectSummary.selector ^ this.projectDescription.selector\n        ^ this.logoUrl.selector ^ this.coverImageUrl.selector ^ this.websiteUrl.selector ^ this.whitepaperUrl.selector\n        ^ this.videoUrl.selector ^ this.name.selector ^ this.weiRaised.selector ^ this.withdrawn.selector\n        ^ this.started.selector ^ this.successful.selector ^ this.finished.selector ^ this.paymentOf.selector\n        ^ bytes4(keccak256(\"update(string,string,string,string,string,string,string,string,string)\"))\n        ^ bytes4(keccak256(\"update(string,string,string,string,string,string,string,string,string,address)\"))\n        ^ this.addStrategy.selector ^ this.numberOfStrategies.selector ^ this.strategyAt.selector\n        ^ this.numberOfActivatedStrategies.selector ^ this.activatedStrategyAt.selector ^ this.withdraw.selector\n        ^ this.claimRefund.selector ^ this.token.selector ^ this.numberOfPurchasers.selector ^ this.purchaserAt.selector\n        ^ this.tokenAmountOf.selector ^ this.purchasable.selector ^ this.getTokenAmount.selector\n     */\n    bytes4 public constant InterfaceId_ERC20Sale = 0x90e2f494;\n\n    event TokenPurchase(\n        address indexed purchaser,\n        uint256 weiAmount,\n        uint256 tokenAmount\n    );\n\n    mapping(address => uint256) tokenAmountOfPurchaser;\n    ERC20 public token;\n\n    constructor(\n        address _owner,\n        string _projectName,\n        string _name,\n        ERC20 _token\n    ) public Sale(_owner, _projectName, _name) {\n        require(_token != address(0));\n\n        token = _token;\n\n        _registerInterface(InterfaceId_ERC20Sale);\n    }\n\n    function tokenAmountOf(address _purchaser) public view returns (uint256) {\n        return tokenAmountOfPurchaser[_purchaser];\n    }\n\n    function update(\n        string _projectName,\n        string _projectSummary,\n        string _projectDescription,\n        string _logoUrl,\n        string _coverImageUrl,\n        string _websiteUrl,\n        string _whitepaperUrl,\n        string _videoUrl,\n        string _name,\n        ERC20 _token\n    ) public {\n        super.update(\n            _projectName,\n            _projectSummary,\n            _projectDescription,\n            _logoUrl,\n            _coverImageUrl,\n            _websiteUrl,\n            _whitepaperUrl,\n            _videoUrl,\n            _name\n        );\n        token = _token;\n    }\n\n    function() whenActivated external payable {\n        require(!finished());\n        require(started());\n        require(purchasable(msg.value));\n\n        address purchaser = msg.sender;\n        increasePaymentOf(purchaser, msg.value);\n\n        uint256 tokenAmount = getTokenAmount(msg.value);\n        _updateTokenAmount(purchaser, tokenAmount);\n\n        address tokenReceiver = _tokenReceiver(purchaser, tokenAmount);\n        require(_supplyTokens(tokenReceiver, tokenAmount));\n\n        emit TokenPurchase(purchaser, msg.value, tokenAmount);\n    }\n\n    function purchasable(uint256 _weiAmount) public view returns (bool) {\n        bool p = true;\n        for (uint i = 0; i < activatedStrategies.length; i++) {\n            ERC20SaleStrategy strategy = ERC20SaleStrategy(activatedStrategies[i]);\n            p = p && strategy.purchasable(msg.sender, _weiAmount);\n        }\n        return p;\n    }\n\n    function getTokenAmount(uint256 _weiAmount) public view returns (uint256) {\n        for (uint i = 0; i < activatedStrategies.length; i++) {\n            ERC20SaleStrategy strategy = ERC20SaleStrategy(activatedStrategies[i]);\n            uint256 rate = strategy.tokenRate(msg.sender, _weiAmount);\n            if (rate > 0) {\n                return _weiAmount.mul(rate);\n            }\n        }\n        return 0;\n    }\n\n    function _updateTokenAmount(address _purchaser, uint256 _tokenAmount) private {\n        tokenAmountOfPurchaser[_purchaser] = tokenAmountOfPurchaser[_purchaser].add(_tokenAmount);\n    }\n\n    function _tokenReceiver(address _purchaser, uint256 _tokenAmount) private returns (address) {\n        for (uint i = 0; i < activatedStrategies.length; i++) {\n            ERC20SaleStrategy strategy = ERC20SaleStrategy(activatedStrategies[i]);\n            if (strategy.receivesTokens(_purchaser, _tokenAmount)) {\n                return address(strategy);\n            }\n        }\n        return _purchaser;\n    }\n\n    function _supplyTokens(address _to, uint256 _tokenAmount) private returns (bool) {\n        for (uint i = 0; i < activatedStrategies.length; i++) {\n            ERC20SaleStrategy strategy = ERC20SaleStrategy(activatedStrategies[i]);\n            if (strategy.supplyTokens(_to, _tokenAmount)) {\n                return true;\n            }\n        }\n        return false;\n    }\n}\n",
  "sourcePath": "/Users/yoonjae/SolidityProjects/tokenboost-solidity-erc20sale/contracts/sale/erc20/ERC20Sale.sol",
  "ast": {
    "absolutePath": "/Users/yoonjae/SolidityProjects/tokenboost-solidity-erc20sale/contracts/sale/erc20/ERC20Sale.sol",
    "exportedSymbols": {
      "ERC20Sale": [
        386
      ]
    },
    "id": 387,
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 1,
        "literals": [
          "solidity",
          "^",
          "0.4",
          ".24"
        ],
        "nodeType": "PragmaDirective",
        "src": "0:24:0"
      },
      {
        "absolutePath": "tokenboost-solidity/contracts/sale/Sale.sol",
        "file": "tokenboost-solidity/contracts/sale/Sale.sol",
        "id": 2,
        "nodeType": "ImportDirective",
        "scope": 387,
        "sourceUnit": 1960,
        "src": "26:53:0",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "tokenboost-solidity/contracts/utils/strings.sol",
        "file": "tokenboost-solidity/contracts/utils/strings.sol",
        "id": 3,
        "nodeType": "ImportDirective",
        "scope": 387,
        "sourceUnit": 4334,
        "src": "80:57:0",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "zeppelin-solidity/contracts/token/ERC20/ERC20.sol",
        "file": "zeppelin-solidity/contracts/token/ERC20/ERC20.sol",
        "id": 4,
        "nodeType": "ImportDirective",
        "scope": 387,
        "sourceUnit": 5399,
        "src": "138:59:0",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "/Users/yoonjae/SolidityProjects/tokenboost-solidity-erc20sale/contracts/strategy/sale/erc20/ERC20SaleStrategy.sol",
        "file": "../../strategy/sale/erc20/ERC20SaleStrategy.sol",
        "id": 5,
        "nodeType": "ImportDirective",
        "scope": 387,
        "sourceUnit": 1243,
        "src": "198:57:0",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 6,
              "name": "Sale",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 1959,
              "src": "279:4:0",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_Sale_$1959",
                "typeString": "contract Sale"
              }
            },
            "id": 7,
            "nodeType": "InheritanceSpecifier",
            "src": "279:4:0"
          }
        ],
        "contractDependencies": [
          1276,
          1320,
          1959,
          5124,
          5175,
          5355
        ],
        "contractKind": "contract",
        "documentation": null,
        "fullyImplemented": true,
        "id": 386,
        "linearizedBaseContracts": [
          386,
          1959,
          1276,
          1320,
          5175,
          5124,
          5355
        ],
        "name": "ERC20Sale",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "id": 10,
            "libraryName": {
              "contractScope": null,
              "id": 8,
              "name": "SafeMath",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 5269,
              "src": "296:8:0",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_SafeMath_$5269",
                "typeString": "library SafeMath"
              }
            },
            "nodeType": "UsingForDirective",
            "src": "290:27:0",
            "typeName": {
              "id": 9,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "309:7:0",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            }
          },
          {
            "id": 12,
            "libraryName": {
              "contractScope": null,
              "id": 11,
              "name": "strings",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 4333,
              "src": "328:7:0",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_strings_$4333",
                "typeString": "library strings"
              }
            },
            "nodeType": "UsingForDirective",
            "src": "322:20:0",
            "typeName": null
          },
          {
            "constant": true,
            "id": 15,
            "name": "InterfaceId_ERC20Sale",
            "nodeType": "VariableDeclaration",
            "scope": 386,
            "src": "1603:57:0",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_bytes4",
              "typeString": "bytes4"
            },
            "typeName": {
              "id": 13,
              "name": "bytes4",
              "nodeType": "ElementaryTypeName",
              "src": "1603:6:0",
              "typeDescriptions": {
                "typeIdentifier": "t_bytes4",
                "typeString": "bytes4"
              }
            },
            "value": {
              "argumentTypes": null,
              "hexValue": "30783930653266343934",
              "id": 14,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "1650:10:0",
              "subdenomination": null,
              "typeDescriptions": {
                "typeIdentifier": "t_rational_2430792852_by_1",
                "typeString": "int_const 2430792852"
              },
              "value": "0x90e2f494"
            },
            "visibility": "public"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 23,
            "name": "TokenPurchase",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 22,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17,
                  "indexed": true,
                  "name": "purchaser",
                  "nodeType": "VariableDeclaration",
                  "scope": 23,
                  "src": "1696:25:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 16,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1696:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 19,
                  "indexed": false,
                  "name": "weiAmount",
                  "nodeType": "VariableDeclaration",
                  "scope": 23,
                  "src": "1731:17:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 18,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1731:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 21,
                  "indexed": false,
                  "name": "tokenAmount",
                  "nodeType": "VariableDeclaration",
                  "scope": 23,
                  "src": "1758:19:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 20,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1758:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1686:97:0"
            },
            "src": "1667:117:0"
          },
          {
            "constant": false,
            "id": 27,
            "name": "tokenAmountOfPurchaser",
            "nodeType": "VariableDeclaration",
            "scope": 386,
            "src": "1790:50:0",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
              "typeString": "mapping(address => uint256)"
            },
            "typeName": {
              "id": 26,
              "keyType": {
                "id": 24,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "1798:7:0",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "nodeType": "Mapping",
              "src": "1790:27:0",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                "typeString": "mapping(address => uint256)"
              },
              "valueType": {
                "id": 25,
                "name": "uint256",
                "nodeType": "ElementaryTypeName",
                "src": "1809:7:0",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                }
              }
            },
            "value": null,
            "visibility": "internal"
          },
          {
            "constant": false,
            "id": 29,
            "name": "token",
            "nodeType": "VariableDeclaration",
            "scope": 386,
            "src": "1846:18:0",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_contract$_ERC20_$5398",
              "typeString": "contract ERC20"
            },
            "typeName": {
              "contractScope": null,
              "id": 28,
              "name": "ERC20",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 5398,
              "src": "1846:5:0",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_ERC20_$5398",
                "typeString": "contract ERC20"
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 61,
              "nodeType": "Block",
              "src": "2027:123:0",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 50,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 46,
                          "name": "_token",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 37,
                          "src": "2045:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ERC20_$5398",
                            "typeString": "contract ERC20"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 48,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "2063:1:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              }
                            ],
                            "id": 47,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "2055:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": "address"
                          },
                          "id": 49,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2055:10:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "src": "2045:20:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      ],
                      "id": 45,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        5448,
                        5449
                      ],
                      "referencedDeclaration": 5448,
                      "src": "2037:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$",
                        "typeString": "function (bool) pure"
                      }
                    },
                    "id": 51,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2037:29:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 52,
                  "nodeType": "ExpressionStatement",
                  "src": "2037:29:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 55,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 53,
                      "name": "token",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 29,
                      "src": "2077:5:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_ERC20_$5398",
                        "typeString": "contract ERC20"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 54,
                      "name": "_token",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 37,
                      "src": "2085:6:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_ERC20_$5398",
                        "typeString": "contract ERC20"
                      }
                    },
                    "src": "2077:14:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC20_$5398",
                      "typeString": "contract ERC20"
                    }
                  },
                  "id": 56,
                  "nodeType": "ExpressionStatement",
                  "src": "2077:14:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 58,
                        "name": "InterfaceId_ERC20Sale",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 15,
                        "src": "2121:21:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        }
                      ],
                      "id": 57,
                      "name": "_registerInterface",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5174,
                      "src": "2102:18:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_bytes4_$returns$__$",
                        "typeString": "function (bytes4)"
                      }
                    },
                    "id": 59,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2102:41:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 60,
                  "nodeType": "ExpressionStatement",
                  "src": "2102:41:0"
                }
              ]
            },
            "documentation": null,
            "id": 62,
            "implemented": true,
            "isConstructor": true,
            "isDeclaredConst": false,
            "modifiers": [
              {
                "arguments": [
                  {
                    "argumentTypes": null,
                    "id": 40,
                    "name": "_owner",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 31,
                    "src": "1998:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  {
                    "argumentTypes": null,
                    "id": 41,
                    "name": "_projectName",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 33,
                    "src": "2006:12:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_memory_ptr",
                      "typeString": "string memory"
                    }
                  },
                  {
                    "argumentTypes": null,
                    "id": 42,
                    "name": "_name",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 35,
                    "src": "2020:5:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_memory_ptr",
                      "typeString": "string memory"
                    }
                  }
                ],
                "id": 43,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 39,
                  "name": "Sale",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 1959,
                  "src": "1993:4:0",
                  "typeDescriptions": {
                    "typeIdentifier": "t_type$_t_contract$_Sale_$1959_$",
                    "typeString": "type(contract Sale)"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "1993:33:0"
              }
            ],
            "name": "",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 38,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 31,
                  "name": "_owner",
                  "nodeType": "VariableDeclaration",
                  "scope": 62,
                  "src": "1892:14:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 30,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1892:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 33,
                  "name": "_projectName",
                  "nodeType": "VariableDeclaration",
                  "scope": 62,
                  "src": "1916:19:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 32,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1916:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 35,
                  "name": "_name",
                  "nodeType": "VariableDeclaration",
                  "scope": 62,
                  "src": "1945:12:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 34,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1945:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 37,
                  "name": "_token",
                  "nodeType": "VariableDeclaration",
                  "scope": 62,
                  "src": "1967:12:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_ERC20_$5398",
                    "typeString": "contract ERC20"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 36,
                    "name": "ERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 5398,
                    "src": "1967:5:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC20_$5398",
                      "typeString": "contract ERC20"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1882:103:0"
            },
            "payable": false,
            "returnParameters": {
              "id": 44,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2027:0:0"
            },
            "scope": 386,
            "src": "1871:279:0",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 73,
              "nodeType": "Block",
              "src": "2229:58:0",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 69,
                      "name": "tokenAmountOfPurchaser",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 27,
                      "src": "2246:22:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                        "typeString": "mapping(address => uint256)"
                      }
                    },
                    "id": 71,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 70,
                      "name": "_purchaser",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 64,
                      "src": "2269:10:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "2246:34:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 68,
                  "id": 72,
                  "nodeType": "Return",
                  "src": "2239:41:0"
                }
              ]
            },
            "documentation": null,
            "id": 74,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": true,
            "modifiers": [],
            "name": "tokenAmountOf",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 65,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 64,
                  "name": "_purchaser",
                  "nodeType": "VariableDeclaration",
                  "scope": 74,
                  "src": "2179:18:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 63,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2179:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2178:20:0"
            },
            "payable": false,
            "returnParameters": {
              "id": 68,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 67,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 74,
                  "src": "2220:7:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 66,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2220:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2219:9:0"
            },
            "scope": 386,
            "src": "2156:131:0",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 115,
              "nodeType": "Block",
              "src": "2604:296:0",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 100,
                        "name": "_projectName",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 76,
                        "src": "2640:12:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 101,
                        "name": "_projectSummary",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 78,
                        "src": "2666:15:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 102,
                        "name": "_projectDescription",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 80,
                        "src": "2695:19:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 103,
                        "name": "_logoUrl",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 82,
                        "src": "2728:8:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 104,
                        "name": "_coverImageUrl",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 84,
                        "src": "2750:14:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 105,
                        "name": "_websiteUrl",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 86,
                        "src": "2778:11:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 106,
                        "name": "_whitepaperUrl",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 88,
                        "src": "2803:14:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 107,
                        "name": "_videoUrl",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 90,
                        "src": "2831:9:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 108,
                        "name": "_name",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 92,
                        "src": "2854:5:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        },
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        },
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        },
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        },
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        },
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        },
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        },
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        },
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 97,
                        "name": "super",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5491,
                        "src": "2614:5:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_super$_ERC20Sale_$386",
                          "typeString": "contract super ERC20Sale"
                        }
                      },
                      "id": 99,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "update",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 1459,
                      "src": "2614:12:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_string_memory_ptr_$_t_string_memory_ptr_$_t_string_memory_ptr_$_t_string_memory_ptr_$_t_string_memory_ptr_$_t_string_memory_ptr_$_t_string_memory_ptr_$_t_string_memory_ptr_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (string memory,string memory,string memory,string memory,string memory,string memory,string memory,string memory,string memory)"
                      }
                    },
                    "id": 109,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2614:255:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 110,
                  "nodeType": "ExpressionStatement",
                  "src": "2614:255:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 113,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 111,
                      "name": "token",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 29,
                      "src": "2879:5:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_ERC20_$5398",
                        "typeString": "contract ERC20"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 112,
                      "name": "_token",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 94,
                      "src": "2887:6:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_ERC20_$5398",
                        "typeString": "contract ERC20"
                      }
                    },
                    "src": "2879:14:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC20_$5398",
                      "typeString": "contract ERC20"
                    }
                  },
                  "id": 114,
                  "nodeType": "ExpressionStatement",
                  "src": "2879:14:0"
                }
              ]
            },
            "documentation": null,
            "id": 116,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": false,
            "modifiers": [],
            "name": "update",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 95,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 76,
                  "name": "_projectName",
                  "nodeType": "VariableDeclaration",
                  "scope": 116,
                  "src": "2318:19:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 75,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "2318:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 78,
                  "name": "_projectSummary",
                  "nodeType": "VariableDeclaration",
                  "scope": 116,
                  "src": "2347:22:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 77,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "2347:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 80,
                  "name": "_projectDescription",
                  "nodeType": "VariableDeclaration",
                  "scope": 116,
                  "src": "2379:26:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 79,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "2379:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 82,
                  "name": "_logoUrl",
                  "nodeType": "VariableDeclaration",
                  "scope": 116,
                  "src": "2415:15:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 81,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "2415:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 84,
                  "name": "_coverImageUrl",
                  "nodeType": "VariableDeclaration",
                  "scope": 116,
                  "src": "2440:21:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 83,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "2440:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 86,
                  "name": "_websiteUrl",
                  "nodeType": "VariableDeclaration",
                  "scope": 116,
                  "src": "2471:18:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 85,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "2471:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 88,
                  "name": "_whitepaperUrl",
                  "nodeType": "VariableDeclaration",
                  "scope": 116,
                  "src": "2499:21:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 87,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "2499:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 90,
                  "name": "_videoUrl",
                  "nodeType": "VariableDeclaration",
                  "scope": 116,
                  "src": "2530:16:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 89,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "2530:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 92,
                  "name": "_name",
                  "nodeType": "VariableDeclaration",
                  "scope": 116,
                  "src": "2556:12:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 91,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "2556:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 94,
                  "name": "_token",
                  "nodeType": "VariableDeclaration",
                  "scope": 116,
                  "src": "2578:12:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_ERC20_$5398",
                    "typeString": "contract ERC20"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 93,
                    "name": "ERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 5398,
                    "src": "2578:5:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC20_$5398",
                      "typeString": "contract ERC20"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2308:288:0"
            },
            "payable": false,
            "returnParameters": {
              "id": 96,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2604:0:0"
            },
            "scope": 386,
            "src": "2293:607:0",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 183,
              "nodeType": "Block",
              "src": "2948:503:0",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 124,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "UnaryOperation",
                        "operator": "!",
                        "prefix": true,
                        "src": "2966:11:0",
                        "subExpression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 122,
                            "name": "finished",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1770,
                            "src": "2967:8:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$__$returns$_t_bool_$",
                              "typeString": "function () view returns (bool)"
                            }
                          },
                          "id": 123,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2967:10:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      ],
                      "id": 121,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        5448,
                        5449
                      ],
                      "referencedDeclaration": 5448,
                      "src": "2958:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$",
                        "typeString": "function (bool) pure"
                      }
                    },
                    "id": 125,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2958:20:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 126,
                  "nodeType": "ExpressionStatement",
                  "src": "2958:20:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [],
                        "expression": {
                          "argumentTypes": [],
                          "id": 128,
                          "name": "started",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1688,
                          "src": "2996:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$__$returns$_t_bool_$",
                            "typeString": "function () view returns (bool)"
                          }
                        },
                        "id": 129,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "2996:9:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      ],
                      "id": 127,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        5448,
                        5449
                      ],
                      "referencedDeclaration": 5448,
                      "src": "2988:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$",
                        "typeString": "function (bool) pure"
                      }
                    },
                    "id": 130,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2988:18:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 131,
                  "nodeType": "ExpressionStatement",
                  "src": "2988:18:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 134,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5445,
                              "src": "3036:3:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 135,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "value",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "3036:9:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          ],
                          "id": 133,
                          "name": "purchasable",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 230,
                          "src": "3024:11:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$_t_uint256_$returns$_t_bool_$",
                            "typeString": "function (uint256) view returns (bool)"
                          }
                        },
                        "id": 136,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "3024:22:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      ],
                      "id": 132,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        5448,
                        5449
                      ],
                      "referencedDeclaration": 5448,
                      "src": "3016:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$",
                        "typeString": "function (bool) pure"
                      }
                    },
                    "id": 137,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3016:31:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 138,
                  "nodeType": "ExpressionStatement",
                  "src": "3016:31:0"
                },
                {
                  "assignments": [
                    140
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 140,
                      "name": "purchaser",
                      "nodeType": "VariableDeclaration",
                      "scope": 184,
                      "src": "3058:17:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "typeName": {
                        "id": 139,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "3058:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 143,
                  "initialValue": {
                    "argumentTypes": null,
                    "expression": {
                      "argumentTypes": null,
                      "id": 141,
                      "name": "msg",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5445,
                      "src": "3078:3:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_magic_message",
                        "typeString": "msg"
                      }
                    },
                    "id": 142,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "memberName": "sender",
                    "nodeType": "MemberAccess",
                    "referencedDeclaration": null,
                    "src": "3078:10:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "3058:30:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 145,
                        "name": "purchaser",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 140,
                        "src": "3116:9:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 146,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5445,
                          "src": "3127:3:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 147,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "value",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "3127:9:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 144,
                      "name": "increasePaymentOf",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1837,
                      "src": "3098:17:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256)"
                      }
                    },
                    "id": 148,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3098:39:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 149,
                  "nodeType": "ExpressionStatement",
                  "src": "3098:39:0"
                },
                {
                  "assignments": [
                    151
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 151,
                      "name": "tokenAmount",
                      "nodeType": "VariableDeclaration",
                      "scope": 184,
                      "src": "3148:19:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 150,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "3148:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 156,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 153,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5445,
                          "src": "3185:3:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 154,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "value",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "3185:9:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 152,
                      "name": "getTokenAmount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 280,
                      "src": "3170:14:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_uint256_$returns$_t_uint256_$",
                        "typeString": "function (uint256) view returns (uint256)"
                      }
                    },
                    "id": 155,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3170:25:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "3148:47:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 158,
                        "name": "purchaser",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 140,
                        "src": "3224:9:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 159,
                        "name": "tokenAmount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 151,
                        "src": "3235:11:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 157,
                      "name": "_updateTokenAmount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 299,
                      "src": "3205:18:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256)"
                      }
                    },
                    "id": 160,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3205:42:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 161,
                  "nodeType": "ExpressionStatement",
                  "src": "3205:42:0"
                },
                {
                  "assignments": [
                    163
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 163,
                      "name": "tokenReceiver",
                      "nodeType": "VariableDeclaration",
                      "scope": 184,
                      "src": "3258:21:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "typeName": {
                        "id": 162,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "3258:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 168,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 165,
                        "name": "purchaser",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 140,
                        "src": "3297:9:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 166,
                        "name": "tokenAmount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 151,
                        "src": "3308:11:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 164,
                      "name": "_tokenReceiver",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 343,
                      "src": "3282:14:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$_t_address_$",
                        "typeString": "function (address,uint256) returns (address)"
                      }
                    },
                    "id": 167,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3282:38:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "3258:62:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 171,
                            "name": "tokenReceiver",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 163,
                            "src": "3352:13:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          {
                            "argumentTypes": null,
                            "id": 172,
                            "name": "tokenAmount",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 151,
                            "src": "3367:11:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          ],
                          "id": 170,
                          "name": "_supplyTokens",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 385,
                          "src": "3338:13:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                            "typeString": "function (address,uint256) returns (bool)"
                          }
                        },
                        "id": 173,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "3338:41:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      ],
                      "id": 169,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        5448,
                        5449
                      ],
                      "referencedDeclaration": 5448,
                      "src": "3330:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$",
                        "typeString": "function (bool) pure"
                      }
                    },
                    "id": 174,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3330:50:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 175,
                  "nodeType": "ExpressionStatement",
                  "src": "3330:50:0"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 177,
                        "name": "purchaser",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 140,
                        "src": "3410:9:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 178,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5445,
                          "src": "3421:3:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 179,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "value",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "3421:9:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 180,
                        "name": "tokenAmount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 151,
                        "src": "3432:11:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 176,
                      "name": "TokenPurchase",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 23,
                      "src": "3396:13:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256,uint256)"
                      }
                    },
                    "id": 181,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3396:48:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 182,
                  "nodeType": "EmitStatement",
                  "src": "3391:53:0"
                }
              ]
            },
            "documentation": null,
            "id": 184,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": false,
            "modifiers": [
              {
                "arguments": null,
                "id": 119,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 118,
                  "name": "whenActivated",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 1254,
                  "src": "2917:13:0",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "2917:13:0"
              }
            ],
            "name": "",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 117,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2914:2:0"
            },
            "payable": true,
            "returnParameters": {
              "id": 120,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2948:0:0"
            },
            "scope": 386,
            "src": "2906:545:0",
            "stateMutability": "payable",
            "superFunction": 1773,
            "visibility": "external"
          },
          {
            "body": {
              "id": 229,
              "nodeType": "Block",
              "src": "3525:273:0",
              "statements": [
                {
                  "assignments": [
                    192
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 192,
                      "name": "p",
                      "nodeType": "VariableDeclaration",
                      "scope": 230,
                      "src": "3535:6:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "typeName": {
                        "id": 191,
                        "name": "bool",
                        "nodeType": "ElementaryTypeName",
                        "src": "3535:4:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 194,
                  "initialValue": {
                    "argumentTypes": null,
                    "hexValue": "74727565",
                    "id": 193,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "bool",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "3544:4:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "value": "true"
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "3535:13:0"
                },
                {
                  "body": {
                    "id": 225,
                    "nodeType": "Block",
                    "src": "3612:162:0",
                    "statements": [
                      {
                        "assignments": [
                          207
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 207,
                            "name": "strategy",
                            "nodeType": "VariableDeclaration",
                            "scope": 230,
                            "src": "3626:26:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ERC20SaleStrategy_$1242",
                              "typeString": "contract ERC20SaleStrategy"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 206,
                              "name": "ERC20SaleStrategy",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 1242,
                              "src": "3626:17:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ERC20SaleStrategy_$1242",
                                "typeString": "contract ERC20SaleStrategy"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 213,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 209,
                                "name": "activatedStrategies",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1365,
                                "src": "3673:19:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_array$_t_contract$_SaleStrategy_$2091_$dyn_storage",
                                  "typeString": "contract SaleStrategy[] storage ref"
                                }
                              },
                              "id": 211,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 210,
                                "name": "i",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 196,
                                "src": "3693:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "3673:22:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_SaleStrategy_$2091",
                                "typeString": "contract SaleStrategy"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_SaleStrategy_$2091",
                                "typeString": "contract SaleStrategy"
                              }
                            ],
                            "id": 208,
                            "name": "ERC20SaleStrategy",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1242,
                            "src": "3655:17:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_contract$_ERC20SaleStrategy_$1242_$",
                              "typeString": "type(contract ERC20SaleStrategy)"
                            }
                          },
                          "id": 212,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3655:41:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ERC20SaleStrategy_$1242",
                            "typeString": "contract ERC20SaleStrategy"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "3626:70:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 223,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 214,
                            "name": "p",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 192,
                            "src": "3710:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            },
                            "id": 222,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 215,
                              "name": "p",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 192,
                              "src": "3714:1:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "&&",
                            "rightExpression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 218,
                                    "name": "msg",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 5445,
                                    "src": "3740:3:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_magic_message",
                                      "typeString": "msg"
                                    }
                                  },
                                  "id": 219,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "sender",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "3740:10:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 220,
                                  "name": "_weiAmount",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 186,
                                  "src": "3752:10:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 216,
                                  "name": "strategy",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 207,
                                  "src": "3719:8:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_ERC20SaleStrategy_$1242",
                                    "typeString": "contract ERC20SaleStrategy"
                                  }
                                },
                                "id": 217,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "purchasable",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 1214,
                                "src": "3719:20:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_external_view$_t_address_$_t_uint256_$returns$_t_bool_$",
                                  "typeString": "function (address,uint256) view external returns (bool)"
                                }
                              },
                              "id": 221,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "3719:44:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "src": "3714:49:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "src": "3710:53:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 224,
                        "nodeType": "ExpressionStatement",
                        "src": "3710:53:0"
                      }
                    ]
                  },
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 202,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 199,
                      "name": "i",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 196,
                      "src": "3575:1:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<",
                    "rightExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 200,
                        "name": "activatedStrategies",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1365,
                        "src": "3579:19:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_contract$_SaleStrategy_$2091_$dyn_storage",
                          "typeString": "contract SaleStrategy[] storage ref"
                        }
                      },
                      "id": 201,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "length",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "3579:26:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "3575:30:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 226,
                  "initializationExpression": {
                    "assignments": [
                      196
                    ],
                    "declarations": [
                      {
                        "constant": false,
                        "id": 196,
                        "name": "i",
                        "nodeType": "VariableDeclaration",
                        "scope": 230,
                        "src": "3563:6:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 195,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "3563:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "id": 198,
                    "initialValue": {
                      "argumentTypes": null,
                      "hexValue": "30",
                      "id": 197,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "3572:1:0",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "nodeType": "VariableDeclarationStatement",
                    "src": "3563:10:0"
                  },
                  "loopExpression": {
                    "expression": {
                      "argumentTypes": null,
                      "id": 204,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "UnaryOperation",
                      "operator": "++",
                      "prefix": false,
                      "src": "3607:3:0",
                      "subExpression": {
                        "argumentTypes": null,
                        "id": 203,
                        "name": "i",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 196,
                        "src": "3607:1:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "id": 205,
                    "nodeType": "ExpressionStatement",
                    "src": "3607:3:0"
                  },
                  "nodeType": "ForStatement",
                  "src": "3558:216:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 227,
                    "name": "p",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 192,
                    "src": "3790:1:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 190,
                  "id": 228,
                  "nodeType": "Return",
                  "src": "3783:8:0"
                }
              ]
            },
            "documentation": null,
            "id": 230,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": true,
            "modifiers": [],
            "name": "purchasable",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 187,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 186,
                  "name": "_weiAmount",
                  "nodeType": "VariableDeclaration",
                  "scope": 230,
                  "src": "3478:18:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 185,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "3478:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3477:20:0"
            },
            "payable": false,
            "returnParameters": {
              "id": 190,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 189,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 230,
                  "src": "3519:4:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 188,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "3519:4:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3518:6:0"
            },
            "scope": 386,
            "src": "3457:341:0",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 279,
              "nodeType": "Block",
              "src": "3878:341:0",
              "statements": [
                {
                  "body": {
                    "id": 275,
                    "nodeType": "Block",
                    "src": "3942:253:0",
                    "statements": [
                      {
                        "assignments": [
                          249
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 249,
                            "name": "strategy",
                            "nodeType": "VariableDeclaration",
                            "scope": 280,
                            "src": "3956:26:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ERC20SaleStrategy_$1242",
                              "typeString": "contract ERC20SaleStrategy"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 248,
                              "name": "ERC20SaleStrategy",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 1242,
                              "src": "3956:17:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ERC20SaleStrategy_$1242",
                                "typeString": "contract ERC20SaleStrategy"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 255,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 251,
                                "name": "activatedStrategies",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1365,
                                "src": "4003:19:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_array$_t_contract$_SaleStrategy_$2091_$dyn_storage",
                                  "typeString": "contract SaleStrategy[] storage ref"
                                }
                              },
                              "id": 253,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 252,
                                "name": "i",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 238,
                                "src": "4023:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "4003:22:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_SaleStrategy_$2091",
                                "typeString": "contract SaleStrategy"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_SaleStrategy_$2091",
                                "typeString": "contract SaleStrategy"
                              }
                            ],
                            "id": 250,
                            "name": "ERC20SaleStrategy",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1242,
                            "src": "3985:17:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_contract$_ERC20SaleStrategy_$1242_$",
                              "typeString": "type(contract ERC20SaleStrategy)"
                            }
                          },
                          "id": 254,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3985:41:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ERC20SaleStrategy_$1242",
                            "typeString": "contract ERC20SaleStrategy"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "3956:70:0"
                      },
                      {
                        "assignments": [
                          257
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 257,
                            "name": "rate",
                            "nodeType": "VariableDeclaration",
                            "scope": 280,
                            "src": "4040:12:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 256,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "4040:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 264,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 260,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5445,
                                "src": "4074:3:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 261,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "4074:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 262,
                              "name": "_weiAmount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 232,
                              "src": "4086:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 258,
                              "name": "strategy",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 249,
                              "src": "4055:8:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ERC20SaleStrategy_$1242",
                                "typeString": "contract ERC20SaleStrategy"
                              }
                            },
                            "id": 259,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "tokenRate",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1223,
                            "src": "4055:18:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_view$_t_address_$_t_uint256_$returns$_t_uint256_$",
                              "typeString": "function (address,uint256) view external returns (uint256)"
                            }
                          },
                          "id": 263,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4055:42:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "4040:57:0"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 267,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 265,
                            "name": "rate",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 257,
                            "src": "4115:4:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": ">",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 266,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "4122:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "4115:8:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 274,
                        "nodeType": "IfStatement",
                        "src": "4111:74:0",
                        "trueBody": {
                          "id": 273,
                          "nodeType": "Block",
                          "src": "4125:60:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 270,
                                    "name": "rate",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 257,
                                    "src": "4165:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 268,
                                    "name": "_weiAmount",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 232,
                                    "src": "4150:10:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 269,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "mul",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 5210,
                                  "src": "4150:14:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256,uint256) pure returns (uint256)"
                                  }
                                },
                                "id": 271,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "4150:20:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "functionReturnParameters": 236,
                              "id": 272,
                              "nodeType": "Return",
                              "src": "4143:27:0"
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 244,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 241,
                      "name": "i",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 238,
                      "src": "3905:1:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<",
                    "rightExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 242,
                        "name": "activatedStrategies",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1365,
                        "src": "3909:19:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_contract$_SaleStrategy_$2091_$dyn_storage",
                          "typeString": "contract SaleStrategy[] storage ref"
                        }
                      },
                      "id": 243,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "length",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "3909:26:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "3905:30:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 276,
                  "initializationExpression": {
                    "assignments": [
                      238
                    ],
                    "declarations": [
                      {
                        "constant": false,
                        "id": 238,
                        "name": "i",
                        "nodeType": "VariableDeclaration",
                        "scope": 280,
                        "src": "3893:6:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 237,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "3893:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "id": 240,
                    "initialValue": {
                      "argumentTypes": null,
                      "hexValue": "30",
                      "id": 239,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "3902:1:0",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "nodeType": "VariableDeclarationStatement",
                    "src": "3893:10:0"
                  },
                  "loopExpression": {
                    "expression": {
                      "argumentTypes": null,
                      "id": 246,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "UnaryOperation",
                      "operator": "++",
                      "prefix": false,
                      "src": "3937:3:0",
                      "subExpression": {
                        "argumentTypes": null,
                        "id": 245,
                        "name": "i",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 238,
                        "src": "3937:1:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "id": 247,
                    "nodeType": "ExpressionStatement",
                    "src": "3937:3:0"
                  },
                  "nodeType": "ForStatement",
                  "src": "3888:307:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "hexValue": "30",
                    "id": 277,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "4211:1:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_0_by_1",
                      "typeString": "int_const 0"
                    },
                    "value": "0"
                  },
                  "functionReturnParameters": 236,
                  "id": 278,
                  "nodeType": "Return",
                  "src": "4204:8:0"
                }
              ]
            },
            "documentation": null,
            "id": 280,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": true,
            "modifiers": [],
            "name": "getTokenAmount",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 233,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 232,
                  "name": "_weiAmount",
                  "nodeType": "VariableDeclaration",
                  "scope": 280,
                  "src": "3828:18:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 231,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "3828:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3827:20:0"
            },
            "payable": false,
            "returnParameters": {
              "id": 236,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 235,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 280,
                  "src": "3869:7:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 234,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "3869:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3868:9:0"
            },
            "scope": 386,
            "src": "3804:415:0",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 298,
              "nodeType": "Block",
              "src": "4303:106:0",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 296,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 287,
                        "name": "tokenAmountOfPurchaser",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 27,
                        "src": "4313:22:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                          "typeString": "mapping(address => uint256)"
                        }
                      },
                      "id": 289,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 288,
                        "name": "_purchaser",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 282,
                        "src": "4336:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "4313:34:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 294,
                          "name": "_tokenAmount",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 284,
                          "src": "4389:12:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 290,
                            "name": "tokenAmountOfPurchaser",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 27,
                            "src": "4350:22:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                              "typeString": "mapping(address => uint256)"
                            }
                          },
                          "id": 292,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 291,
                            "name": "_purchaser",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 282,
                            "src": "4373:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "4350:34:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 293,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "add",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 5268,
                        "src": "4350:38:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                          "typeString": "function (uint256,uint256) pure returns (uint256)"
                        }
                      },
                      "id": 295,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "4350:52:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "4313:89:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 297,
                  "nodeType": "ExpressionStatement",
                  "src": "4313:89:0"
                }
              ]
            },
            "documentation": null,
            "id": 299,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": false,
            "modifiers": [],
            "name": "_updateTokenAmount",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 285,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 282,
                  "name": "_purchaser",
                  "nodeType": "VariableDeclaration",
                  "scope": 299,
                  "src": "4253:18:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 281,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4253:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 284,
                  "name": "_tokenAmount",
                  "nodeType": "VariableDeclaration",
                  "scope": 299,
                  "src": "4273:20:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 283,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "4273:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4252:42:0"
            },
            "payable": false,
            "returnParameters": {
              "id": 286,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4303:0:0"
            },
            "scope": 386,
            "src": "4225:184:0",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "private"
          },
          {
            "body": {
              "id": 342,
              "nodeType": "Block",
              "src": "4507:317:0",
              "statements": [
                {
                  "body": {
                    "id": 338,
                    "nodeType": "Block",
                    "src": "4571:220:0",
                    "statements": [
                      {
                        "assignments": [
                          320
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 320,
                            "name": "strategy",
                            "nodeType": "VariableDeclaration",
                            "scope": 343,
                            "src": "4585:26:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ERC20SaleStrategy_$1242",
                              "typeString": "contract ERC20SaleStrategy"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 319,
                              "name": "ERC20SaleStrategy",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 1242,
                              "src": "4585:17:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ERC20SaleStrategy_$1242",
                                "typeString": "contract ERC20SaleStrategy"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 326,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 322,
                                "name": "activatedStrategies",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1365,
                                "src": "4632:19:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_array$_t_contract$_SaleStrategy_$2091_$dyn_storage",
                                  "typeString": "contract SaleStrategy[] storage ref"
                                }
                              },
                              "id": 324,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 323,
                                "name": "i",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 309,
                                "src": "4652:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "4632:22:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_SaleStrategy_$2091",
                                "typeString": "contract SaleStrategy"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_SaleStrategy_$2091",
                                "typeString": "contract SaleStrategy"
                              }
                            ],
                            "id": 321,
                            "name": "ERC20SaleStrategy",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1242,
                            "src": "4614:17:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_contract$_ERC20SaleStrategy_$1242_$",
                              "typeString": "type(contract ERC20SaleStrategy)"
                            }
                          },
                          "id": 325,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4614:41:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ERC20SaleStrategy_$1242",
                            "typeString": "contract ERC20SaleStrategy"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "4585:70:0"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 329,
                              "name": "_purchaser",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 301,
                              "src": "4697:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 330,
                              "name": "_tokenAmount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 303,
                              "src": "4709:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 327,
                              "name": "strategy",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 320,
                              "src": "4673:8:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ERC20SaleStrategy_$1242",
                                "typeString": "contract ERC20SaleStrategy"
                              }
                            },
                            "id": 328,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "receivesTokens",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1241,
                            "src": "4673:23:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                              "typeString": "function (address,uint256) external returns (bool)"
                            }
                          },
                          "id": 331,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4673:49:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 337,
                        "nodeType": "IfStatement",
                        "src": "4669:112:0",
                        "trueBody": {
                          "id": 336,
                          "nodeType": "Block",
                          "src": "4724:57:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 333,
                                    "name": "strategy",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 320,
                                    "src": "4757:8:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_ERC20SaleStrategy_$1242",
                                      "typeString": "contract ERC20SaleStrategy"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_ERC20SaleStrategy_$1242",
                                      "typeString": "contract ERC20SaleStrategy"
                                    }
                                  ],
                                  "id": 332,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "4749:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": "address"
                                },
                                "id": 334,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "4749:17:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "functionReturnParameters": 307,
                              "id": 335,
                              "nodeType": "Return",
                              "src": "4742:24:0"
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 315,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 312,
                      "name": "i",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 309,
                      "src": "4534:1:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<",
                    "rightExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 313,
                        "name": "activatedStrategies",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1365,
                        "src": "4538:19:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_contract$_SaleStrategy_$2091_$dyn_storage",
                          "typeString": "contract SaleStrategy[] storage ref"
                        }
                      },
                      "id": 314,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "length",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "4538:26:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "4534:30:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 339,
                  "initializationExpression": {
                    "assignments": [
                      309
                    ],
                    "declarations": [
                      {
                        "constant": false,
                        "id": 309,
                        "name": "i",
                        "nodeType": "VariableDeclaration",
                        "scope": 343,
                        "src": "4522:6:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 308,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "4522:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "id": 311,
                    "initialValue": {
                      "argumentTypes": null,
                      "hexValue": "30",
                      "id": 310,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "4531:1:0",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "nodeType": "VariableDeclarationStatement",
                    "src": "4522:10:0"
                  },
                  "loopExpression": {
                    "expression": {
                      "argumentTypes": null,
                      "id": 317,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "UnaryOperation",
                      "operator": "++",
                      "prefix": false,
                      "src": "4566:3:0",
                      "subExpression": {
                        "argumentTypes": null,
                        "id": 316,
                        "name": "i",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 309,
                        "src": "4566:1:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "id": 318,
                    "nodeType": "ExpressionStatement",
                    "src": "4566:3:0"
                  },
                  "nodeType": "ForStatement",
                  "src": "4517:274:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 340,
                    "name": "_purchaser",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 301,
                    "src": "4807:10:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "functionReturnParameters": 307,
                  "id": 341,
                  "nodeType": "Return",
                  "src": "4800:17:0"
                }
              ]
            },
            "documentation": null,
            "id": 343,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": false,
            "modifiers": [],
            "name": "_tokenReceiver",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 304,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 301,
                  "name": "_purchaser",
                  "nodeType": "VariableDeclaration",
                  "scope": 343,
                  "src": "4439:18:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 300,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4439:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 303,
                  "name": "_tokenAmount",
                  "nodeType": "VariableDeclaration",
                  "scope": 343,
                  "src": "4459:20:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 302,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "4459:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4438:42:0"
            },
            "payable": false,
            "returnParameters": {
              "id": 307,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 306,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 343,
                  "src": "4498:7:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 305,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4498:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4497:9:0"
            },
            "scope": 386,
            "src": "4415:409:0",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "private"
          },
          {
            "body": {
              "id": 384,
              "nodeType": "Block",
              "src": "4911:290:0",
              "statements": [
                {
                  "body": {
                    "id": 380,
                    "nodeType": "Block",
                    "src": "4975:198:0",
                    "statements": [
                      {
                        "assignments": [
                          364
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 364,
                            "name": "strategy",
                            "nodeType": "VariableDeclaration",
                            "scope": 385,
                            "src": "4989:26:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ERC20SaleStrategy_$1242",
                              "typeString": "contract ERC20SaleStrategy"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 363,
                              "name": "ERC20SaleStrategy",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 1242,
                              "src": "4989:17:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ERC20SaleStrategy_$1242",
                                "typeString": "contract ERC20SaleStrategy"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 370,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 366,
                                "name": "activatedStrategies",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1365,
                                "src": "5036:19:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_array$_t_contract$_SaleStrategy_$2091_$dyn_storage",
                                  "typeString": "contract SaleStrategy[] storage ref"
                                }
                              },
                              "id": 368,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 367,
                                "name": "i",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 353,
                                "src": "5056:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "5036:22:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_SaleStrategy_$2091",
                                "typeString": "contract SaleStrategy"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_SaleStrategy_$2091",
                                "typeString": "contract SaleStrategy"
                              }
                            ],
                            "id": 365,
                            "name": "ERC20SaleStrategy",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1242,
                            "src": "5018:17:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_contract$_ERC20SaleStrategy_$1242_$",
                              "typeString": "type(contract ERC20SaleStrategy)"
                            }
                          },
                          "id": 369,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5018:41:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ERC20SaleStrategy_$1242",
                            "typeString": "contract ERC20SaleStrategy"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "4989:70:0"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 373,
                              "name": "_to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 345,
                              "src": "5099:3:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 374,
                              "name": "_tokenAmount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 347,
                              "src": "5104:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 371,
                              "name": "strategy",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 364,
                              "src": "5077:8:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ERC20SaleStrategy_$1242",
                                "typeString": "contract ERC20SaleStrategy"
                              }
                            },
                            "id": 372,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "supplyTokens",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1232,
                            "src": "5077:21:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                              "typeString": "function (address,uint256) external returns (bool)"
                            }
                          },
                          "id": 375,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5077:40:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 379,
                        "nodeType": "IfStatement",
                        "src": "5073:90:0",
                        "trueBody": {
                          "id": 378,
                          "nodeType": "Block",
                          "src": "5119:44:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "hexValue": "74727565",
                                "id": 376,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "bool",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "5144:4:0",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                "value": "true"
                              },
                              "functionReturnParameters": 351,
                              "id": 377,
                              "nodeType": "Return",
                              "src": "5137:11:0"
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 359,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 356,
                      "name": "i",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 353,
                      "src": "4938:1:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<",
                    "rightExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 357,
                        "name": "activatedStrategies",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1365,
                        "src": "4942:19:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_contract$_SaleStrategy_$2091_$dyn_storage",
                          "typeString": "contract SaleStrategy[] storage ref"
                        }
                      },
                      "id": 358,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "length",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "4942:26:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "4938:30:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 381,
                  "initializationExpression": {
                    "assignments": [
                      353
                    ],
                    "declarations": [
                      {
                        "constant": false,
                        "id": 353,
                        "name": "i",
                        "nodeType": "VariableDeclaration",
                        "scope": 385,
                        "src": "4926:6:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 352,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "4926:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "id": 355,
                    "initialValue": {
                      "argumentTypes": null,
                      "hexValue": "30",
                      "id": 354,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "4935:1:0",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "nodeType": "VariableDeclarationStatement",
                    "src": "4926:10:0"
                  },
                  "loopExpression": {
                    "expression": {
                      "argumentTypes": null,
                      "id": 361,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "UnaryOperation",
                      "operator": "++",
                      "prefix": false,
                      "src": "4970:3:0",
                      "subExpression": {
                        "argumentTypes": null,
                        "id": 360,
                        "name": "i",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 353,
                        "src": "4970:1:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "id": 362,
                    "nodeType": "ExpressionStatement",
                    "src": "4970:3:0"
                  },
                  "nodeType": "ForStatement",
                  "src": "4921:252:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "hexValue": "66616c7365",
                    "id": 382,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "bool",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "5189:5:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "value": "false"
                  },
                  "functionReturnParameters": 351,
                  "id": 383,
                  "nodeType": "Return",
                  "src": "5182:12:0"
                }
              ]
            },
            "documentation": null,
            "id": 385,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": false,
            "modifiers": [],
            "name": "_supplyTokens",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 348,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 345,
                  "name": "_to",
                  "nodeType": "VariableDeclaration",
                  "scope": 385,
                  "src": "4853:11:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 344,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4853:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 347,
                  "name": "_tokenAmount",
                  "nodeType": "VariableDeclaration",
                  "scope": 385,
                  "src": "4866:20:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 346,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "4866:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4852:35:0"
            },
            "payable": false,
            "returnParameters": {
              "id": 351,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 350,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 385,
                  "src": "4905:4:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 349,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "4905:4:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4904:6:0"
            },
            "scope": 386,
            "src": "4830:371:0",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "private"
          }
        ],
        "scope": 387,
        "src": "257:4946:0"
      }
    ],
    "src": "0:5204:0"
  },
  "legacyAST": {
    "absolutePath": "/Users/yoonjae/SolidityProjects/tokenboost-solidity-erc20sale/contracts/sale/erc20/ERC20Sale.sol",
    "exportedSymbols": {
      "ERC20Sale": [
        386
      ]
    },
    "id": 387,
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 1,
        "literals": [
          "solidity",
          "^",
          "0.4",
          ".24"
        ],
        "nodeType": "PragmaDirective",
        "src": "0:24:0"
      },
      {
        "absolutePath": "tokenboost-solidity/contracts/sale/Sale.sol",
        "file": "tokenboost-solidity/contracts/sale/Sale.sol",
        "id": 2,
        "nodeType": "ImportDirective",
        "scope": 387,
        "sourceUnit": 1960,
        "src": "26:53:0",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "tokenboost-solidity/contracts/utils/strings.sol",
        "file": "tokenboost-solidity/contracts/utils/strings.sol",
        "id": 3,
        "nodeType": "ImportDirective",
        "scope": 387,
        "sourceUnit": 4334,
        "src": "80:57:0",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "zeppelin-solidity/contracts/token/ERC20/ERC20.sol",
        "file": "zeppelin-solidity/contracts/token/ERC20/ERC20.sol",
        "id": 4,
        "nodeType": "ImportDirective",
        "scope": 387,
        "sourceUnit": 5399,
        "src": "138:59:0",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "/Users/yoonjae/SolidityProjects/tokenboost-solidity-erc20sale/contracts/strategy/sale/erc20/ERC20SaleStrategy.sol",
        "file": "../../strategy/sale/erc20/ERC20SaleStrategy.sol",
        "id": 5,
        "nodeType": "ImportDirective",
        "scope": 387,
        "sourceUnit": 1243,
        "src": "198:57:0",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 6,
              "name": "Sale",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 1959,
              "src": "279:4:0",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_Sale_$1959",
                "typeString": "contract Sale"
              }
            },
            "id": 7,
            "nodeType": "InheritanceSpecifier",
            "src": "279:4:0"
          }
        ],
        "contractDependencies": [
          1276,
          1320,
          1959,
          5124,
          5175,
          5355
        ],
        "contractKind": "contract",
        "documentation": null,
        "fullyImplemented": true,
        "id": 386,
        "linearizedBaseContracts": [
          386,
          1959,
          1276,
          1320,
          5175,
          5124,
          5355
        ],
        "name": "ERC20Sale",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "id": 10,
            "libraryName": {
              "contractScope": null,
              "id": 8,
              "name": "SafeMath",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 5269,
              "src": "296:8:0",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_SafeMath_$5269",
                "typeString": "library SafeMath"
              }
            },
            "nodeType": "UsingForDirective",
            "src": "290:27:0",
            "typeName": {
              "id": 9,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "309:7:0",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            }
          },
          {
            "id": 12,
            "libraryName": {
              "contractScope": null,
              "id": 11,
              "name": "strings",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 4333,
              "src": "328:7:0",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_strings_$4333",
                "typeString": "library strings"
              }
            },
            "nodeType": "UsingForDirective",
            "src": "322:20:0",
            "typeName": null
          },
          {
            "constant": true,
            "id": 15,
            "name": "InterfaceId_ERC20Sale",
            "nodeType": "VariableDeclaration",
            "scope": 386,
            "src": "1603:57:0",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_bytes4",
              "typeString": "bytes4"
            },
            "typeName": {
              "id": 13,
              "name": "bytes4",
              "nodeType": "ElementaryTypeName",
              "src": "1603:6:0",
              "typeDescriptions": {
                "typeIdentifier": "t_bytes4",
                "typeString": "bytes4"
              }
            },
            "value": {
              "argumentTypes": null,
              "hexValue": "30783930653266343934",
              "id": 14,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "1650:10:0",
              "subdenomination": null,
              "typeDescriptions": {
                "typeIdentifier": "t_rational_2430792852_by_1",
                "typeString": "int_const 2430792852"
              },
              "value": "0x90e2f494"
            },
            "visibility": "public"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 23,
            "name": "TokenPurchase",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 22,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17,
                  "indexed": true,
                  "name": "purchaser",
                  "nodeType": "VariableDeclaration",
                  "scope": 23,
                  "src": "1696:25:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 16,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1696:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 19,
                  "indexed": false,
                  "name": "weiAmount",
                  "nodeType": "VariableDeclaration",
                  "scope": 23,
                  "src": "1731:17:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 18,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1731:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 21,
                  "indexed": false,
                  "name": "tokenAmount",
                  "nodeType": "VariableDeclaration",
                  "scope": 23,
                  "src": "1758:19:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 20,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1758:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1686:97:0"
            },
            "src": "1667:117:0"
          },
          {
            "constant": false,
            "id": 27,
            "name": "tokenAmountOfPurchaser",
            "nodeType": "VariableDeclaration",
            "scope": 386,
            "src": "1790:50:0",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
              "typeString": "mapping(address => uint256)"
            },
            "typeName": {
              "id": 26,
              "keyType": {
                "id": 24,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "1798:7:0",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "nodeType": "Mapping",
              "src": "1790:27:0",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                "typeString": "mapping(address => uint256)"
              },
              "valueType": {
                "id": 25,
                "name": "uint256",
                "nodeType": "ElementaryTypeName",
                "src": "1809:7:0",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                }
              }
            },
            "value": null,
            "visibility": "internal"
          },
          {
            "constant": false,
            "id": 29,
            "name": "token",
            "nodeType": "VariableDeclaration",
            "scope": 386,
            "src": "1846:18:0",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_contract$_ERC20_$5398",
              "typeString": "contract ERC20"
            },
            "typeName": {
              "contractScope": null,
              "id": 28,
              "name": "ERC20",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 5398,
              "src": "1846:5:0",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_ERC20_$5398",
                "typeString": "contract ERC20"
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 61,
              "nodeType": "Block",
              "src": "2027:123:0",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 50,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 46,
                          "name": "_token",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 37,
                          "src": "2045:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ERC20_$5398",
                            "typeString": "contract ERC20"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 48,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "2063:1:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              }
                            ],
                            "id": 47,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "2055:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": "address"
                          },
                          "id": 49,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2055:10:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "src": "2045:20:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      ],
                      "id": 45,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        5448,
                        5449
                      ],
                      "referencedDeclaration": 5448,
                      "src": "2037:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$",
                        "typeString": "function (bool) pure"
                      }
                    },
                    "id": 51,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2037:29:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 52,
                  "nodeType": "ExpressionStatement",
                  "src": "2037:29:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 55,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 53,
                      "name": "token",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 29,
                      "src": "2077:5:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_ERC20_$5398",
                        "typeString": "contract ERC20"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 54,
                      "name": "_token",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 37,
                      "src": "2085:6:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_ERC20_$5398",
                        "typeString": "contract ERC20"
                      }
                    },
                    "src": "2077:14:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC20_$5398",
                      "typeString": "contract ERC20"
                    }
                  },
                  "id": 56,
                  "nodeType": "ExpressionStatement",
                  "src": "2077:14:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 58,
                        "name": "InterfaceId_ERC20Sale",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 15,
                        "src": "2121:21:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        }
                      ],
                      "id": 57,
                      "name": "_registerInterface",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5174,
                      "src": "2102:18:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_bytes4_$returns$__$",
                        "typeString": "function (bytes4)"
                      }
                    },
                    "id": 59,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2102:41:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 60,
                  "nodeType": "ExpressionStatement",
                  "src": "2102:41:0"
                }
              ]
            },
            "documentation": null,
            "id": 62,
            "implemented": true,
            "isConstructor": true,
            "isDeclaredConst": false,
            "modifiers": [
              {
                "arguments": [
                  {
                    "argumentTypes": null,
                    "id": 40,
                    "name": "_owner",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 31,
                    "src": "1998:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  {
                    "argumentTypes": null,
                    "id": 41,
                    "name": "_projectName",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 33,
                    "src": "2006:12:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_memory_ptr",
                      "typeString": "string memory"
                    }
                  },
                  {
                    "argumentTypes": null,
                    "id": 42,
                    "name": "_name",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 35,
                    "src": "2020:5:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_memory_ptr",
                      "typeString": "string memory"
                    }
                  }
                ],
                "id": 43,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 39,
                  "name": "Sale",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 1959,
                  "src": "1993:4:0",
                  "typeDescriptions": {
                    "typeIdentifier": "t_type$_t_contract$_Sale_$1959_$",
                    "typeString": "type(contract Sale)"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "1993:33:0"
              }
            ],
            "name": "",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 38,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 31,
                  "name": "_owner",
                  "nodeType": "VariableDeclaration",
                  "scope": 62,
                  "src": "1892:14:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 30,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1892:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 33,
                  "name": "_projectName",
                  "nodeType": "VariableDeclaration",
                  "scope": 62,
                  "src": "1916:19:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 32,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1916:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 35,
                  "name": "_name",
                  "nodeType": "VariableDeclaration",
                  "scope": 62,
                  "src": "1945:12:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 34,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1945:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 37,
                  "name": "_token",
                  "nodeType": "VariableDeclaration",
                  "scope": 62,
                  "src": "1967:12:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_ERC20_$5398",
                    "typeString": "contract ERC20"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 36,
                    "name": "ERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 5398,
                    "src": "1967:5:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC20_$5398",
                      "typeString": "contract ERC20"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1882:103:0"
            },
            "payable": false,
            "returnParameters": {
              "id": 44,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2027:0:0"
            },
            "scope": 386,
            "src": "1871:279:0",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 73,
              "nodeType": "Block",
              "src": "2229:58:0",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 69,
                      "name": "tokenAmountOfPurchaser",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 27,
                      "src": "2246:22:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                        "typeString": "mapping(address => uint256)"
                      }
                    },
                    "id": 71,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 70,
                      "name": "_purchaser",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 64,
                      "src": "2269:10:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "2246:34:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 68,
                  "id": 72,
                  "nodeType": "Return",
                  "src": "2239:41:0"
                }
              ]
            },
            "documentation": null,
            "id": 74,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": true,
            "modifiers": [],
            "name": "tokenAmountOf",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 65,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 64,
                  "name": "_purchaser",
                  "nodeType": "VariableDeclaration",
                  "scope": 74,
                  "src": "2179:18:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 63,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2179:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2178:20:0"
            },
            "payable": false,
            "returnParameters": {
              "id": 68,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 67,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 74,
                  "src": "2220:7:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 66,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2220:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2219:9:0"
            },
            "scope": 386,
            "src": "2156:131:0",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 115,
              "nodeType": "Block",
              "src": "2604:296:0",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 100,
                        "name": "_projectName",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 76,
                        "src": "2640:12:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 101,
                        "name": "_projectSummary",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 78,
                        "src": "2666:15:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 102,
                        "name": "_projectDescription",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 80,
                        "src": "2695:19:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 103,
                        "name": "_logoUrl",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 82,
                        "src": "2728:8:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 104,
                        "name": "_coverImageUrl",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 84,
                        "src": "2750:14:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 105,
                        "name": "_websiteUrl",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 86,
                        "src": "2778:11:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 106,
                        "name": "_whitepaperUrl",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 88,
                        "src": "2803:14:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 107,
                        "name": "_videoUrl",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 90,
                        "src": "2831:9:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 108,
                        "name": "_name",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 92,
                        "src": "2854:5:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        },
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        },
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        },
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        },
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        },
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        },
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        },
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        },
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 97,
                        "name": "super",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5491,
                        "src": "2614:5:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_super$_ERC20Sale_$386",
                          "typeString": "contract super ERC20Sale"
                        }
                      },
                      "id": 99,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "update",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 1459,
                      "src": "2614:12:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_string_memory_ptr_$_t_string_memory_ptr_$_t_string_memory_ptr_$_t_string_memory_ptr_$_t_string_memory_ptr_$_t_string_memory_ptr_$_t_string_memory_ptr_$_t_string_memory_ptr_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (string memory,string memory,string memory,string memory,string memory,string memory,string memory,string memory,string memory)"
                      }
                    },
                    "id": 109,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2614:255:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 110,
                  "nodeType": "ExpressionStatement",
                  "src": "2614:255:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 113,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 111,
                      "name": "token",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 29,
                      "src": "2879:5:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_ERC20_$5398",
                        "typeString": "contract ERC20"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 112,
                      "name": "_token",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 94,
                      "src": "2887:6:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_ERC20_$5398",
                        "typeString": "contract ERC20"
                      }
                    },
                    "src": "2879:14:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC20_$5398",
                      "typeString": "contract ERC20"
                    }
                  },
                  "id": 114,
                  "nodeType": "ExpressionStatement",
                  "src": "2879:14:0"
                }
              ]
            },
            "documentation": null,
            "id": 116,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": false,
            "modifiers": [],
            "name": "update",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 95,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 76,
                  "name": "_projectName",
                  "nodeType": "VariableDeclaration",
                  "scope": 116,
                  "src": "2318:19:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 75,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "2318:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 78,
                  "name": "_projectSummary",
                  "nodeType": "VariableDeclaration",
                  "scope": 116,
                  "src": "2347:22:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 77,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "2347:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 80,
                  "name": "_projectDescription",
                  "nodeType": "VariableDeclaration",
                  "scope": 116,
                  "src": "2379:26:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 79,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "2379:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 82,
                  "name": "_logoUrl",
                  "nodeType": "VariableDeclaration",
                  "scope": 116,
                  "src": "2415:15:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 81,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "2415:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 84,
                  "name": "_coverImageUrl",
                  "nodeType": "VariableDeclaration",
                  "scope": 116,
                  "src": "2440:21:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 83,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "2440:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 86,
                  "name": "_websiteUrl",
                  "nodeType": "VariableDeclaration",
                  "scope": 116,
                  "src": "2471:18:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 85,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "2471:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 88,
                  "name": "_whitepaperUrl",
                  "nodeType": "VariableDeclaration",
                  "scope": 116,
                  "src": "2499:21:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 87,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "2499:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 90,
                  "name": "_videoUrl",
                  "nodeType": "VariableDeclaration",
                  "scope": 116,
                  "src": "2530:16:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 89,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "2530:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 92,
                  "name": "_name",
                  "nodeType": "VariableDeclaration",
                  "scope": 116,
                  "src": "2556:12:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 91,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "2556:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 94,
                  "name": "_token",
                  "nodeType": "VariableDeclaration",
                  "scope": 116,
                  "src": "2578:12:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_ERC20_$5398",
                    "typeString": "contract ERC20"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 93,
                    "name": "ERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 5398,
                    "src": "2578:5:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC20_$5398",
                      "typeString": "contract ERC20"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2308:288:0"
            },
            "payable": false,
            "returnParameters": {
              "id": 96,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2604:0:0"
            },
            "scope": 386,
            "src": "2293:607:0",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 183,
              "nodeType": "Block",
              "src": "2948:503:0",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 124,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "UnaryOperation",
                        "operator": "!",
                        "prefix": true,
                        "src": "2966:11:0",
                        "subExpression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 122,
                            "name": "finished",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1770,
                            "src": "2967:8:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$__$returns$_t_bool_$",
                              "typeString": "function () view returns (bool)"
                            }
                          },
                          "id": 123,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2967:10:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      ],
                      "id": 121,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        5448,
                        5449
                      ],
                      "referencedDeclaration": 5448,
                      "src": "2958:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$",
                        "typeString": "function (bool) pure"
                      }
                    },
                    "id": 125,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2958:20:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 126,
                  "nodeType": "ExpressionStatement",
                  "src": "2958:20:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [],
                        "expression": {
                          "argumentTypes": [],
                          "id": 128,
                          "name": "started",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1688,
                          "src": "2996:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$__$returns$_t_bool_$",
                            "typeString": "function () view returns (bool)"
                          }
                        },
                        "id": 129,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "2996:9:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      ],
                      "id": 127,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        5448,
                        5449
                      ],
                      "referencedDeclaration": 5448,
                      "src": "2988:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$",
                        "typeString": "function (bool) pure"
                      }
                    },
                    "id": 130,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2988:18:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 131,
                  "nodeType": "ExpressionStatement",
                  "src": "2988:18:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 134,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5445,
                              "src": "3036:3:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 135,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "value",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "3036:9:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          ],
                          "id": 133,
                          "name": "purchasable",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 230,
                          "src": "3024:11:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$_t_uint256_$returns$_t_bool_$",
                            "typeString": "function (uint256) view returns (bool)"
                          }
                        },
                        "id": 136,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "3024:22:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      ],
                      "id": 132,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        5448,
                        5449
                      ],
                      "referencedDeclaration": 5448,
                      "src": "3016:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$",
                        "typeString": "function (bool) pure"
                      }
                    },
                    "id": 137,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3016:31:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 138,
                  "nodeType": "ExpressionStatement",
                  "src": "3016:31:0"
                },
                {
                  "assignments": [
                    140
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 140,
                      "name": "purchaser",
                      "nodeType": "VariableDeclaration",
                      "scope": 184,
                      "src": "3058:17:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "typeName": {
                        "id": 139,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "3058:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 143,
                  "initialValue": {
                    "argumentTypes": null,
                    "expression": {
                      "argumentTypes": null,
                      "id": 141,
                      "name": "msg",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5445,
                      "src": "3078:3:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_magic_message",
                        "typeString": "msg"
                      }
                    },
                    "id": 142,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "memberName": "sender",
                    "nodeType": "MemberAccess",
                    "referencedDeclaration": null,
                    "src": "3078:10:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "3058:30:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 145,
                        "name": "purchaser",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 140,
                        "src": "3116:9:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 146,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5445,
                          "src": "3127:3:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 147,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "value",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "3127:9:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 144,
                      "name": "increasePaymentOf",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1837,
                      "src": "3098:17:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256)"
                      }
                    },
                    "id": 148,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3098:39:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 149,
                  "nodeType": "ExpressionStatement",
                  "src": "3098:39:0"
                },
                {
                  "assignments": [
                    151
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 151,
                      "name": "tokenAmount",
                      "nodeType": "VariableDeclaration",
                      "scope": 184,
                      "src": "3148:19:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 150,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "3148:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 156,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 153,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5445,
                          "src": "3185:3:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 154,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "value",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "3185:9:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 152,
                      "name": "getTokenAmount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 280,
                      "src": "3170:14:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_uint256_$returns$_t_uint256_$",
                        "typeString": "function (uint256) view returns (uint256)"
                      }
                    },
                    "id": 155,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3170:25:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "3148:47:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 158,
                        "name": "purchaser",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 140,
                        "src": "3224:9:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 159,
                        "name": "tokenAmount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 151,
                        "src": "3235:11:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 157,
                      "name": "_updateTokenAmount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 299,
                      "src": "3205:18:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256)"
                      }
                    },
                    "id": 160,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3205:42:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 161,
                  "nodeType": "ExpressionStatement",
                  "src": "3205:42:0"
                },
                {
                  "assignments": [
                    163
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 163,
                      "name": "tokenReceiver",
                      "nodeType": "VariableDeclaration",
                      "scope": 184,
                      "src": "3258:21:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "typeName": {
                        "id": 162,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "3258:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 168,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 165,
                        "name": "purchaser",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 140,
                        "src": "3297:9:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 166,
                        "name": "tokenAmount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 151,
                        "src": "3308:11:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 164,
                      "name": "_tokenReceiver",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 343,
                      "src": "3282:14:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$_t_address_$",
                        "typeString": "function (address,uint256) returns (address)"
                      }
                    },
                    "id": 167,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3282:38:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "3258:62:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 171,
                            "name": "tokenReceiver",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 163,
                            "src": "3352:13:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          {
                            "argumentTypes": null,
                            "id": 172,
                            "name": "tokenAmount",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 151,
                            "src": "3367:11:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          ],
                          "id": 170,
                          "name": "_supplyTokens",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 385,
                          "src": "3338:13:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                            "typeString": "function (address,uint256) returns (bool)"
                          }
                        },
                        "id": 173,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "3338:41:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      ],
                      "id": 169,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        5448,
                        5449
                      ],
                      "referencedDeclaration": 5448,
                      "src": "3330:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$",
                        "typeString": "function (bool) pure"
                      }
                    },
                    "id": 174,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3330:50:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 175,
                  "nodeType": "ExpressionStatement",
                  "src": "3330:50:0"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 177,
                        "name": "purchaser",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 140,
                        "src": "3410:9:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 178,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5445,
                          "src": "3421:3:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 179,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "value",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "3421:9:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 180,
                        "name": "tokenAmount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 151,
                        "src": "3432:11:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 176,
                      "name": "TokenPurchase",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 23,
                      "src": "3396:13:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256,uint256)"
                      }
                    },
                    "id": 181,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3396:48:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 182,
                  "nodeType": "EmitStatement",
                  "src": "3391:53:0"
                }
              ]
            },
            "documentation": null,
            "id": 184,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": false,
            "modifiers": [
              {
                "arguments": null,
                "id": 119,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 118,
                  "name": "whenActivated",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 1254,
                  "src": "2917:13:0",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "2917:13:0"
              }
            ],
            "name": "",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 117,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2914:2:0"
            },
            "payable": true,
            "returnParameters": {
              "id": 120,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2948:0:0"
            },
            "scope": 386,
            "src": "2906:545:0",
            "stateMutability": "payable",
            "superFunction": 1773,
            "visibility": "external"
          },
          {
            "body": {
              "id": 229,
              "nodeType": "Block",
              "src": "3525:273:0",
              "statements": [
                {
                  "assignments": [
                    192
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 192,
                      "name": "p",
                      "nodeType": "VariableDeclaration",
                      "scope": 230,
                      "src": "3535:6:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "typeName": {
                        "id": 191,
                        "name": "bool",
                        "nodeType": "ElementaryTypeName",
                        "src": "3535:4:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 194,
                  "initialValue": {
                    "argumentTypes": null,
                    "hexValue": "74727565",
                    "id": 193,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "bool",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "3544:4:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "value": "true"
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "3535:13:0"
                },
                {
                  "body": {
                    "id": 225,
                    "nodeType": "Block",
                    "src": "3612:162:0",
                    "statements": [
                      {
                        "assignments": [
                          207
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 207,
                            "name": "strategy",
                            "nodeType": "VariableDeclaration",
                            "scope": 230,
                            "src": "3626:26:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ERC20SaleStrategy_$1242",
                              "typeString": "contract ERC20SaleStrategy"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 206,
                              "name": "ERC20SaleStrategy",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 1242,
                              "src": "3626:17:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ERC20SaleStrategy_$1242",
                                "typeString": "contract ERC20SaleStrategy"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 213,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 209,
                                "name": "activatedStrategies",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1365,
                                "src": "3673:19:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_array$_t_contract$_SaleStrategy_$2091_$dyn_storage",
                                  "typeString": "contract SaleStrategy[] storage ref"
                                }
                              },
                              "id": 211,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 210,
                                "name": "i",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 196,
                                "src": "3693:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "3673:22:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_SaleStrategy_$2091",
                                "typeString": "contract SaleStrategy"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_SaleStrategy_$2091",
                                "typeString": "contract SaleStrategy"
                              }
                            ],
                            "id": 208,
                            "name": "ERC20SaleStrategy",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1242,
                            "src": "3655:17:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_contract$_ERC20SaleStrategy_$1242_$",
                              "typeString": "type(contract ERC20SaleStrategy)"
                            }
                          },
                          "id": 212,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3655:41:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ERC20SaleStrategy_$1242",
                            "typeString": "contract ERC20SaleStrategy"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "3626:70:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 223,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 214,
                            "name": "p",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 192,
                            "src": "3710:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            },
                            "id": 222,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 215,
                              "name": "p",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 192,
                              "src": "3714:1:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "&&",
                            "rightExpression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 218,
                                    "name": "msg",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 5445,
                                    "src": "3740:3:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_magic_message",
                                      "typeString": "msg"
                                    }
                                  },
                                  "id": 219,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "sender",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "3740:10:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 220,
                                  "name": "_weiAmount",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 186,
                                  "src": "3752:10:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 216,
                                  "name": "strategy",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 207,
                                  "src": "3719:8:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_ERC20SaleStrategy_$1242",
                                    "typeString": "contract ERC20SaleStrategy"
                                  }
                                },
                                "id": 217,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "purchasable",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 1214,
                                "src": "3719:20:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_external_view$_t_address_$_t_uint256_$returns$_t_bool_$",
                                  "typeString": "function (address,uint256) view external returns (bool)"
                                }
                              },
                              "id": 221,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "3719:44:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "src": "3714:49:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "src": "3710:53:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 224,
                        "nodeType": "ExpressionStatement",
                        "src": "3710:53:0"
                      }
                    ]
                  },
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 202,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 199,
                      "name": "i",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 196,
                      "src": "3575:1:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<",
                    "rightExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 200,
                        "name": "activatedStrategies",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1365,
                        "src": "3579:19:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_contract$_SaleStrategy_$2091_$dyn_storage",
                          "typeString": "contract SaleStrategy[] storage ref"
                        }
                      },
                      "id": 201,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "length",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "3579:26:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "3575:30:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 226,
                  "initializationExpression": {
                    "assignments": [
                      196
                    ],
                    "declarations": [
                      {
                        "constant": false,
                        "id": 196,
                        "name": "i",
                        "nodeType": "VariableDeclaration",
                        "scope": 230,
                        "src": "3563:6:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 195,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "3563:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "id": 198,
                    "initialValue": {
                      "argumentTypes": null,
                      "hexValue": "30",
                      "id": 197,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "3572:1:0",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "nodeType": "VariableDeclarationStatement",
                    "src": "3563:10:0"
                  },
                  "loopExpression": {
                    "expression": {
                      "argumentTypes": null,
                      "id": 204,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "UnaryOperation",
                      "operator": "++",
                      "prefix": false,
                      "src": "3607:3:0",
                      "subExpression": {
                        "argumentTypes": null,
                        "id": 203,
                        "name": "i",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 196,
                        "src": "3607:1:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "id": 205,
                    "nodeType": "ExpressionStatement",
                    "src": "3607:3:0"
                  },
                  "nodeType": "ForStatement",
                  "src": "3558:216:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 227,
                    "name": "p",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 192,
                    "src": "3790:1:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 190,
                  "id": 228,
                  "nodeType": "Return",
                  "src": "3783:8:0"
                }
              ]
            },
            "documentation": null,
            "id": 230,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": true,
            "modifiers": [],
            "name": "purchasable",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 187,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 186,
                  "name": "_weiAmount",
                  "nodeType": "VariableDeclaration",
                  "scope": 230,
                  "src": "3478:18:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 185,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "3478:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3477:20:0"
            },
            "payable": false,
            "returnParameters": {
              "id": 190,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 189,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 230,
                  "src": "3519:4:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 188,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "3519:4:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3518:6:0"
            },
            "scope": 386,
            "src": "3457:341:0",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 279,
              "nodeType": "Block",
              "src": "3878:341:0",
              "statements": [
                {
                  "body": {
                    "id": 275,
                    "nodeType": "Block",
                    "src": "3942:253:0",
                    "statements": [
                      {
                        "assignments": [
                          249
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 249,
                            "name": "strategy",
                            "nodeType": "VariableDeclaration",
                            "scope": 280,
                            "src": "3956:26:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ERC20SaleStrategy_$1242",
                              "typeString": "contract ERC20SaleStrategy"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 248,
                              "name": "ERC20SaleStrategy",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 1242,
                              "src": "3956:17:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ERC20SaleStrategy_$1242",
                                "typeString": "contract ERC20SaleStrategy"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 255,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 251,
                                "name": "activatedStrategies",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1365,
                                "src": "4003:19:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_array$_t_contract$_SaleStrategy_$2091_$dyn_storage",
                                  "typeString": "contract SaleStrategy[] storage ref"
                                }
                              },
                              "id": 253,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 252,
                                "name": "i",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 238,
                                "src": "4023:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "4003:22:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_SaleStrategy_$2091",
                                "typeString": "contract SaleStrategy"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_SaleStrategy_$2091",
                                "typeString": "contract SaleStrategy"
                              }
                            ],
                            "id": 250,
                            "name": "ERC20SaleStrategy",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1242,
                            "src": "3985:17:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_contract$_ERC20SaleStrategy_$1242_$",
                              "typeString": "type(contract ERC20SaleStrategy)"
                            }
                          },
                          "id": 254,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3985:41:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ERC20SaleStrategy_$1242",
                            "typeString": "contract ERC20SaleStrategy"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "3956:70:0"
                      },
                      {
                        "assignments": [
                          257
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 257,
                            "name": "rate",
                            "nodeType": "VariableDeclaration",
                            "scope": 280,
                            "src": "4040:12:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 256,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "4040:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 264,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 260,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5445,
                                "src": "4074:3:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 261,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "4074:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 262,
                              "name": "_weiAmount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 232,
                              "src": "4086:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 258,
                              "name": "strategy",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 249,
                              "src": "4055:8:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ERC20SaleStrategy_$1242",
                                "typeString": "contract ERC20SaleStrategy"
                              }
                            },
                            "id": 259,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "tokenRate",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1223,
                            "src": "4055:18:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_view$_t_address_$_t_uint256_$returns$_t_uint256_$",
                              "typeString": "function (address,uint256) view external returns (uint256)"
                            }
                          },
                          "id": 263,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4055:42:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "4040:57:0"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 267,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 265,
                            "name": "rate",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 257,
                            "src": "4115:4:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": ">",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 266,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "4122:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "4115:8:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 274,
                        "nodeType": "IfStatement",
                        "src": "4111:74:0",
                        "trueBody": {
                          "id": 273,
                          "nodeType": "Block",
                          "src": "4125:60:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 270,
                                    "name": "rate",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 257,
                                    "src": "4165:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 268,
                                    "name": "_weiAmount",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 232,
                                    "src": "4150:10:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 269,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "mul",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 5210,
                                  "src": "4150:14:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256,uint256) pure returns (uint256)"
                                  }
                                },
                                "id": 271,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "4150:20:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "functionReturnParameters": 236,
                              "id": 272,
                              "nodeType": "Return",
                              "src": "4143:27:0"
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 244,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 241,
                      "name": "i",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 238,
                      "src": "3905:1:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<",
                    "rightExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 242,
                        "name": "activatedStrategies",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1365,
                        "src": "3909:19:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_contract$_SaleStrategy_$2091_$dyn_storage",
                          "typeString": "contract SaleStrategy[] storage ref"
                        }
                      },
                      "id": 243,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "length",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "3909:26:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "3905:30:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 276,
                  "initializationExpression": {
                    "assignments": [
                      238
                    ],
                    "declarations": [
                      {
                        "constant": false,
                        "id": 238,
                        "name": "i",
                        "nodeType": "VariableDeclaration",
                        "scope": 280,
                        "src": "3893:6:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 237,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "3893:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "id": 240,
                    "initialValue": {
                      "argumentTypes": null,
                      "hexValue": "30",
                      "id": 239,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "3902:1:0",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "nodeType": "VariableDeclarationStatement",
                    "src": "3893:10:0"
                  },
                  "loopExpression": {
                    "expression": {
                      "argumentTypes": null,
                      "id": 246,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "UnaryOperation",
                      "operator": "++",
                      "prefix": false,
                      "src": "3937:3:0",
                      "subExpression": {
                        "argumentTypes": null,
                        "id": 245,
                        "name": "i",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 238,
                        "src": "3937:1:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "id": 247,
                    "nodeType": "ExpressionStatement",
                    "src": "3937:3:0"
                  },
                  "nodeType": "ForStatement",
                  "src": "3888:307:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "hexValue": "30",
                    "id": 277,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "4211:1:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_0_by_1",
                      "typeString": "int_const 0"
                    },
                    "value": "0"
                  },
                  "functionReturnParameters": 236,
                  "id": 278,
                  "nodeType": "Return",
                  "src": "4204:8:0"
                }
              ]
            },
            "documentation": null,
            "id": 280,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": true,
            "modifiers": [],
            "name": "getTokenAmount",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 233,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 232,
                  "name": "_weiAmount",
                  "nodeType": "VariableDeclaration",
                  "scope": 280,
                  "src": "3828:18:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 231,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "3828:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3827:20:0"
            },
            "payable": false,
            "returnParameters": {
              "id": 236,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 235,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 280,
                  "src": "3869:7:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 234,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "3869:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3868:9:0"
            },
            "scope": 386,
            "src": "3804:415:0",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 298,
              "nodeType": "Block",
              "src": "4303:106:0",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 296,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 287,
                        "name": "tokenAmountOfPurchaser",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 27,
                        "src": "4313:22:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                          "typeString": "mapping(address => uint256)"
                        }
                      },
                      "id": 289,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 288,
                        "name": "_purchaser",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 282,
                        "src": "4336:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "4313:34:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 294,
                          "name": "_tokenAmount",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 284,
                          "src": "4389:12:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 290,
                            "name": "tokenAmountOfPurchaser",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 27,
                            "src": "4350:22:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                              "typeString": "mapping(address => uint256)"
                            }
                          },
                          "id": 292,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 291,
                            "name": "_purchaser",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 282,
                            "src": "4373:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "4350:34:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 293,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "add",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 5268,
                        "src": "4350:38:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                          "typeString": "function (uint256,uint256) pure returns (uint256)"
                        }
                      },
                      "id": 295,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "4350:52:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "4313:89:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 297,
                  "nodeType": "ExpressionStatement",
                  "src": "4313:89:0"
                }
              ]
            },
            "documentation": null,
            "id": 299,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": false,
            "modifiers": [],
            "name": "_updateTokenAmount",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 285,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 282,
                  "name": "_purchaser",
                  "nodeType": "VariableDeclaration",
                  "scope": 299,
                  "src": "4253:18:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 281,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4253:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 284,
                  "name": "_tokenAmount",
                  "nodeType": "VariableDeclaration",
                  "scope": 299,
                  "src": "4273:20:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 283,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "4273:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4252:42:0"
            },
            "payable": false,
            "returnParameters": {
              "id": 286,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4303:0:0"
            },
            "scope": 386,
            "src": "4225:184:0",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "private"
          },
          {
            "body": {
              "id": 342,
              "nodeType": "Block",
              "src": "4507:317:0",
              "statements": [
                {
                  "body": {
                    "id": 338,
                    "nodeType": "Block",
                    "src": "4571:220:0",
                    "statements": [
                      {
                        "assignments": [
                          320
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 320,
                            "name": "strategy",
                            "nodeType": "VariableDeclaration",
                            "scope": 343,
                            "src": "4585:26:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ERC20SaleStrategy_$1242",
                              "typeString": "contract ERC20SaleStrategy"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 319,
                              "name": "ERC20SaleStrategy",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 1242,
                              "src": "4585:17:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ERC20SaleStrategy_$1242",
                                "typeString": "contract ERC20SaleStrategy"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 326,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 322,
                                "name": "activatedStrategies",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1365,
                                "src": "4632:19:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_array$_t_contract$_SaleStrategy_$2091_$dyn_storage",
                                  "typeString": "contract SaleStrategy[] storage ref"
                                }
                              },
                              "id": 324,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 323,
                                "name": "i",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 309,
                                "src": "4652:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "4632:22:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_SaleStrategy_$2091",
                                "typeString": "contract SaleStrategy"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_SaleStrategy_$2091",
                                "typeString": "contract SaleStrategy"
                              }
                            ],
                            "id": 321,
                            "name": "ERC20SaleStrategy",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1242,
                            "src": "4614:17:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_contract$_ERC20SaleStrategy_$1242_$",
                              "typeString": "type(contract ERC20SaleStrategy)"
                            }
                          },
                          "id": 325,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4614:41:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ERC20SaleStrategy_$1242",
                            "typeString": "contract ERC20SaleStrategy"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "4585:70:0"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 329,
                              "name": "_purchaser",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 301,
                              "src": "4697:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 330,
                              "name": "_tokenAmount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 303,
                              "src": "4709:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 327,
                              "name": "strategy",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 320,
                              "src": "4673:8:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ERC20SaleStrategy_$1242",
                                "typeString": "contract ERC20SaleStrategy"
                              }
                            },
                            "id": 328,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "receivesTokens",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1241,
                            "src": "4673:23:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                              "typeString": "function (address,uint256) external returns (bool)"
                            }
                          },
                          "id": 331,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4673:49:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 337,
                        "nodeType": "IfStatement",
                        "src": "4669:112:0",
                        "trueBody": {
                          "id": 336,
                          "nodeType": "Block",
                          "src": "4724:57:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 333,
                                    "name": "strategy",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 320,
                                    "src": "4757:8:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_ERC20SaleStrategy_$1242",
                                      "typeString": "contract ERC20SaleStrategy"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_ERC20SaleStrategy_$1242",
                                      "typeString": "contract ERC20SaleStrategy"
                                    }
                                  ],
                                  "id": 332,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "4749:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": "address"
                                },
                                "id": 334,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "4749:17:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "functionReturnParameters": 307,
                              "id": 335,
                              "nodeType": "Return",
                              "src": "4742:24:0"
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 315,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 312,
                      "name": "i",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 309,
                      "src": "4534:1:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<",
                    "rightExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 313,
                        "name": "activatedStrategies",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1365,
                        "src": "4538:19:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_contract$_SaleStrategy_$2091_$dyn_storage",
                          "typeString": "contract SaleStrategy[] storage ref"
                        }
                      },
                      "id": 314,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "length",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "4538:26:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "4534:30:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 339,
                  "initializationExpression": {
                    "assignments": [
                      309
                    ],
                    "declarations": [
                      {
                        "constant": false,
                        "id": 309,
                        "name": "i",
                        "nodeType": "VariableDeclaration",
                        "scope": 343,
                        "src": "4522:6:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 308,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "4522:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "id": 311,
                    "initialValue": {
                      "argumentTypes": null,
                      "hexValue": "30",
                      "id": 310,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "4531:1:0",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "nodeType": "VariableDeclarationStatement",
                    "src": "4522:10:0"
                  },
                  "loopExpression": {
                    "expression": {
                      "argumentTypes": null,
                      "id": 317,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "UnaryOperation",
                      "operator": "++",
                      "prefix": false,
                      "src": "4566:3:0",
                      "subExpression": {
                        "argumentTypes": null,
                        "id": 316,
                        "name": "i",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 309,
                        "src": "4566:1:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "id": 318,
                    "nodeType": "ExpressionStatement",
                    "src": "4566:3:0"
                  },
                  "nodeType": "ForStatement",
                  "src": "4517:274:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 340,
                    "name": "_purchaser",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 301,
                    "src": "4807:10:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "functionReturnParameters": 307,
                  "id": 341,
                  "nodeType": "Return",
                  "src": "4800:17:0"
                }
              ]
            },
            "documentation": null,
            "id": 343,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": false,
            "modifiers": [],
            "name": "_tokenReceiver",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 304,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 301,
                  "name": "_purchaser",
                  "nodeType": "VariableDeclaration",
                  "scope": 343,
                  "src": "4439:18:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 300,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4439:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 303,
                  "name": "_tokenAmount",
                  "nodeType": "VariableDeclaration",
                  "scope": 343,
                  "src": "4459:20:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 302,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "4459:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4438:42:0"
            },
            "payable": false,
            "returnParameters": {
              "id": 307,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 306,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 343,
                  "src": "4498:7:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 305,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4498:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4497:9:0"
            },
            "scope": 386,
            "src": "4415:409:0",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "private"
          },
          {
            "body": {
              "id": 384,
              "nodeType": "Block",
              "src": "4911:290:0",
              "statements": [
                {
                  "body": {
                    "id": 380,
                    "nodeType": "Block",
                    "src": "4975:198:0",
                    "statements": [
                      {
                        "assignments": [
                          364
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 364,
                            "name": "strategy",
                            "nodeType": "VariableDeclaration",
                            "scope": 385,
                            "src": "4989:26:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ERC20SaleStrategy_$1242",
                              "typeString": "contract ERC20SaleStrategy"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 363,
                              "name": "ERC20SaleStrategy",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 1242,
                              "src": "4989:17:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ERC20SaleStrategy_$1242",
                                "typeString": "contract ERC20SaleStrategy"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 370,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 366,
                                "name": "activatedStrategies",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1365,
                                "src": "5036:19:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_array$_t_contract$_SaleStrategy_$2091_$dyn_storage",
                                  "typeString": "contract SaleStrategy[] storage ref"
                                }
                              },
                              "id": 368,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 367,
                                "name": "i",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 353,
                                "src": "5056:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "5036:22:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_SaleStrategy_$2091",
                                "typeString": "contract SaleStrategy"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_SaleStrategy_$2091",
                                "typeString": "contract SaleStrategy"
                              }
                            ],
                            "id": 365,
                            "name": "ERC20SaleStrategy",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1242,
                            "src": "5018:17:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_contract$_ERC20SaleStrategy_$1242_$",
                              "typeString": "type(contract ERC20SaleStrategy)"
                            }
                          },
                          "id": 369,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5018:41:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ERC20SaleStrategy_$1242",
                            "typeString": "contract ERC20SaleStrategy"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "4989:70:0"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 373,
                              "name": "_to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 345,
                              "src": "5099:3:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 374,
                              "name": "_tokenAmount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 347,
                              "src": "5104:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 371,
                              "name": "strategy",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 364,
                              "src": "5077:8:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ERC20SaleStrategy_$1242",
                                "typeString": "contract ERC20SaleStrategy"
                              }
                            },
                            "id": 372,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "supplyTokens",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1232,
                            "src": "5077:21:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                              "typeString": "function (address,uint256) external returns (bool)"
                            }
                          },
                          "id": 375,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5077:40:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 379,
                        "nodeType": "IfStatement",
                        "src": "5073:90:0",
                        "trueBody": {
                          "id": 378,
                          "nodeType": "Block",
                          "src": "5119:44:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "hexValue": "74727565",
                                "id": 376,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "bool",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "5144:4:0",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                "value": "true"
                              },
                              "functionReturnParameters": 351,
                              "id": 377,
                              "nodeType": "Return",
                              "src": "5137:11:0"
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 359,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 356,
                      "name": "i",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 353,
                      "src": "4938:1:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<",
                    "rightExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 357,
                        "name": "activatedStrategies",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1365,
                        "src": "4942:19:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_contract$_SaleStrategy_$2091_$dyn_storage",
                          "typeString": "contract SaleStrategy[] storage ref"
                        }
                      },
                      "id": 358,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "length",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "4942:26:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "4938:30:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 381,
                  "initializationExpression": {
                    "assignments": [
                      353
                    ],
                    "declarations": [
                      {
                        "constant": false,
                        "id": 353,
                        "name": "i",
                        "nodeType": "VariableDeclaration",
                        "scope": 385,
                        "src": "4926:6:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 352,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "4926:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "id": 355,
                    "initialValue": {
                      "argumentTypes": null,
                      "hexValue": "30",
                      "id": 354,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "4935:1:0",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "nodeType": "VariableDeclarationStatement",
                    "src": "4926:10:0"
                  },
                  "loopExpression": {
                    "expression": {
                      "argumentTypes": null,
                      "id": 361,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "UnaryOperation",
                      "operator": "++",
                      "prefix": false,
                      "src": "4970:3:0",
                      "subExpression": {
                        "argumentTypes": null,
                        "id": 360,
                        "name": "i",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 353,
                        "src": "4970:1:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "id": 362,
                    "nodeType": "ExpressionStatement",
                    "src": "4970:3:0"
                  },
                  "nodeType": "ForStatement",
                  "src": "4921:252:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "hexValue": "66616c7365",
                    "id": 382,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "bool",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "5189:5:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "value": "false"
                  },
                  "functionReturnParameters": 351,
                  "id": 383,
                  "nodeType": "Return",
                  "src": "5182:12:0"
                }
              ]
            },
            "documentation": null,
            "id": 385,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": false,
            "modifiers": [],
            "name": "_supplyTokens",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 348,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 345,
                  "name": "_to",
                  "nodeType": "VariableDeclaration",
                  "scope": 385,
                  "src": "4853:11:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 344,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4853:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 347,
                  "name": "_tokenAmount",
                  "nodeType": "VariableDeclaration",
                  "scope": 385,
                  "src": "4866:20:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 346,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "4866:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4852:35:0"
            },
            "payable": false,
            "returnParameters": {
              "id": 351,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 350,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 385,
                  "src": "4905:4:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 349,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "4905:4:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4904:6:0"
            },
            "scope": 386,
            "src": "4830:371:0",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "private"
          }
        ],
        "scope": 387,
        "src": "257:4946:0"
      }
    ],
    "src": "0:5204:0"
  },
  "compiler": {
    "name": "solc",
    "version": "0.4.24+commit.e67f0147.Emscripten.clang"
  },
  "networks": {},
  "schemaVersion": "2.0.1",
  "updatedAt": "2018-11-01T09:01:02.400Z"
}