{
  "_format": "hh-sol-artifact-1",
  "contractName": "MyAmm",
  "sourceName": "contracts/mocks/MyAmm.sol",
  "abi": [
    {
      "inputs": [],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "Approval",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "baseAmount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "quoteAmount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "liquidity",
          "type": "uint256"
        }
      ],
      "name": "Burn",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "trader",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "inputToken",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "outputToken",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "inputAmount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "outputAmount",
          "type": "uint256"
        }
      ],
      "name": "ForceSwap",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "baseAmount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "quoteAmount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "liquidity",
          "type": "uint256"
        }
      ],
      "name": "Mint",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "quoteReserveBefore",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "quoteReserveAfter",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_baseReserve",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "quoteReserveFromInternal",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "quoteReserveFromExternal",
          "type": "uint256"
        }
      ],
      "name": "Rebase",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "trader",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "inputToken",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "outputToken",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "inputAmount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "outputAmount",
          "type": "uint256"
        }
      ],
      "name": "Swap",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint112",
          "name": "reserveBase",
          "type": "uint112"
        },
        {
          "indexed": false,
          "internalType": "uint112",
          "name": "reserveQuote",
          "type": "uint112"
        }
      ],
      "name": "Sync",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "Transfer",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "DOMAIN_SEPARATOR",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "MINIMUM_LIQUIDITY",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "PERMIT_TYPEHASH",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "allowance",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "approve",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "balanceOf",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "baseToken",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        }
      ],
      "name": "burn",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "baseAmount",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "quoteAmount",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "liquidity",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "collectFee",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "config",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "decimals",
      "outputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "inputToken",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "outputToken",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "inputAmount",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "outputAmount",
          "type": "uint256"
        }
      ],
      "name": "estimateSwap",
      "outputs": [
        {
          "internalType": "uint256[2]",
          "name": "amounts",
          "type": "uint256[2]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "factory",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "trader",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "inputToken",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "outputToken",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "inputAmount",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "outputAmount",
          "type": "uint256"
        }
      ],
      "name": "forceSwap",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getFeeLiquidity",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getReserves",
      "outputs": [
        {
          "internalType": "uint112",
          "name": "reserveBase",
          "type": "uint112"
        },
        {
          "internalType": "uint112",
          "name": "reserveQuote",
          "type": "uint112"
        },
        {
          "internalType": "uint32",
          "name": "blockTimestamp",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getTheMaxBurnLiquidity",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "maxLiquidity",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "baseToken_",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "quoteToken_",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "margin_",
          "type": "address"
        }
      ],
      "name": "initialize",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "lastPrice",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "margin",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        }
      ],
      "name": "mint",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "baseAmount",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "quoteAmount",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "liquidity",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "name",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "nonces",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "deadline",
          "type": "uint256"
        },
        {
          "internalType": "uint8",
          "name": "v",
          "type": "uint8"
        },
        {
          "internalType": "bytes32",
          "name": "r",
          "type": "bytes32"
        },
        {
          "internalType": "bytes32",
          "name": "s",
          "type": "bytes32"
        }
      ],
      "name": "permit",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "price0CumulativeLast",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "price1CumulativeLast",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "quoteToken",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "rebase",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "quoteReserveAfter",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint112",
          "name": "reserveBase",
          "type": "uint112"
        },
        {
          "internalType": "uint112",
          "name": "reserveQuote",
          "type": "uint112"
        }
      ],
      "name": "setReserves",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "trader",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "inputToken",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "outputToken",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "inputAmount",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "outputAmount",
          "type": "uint256"
        }
      ],
      "name": "swap",
      "outputs": [
        {
          "internalType": "uint256[2]",
          "name": "amounts",
          "type": "uint256[2]"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "symbol",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "totalSupply",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "transfer",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "transferFrom",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "bytecode": "0x60a060405234801561001057600080fd5b506040805180820182526007815266041504558204c560cc1b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f918101919091527f61b9d5b67636ce161ec7cadd1dad2e234b7b19f7846bc9e1c0e66fc72bb44376918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606082015246608082018190523060a08301529060c00160408051601f19818403018152919052805160209091012060805250600480546001600160a01b03191633179055608051610edf61011d6000396000818161034c01526107a80152610edf6000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c806379502c551161011a578063ba9a7a56116100ad578063c55dae631161007c578063c55dae6314610557578063d4d5d32a1461056a578063d505accf14610571578063dd62ed3e14610584578063e343fe12146105af57610206565b8063ba9a7a56146104ce578063bc936576146104d7578063c0c53b8b146104f7578063c45a01551461054457610206565b806395d89b41116100e957806395d89b4114610480578063988370a3146104a6578063a9059cbb146104bb578063af14052c146102b857610206565b806379502c55146104275780637ecebe001461043a57806389afcb441461045a5780638f76691a1461046d57610206565b806330adf81f1161019d5780635a3d54931161016c5780635a3d5493146103775780636a627842146103805780636f316f18146102b857806370a08231146103ae57806375ea5f2e146103ce57610206565b806330adf81f14610306578063313ce5671461032d5780633644e515146103475780635909c0d51461036e57610206565b806309daf930116101d957806309daf930146102b857806318160ddd146102bf578063217a4b70146102c857806323b872dd146102f357610206565b8063053f14da1461020b57806306fdde03146102275780630902f1ac1461025a578063095ea7b314610295575b600080fd5b610214600b5481565b6040519081526020015b60405180910390f35b61024d60405180604001604052806007815260200166041504558204c560cc1b81525081565b60405161021e9190610df6565b600c54604080516001600160701b038084168252600160701b8404166020820152600160e01b90920463ffffffff169082015260600161021e565b6102a86102a3366004610d53565b6105c2565b604051901515815260200161021e565b6000610214565b61021460005481565b6007546102db906001600160a01b031681565b6040516001600160a01b03909116815260200161021e565b6102a8610301366004610c66565b6105d8565b6102147f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b610335601281565b60405160ff909116815260200161021e565b6102147f000000000000000000000000000000000000000000000000000000000000000081565b61021460095481565b610214600a5481565b61039361038e366004610b7d565b61066d565b6040805193845260208401929092529082015260600161021e565b6102146103bc366004610b7d565b60016020526000908152604090205481565b6104256103dc366004610d9c565b600c80546001600160701b03928316600160701b026dffffffffffffffffffffffffffff60701b19949093166dffffffffffffffffffffffffffff199091161792909216179055565b005b6005546102db906001600160a01b031681565b610214610448366004610b7d565b60036020526000908152604090205481565b610393610468366004610b7d565b610685565b6008546102db906001600160a01b031681565b61024d604051806040016040528060078152602001660415045582d4c560cc1b81525081565b6104256104b4366004610c12565b5050505050565b6102a86104c9366004610d53565b61071a565b6102146103e881565b6104ea6104e5366004610ca1565b610727565b60405161021e9190610dc5565b610425610505366004610bd0565b600680546001600160a01b039485166001600160a01b031991821617909155600780549385169382169390931790925560088054919093169116179055565b6004546102db906001600160a01b031681565b6006546102db906001600160a01b031681565b60006102a8565b61042561057f366004610ce2565b610737565b610214610592366004610b9e565b600260209081526000928352604080842090915290825290205481565b6104ea6105bd366004610c12565b610980565b60006105cf338484610991565b50600192915050565b6001600160a01b038316600090815260026020908152604080832033845290915281205460001914610658576001600160a01b0384166000908152600260209081526040808320338452909152902054610633908390610e61565b6001600160a01b03851660009081526002602090815260408083203384529091529020555b6106638484846109f3565b5060019392505050565b600080600061067e84612710610a9b565b9193909250565b60065460405163a9059cbb60e01b81526001600160a01b03838116600483015260646024830152600092839283929091169063a9059cbb90604401602060405180830381600087803b1580156106da57600080fd5b505af11580156106ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107129190610d7c565b509193909250565b60006105cf3384846109f3565b61072f610b2c565b949350505050565b4284101561078c5760405162461bcd60e51b815260206004820152601760248201527f4c697175696469747945524332303a204558504952454400000000000000000060448201526064015b60405180910390fd5b6001600160a01b038716600090815260036020526040812080547f0000000000000000000000000000000000000000000000000000000000000000917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b91876107fa83610e78565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e0016040516020818303038152906040528051906020012060405160200161087392919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa1580156108de573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906109145750886001600160a01b0316816001600160a01b0316145b61096a5760405162461bcd60e51b815260206004820152602160248201527f4c697175696469747945524332303a20494e56414c49445f5349474e415455526044820152604560f81b6064820152608401610783565b610975898989610991565b505050505050505050565b610988610b2c565b95945050505050565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316600090815260016020526040902054610a17908290610e61565b6001600160a01b038085166000908152600160205260408082209390935590841681522054610a47908290610e49565b6001600160a01b0380841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906109e69085815260200190565b80600054610aa99190610e49565b60009081556001600160a01b038316815260016020526040902054610acf908290610e49565b6001600160a01b0383166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610b209085815260200190565b60405180910390a35050565b60405180604001604052806002906020820280368337509192915050565b80356001600160a01b0381168114610b6157600080fd5b919050565b80356001600160701b0381168114610b6157600080fd5b600060208284031215610b8e578081fd5b610b9782610b4a565b9392505050565b60008060408385031215610bb0578081fd5b610bb983610b4a565b9150610bc760208401610b4a565b90509250929050565b600080600060608486031215610be4578081fd5b610bed84610b4a565b9250610bfb60208501610b4a565b9150610c0960408501610b4a565b90509250925092565b600080600080600060a08688031215610c29578081fd5b610c3286610b4a565b9450610c4060208701610b4a565b9350610c4e60408701610b4a565b94979396509394606081013594506080013592915050565b600080600060608486031215610c7a578283fd5b610c8384610b4a565b9250610c9160208501610b4a565b9150604084013590509250925092565b60008060008060808587031215610cb6578384fd5b610cbf85610b4a565b9350610ccd60208601610b4a565b93969395505050506040820135916060013590565b600080600080600080600060e0888a031215610cfc578182fd5b610d0588610b4a565b9650610d1360208901610b4a565b95506040880135945060608801359350608088013560ff81168114610d36578283fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610d65578182fd5b610d6e83610b4a565b946020939093013593505050565b600060208284031215610d8d578081fd5b81518015158114610b97578182fd5b60008060408385031215610dae578182fd5b610db783610b66565b9150610bc760208401610b66565b60408101818360005b6002811015610ded578151835260209283019290910190600101610dce565b50505092915050565b6000602080835283518082850152825b81811015610e2257858101830151858201604001528201610e06565b81811115610e335783604083870101525b50601f01601f1916929092016040019392505050565b60008219821115610e5c57610e5c610e93565b500190565b600082821015610e7357610e73610e93565b500390565b6000600019821415610e8c57610e8c610e93565b5060010190565b634e487b7160e01b600052601160045260246000fdfea2646970667358221220c9d4cd6727c9885788b27e9a87127fb4accb6075c3d39bd5e04f52b252e918d064736f6c63430008020033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102065760003560e01c806379502c551161011a578063ba9a7a56116100ad578063c55dae631161007c578063c55dae6314610557578063d4d5d32a1461056a578063d505accf14610571578063dd62ed3e14610584578063e343fe12146105af57610206565b8063ba9a7a56146104ce578063bc936576146104d7578063c0c53b8b146104f7578063c45a01551461054457610206565b806395d89b41116100e957806395d89b4114610480578063988370a3146104a6578063a9059cbb146104bb578063af14052c146102b857610206565b806379502c55146104275780637ecebe001461043a57806389afcb441461045a5780638f76691a1461046d57610206565b806330adf81f1161019d5780635a3d54931161016c5780635a3d5493146103775780636a627842146103805780636f316f18146102b857806370a08231146103ae57806375ea5f2e146103ce57610206565b806330adf81f14610306578063313ce5671461032d5780633644e515146103475780635909c0d51461036e57610206565b806309daf930116101d957806309daf930146102b857806318160ddd146102bf578063217a4b70146102c857806323b872dd146102f357610206565b8063053f14da1461020b57806306fdde03146102275780630902f1ac1461025a578063095ea7b314610295575b600080fd5b610214600b5481565b6040519081526020015b60405180910390f35b61024d60405180604001604052806007815260200166041504558204c560cc1b81525081565b60405161021e9190610df6565b600c54604080516001600160701b038084168252600160701b8404166020820152600160e01b90920463ffffffff169082015260600161021e565b6102a86102a3366004610d53565b6105c2565b604051901515815260200161021e565b6000610214565b61021460005481565b6007546102db906001600160a01b031681565b6040516001600160a01b03909116815260200161021e565b6102a8610301366004610c66565b6105d8565b6102147f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b610335601281565b60405160ff909116815260200161021e565b6102147f000000000000000000000000000000000000000000000000000000000000000081565b61021460095481565b610214600a5481565b61039361038e366004610b7d565b61066d565b6040805193845260208401929092529082015260600161021e565b6102146103bc366004610b7d565b60016020526000908152604090205481565b6104256103dc366004610d9c565b600c80546001600160701b03928316600160701b026dffffffffffffffffffffffffffff60701b19949093166dffffffffffffffffffffffffffff199091161792909216179055565b005b6005546102db906001600160a01b031681565b610214610448366004610b7d565b60036020526000908152604090205481565b610393610468366004610b7d565b610685565b6008546102db906001600160a01b031681565b61024d604051806040016040528060078152602001660415045582d4c560cc1b81525081565b6104256104b4366004610c12565b5050505050565b6102a86104c9366004610d53565b61071a565b6102146103e881565b6104ea6104e5366004610ca1565b610727565b60405161021e9190610dc5565b610425610505366004610bd0565b600680546001600160a01b039485166001600160a01b031991821617909155600780549385169382169390931790925560088054919093169116179055565b6004546102db906001600160a01b031681565b6006546102db906001600160a01b031681565b60006102a8565b61042561057f366004610ce2565b610737565b610214610592366004610b9e565b600260209081526000928352604080842090915290825290205481565b6104ea6105bd366004610c12565b610980565b60006105cf338484610991565b50600192915050565b6001600160a01b038316600090815260026020908152604080832033845290915281205460001914610658576001600160a01b0384166000908152600260209081526040808320338452909152902054610633908390610e61565b6001600160a01b03851660009081526002602090815260408083203384529091529020555b6106638484846109f3565b5060019392505050565b600080600061067e84612710610a9b565b9193909250565b60065460405163a9059cbb60e01b81526001600160a01b03838116600483015260646024830152600092839283929091169063a9059cbb90604401602060405180830381600087803b1580156106da57600080fd5b505af11580156106ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107129190610d7c565b509193909250565b60006105cf3384846109f3565b61072f610b2c565b949350505050565b4284101561078c5760405162461bcd60e51b815260206004820152601760248201527f4c697175696469747945524332303a204558504952454400000000000000000060448201526064015b60405180910390fd5b6001600160a01b038716600090815260036020526040812080547f0000000000000000000000000000000000000000000000000000000000000000917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b91876107fa83610e78565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e0016040516020818303038152906040528051906020012060405160200161087392919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa1580156108de573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906109145750886001600160a01b0316816001600160a01b0316145b61096a5760405162461bcd60e51b815260206004820152602160248201527f4c697175696469747945524332303a20494e56414c49445f5349474e415455526044820152604560f81b6064820152608401610783565b610975898989610991565b505050505050505050565b610988610b2c565b95945050505050565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316600090815260016020526040902054610a17908290610e61565b6001600160a01b038085166000908152600160205260408082209390935590841681522054610a47908290610e49565b6001600160a01b0380841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906109e69085815260200190565b80600054610aa99190610e49565b60009081556001600160a01b038316815260016020526040902054610acf908290610e49565b6001600160a01b0383166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610b209085815260200190565b60405180910390a35050565b60405180604001604052806002906020820280368337509192915050565b80356001600160a01b0381168114610b6157600080fd5b919050565b80356001600160701b0381168114610b6157600080fd5b600060208284031215610b8e578081fd5b610b9782610b4a565b9392505050565b60008060408385031215610bb0578081fd5b610bb983610b4a565b9150610bc760208401610b4a565b90509250929050565b600080600060608486031215610be4578081fd5b610bed84610b4a565b9250610bfb60208501610b4a565b9150610c0960408501610b4a565b90509250925092565b600080600080600060a08688031215610c29578081fd5b610c3286610b4a565b9450610c4060208701610b4a565b9350610c4e60408701610b4a565b94979396509394606081013594506080013592915050565b600080600060608486031215610c7a578283fd5b610c8384610b4a565b9250610c9160208501610b4a565b9150604084013590509250925092565b60008060008060808587031215610cb6578384fd5b610cbf85610b4a565b9350610ccd60208601610b4a565b93969395505050506040820135916060013590565b600080600080600080600060e0888a031215610cfc578182fd5b610d0588610b4a565b9650610d1360208901610b4a565b95506040880135945060608801359350608088013560ff81168114610d36578283fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610d65578182fd5b610d6e83610b4a565b946020939093013593505050565b600060208284031215610d8d578081fd5b81518015158114610b97578182fd5b60008060408385031215610dae578182fd5b610db783610b66565b9150610bc760208401610b66565b60408101818360005b6002811015610ded578151835260209283019290910190600101610dce565b50505092915050565b6000602080835283518082850152825b81811015610e2257858101830151858201604001528201610e06565b81811115610e335783604083870101525b50601f01601f1916929092016040019392505050565b60008219821115610e5c57610e5c610e93565b500190565b600082821015610e7357610e73610e93565b500390565b6000600019821415610e8c57610e8c610e93565b5060010190565b634e487b7160e01b600052601160045260246000fdfea2646970667358221220c9d4cd6727c9885788b27e9a87127fb4accb6075c3d39bd5e04f52b252e918d064736f6c63430008020033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
