-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy path216.bandle.js
1 lines (1 loc) · 170 KB
/
216.bandle.js
1
"use strict";(self.webpackChunkhedge=self.webpackChunkhedge||[]).push([[216],{20216:module=>{eval('module.exports = JSON.parse(\'{"address":"0x137Af6286Fdda0D367F8A1427e2D2EcE6FD242b1","abi":[{"inputs":[{"internalType":"contract IHegicOperationalTreasury","name":"_pool","type":"address"},{"internalType":"contract AggregatorV3Interface","name":"_priceProvider","type":"address"},{"internalType":"contract IPremiumCalculator","name":"_pricer","type":"address"},{"internalType":"uint8","name":"_spotDecimals","type":"uint8"},{"internalType":"uint256","name":"limit","type":"uint256"},{"internalType":"uint256","name":"percentage","type":"uint256"},{"internalType":"uint8","name":"_roundedDecimals","type":"uint8"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"premium","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"strike","type":"uint256"},{"indexed":false,"internalType":"uint32","name":"expiration","type":"uint32"}],"name":"Acquired","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"premium","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"atmStrike","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"otmStrike","type":"uint256"},{"indexed":false,"internalType":"uint32","name":"expiration","type":"uint32"}],"name":"AcquiredSpread","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"premium","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"callStrike","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"putStrike","type":"uint256"},{"indexed":false,"internalType":"uint32","name":"expiration","type":"uint32"}],"name":"AcquiredStrangle","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"limit","type":"uint256"}],"name":"SetLimit","type":"event"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint128","name":"amount","type":"uint128"},{"internalType":"uint256","name":"strike","type":"uint256"}],"name":"buy","outputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"strike","type":"uint256"}],"name":"calculatePremium","outputs":[{"internalType":"uint256","name":"premium","type":"uint256"},{"internalType":"uint256","name":"available","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collateralizationRatio","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"optionID","type":"uint256"}],"name":"exercise","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getLockedByStrategy","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"k","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockedLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pool","outputs":[{"internalType":"contract IHegicOperationalTreasury","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceProvider","outputs":[{"internalType":"contract AggregatorV3Interface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pricer","outputs":[{"internalType":"contract IPremiumCalculator","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"optionID","type":"uint256"}],"name":"profitOf","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint8","name":"decimals","type":"uint8"}],"name":"round","outputs":[{"internalType":"uint256","name":"roundedValue","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setK","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IPremiumCalculator","name":"value","type":"address"}],"name":"setPricer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"strategyData","outputs":[{"internalType":"uint128","name":"amount","type":"uint128"},{"internalType":"uint128","name":"strike","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"strikePercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"transactionHash":"0x8de5c7e2f142a4b4129f054a4c0fa0ecefcb34e38ed1222e013bb7f713c7f704","receipt":{"to":null,"from":"0xF15968a096Fc8F47650001585d23bEE819b5affb","contractAddress":"0x137Af6286Fdda0D367F8A1427e2D2EcE6FD242b1","transactionIndex":0,"gasUsed":"15239882","logsBloom":"0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008001000000000020000000000000000100000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000004000000000000000000000000020000000000000000000000100000000000000000000000000000000000000000000","blockHash":"0x140d643ac86d4f33ad4e857ced70a0eda52ad303a0f6fc9c3d043317f62e1f4a","transactionHash":"0x8de5c7e2f142a4b4129f054a4c0fa0ecefcb34e38ed1222e013bb7f713c7f704","logs":[{"transactionIndex":0,"blockNumber":9864536,"transactionHash":"0x8de5c7e2f142a4b4129f054a4c0fa0ecefcb34e38ed1222e013bb7f713c7f704","address":"0x137Af6286Fdda0D367F8A1427e2D2EcE6FD242b1","topics":["0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0","0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000f15968a096fc8f47650001585d23bee819b5affb"],"data":"0x","logIndex":0,"blockHash":"0x140d643ac86d4f33ad4e857ced70a0eda52ad303a0f6fc9c3d043317f62e1f4a"}],"blockNumber":9864536,"cumulativeGasUsed":"516662","status":1,"byzantium":true},"args":["0xB0F9F032158510cd4a926F9263Abc86bAF7b4Ab3","0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612","0x9E2d98a3F839985D87dBD9f56f2790Ad65487c07",18,33333000000,120,10],"solcInputHash":"264ee48953aea33f233d54b8c17bc0e4","metadata":"{\\\\"compiler\\\\":{\\\\"version\\\\":\\\\"0.8.6+commit.11564f7e\\\\"},\\\\"language\\\\":\\\\"Solidity\\\\",\\\\"output\\\\":{\\\\"abi\\\\":[{\\\\"inputs\\\\":[{\\\\"internalType\\\\":\\\\"contract IHegicOperationalTreasury\\\\",\\\\"name\\\\":\\\\"_pool\\\\",\\\\"type\\\\":\\\\"address\\\\"},{\\\\"internalType\\\\":\\\\"contract AggregatorV3Interface\\\\",\\\\"name\\\\":\\\\"_priceProvider\\\\",\\\\"type\\\\":\\\\"address\\\\"},{\\\\"internalType\\\\":\\\\"contract IPremiumCalculator\\\\",\\\\"name\\\\":\\\\"_pricer\\\\",\\\\"type\\\\":\\\\"address\\\\"},{\\\\"internalType\\\\":\\\\"uint8\\\\",\\\\"name\\\\":\\\\"_spotDecimals\\\\",\\\\"type\\\\":\\\\"uint8\\\\"},{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"limit\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"percentage\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"internalType\\\\":\\\\"uint8\\\\",\\\\"name\\\\":\\\\"_roundedDecimals\\\\",\\\\"type\\\\":\\\\"uint8\\\\"}],\\\\"stateMutability\\\\":\\\\"nonpayable\\\\",\\\\"type\\\\":\\\\"constructor\\\\"},{\\\\"anonymous\\\\":false,\\\\"inputs\\\\":[{\\\\"indexed\\\\":true,\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"id\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"indexed\\\\":false,\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"amount\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"indexed\\\\":false,\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"premium\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"indexed\\\\":false,\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"strike\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"indexed\\\\":false,\\\\"internalType\\\\":\\\\"uint32\\\\",\\\\"name\\\\":\\\\"expiration\\\\",\\\\"type\\\\":\\\\"uint32\\\\"}],\\\\"name\\\\":\\\\"Acquired\\\\",\\\\"type\\\\":\\\\"event\\\\"},{\\\\"anonymous\\\\":false,\\\\"inputs\\\\":[{\\\\"indexed\\\\":true,\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"id\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"indexed\\\\":false,\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"amount\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"indexed\\\\":false,\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"premium\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"indexed\\\\":false,\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"atmStrike\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"indexed\\\\":false,\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"otmStrike\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"indexed\\\\":false,\\\\"internalType\\\\":\\\\"uint32\\\\",\\\\"name\\\\":\\\\"expiration\\\\",\\\\"type\\\\":\\\\"uint32\\\\"}],\\\\"name\\\\":\\\\"AcquiredSpread\\\\",\\\\"type\\\\":\\\\"event\\\\"},{\\\\"anonymous\\\\":false,\\\\"inputs\\\\":[{\\\\"indexed\\\\":true,\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"id\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"indexed\\\\":false,\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"amount\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"indexed\\\\":false,\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"premium\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"indexed\\\\":false,\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"callStrike\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"indexed\\\\":false,\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"putStrike\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"indexed\\\\":false,\\\\"internalType\\\\":\\\\"uint32\\\\",\\\\"name\\\\":\\\\"expiration\\\\",\\\\"type\\\\":\\\\"uint32\\\\"}],\\\\"name\\\\":\\\\"AcquiredStrangle\\\\",\\\\"type\\\\":\\\\"event\\\\"},{\\\\"anonymous\\\\":false,\\\\"inputs\\\\":[{\\\\"indexed\\\\":true,\\\\"internalType\\\\":\\\\"address\\\\",\\\\"name\\\\":\\\\"previousOwner\\\\",\\\\"type\\\\":\\\\"address\\\\"},{\\\\"indexed\\\\":true,\\\\"internalType\\\\":\\\\"address\\\\",\\\\"name\\\\":\\\\"newOwner\\\\",\\\\"type\\\\":\\\\"address\\\\"}],\\\\"name\\\\":\\\\"OwnershipTransferred\\\\",\\\\"type\\\\":\\\\"event\\\\"},{\\\\"anonymous\\\\":false,\\\\"inputs\\\\":[{\\\\"indexed\\\\":false,\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"limit\\\\",\\\\"type\\\\":\\\\"uint256\\\\"}],\\\\"name\\\\":\\\\"SetLimit\\\\",\\\\"type\\\\":\\\\"event\\\\"},{\\\\"inputs\\\\":[{\\\\"internalType\\\\":\\\\"address\\\\",\\\\"name\\\\":\\\\"holder\\\\",\\\\"type\\\\":\\\\"address\\\\"},{\\\\"internalType\\\\":\\\\"uint32\\\\",\\\\"name\\\\":\\\\"period\\\\",\\\\"type\\\\":\\\\"uint32\\\\"},{\\\\"internalType\\\\":\\\\"uint128\\\\",\\\\"name\\\\":\\\\"amount\\\\",\\\\"type\\\\":\\\\"uint128\\\\"},{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"strike\\\\",\\\\"type\\\\":\\\\"uint256\\\\"}],\\\\"name\\\\":\\\\"buy\\\\",\\\\"outputs\\\\":[{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"id\\\\",\\\\"type\\\\":\\\\"uint256\\\\"}],\\\\"stateMutability\\\\":\\\\"nonpayable\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[{\\\\"internalType\\\\":\\\\"uint32\\\\",\\\\"name\\\\":\\\\"period\\\\",\\\\"type\\\\":\\\\"uint32\\\\"},{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"amount\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"strike\\\\",\\\\"type\\\\":\\\\"uint256\\\\"}],\\\\"name\\\\":\\\\"calculatePremium\\\\",\\\\"outputs\\\\":[{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"premium\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"available\\\\",\\\\"type\\\\":\\\\"uint256\\\\"}],\\\\"stateMutability\\\\":\\\\"view\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[],\\\\"name\\\\":\\\\"collateralizationRatio\\\\",\\\\"outputs\\\\":[{\\\\"internalType\\\\":\\\\"uint8\\\\",\\\\"name\\\\":\\\\"\\\\",\\\\"type\\\\":\\\\"uint8\\\\"}],\\\\"stateMutability\\\\":\\\\"view\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"optionID\\\\",\\\\"type\\\\":\\\\"uint256\\\\"}],\\\\"name\\\\":\\\\"exercise\\\\",\\\\"outputs\\\\":[],\\\\"stateMutability\\\\":\\\\"nonpayable\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[],\\\\"name\\\\":\\\\"getLockedByStrategy\\\\",\\\\"outputs\\\\":[{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"amount\\\\",\\\\"type\\\\":\\\\"uint256\\\\"}],\\\\"stateMutability\\\\":\\\\"view\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[],\\\\"name\\\\":\\\\"k\\\\",\\\\"outputs\\\\":[{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"\\\\",\\\\"type\\\\":\\\\"uint256\\\\"}],\\\\"stateMutability\\\\":\\\\"view\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[],\\\\"name\\\\":\\\\"lockedLimit\\\\",\\\\"outputs\\\\":[{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"\\\\",\\\\"type\\\\":\\\\"uint256\\\\"}],\\\\"stateMutability\\\\":\\\\"view\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[],\\\\"name\\\\":\\\\"owner\\\\",\\\\"outputs\\\\":[{\\\\"internalType\\\\":\\\\"address\\\\",\\\\"name\\\\":\\\\"\\\\",\\\\"type\\\\":\\\\"address\\\\"}],\\\\"stateMutability\\\\":\\\\"view\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[],\\\\"name\\\\":\\\\"pool\\\\",\\\\"outputs\\\\":[{\\\\"internalType\\\\":\\\\"contract IHegicOperationalTreasury\\\\",\\\\"name\\\\":\\\\"\\\\",\\\\"type\\\\":\\\\"address\\\\"}],\\\\"stateMutability\\\\":\\\\"view\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[],\\\\"name\\\\":\\\\"priceProvider\\\\",\\\\"outputs\\\\":[{\\\\"internalType\\\\":\\\\"contract AggregatorV3Interface\\\\",\\\\"name\\\\":\\\\"\\\\",\\\\"type\\\\":\\\\"address\\\\"}],\\\\"stateMutability\\\\":\\\\"view\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[],\\\\"name\\\\":\\\\"pricer\\\\",\\\\"outputs\\\\":[{\\\\"internalType\\\\":\\\\"contract IPremiumCalculator\\\\",\\\\"name\\\\":\\\\"\\\\",\\\\"type\\\\":\\\\"address\\\\"}],\\\\"stateMutability\\\\":\\\\"view\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"optionID\\\\",\\\\"type\\\\":\\\\"uint256\\\\"}],\\\\"name\\\\":\\\\"profitOf\\\\",\\\\"outputs\\\\":[{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"amount\\\\",\\\\"type\\\\":\\\\"uint256\\\\"}],\\\\"stateMutability\\\\":\\\\"view\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[],\\\\"name\\\\":\\\\"renounceOwnership\\\\",\\\\"outputs\\\\":[],\\\\"stateMutability\\\\":\\\\"nonpayable\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"value\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"internalType\\\\":\\\\"uint8\\\\",\\\\"name\\\\":\\\\"decimals\\\\",\\\\"type\\\\":\\\\"uint8\\\\"}],\\\\"name\\\\":\\\\"round\\\\",\\\\"outputs\\\\":[{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"roundedValue\\\\",\\\\"type\\\\":\\\\"uint256\\\\"}],\\\\"stateMutability\\\\":\\\\"pure\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"value\\\\",\\\\"type\\\\":\\\\"uint256\\\\"}],\\\\"name\\\\":\\\\"setK\\\\",\\\\"outputs\\\\":[],\\\\"stateMutability\\\\":\\\\"nonpayable\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"value\\\\",\\\\"type\\\\":\\\\"uint256\\\\"}],\\\\"name\\\\":\\\\"setLimit\\\\",\\\\"outputs\\\\":[],\\\\"stateMutability\\\\":\\\\"nonpayable\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[{\\\\"internalType\\\\":\\\\"contract IPremiumCalculator\\\\",\\\\"name\\\\":\\\\"value\\\\",\\\\"type\\\\":\\\\"address\\\\"}],\\\\"name\\\\":\\\\"setPricer\\\\",\\\\"outputs\\\\":[],\\\\"stateMutability\\\\":\\\\"nonpayable\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"\\\\",\\\\"type\\\\":\\\\"uint256\\\\"}],\\\\"name\\\\":\\\\"strategyData\\\\",\\\\"outputs\\\\":[{\\\\"internalType\\\\":\\\\"uint128\\\\",\\\\"name\\\\":\\\\"amount\\\\",\\\\"type\\\\":\\\\"uint128\\\\"},{\\\\"internalType\\\\":\\\\"uint128\\\\",\\\\"name\\\\":\\\\"strike\\\\",\\\\"type\\\\":\\\\"uint128\\\\"}],\\\\"stateMutability\\\\":\\\\"view\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[],\\\\"name\\\\":\\\\"strikePercentage\\\\",\\\\"outputs\\\\":[{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"\\\\",\\\\"type\\\\":\\\\"uint256\\\\"}],\\\\"stateMutability\\\\":\\\\"view\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[{\\\\"internalType\\\\":\\\\"address\\\\",\\\\"name\\\\":\\\\"newOwner\\\\",\\\\"type\\\\":\\\\"address\\\\"}],\\\\"name\\\\":\\\\"transferOwnership\\\\",\\\\"outputs\\\\":[],\\\\"stateMutability\\\\":\\\\"nonpayable\\\\",\\\\"type\\\\":\\\\"function\\\\"}],\\\\"devdoc\\\\":{\\\\"kind\\\\":\\\\"dev\\\\",\\\\"methods\\\\":{\\\\"buy(address,uint32,uint128,uint256)\\\\":{\\\\"params\\\\":{\\\\"amount\\\\":\\\\"The option/strategy amount\\\\",\\\\"holder\\\\":\\\\"The holder address\\\\",\\\\"period\\\\":\\\\"The option/strategy period\\\\",\\\\"strike\\\\":\\\\"The option/strategy strike*\\\\"}},\\\\"exercise(uint256)\\\\":{\\\\"params\\\\":{\\\\"optionID\\\\":\\\\"The option/strategy ID*\\\\"}},\\\\"owner()\\\\":{\\\\"details\\\\":\\\\"Returns the address of the current owner.\\\\"},\\\\"profitOf(uint256)\\\\":{\\\\"params\\\\":{\\\\"amount\\\\":\\\\"The unrealized profits amount*\\\\",\\\\"optionID\\\\":\\\\"The option/strategy ID\\\\"}},\\\\"renounceOwnership()\\\\":{\\\\"details\\\\":\\\\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\\\\"},\\\\"setK(uint256)\\\\":{\\\\"params\\\\":{\\\\"value\\\\":\\\\"The collateralization coefficient*\\\\"}},\\\\"setLimit(uint256)\\\\":{\\\\"params\\\\":{\\\\"value\\\\":\\\\"The maximum locked liquidity*\\\\"}},\\\\"transferOwnership(address)\\\\":{\\\\"details\\\\":\\\\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\\\\"}},\\\\"version\\\\":1},\\\\"userdoc\\\\":{\\\\"kind\\\\":\\\\"user\\\\",\\\\"methods\\\\":{\\\\"buy(address,uint32,uint128,uint256)\\\\":{\\\\"notice\\\\":\\\\"Used for buying options/strategies\\\\"},\\\\"exercise(uint256)\\\\":{\\\\"notice\\\\":\\\\"Used for exercising an in-the-money option/strategy and taking profits\\\\"},\\\\"getLockedByStrategy()\\\\":{\\\\"notice\\\\":\\\\"Used for viewing the total liquidity locked up for a specific options strategy*\\\\"},\\\\"profitOf(uint256)\\\\":{\\\\"notice\\\\":\\\\"Used for calculating the holder\\\'s option/strategy unrealized profits\\\\"},\\\\"setK(uint256)\\\\":{\\\\"notice\\\\":\\\\"Used for setting the collateralization coefficient\\\\"},\\\\"setLimit(uint256)\\\\":{\\\\"notice\\\\":\\\\"Used for setting a limit on the total locked liquidity\\\\"}},\\\\"version\\\\":1}},\\\\"settings\\\\":{\\\\"compilationTarget\\\\":{\\\\"contracts/Strategies/HegicStrategySpreadCall.sol\\\\":\\\\"HegicStrategySpreadCall\\\\"},\\\\"evmVersion\\\\":\\\\"berlin\\\\",\\\\"libraries\\\\":{},\\\\"metadata\\\\":{\\\\"bytecodeHash\\\\":\\\\"ipfs\\\\",\\\\"useLiteralContent\\\\":true},\\\\"optimizer\\\\":{\\\\"enabled\\\\":true,\\\\"runs\\\\":200},\\\\"remappings\\\\":[]},\\\\"sources\\\\":{\\\\"@chainlink/contracts/src/v0.7/interfaces/AggregatorV3Interface.sol\\\\":{\\\\"content\\\\":\\\\"// SPDX-License-Identifier: MIT\\\\\\\\npragma solidity >=0.7.0;\\\\\\\\n\\\\\\\\ninterface AggregatorV3Interface {\\\\\\\\n\\\\\\\\n function decimals() external view returns (uint8);\\\\\\\\n function description() external view returns (string memory);\\\\\\\\n function version() external view returns (uint256);\\\\\\\\n\\\\\\\\n // getRoundData and latestRoundData should both raise \\\\\\\\\\\\"No data present\\\\\\\\\\\\"\\\\\\\\n // if they do not have data to report, instead of returning unset values\\\\\\\\n // which could be misinterpreted as actual reported values.\\\\\\\\n function getRoundData(uint80 _roundId)\\\\\\\\n external\\\\\\\\n view\\\\\\\\n returns (\\\\\\\\n uint80 roundId,\\\\\\\\n int256 answer,\\\\\\\\n uint256 startedAt,\\\\\\\\n uint256 updatedAt,\\\\\\\\n uint80 answeredInRound\\\\\\\\n );\\\\\\\\n function latestRoundData()\\\\\\\\n external\\\\\\\\n view\\\\\\\\n returns (\\\\\\\\n uint80 roundId,\\\\\\\\n int256 answer,\\\\\\\\n uint256 startedAt,\\\\\\\\n uint256 updatedAt,\\\\\\\\n uint80 answeredInRound\\\\\\\\n );\\\\\\\\n\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x78af5c13ec137bdbb22ec9d65c730fb6f138d3a61a3fdbb63be4838ce7faf2a6\\\\",\\\\"license\\\\":\\\\"MIT\\\\"},\\\\"@openzeppelin/contracts/access/Ownable.sol\\\\":{\\\\"content\\\\":\\\\"// SPDX-License-Identifier: MIT\\\\\\\\n\\\\\\\\npragma solidity ^0.8.0;\\\\\\\\n\\\\\\\\nimport \\\\\\\\\\\\"../utils/Context.sol\\\\\\\\\\\\";\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @dev Contract module which provides a basic access control mechanism, where\\\\\\\\n * there is an account (an owner) that can be granted exclusive access to\\\\\\\\n * specific functions.\\\\\\\\n *\\\\\\\\n * By default, the owner account will be the one that deploys the contract. This\\\\\\\\n * can later be changed with {transferOwnership}.\\\\\\\\n *\\\\\\\\n * This module is used through inheritance. It will make available the modifier\\\\\\\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\\\\\\\n * the owner.\\\\\\\\n */\\\\\\\\nabstract contract Ownable is Context {\\\\\\\\n address private _owner;\\\\\\\\n\\\\\\\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Initializes the contract setting the deployer as the initial owner.\\\\\\\\n */\\\\\\\\n constructor() {\\\\\\\\n _setOwner(_msgSender());\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Returns the address of the current owner.\\\\\\\\n */\\\\\\\\n function owner() public view virtual returns (address) {\\\\\\\\n return _owner;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Throws if called by any account other than the owner.\\\\\\\\n */\\\\\\\\n modifier onlyOwner() {\\\\\\\\n require(owner() == _msgSender(), \\\\\\\\\\\\"Ownable: caller is not the owner\\\\\\\\\\\\");\\\\\\\\n _;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Leaves the contract without owner. It will not be possible to call\\\\\\\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\\\\\\\n *\\\\\\\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\\\\\\\n * thereby removing any functionality that is only available to the owner.\\\\\\\\n */\\\\\\\\n function renounceOwnership() public virtual onlyOwner {\\\\\\\\n _setOwner(address(0));\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\\\\\\\n * Can only be called by the current owner.\\\\\\\\n */\\\\\\\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\\\\\\\n require(newOwner != address(0), \\\\\\\\\\\\"Ownable: new owner is the zero address\\\\\\\\\\\\");\\\\\\\\n _setOwner(newOwner);\\\\\\\\n }\\\\\\\\n\\\\\\\\n function _setOwner(address newOwner) private {\\\\\\\\n address oldOwner = _owner;\\\\\\\\n _owner = newOwner;\\\\\\\\n emit OwnershipTransferred(oldOwner, newOwner);\\\\\\\\n }\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\\\\",\\\\"license\\\\":\\\\"MIT\\\\"},\\\\"@openzeppelin/contracts/security/ReentrancyGuard.sol\\\\":{\\\\"content\\\\":\\\\"// SPDX-License-Identifier: MIT\\\\\\\\n\\\\\\\\npragma solidity ^0.8.0;\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @dev Contract module that helps prevent reentrant calls to a function.\\\\\\\\n *\\\\\\\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\\\\\\\n * available, which can be applied to functions to make sure there are no nested\\\\\\\\n * (reentrant) calls to them.\\\\\\\\n *\\\\\\\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\\\\\\\n * `nonReentrant` may not call one another. This can be worked around by making\\\\\\\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\\\\\\\n * points to them.\\\\\\\\n *\\\\\\\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\\\\\\\n * to protect against it, check out our blog post\\\\\\\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\\\\\\\n */\\\\\\\\nabstract contract ReentrancyGuard {\\\\\\\\n // Booleans are more expensive than uint256 or any type that takes up a full\\\\\\\\n // word because each write operation emits an extra SLOAD to first read the\\\\\\\\n // slot\\\'s contents, replace the bits taken up by the boolean, and then write\\\\\\\\n // back. This is the compiler\\\'s defense against contract upgrades and\\\\\\\\n // pointer aliasing, and it cannot be disabled.\\\\\\\\n\\\\\\\\n // The values being non-zero value makes deployment a bit more expensive,\\\\\\\\n // but in exchange the refund on every call to nonReentrant will be lower in\\\\\\\\n // amount. Since refunds are capped to a percentage of the total\\\\\\\\n // transaction\\\'s gas, it is best to keep them low in cases like this one, to\\\\\\\\n // increase the likelihood of the full refund coming into effect.\\\\\\\\n uint256 private constant _NOT_ENTERED = 1;\\\\\\\\n uint256 private constant _ENTERED = 2;\\\\\\\\n\\\\\\\\n uint256 private _status;\\\\\\\\n\\\\\\\\n constructor() {\\\\\\\\n _status = _NOT_ENTERED;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\\\\\\\n * Calling a `nonReentrant` function from another `nonReentrant`\\\\\\\\n * function is not supported. It is possible to prevent this from happening\\\\\\\\n * by making the `nonReentrant` function external, and make it call a\\\\\\\\n * `private` function that does the actual work.\\\\\\\\n */\\\\\\\\n modifier nonReentrant() {\\\\\\\\n // On the first call to nonReentrant, _notEntered will be true\\\\\\\\n require(_status != _ENTERED, \\\\\\\\\\\\"ReentrancyGuard: reentrant call\\\\\\\\\\\\");\\\\\\\\n\\\\\\\\n // Any calls to nonReentrant after this point will fail\\\\\\\\n _status = _ENTERED;\\\\\\\\n\\\\\\\\n _;\\\\\\\\n\\\\\\\\n // By storing the original value once again, a refund is triggered (see\\\\\\\\n // https://eips.ethereum.org/EIPS/eip-2200)\\\\\\\\n _status = _NOT_ENTERED;\\\\\\\\n }\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x842ccf9a6cd33e17b7acef8372ca42090755217b358fe0c44c98e951ea549d3a\\\\",\\\\"license\\\\":\\\\"MIT\\\\"},\\\\"@openzeppelin/contracts/token/ERC20/ERC20.sol\\\\":{\\\\"content\\\\":\\\\"// SPDX-License-Identifier: MIT\\\\\\\\n\\\\\\\\npragma solidity ^0.8.0;\\\\\\\\n\\\\\\\\nimport \\\\\\\\\\\\"./IERC20.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"./extensions/IERC20Metadata.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"../../utils/Context.sol\\\\\\\\\\\\";\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @dev Implementation of the {IERC20} interface.\\\\\\\\n *\\\\\\\\n * This implementation is agnostic to the way tokens are created. This means\\\\\\\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\\\\\\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\\\\\\\n *\\\\\\\\n * TIP: For a detailed writeup see our guide\\\\\\\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\\\\\\\n * to implement supply mechanisms].\\\\\\\\n *\\\\\\\\n * We have followed general OpenZeppelin guidelines: functions revert instead\\\\\\\\n * of returning `false` on failure. This behavior is nonetheless conventional\\\\\\\\n * and does not conflict with the expectations of ERC20 applications.\\\\\\\\n *\\\\\\\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\\\\\\\n * This allows applications to reconstruct the allowance for all accounts just\\\\\\\\n * by listening to said events. Other implementations of the EIP may not emit\\\\\\\\n * these events, as it isn\\\'t required by the specification.\\\\\\\\n *\\\\\\\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\\\\\\\n * functions have been added to mitigate the well-known issues around setting\\\\\\\\n * allowances. See {IERC20-approve}.\\\\\\\\n */\\\\\\\\ncontract ERC20 is Context, IERC20, IERC20Metadata {\\\\\\\\n mapping(address => uint256) private _balances;\\\\\\\\n\\\\\\\\n mapping(address => mapping(address => uint256)) private _allowances;\\\\\\\\n\\\\\\\\n uint256 private _totalSupply;\\\\\\\\n\\\\\\\\n string private _name;\\\\\\\\n string private _symbol;\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Sets the values for {name} and {symbol}.\\\\\\\\n *\\\\\\\\n * The default value of {decimals} is 18. To select a different value for\\\\\\\\n * {decimals} you should overload it.\\\\\\\\n *\\\\\\\\n * All two of these values are immutable: they can only be set once during\\\\\\\\n * construction.\\\\\\\\n */\\\\\\\\n constructor(string memory name_, string memory symbol_) {\\\\\\\\n _name = name_;\\\\\\\\n _symbol = symbol_;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Returns the name of the token.\\\\\\\\n */\\\\\\\\n function name() public view virtual override returns (string memory) {\\\\\\\\n return _name;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Returns the symbol of the token, usually a shorter version of the\\\\\\\\n * name.\\\\\\\\n */\\\\\\\\n function symbol() public view virtual override returns (string memory) {\\\\\\\\n return _symbol;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Returns the number of decimals used to get its user representation.\\\\\\\\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\\\\\\\\n * be displayed to a user as `5,05` (`505 / 10 ** 2`).\\\\\\\\n *\\\\\\\\n * Tokens usually opt for a value of 18, imitating the relationship between\\\\\\\\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\\\\\\\\n * overridden;\\\\\\\\n *\\\\\\\\n * NOTE: This information is only used for _display_ purposes: it in\\\\\\\\n * no way affects any of the arithmetic of the contract, including\\\\\\\\n * {IERC20-balanceOf} and {IERC20-transfer}.\\\\\\\\n */\\\\\\\\n function decimals() public view virtual override returns (uint8) {\\\\\\\\n return 18;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC20-totalSupply}.\\\\\\\\n */\\\\\\\\n function totalSupply() public view virtual override returns (uint256) {\\\\\\\\n return _totalSupply;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC20-balanceOf}.\\\\\\\\n */\\\\\\\\n function balanceOf(address account) public view virtual override returns (uint256) {\\\\\\\\n return _balances[account];\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC20-transfer}.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `recipient` cannot be the zero address.\\\\\\\\n * - the caller must have a balance of at least `amount`.\\\\\\\\n */\\\\\\\\n function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\\\\\\\\n _transfer(_msgSender(), recipient, amount);\\\\\\\\n return true;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC20-allowance}.\\\\\\\\n */\\\\\\\\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\\\\\\\\n return _allowances[owner][spender];\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC20-approve}.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `spender` cannot be the zero address.\\\\\\\\n */\\\\\\\\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\\\\\\\\n _approve(_msgSender(), spender, amount);\\\\\\\\n return true;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC20-transferFrom}.\\\\\\\\n *\\\\\\\\n * Emits an {Approval} event indicating the updated allowance. This is not\\\\\\\\n * required by the EIP. See the note at the beginning of {ERC20}.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `sender` and `recipient` cannot be the zero address.\\\\\\\\n * - `sender` must have a balance of at least `amount`.\\\\\\\\n * - the caller must have allowance for ``sender``\\\'s tokens of at least\\\\\\\\n * `amount`.\\\\\\\\n */\\\\\\\\n function transferFrom(\\\\\\\\n address sender,\\\\\\\\n address recipient,\\\\\\\\n uint256 amount\\\\\\\\n ) public virtual override returns (bool) {\\\\\\\\n _transfer(sender, recipient, amount);\\\\\\\\n\\\\\\\\n uint256 currentAllowance = _allowances[sender][_msgSender()];\\\\\\\\n require(currentAllowance >= amount, \\\\\\\\\\\\"ERC20: transfer amount exceeds allowance\\\\\\\\\\\\");\\\\\\\\n unchecked {\\\\\\\\n _approve(sender, _msgSender(), currentAllowance - amount);\\\\\\\\n }\\\\\\\\n\\\\\\\\n return true;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Atomically increases the allowance granted to `spender` by the caller.\\\\\\\\n *\\\\\\\\n * This is an alternative to {approve} that can be used as a mitigation for\\\\\\\\n * problems described in {IERC20-approve}.\\\\\\\\n *\\\\\\\\n * Emits an {Approval} event indicating the updated allowance.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `spender` cannot be the zero address.\\\\\\\\n */\\\\\\\\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\\\\\\\n _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);\\\\\\\\n return true;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\\\\\\\\n *\\\\\\\\n * This is an alternative to {approve} that can be used as a mitigation for\\\\\\\\n * problems described in {IERC20-approve}.\\\\\\\\n *\\\\\\\\n * Emits an {Approval} event indicating the updated allowance.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `spender` cannot be the zero address.\\\\\\\\n * - `spender` must have allowance for the caller of at least\\\\\\\\n * `subtractedValue`.\\\\\\\\n */\\\\\\\\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\\\\\\\n uint256 currentAllowance = _allowances[_msgSender()][spender];\\\\\\\\n require(currentAllowance >= subtractedValue, \\\\\\\\\\\\"ERC20: decreased allowance below zero\\\\\\\\\\\\");\\\\\\\\n unchecked {\\\\\\\\n _approve(_msgSender(), spender, currentAllowance - subtractedValue);\\\\\\\\n }\\\\\\\\n\\\\\\\\n return true;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Moves `amount` of tokens from `sender` to `recipient`.\\\\\\\\n *\\\\\\\\n * This internal function is equivalent to {transfer}, and can be used to\\\\\\\\n * e.g. implement automatic token fees, slashing mechanisms, etc.\\\\\\\\n *\\\\\\\\n * Emits a {Transfer} event.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `sender` cannot be the zero address.\\\\\\\\n * - `recipient` cannot be the zero address.\\\\\\\\n * - `sender` must have a balance of at least `amount`.\\\\\\\\n */\\\\\\\\n function _transfer(\\\\\\\\n address sender,\\\\\\\\n address recipient,\\\\\\\\n uint256 amount\\\\\\\\n ) internal virtual {\\\\\\\\n require(sender != address(0), \\\\\\\\\\\\"ERC20: transfer from the zero address\\\\\\\\\\\\");\\\\\\\\n require(recipient != address(0), \\\\\\\\\\\\"ERC20: transfer to the zero address\\\\\\\\\\\\");\\\\\\\\n\\\\\\\\n _beforeTokenTransfer(sender, recipient, amount);\\\\\\\\n\\\\\\\\n uint256 senderBalance = _balances[sender];\\\\\\\\n require(senderBalance >= amount, \\\\\\\\\\\\"ERC20: transfer amount exceeds balance\\\\\\\\\\\\");\\\\\\\\n unchecked {\\\\\\\\n _balances[sender] = senderBalance - amount;\\\\\\\\n }\\\\\\\\n _balances[recipient] += amount;\\\\\\\\n\\\\\\\\n emit Transfer(sender, recipient, amount);\\\\\\\\n\\\\\\\\n _afterTokenTransfer(sender, recipient, amount);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\\\\\\\n * the total supply.\\\\\\\\n *\\\\\\\\n * Emits a {Transfer} event with `from` set to the zero address.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `account` cannot be the zero address.\\\\\\\\n */\\\\\\\\n function _mint(address account, uint256 amount) internal virtual {\\\\\\\\n require(account != address(0), \\\\\\\\\\\\"ERC20: mint to the zero address\\\\\\\\\\\\");\\\\\\\\n\\\\\\\\n _beforeTokenTransfer(address(0), account, amount);\\\\\\\\n\\\\\\\\n _totalSupply += amount;\\\\\\\\n _balances[account] += amount;\\\\\\\\n emit Transfer(address(0), account, amount);\\\\\\\\n\\\\\\\\n _afterTokenTransfer(address(0), account, amount);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Destroys `amount` tokens from `account`, reducing the\\\\\\\\n * total supply.\\\\\\\\n *\\\\\\\\n * Emits a {Transfer} event with `to` set to the zero address.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `account` cannot be the zero address.\\\\\\\\n * - `account` must have at least `amount` tokens.\\\\\\\\n */\\\\\\\\n function _burn(address account, uint256 amount) internal virtual {\\\\\\\\n require(account != address(0), \\\\\\\\\\\\"ERC20: burn from the zero address\\\\\\\\\\\\");\\\\\\\\n\\\\\\\\n _beforeTokenTransfer(account, address(0), amount);\\\\\\\\n\\\\\\\\n uint256 accountBalance = _balances[account];\\\\\\\\n require(accountBalance >= amount, \\\\\\\\\\\\"ERC20: burn amount exceeds balance\\\\\\\\\\\\");\\\\\\\\n unchecked {\\\\\\\\n _balances[account] = accountBalance - amount;\\\\\\\\n }\\\\\\\\n _totalSupply -= amount;\\\\\\\\n\\\\\\\\n emit Transfer(account, address(0), amount);\\\\\\\\n\\\\\\\\n _afterTokenTransfer(account, address(0), amount);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\\\\\\\n *\\\\\\\\n * This internal function is equivalent to `approve`, and can be used to\\\\\\\\n * e.g. set automatic allowances for certain subsystems, etc.\\\\\\\\n *\\\\\\\\n * Emits an {Approval} event.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `owner` cannot be the zero address.\\\\\\\\n * - `spender` cannot be the zero address.\\\\\\\\n */\\\\\\\\n function _approve(\\\\\\\\n address owner,\\\\\\\\n address spender,\\\\\\\\n uint256 amount\\\\\\\\n ) internal virtual {\\\\\\\\n require(owner != address(0), \\\\\\\\\\\\"ERC20: approve from the zero address\\\\\\\\\\\\");\\\\\\\\n require(spender != address(0), \\\\\\\\\\\\"ERC20: approve to the zero address\\\\\\\\\\\\");\\\\\\\\n\\\\\\\\n _allowances[owner][spender] = amount;\\\\\\\\n emit Approval(owner, spender, amount);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Hook that is called before any transfer of tokens. This includes\\\\\\\\n * minting and burning.\\\\\\\\n *\\\\\\\\n * Calling conditions:\\\\\\\\n *\\\\\\\\n * - when `from` and `to` are both non-zero, `amount` of ``from``\\\'s tokens\\\\\\\\n * will be transferred to `to`.\\\\\\\\n * - when `from` is zero, `amount` tokens will be minted for `to`.\\\\\\\\n * - when `to` is zero, `amount` of ``from``\\\'s tokens will be burned.\\\\\\\\n * - `from` and `to` are never both zero.\\\\\\\\n *\\\\\\\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\\\\\\\n */\\\\\\\\n function _beforeTokenTransfer(\\\\\\\\n address from,\\\\\\\\n address to,\\\\\\\\n uint256 amount\\\\\\\\n ) internal virtual {}\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Hook that is called after any transfer of tokens. This includes\\\\\\\\n * minting and burning.\\\\\\\\n *\\\\\\\\n * Calling conditions:\\\\\\\\n *\\\\\\\\n * - when `from` and `to` are both non-zero, `amount` of ``from``\\\'s tokens\\\\\\\\n * has been transferred to `to`.\\\\\\\\n * - when `from` is zero, `amount` tokens have been minted for `to`.\\\\\\\\n * - when `to` is zero, `amount` of ``from``\\\'s tokens have been burned.\\\\\\\\n * - `from` and `to` are never both zero.\\\\\\\\n *\\\\\\\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\\\\\\\n */\\\\\\\\n function _afterTokenTransfer(\\\\\\\\n address from,\\\\\\\\n address to,\\\\\\\\n uint256 amount\\\\\\\\n ) internal virtual {}\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x418cfe64226a974419f8ab7287ad4bb413156a4d7af8ab5d9bcaa5678d1a2f22\\\\",\\\\"license\\\\":\\\\"MIT\\\\"},\\\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\\":{\\\\"content\\\\":\\\\"// SPDX-License-Identifier: MIT\\\\\\\\n\\\\\\\\npragma solidity ^0.8.0;\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\\\\\\\n */\\\\\\\\ninterface IERC20 {\\\\\\\\n /**\\\\\\\\n * @dev Returns the amount of tokens in existence.\\\\\\\\n */\\\\\\\\n function totalSupply() external view returns (uint256);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Returns the amount of tokens owned by `account`.\\\\\\\\n */\\\\\\\\n function balanceOf(address account) external view returns (uint256);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Moves `amount` tokens from the caller\\\'s account to `recipient`.\\\\\\\\n *\\\\\\\\n * Returns a boolean value indicating whether the operation succeeded.\\\\\\\\n *\\\\\\\\n * Emits a {Transfer} event.\\\\\\\\n */\\\\\\\\n function transfer(address recipient, uint256 amount) external returns (bool);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Returns the remaining number of tokens that `spender` will be\\\\\\\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\\\\\\\n * zero by default.\\\\\\\\n *\\\\\\\\n * This value changes when {approve} or {transferFrom} are called.\\\\\\\\n */\\\\\\\\n function allowance(address owner, address spender) external view returns (uint256);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Sets `amount` as the allowance of `spender` over the caller\\\'s tokens.\\\\\\\\n *\\\\\\\\n * Returns a boolean value indicating whether the operation succeeded.\\\\\\\\n *\\\\\\\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\\\\\\\n * that someone may use both the old and the new allowance by unfortunate\\\\\\\\n * transaction ordering. One possible solution to mitigate this race\\\\\\\\n * condition is to first reduce the spender\\\'s allowance to 0 and set the\\\\\\\\n * desired value afterwards:\\\\\\\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\\\\\\\n *\\\\\\\\n * Emits an {Approval} event.\\\\\\\\n */\\\\\\\\n function approve(address spender, uint256 amount) external returns (bool);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Moves `amount` tokens from `sender` to `recipient` using the\\\\\\\\n * allowance mechanism. `amount` is then deducted from the caller\\\'s\\\\\\\\n * allowance.\\\\\\\\n *\\\\\\\\n * Returns a boolean value indicating whether the operation succeeded.\\\\\\\\n *\\\\\\\\n * Emits a {Transfer} event.\\\\\\\\n */\\\\\\\\n function transferFrom(\\\\\\\\n address sender,\\\\\\\\n address recipient,\\\\\\\\n uint256 amount\\\\\\\\n ) external returns (bool);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\\\\\\\n * another (`to`).\\\\\\\\n *\\\\\\\\n * Note that `value` may be zero.\\\\\\\\n */\\\\\\\\n event Transfer(address indexed from, address indexed to, uint256 value);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\\\\\\\n * a call to {approve}. `value` is the new allowance.\\\\\\\\n */\\\\\\\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x027b891937d20ccf213fdb9c31531574256de774bda99d3a70ecef6e1913ed2a\\\\",\\\\"license\\\\":\\\\"MIT\\\\"},\\\\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\\\\":{\\\\"content\\\\":\\\\"// SPDX-License-Identifier: MIT\\\\\\\\n\\\\\\\\npragma solidity ^0.8.0;\\\\\\\\n\\\\\\\\nimport \\\\\\\\\\\\"../IERC20.sol\\\\\\\\\\\\";\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\\\\\\\n *\\\\\\\\n * _Available since v4.1._\\\\\\\\n */\\\\\\\\ninterface IERC20Metadata is IERC20 {\\\\\\\\n /**\\\\\\\\n * @dev Returns the name of the token.\\\\\\\\n */\\\\\\\\n function name() external view returns (string memory);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Returns the symbol of the token.\\\\\\\\n */\\\\\\\\n function symbol() external view returns (string memory);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Returns the decimals places of the token.\\\\\\\\n */\\\\\\\\n function decimals() external view returns (uint8);\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x83fe24f5c04a56091e50f4a345ff504c8bff658a76d4c43b16878c8f940c53b2\\\\",\\\\"license\\\\":\\\\"MIT\\\\"},\\\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\\":{\\\\"content\\\\":\\\\"// SPDX-License-Identifier: MIT\\\\\\\\n\\\\\\\\npragma solidity ^0.8.0;\\\\\\\\n\\\\\\\\nimport \\\\\\\\\\\\"../IERC20.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"../../../utils/Address.sol\\\\\\\\\\\\";\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @title SafeERC20\\\\\\\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\\\\\\\n * contract returns false). Tokens that return no value (and instead revert or\\\\\\\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\\\\\\\n * successful.\\\\\\\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\\\\\\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\\\\\\\n */\\\\\\\\nlibrary SafeERC20 {\\\\\\\\n using Address for address;\\\\\\\\n\\\\\\\\n function safeTransfer(\\\\\\\\n IERC20 token,\\\\\\\\n address to,\\\\\\\\n uint256 value\\\\\\\\n ) internal {\\\\\\\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\\\\\\\n }\\\\\\\\n\\\\\\\\n function safeTransferFrom(\\\\\\\\n IERC20 token,\\\\\\\\n address from,\\\\\\\\n address to,\\\\\\\\n uint256 value\\\\\\\\n ) internal {\\\\\\\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Deprecated. This function has issues similar to the ones found in\\\\\\\\n * {IERC20-approve}, and its usage is discouraged.\\\\\\\\n *\\\\\\\\n * Whenever possible, use {safeIncreaseAllowance} and\\\\\\\\n * {safeDecreaseAllowance} instead.\\\\\\\\n */\\\\\\\\n function safeApprove(\\\\\\\\n IERC20 token,\\\\\\\\n address spender,\\\\\\\\n uint256 value\\\\\\\\n ) internal {\\\\\\\\n // safeApprove should only be called when setting an initial allowance,\\\\\\\\n // or when resetting it to zero. To increase and decrease it, use\\\\\\\\n // \\\'safeIncreaseAllowance\\\' and \\\'safeDecreaseAllowance\\\'\\\\\\\\n require(\\\\\\\\n (value == 0) || (token.allowance(address(this), spender) == 0),\\\\\\\\n \\\\\\\\\\\\"SafeERC20: approve from non-zero to non-zero allowance\\\\\\\\\\\\"\\\\\\\\n );\\\\\\\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\\\\\\\n }\\\\\\\\n\\\\\\\\n function safeIncreaseAllowance(\\\\\\\\n IERC20 token,\\\\\\\\n address spender,\\\\\\\\n uint256 value\\\\\\\\n ) internal {\\\\\\\\n uint256 newAllowance = token.allowance(address(this), spender) + value;\\\\\\\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\\\\\\\n }\\\\\\\\n\\\\\\\\n function safeDecreaseAllowance(\\\\\\\\n IERC20 token,\\\\\\\\n address spender,\\\\\\\\n uint256 value\\\\\\\\n ) internal {\\\\\\\\n unchecked {\\\\\\\\n uint256 oldAllowance = token.allowance(address(this), spender);\\\\\\\\n require(oldAllowance >= value, \\\\\\\\\\\\"SafeERC20: decreased allowance below zero\\\\\\\\\\\\");\\\\\\\\n uint256 newAllowance = oldAllowance - value;\\\\\\\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\\\\\\\n }\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\\\\\\\n * on the return value: the return value is optional (but if data is returned, it must not be false).\\\\\\\\n * @param token The token targeted by the call.\\\\\\\\n * @param data The call data (encoded using abi.encode or one of its variants).\\\\\\\\n */\\\\\\\\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\\\\\\\\n // We need to perform a low level call here, to bypass Solidity\\\'s return data size checking mechanism, since\\\\\\\\n // we\\\'re implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\\\\\\\n // the target address contains contract code and also asserts for success in the low-level call.\\\\\\\\n\\\\\\\\n bytes memory returndata = address(token).functionCall(data, \\\\\\\\\\\\"SafeERC20: low-level call failed\\\\\\\\\\\\");\\\\\\\\n if (returndata.length > 0) {\\\\\\\\n // Return data is optional\\\\\\\\n require(abi.decode(returndata, (bool)), \\\\\\\\\\\\"SafeERC20: ERC20 operation did not succeed\\\\\\\\\\\\");\\\\\\\\n }\\\\\\\\n }\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x02348b2e4b9f3200c7e3907c5c2661643a6d8520e9f79939fbb9b4005a54894d\\\\",\\\\"license\\\\":\\\\"MIT\\\\"},\\\\"@openzeppelin/contracts/token/ERC721/ERC721.sol\\\\":{\\\\"content\\\\":\\\\"// SPDX-License-Identifier: MIT\\\\\\\\n\\\\\\\\npragma solidity ^0.8.0;\\\\\\\\n\\\\\\\\nimport \\\\\\\\\\\\"./IERC721.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"./IERC721Receiver.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"./extensions/IERC721Metadata.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"../../utils/Address.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"../../utils/Context.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"../../utils/Strings.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"../../utils/introspection/ERC165.sol\\\\\\\\\\\\";\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including\\\\\\\\n * the Metadata extension, but not including the Enumerable extension, which is available separately as\\\\\\\\n * {ERC721Enumerable}.\\\\\\\\n */\\\\\\\\ncontract ERC721 is Context, ERC165, IERC721, IERC721Metadata {\\\\\\\\n using Address for address;\\\\\\\\n using Strings for uint256;\\\\\\\\n\\\\\\\\n // Token name\\\\\\\\n string private _name;\\\\\\\\n\\\\\\\\n // Token symbol\\\\\\\\n string private _symbol;\\\\\\\\n\\\\\\\\n // Mapping from token ID to owner address\\\\\\\\n mapping(uint256 => address) private _owners;\\\\\\\\n\\\\\\\\n // Mapping owner address to token count\\\\\\\\n mapping(address => uint256) private _balances;\\\\\\\\n\\\\\\\\n // Mapping from token ID to approved address\\\\\\\\n mapping(uint256 => address) private _tokenApprovals;\\\\\\\\n\\\\\\\\n // Mapping from owner to operator approvals\\\\\\\\n mapping(address => mapping(address => bool)) private _operatorApprovals;\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.\\\\\\\\n */\\\\\\\\n constructor(string memory name_, string memory symbol_) {\\\\\\\\n _name = name_;\\\\\\\\n _symbol = symbol_;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC165-supportsInterface}.\\\\\\\\n */\\\\\\\\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {\\\\\\\\n return\\\\\\\\n interfaceId == type(IERC721).interfaceId ||\\\\\\\\n interfaceId == type(IERC721Metadata).interfaceId ||\\\\\\\\n super.supportsInterface(interfaceId);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC721-balanceOf}.\\\\\\\\n */\\\\\\\\n function balanceOf(address owner) public view virtual override returns (uint256) {\\\\\\\\n require(owner != address(0), \\\\\\\\\\\\"ERC721: balance query for the zero address\\\\\\\\\\\\");\\\\\\\\n return _balances[owner];\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC721-ownerOf}.\\\\\\\\n */\\\\\\\\n function ownerOf(uint256 tokenId) public view virtual override returns (address) {\\\\\\\\n address owner = _owners[tokenId];\\\\\\\\n require(owner != address(0), \\\\\\\\\\\\"ERC721: owner query for nonexistent token\\\\\\\\\\\\");\\\\\\\\n return owner;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC721Metadata-name}.\\\\\\\\n */\\\\\\\\n function name() public view virtual override returns (string memory) {\\\\\\\\n return _name;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC721Metadata-symbol}.\\\\\\\\n */\\\\\\\\n function symbol() public view virtual override returns (string memory) {\\\\\\\\n return _symbol;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC721Metadata-tokenURI}.\\\\\\\\n */\\\\\\\\n function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {\\\\\\\\n require(_exists(tokenId), \\\\\\\\\\\\"ERC721Metadata: URI query for nonexistent token\\\\\\\\\\\\");\\\\\\\\n\\\\\\\\n string memory baseURI = _baseURI();\\\\\\\\n return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : \\\\\\\\\\\\"\\\\\\\\\\\\";\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each\\\\\\\\n * token will be the concatenation of the `baseURI` and the `tokenId`. Empty\\\\\\\\n * by default, can be overriden in child contracts.\\\\\\\\n */\\\\\\\\n function _baseURI() internal view virtual returns (string memory) {\\\\\\\\n return \\\\\\\\\\\\"\\\\\\\\\\\\";\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC721-approve}.\\\\\\\\n */\\\\\\\\n function approve(address to, uint256 tokenId) public virtual override {\\\\\\\\n address owner = ERC721.ownerOf(tokenId);\\\\\\\\n require(to != owner, \\\\\\\\\\\\"ERC721: approval to current owner\\\\\\\\\\\\");\\\\\\\\n\\\\\\\\n require(\\\\\\\\n _msgSender() == owner || isApprovedForAll(owner, _msgSender()),\\\\\\\\n \\\\\\\\\\\\"ERC721: approve caller is not owner nor approved for all\\\\\\\\\\\\"\\\\\\\\n );\\\\\\\\n\\\\\\\\n _approve(to, tokenId);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC721-getApproved}.\\\\\\\\n */\\\\\\\\n function getApproved(uint256 tokenId) public view virtual override returns (address) {\\\\\\\\n require(_exists(tokenId), \\\\\\\\\\\\"ERC721: approved query for nonexistent token\\\\\\\\\\\\");\\\\\\\\n\\\\\\\\n return _tokenApprovals[tokenId];\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC721-setApprovalForAll}.\\\\\\\\n */\\\\\\\\n function setApprovalForAll(address operator, bool approved) public virtual override {\\\\\\\\n require(operator != _msgSender(), \\\\\\\\\\\\"ERC721: approve to caller\\\\\\\\\\\\");\\\\\\\\n\\\\\\\\n _operatorApprovals[_msgSender()][operator] = approved;\\\\\\\\n emit ApprovalForAll(_msgSender(), operator, approved);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC721-isApprovedForAll}.\\\\\\\\n */\\\\\\\\n function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {\\\\\\\\n return _operatorApprovals[owner][operator];\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC721-transferFrom}.\\\\\\\\n */\\\\\\\\n function transferFrom(\\\\\\\\n address from,\\\\\\\\n address to,\\\\\\\\n uint256 tokenId\\\\\\\\n ) public virtual override {\\\\\\\\n //solhint-disable-next-line max-line-length\\\\\\\\n require(_isApprovedOrOwner(_msgSender(), tokenId), \\\\\\\\\\\\"ERC721: transfer caller is not owner nor approved\\\\\\\\\\\\");\\\\\\\\n\\\\\\\\n _transfer(from, to, tokenId);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC721-safeTransferFrom}.\\\\\\\\n */\\\\\\\\n function safeTransferFrom(\\\\\\\\n address from,\\\\\\\\n address to,\\\\\\\\n uint256 tokenId\\\\\\\\n ) public virtual override {\\\\\\\\n safeTransferFrom(from, to, tokenId, \\\\\\\\\\\\"\\\\\\\\\\\\");\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC721-safeTransferFrom}.\\\\\\\\n */\\\\\\\\n function safeTransferFrom(\\\\\\\\n address from,\\\\\\\\n address to,\\\\\\\\n uint256 tokenId,\\\\\\\\n bytes memory _data\\\\\\\\n ) public virtual override {\\\\\\\\n require(_isApprovedOrOwner(_msgSender(), tokenId), \\\\\\\\\\\\"ERC721: transfer caller is not owner nor approved\\\\\\\\\\\\");\\\\\\\\n _safeTransfer(from, to, tokenId, _data);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\\\\\\\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\\\\\\\n *\\\\\\\\n * `_data` is additional data, it has no specified format and it is sent in call to `to`.\\\\\\\\n *\\\\\\\\n * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.\\\\\\\\n * implement alternative mechanisms to perform token transfer, such as signature-based.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `from` cannot be the zero address.\\\\\\\\n * - `to` cannot be the zero address.\\\\\\\\n * - `tokenId` token must exist and be owned by `from`.\\\\\\\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\\\\\\\n *\\\\\\\\n * Emits a {Transfer} event.\\\\\\\\n */\\\\\\\\n function _safeTransfer(\\\\\\\\n address from,\\\\\\\\n address to,\\\\\\\\n uint256 tokenId,\\\\\\\\n bytes memory _data\\\\\\\\n ) internal virtual {\\\\\\\\n _transfer(from, to, tokenId);\\\\\\\\n require(_checkOnERC721Received(from, to, tokenId, _data), \\\\\\\\\\\\"ERC721: transfer to non ERC721Receiver implementer\\\\\\\\\\\\");\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Returns whether `tokenId` exists.\\\\\\\\n *\\\\\\\\n * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.\\\\\\\\n *\\\\\\\\n * Tokens start existing when they are minted (`_mint`),\\\\\\\\n * and stop existing when they are burned (`_burn`).\\\\\\\\n */\\\\\\\\n function _exists(uint256 tokenId) internal view virtual returns (bool) {\\\\\\\\n return _owners[tokenId] != address(0);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Returns whether `spender` is allowed to manage `tokenId`.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `tokenId` must exist.\\\\\\\\n */\\\\\\\\n function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {\\\\\\\\n require(_exists(tokenId), \\\\\\\\\\\\"ERC721: operator query for nonexistent token\\\\\\\\\\\\");\\\\\\\\n address owner = ERC721.ownerOf(tokenId);\\\\\\\\n return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Safely mints `tokenId` and transfers it to `to`.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `tokenId` must not exist.\\\\\\\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\\\\\\\n *\\\\\\\\n * Emits a {Transfer} event.\\\\\\\\n */\\\\\\\\n function _safeMint(address to, uint256 tokenId) internal virtual {\\\\\\\\n _safeMint(to, tokenId, \\\\\\\\\\\\"\\\\\\\\\\\\");\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is\\\\\\\\n * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\\\\\\\\n */\\\\\\\\n function _safeMint(\\\\\\\\n address to,\\\\\\\\n uint256 tokenId,\\\\\\\\n bytes memory _data\\\\\\\\n ) internal virtual {\\\\\\\\n _mint(to, tokenId);\\\\\\\\n require(\\\\\\\\n _checkOnERC721Received(address(0), to, tokenId, _data),\\\\\\\\n \\\\\\\\\\\\"ERC721: transfer to non ERC721Receiver implementer\\\\\\\\\\\\"\\\\\\\\n );\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Mints `tokenId` and transfers it to `to`.\\\\\\\\n *\\\\\\\\n * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `tokenId` must not exist.\\\\\\\\n * - `to` cannot be the zero address.\\\\\\\\n *\\\\\\\\n * Emits a {Transfer} event.\\\\\\\\n */\\\\\\\\n function _mint(address to, uint256 tokenId) internal virtual {\\\\\\\\n require(to != address(0), \\\\\\\\\\\\"ERC721: mint to the zero address\\\\\\\\\\\\");\\\\\\\\n require(!_exists(tokenId), \\\\\\\\\\\\"ERC721: token already minted\\\\\\\\\\\\");\\\\\\\\n\\\\\\\\n _beforeTokenTransfer(address(0), to, tokenId);\\\\\\\\n\\\\\\\\n _balances[to] += 1;\\\\\\\\n _owners[tokenId] = to;\\\\\\\\n\\\\\\\\n emit Transfer(address(0), to, tokenId);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Destroys `tokenId`.\\\\\\\\n * The approval is cleared when the token is burned.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `tokenId` must exist.\\\\\\\\n *\\\\\\\\n * Emits a {Transfer} event.\\\\\\\\n */\\\\\\\\n function _burn(uint256 tokenId) internal virtual {\\\\\\\\n address owner = ERC721.ownerOf(tokenId);\\\\\\\\n\\\\\\\\n _beforeTokenTransfer(owner, address(0), tokenId);\\\\\\\\n\\\\\\\\n // Clear approvals\\\\\\\\n _approve(address(0), tokenId);\\\\\\\\n\\\\\\\\n _balances[owner] -= 1;\\\\\\\\n delete _owners[tokenId];\\\\\\\\n\\\\\\\\n emit Transfer(owner, address(0), tokenId);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Transfers `tokenId` from `from` to `to`.\\\\\\\\n * As opposed to {transferFrom}, this imposes no restrictions on msg.sender.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `to` cannot be the zero address.\\\\\\\\n * - `tokenId` token must be owned by `from`.\\\\\\\\n *\\\\\\\\n * Emits a {Transfer} event.\\\\\\\\n */\\\\\\\\n function _transfer(\\\\\\\\n address from,\\\\\\\\n address to,\\\\\\\\n uint256 tokenId\\\\\\\\n ) internal virtual {\\\\\\\\n require(ERC721.ownerOf(tokenId) == from, \\\\\\\\\\\\"ERC721: transfer of token that is not own\\\\\\\\\\\\");\\\\\\\\n require(to != address(0), \\\\\\\\\\\\"ERC721: transfer to the zero address\\\\\\\\\\\\");\\\\\\\\n\\\\\\\\n _beforeTokenTransfer(from, to, tokenId);\\\\\\\\n\\\\\\\\n // Clear approvals from the previous owner\\\\\\\\n _approve(address(0), tokenId);\\\\\\\\n\\\\\\\\n _balances[from] -= 1;\\\\\\\\n _balances[to] += 1;\\\\\\\\n _owners[tokenId] = to;\\\\\\\\n\\\\\\\\n emit Transfer(from, to, tokenId);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Approve `to` to operate on `tokenId`\\\\\\\\n *\\\\\\\\n * Emits a {Approval} event.\\\\\\\\n */\\\\\\\\n function _approve(address to, uint256 tokenId) internal virtual {\\\\\\\\n _tokenApprovals[tokenId] = to;\\\\\\\\n emit Approval(ERC721.ownerOf(tokenId), to, tokenId);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.\\\\\\\\n * The call is not executed if the target address is not a contract.\\\\\\\\n *\\\\\\\\n * @param from address representing the previous owner of the given token ID\\\\\\\\n * @param to target address that will receive the tokens\\\\\\\\n * @param tokenId uint256 ID of the token to be transferred\\\\\\\\n * @param _data bytes optional data to send along with the call\\\\\\\\n * @return bool whether the call correctly returned the expected magic value\\\\\\\\n */\\\\\\\\n function _checkOnERC721Received(\\\\\\\\n address from,\\\\\\\\n address to,\\\\\\\\n uint256 tokenId,\\\\\\\\n bytes memory _data\\\\\\\\n ) private returns (bool) {\\\\\\\\n if (to.isContract()) {\\\\\\\\n try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {\\\\\\\\n return retval == IERC721Receiver(to).onERC721Received.selector;\\\\\\\\n } catch (bytes memory reason) {\\\\\\\\n if (reason.length == 0) {\\\\\\\\n revert(\\\\\\\\\\\\"ERC721: transfer to non ERC721Receiver implementer\\\\\\\\\\\\");\\\\\\\\n } else {\\\\\\\\n assembly {\\\\\\\\n revert(add(32, reason), mload(reason))\\\\\\\\n }\\\\\\\\n }\\\\\\\\n }\\\\\\\\n } else {\\\\\\\\n return true;\\\\\\\\n }\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Hook that is called before any token transfer. This includes minting\\\\\\\\n * and burning.\\\\\\\\n *\\\\\\\\n * Calling conditions:\\\\\\\\n *\\\\\\\\n * - When `from` and `to` are both non-zero, ``from``\\\'s `tokenId` will be\\\\\\\\n * transferred to `to`.\\\\\\\\n * - When `from` is zero, `tokenId` will be minted for `to`.\\\\\\\\n * - When `to` is zero, ``from``\\\'s `tokenId` will be burned.\\\\\\\\n * - `from` and `to` are never both zero.\\\\\\\\n *\\\\\\\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\\\\\\\n */\\\\\\\\n function _beforeTokenTransfer(\\\\\\\\n address from,\\\\\\\\n address to,\\\\\\\\n uint256 tokenId\\\\\\\\n ) internal virtual {}\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0xd644260d8e4e64563a7adba96d774dbaac6ae89c2ee58ef49a19850ff1239b08\\\\",\\\\"license\\\\":\\\\"MIT\\\\"},\\\\"@openzeppelin/contracts/token/ERC721/IERC721.sol\\\\":{\\\\"content\\\\":\\\\"// SPDX-License-Identifier: MIT\\\\\\\\n\\\\\\\\npragma solidity ^0.8.0;\\\\\\\\n\\\\\\\\nimport \\\\\\\\\\\\"../../utils/introspection/IERC165.sol\\\\\\\\\\\\";\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @dev Required interface of an ERC721 compliant contract.\\\\\\\\n */\\\\\\\\ninterface IERC721 is IERC165 {\\\\\\\\n /**\\\\\\\\n * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\\\\\\\n */\\\\\\\\n event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\\\\\\\n */\\\\\\\\n event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\\\\\\\n */\\\\\\\\n event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Returns the number of tokens in ``owner``\\\'s account.\\\\\\\\n */\\\\\\\\n function balanceOf(address owner) external view returns (uint256 balance);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Returns the owner of the `tokenId` token.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `tokenId` must exist.\\\\\\\\n */\\\\\\\\n function ownerOf(uint256 tokenId) external view returns (address owner);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\\\\\\\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `from` cannot be the zero address.\\\\\\\\n * - `to` cannot be the zero address.\\\\\\\\n * - `tokenId` token must exist and be owned by `from`.\\\\\\\\n * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.\\\\\\\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\\\\\\\n *\\\\\\\\n * Emits a {Transfer} event.\\\\\\\\n */\\\\\\\\n function safeTransferFrom(\\\\\\\\n address from,\\\\\\\\n address to,\\\\\\\\n uint256 tokenId\\\\\\\\n ) external;\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Transfers `tokenId` token from `from` to `to`.\\\\\\\\n *\\\\\\\\n * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `from` cannot be the zero address.\\\\\\\\n * - `to` cannot be the zero address.\\\\\\\\n * - `tokenId` token must be owned by `from`.\\\\\\\\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\\\\\\\n *\\\\\\\\n * Emits a {Transfer} event.\\\\\\\\n */\\\\\\\\n function transferFrom(\\\\\\\\n address from,\\\\\\\\n address to,\\\\\\\\n uint256 tokenId\\\\\\\\n ) external;\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\\\\\\\n * The approval is cleared when the token is transferred.\\\\\\\\n *\\\\\\\\n * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - The caller must own the token or be an approved operator.\\\\\\\\n * - `tokenId` must exist.\\\\\\\\n *\\\\\\\\n * Emits an {Approval} event.\\\\\\\\n */\\\\\\\\n function approve(address to, uint256 tokenId) external;\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Returns the account approved for `tokenId` token.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `tokenId` must exist.\\\\\\\\n */\\\\\\\\n function getApproved(uint256 tokenId) external view returns (address operator);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Approve or remove `operator` as an operator for the caller.\\\\\\\\n * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - The `operator` cannot be the caller.\\\\\\\\n *\\\\\\\\n * Emits an {ApprovalForAll} event.\\\\\\\\n */\\\\\\\\n function setApprovalForAll(address operator, bool _approved) external;\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\\\\\\\n *\\\\\\\\n * See {setApprovalForAll}\\\\\\\\n */\\\\\\\\n function isApprovedForAll(address owner, address operator) external view returns (bool);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Safely transfers `tokenId` token from `from` to `to`.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `from` cannot be the zero address.\\\\\\\\n * - `to` cannot be the zero address.\\\\\\\\n * - `tokenId` token must exist and be owned by `from`.\\\\\\\\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\\\\\\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\\\\\\\n *\\\\\\\\n * Emits a {Transfer} event.\\\\\\\\n */\\\\\\\\n function safeTransferFrom(\\\\\\\\n address from,\\\\\\\\n address to,\\\\\\\\n uint256 tokenId,\\\\\\\\n bytes calldata data\\\\\\\\n ) external;\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0xf101e8720213560fab41104d53b3cc7ba0456ef3a98455aa7f022391783144a0\\\\",\\\\"license\\\\":\\\\"MIT\\\\"},\\\\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\\\\":{\\\\"content\\\\":\\\\"// SPDX-License-Identifier: MIT\\\\\\\\n\\\\\\\\npragma solidity ^0.8.0;\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @title ERC721 token receiver interface\\\\\\\\n * @dev Interface for any contract that wants to support safeTransfers\\\\\\\\n * from ERC721 asset contracts.\\\\\\\\n */\\\\\\\\ninterface IERC721Receiver {\\\\\\\\n /**\\\\\\\\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\\\\\\\n * by `operator` from `from`, this function is called.\\\\\\\\n *\\\\\\\\n * It must return its Solidity selector to confirm the token transfer.\\\\\\\\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\\\\\\\n *\\\\\\\\n * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.\\\\\\\\n */\\\\\\\\n function onERC721Received(\\\\\\\\n address operator,\\\\\\\\n address from,\\\\\\\\n uint256 tokenId,\\\\\\\\n bytes calldata data\\\\\\\\n ) external returns (bytes4);\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0xd9517254724276e2e8de3769183c1f738f445f0095c26fd9b86d3c6687e887b9\\\\",\\\\"license\\\\":\\\\"MIT\\\\"},\\\\"@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol\\\\":{\\\\"content\\\\":\\\\"// SPDX-License-Identifier: MIT\\\\\\\\n\\\\\\\\npragma solidity ^0.8.0;\\\\\\\\n\\\\\\\\nimport \\\\\\\\\\\\"../IERC721.sol\\\\\\\\\\\\";\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @title ERC-721 Non-Fungible Token Standard, optional metadata extension\\\\\\\\n * @dev See https://eips.ethereum.org/EIPS/eip-721\\\\\\\\n */\\\\\\\\ninterface IERC721Metadata is IERC721 {\\\\\\\\n /**\\\\\\\\n * @dev Returns the token collection name.\\\\\\\\n */\\\\\\\\n function name() external view returns (string memory);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Returns the token collection symbol.\\\\\\\\n */\\\\\\\\n function symbol() external view returns (string memory);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.\\\\\\\\n */\\\\\\\\n function tokenURI(uint256 tokenId) external view returns (string memory);\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0xd32fb7f530a914b1083d10a6bed3a586f2451952fec04fe542bcc670a82f7ba5\\\\",\\\\"license\\\\":\\\\"MIT\\\\"},\\\\"@openzeppelin/contracts/utils/Address.sol\\\\":{\\\\"content\\\\":\\\\"// SPDX-License-Identifier: MIT\\\\\\\\n\\\\\\\\npragma solidity ^0.8.0;\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @dev Collection of functions related to the address type\\\\\\\\n */\\\\\\\\nlibrary Address {\\\\\\\\n /**\\\\\\\\n * @dev Returns true if `account` is a contract.\\\\\\\\n *\\\\\\\\n * [IMPORTANT]\\\\\\\\n * ====\\\\\\\\n * It is unsafe to assume that an address for which this function returns\\\\\\\\n * false is an externally-owned account (EOA) and not a contract.\\\\\\\\n *\\\\\\\\n * Among others, `isContract` will return false for the following\\\\\\\\n * types of addresses:\\\\\\\\n *\\\\\\\\n * - an externally-owned account\\\\\\\\n * - a contract in construction\\\\\\\\n * - an address where a contract will be created\\\\\\\\n * - an address where a contract lived, but was destroyed\\\\\\\\n * ====\\\\\\\\n */\\\\\\\\n function isContract(address account) internal view returns (bool) {\\\\\\\\n // This method relies on extcodesize, which returns 0 for contracts in\\\\\\\\n // construction, since the code is only stored at the end of the\\\\\\\\n // constructor execution.\\\\\\\\n\\\\\\\\n uint256 size;\\\\\\\\n assembly {\\\\\\\\n size := extcodesize(account)\\\\\\\\n }\\\\\\\\n return size > 0;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Replacement for Solidity\\\'s `transfer`: sends `amount` wei to\\\\\\\\n * `recipient`, forwarding all available gas and reverting on errors.\\\\\\\\n *\\\\\\\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\\\\\\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\\\\\\\n * imposed by `transfer`, making them unable to receive funds via\\\\\\\\n * `transfer`. {sendValue} removes this limitation.\\\\\\\\n *\\\\\\\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\\\\\\\n *\\\\\\\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\\\\\\\n * taken to not create reentrancy vulnerabilities. Consider using\\\\\\\\n * {ReentrancyGuard} or the\\\\\\\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\\\\\\\n */\\\\\\\\n function sendValue(address payable recipient, uint256 amount) internal {\\\\\\\\n require(address(this).balance >= amount, \\\\\\\\\\\\"Address: insufficient balance\\\\\\\\\\\\");\\\\\\\\n\\\\\\\\n (bool success, ) = recipient.call{value: amount}(\\\\\\\\\\\\"\\\\\\\\\\\\");\\\\\\\\n require(success, \\\\\\\\\\\\"Address: unable to send value, recipient may have reverted\\\\\\\\\\\\");\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Performs a Solidity function call using a low level `call`. A\\\\\\\\n * plain `call` is an unsafe replacement for a function call: use this\\\\\\\\n * function instead.\\\\\\\\n *\\\\\\\\n * If `target` reverts with a revert reason, it is bubbled up by this\\\\\\\\n * function (like regular Solidity function calls).\\\\\\\\n *\\\\\\\\n * Returns the raw returned data. To convert to the expected return value,\\\\\\\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `target` must be a contract.\\\\\\\\n * - calling `target` with `data` must not revert.\\\\\\\\n *\\\\\\\\n * _Available since v3.1._\\\\\\\\n */\\\\\\\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\\\\\\\n return functionCall(target, data, \\\\\\\\\\\\"Address: low-level call failed\\\\\\\\\\\\");\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\\\\\\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\\\\\\\n *\\\\\\\\n * _Available since v3.1._\\\\\\\\n */\\\\\\\\n function functionCall(\\\\\\\\n address target,\\\\\\\\n bytes memory data,\\\\\\\\n string memory errorMessage\\\\\\\\n ) internal returns (bytes memory) {\\\\\\\\n return functionCallWithValue(target, data, 0, errorMessage);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\\\\\\\n * but also transferring `value` wei to `target`.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - the calling contract must have an ETH balance of at least `value`.\\\\\\\\n * - the called Solidity function must be `payable`.\\\\\\\\n *\\\\\\\\n * _Available since v3.1._\\\\\\\\n */\\\\\\\\n function functionCallWithValue(\\\\\\\\n address target,\\\\\\\\n bytes memory data,\\\\\\\\n uint256 value\\\\\\\\n ) internal returns (bytes memory) {\\\\\\\\n return functionCallWithValue(target, data, value, \\\\\\\\\\\\"Address: low-level call with value failed\\\\\\\\\\\\");\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\\\\\\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\\\\\\\n *\\\\\\\\n * _Available since v3.1._\\\\\\\\n */\\\\\\\\n function functionCallWithValue(\\\\\\\\n address target,\\\\\\\\n bytes memory data,\\\\\\\\n uint256 value,\\\\\\\\n string memory errorMessage\\\\\\\\n ) internal returns (bytes memory) {\\\\\\\\n require(address(this).balance >= value, \\\\\\\\\\\\"Address: insufficient balance for call\\\\\\\\\\\\");\\\\\\\\n require(isContract(target), \\\\\\\\\\\\"Address: call to non-contract\\\\\\\\\\\\");\\\\\\\\n\\\\\\\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\\\\\\\n return _verifyCallResult(success, returndata, errorMessage);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\\\\\\\n * but performing a static call.\\\\\\\\n *\\\\\\\\n * _Available since v3.3._\\\\\\\\n */\\\\\\\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\\\\\\\n return functionStaticCall(target, data, \\\\\\\\\\\\"Address: low-level static call failed\\\\\\\\\\\\");\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\\\\\\\n * but performing a static call.\\\\\\\\n *\\\\\\\\n * _Available since v3.3._\\\\\\\\n */\\\\\\\\n function functionStaticCall(\\\\\\\\n address target,\\\\\\\\n bytes memory data,\\\\\\\\n string memory errorMessage\\\\\\\\n ) internal view returns (bytes memory) {\\\\\\\\n require(isContract(target), \\\\\\\\\\\\"Address: static call to non-contract\\\\\\\\\\\\");\\\\\\\\n\\\\\\\\n (bool success, bytes memory returndata) = target.staticcall(data);\\\\\\\\n return _verifyCallResult(success, returndata, errorMessage);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\\\\\\\n * but performing a delegate call.\\\\\\\\n *\\\\\\\\n * _Available since v3.4._\\\\\\\\n */\\\\\\\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\\\\\\\n return functionDelegateCall(target, data, \\\\\\\\\\\\"Address: low-level delegate call failed\\\\\\\\\\\\");\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\\\\\\\n * but performing a delegate call.\\\\\\\\n *\\\\\\\\n * _Available since v3.4._\\\\\\\\n */\\\\\\\\n function functionDelegateCall(\\\\\\\\n address target,\\\\\\\\n bytes memory data,\\\\\\\\n string memory errorMessage\\\\\\\\n ) internal returns (bytes memory) {\\\\\\\\n require(isContract(target), \\\\\\\\\\\\"Address: delegate call to non-contract\\\\\\\\\\\\");\\\\\\\\n\\\\\\\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\\\\\\\n return _verifyCallResult(success, returndata, errorMessage);\\\\\\\\n }\\\\\\\\n\\\\\\\\n function _verifyCallResult(\\\\\\\\n bool success,\\\\\\\\n bytes memory returndata,\\\\\\\\n string memory errorMessage\\\\\\\\n ) private pure returns (bytes memory) {\\\\\\\\n if (success) {\\\\\\\\n return returndata;\\\\\\\\n } else {\\\\\\\\n // Look for revert reason and bubble it up if present\\\\\\\\n if (returndata.length > 0) {\\\\\\\\n // The easiest way to bubble the revert reason is using memory via assembly\\\\\\\\n\\\\\\\\n assembly {\\\\\\\\n let returndata_size := mload(returndata)\\\\\\\\n revert(add(32, returndata), returndata_size)\\\\\\\\n }\\\\\\\\n } else {\\\\\\\\n revert(errorMessage);\\\\\\\\n }\\\\\\\\n }\\\\\\\\n }\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x3b4820cac4f127869f6eb496c1d74fa6ac86ed24071e0f94742e6aef20e7252c\\\\",\\\\"license\\\\":\\\\"MIT\\\\"},\\\\"@openzeppelin/contracts/utils/Context.sol\\\\":{\\\\"content\\\\":\\\\"// SPDX-License-Identifier: MIT\\\\\\\\n\\\\\\\\npragma solidity ^0.8.0;\\\\\\\\n\\\\\\\\n/*\\\\\\\\n * @dev Provides information about the current execution context, including the\\\\\\\\n * sender of the transaction and its data. While these are generally available\\\\\\\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\\\\\\\n * manner, since when dealing with meta-transactions the account sending and\\\\\\\\n * paying for execution may not be the actual sender (as far as an application\\\\\\\\n * is concerned).\\\\\\\\n *\\\\\\\\n * This contract is only required for intermediate, library-like contracts.\\\\\\\\n */\\\\\\\\nabstract contract Context {\\\\\\\\n function _msgSender() internal view virtual returns (address) {\\\\\\\\n return msg.sender;\\\\\\\\n }\\\\\\\\n\\\\\\\\n function _msgData() internal view virtual returns (bytes calldata) {\\\\\\\\n return msg.data;\\\\\\\\n }\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x95098bd1d9c8dec4d80d3dedb88a0d949fa0d740ee99f2aa466bc308216ca6d5\\\\",\\\\"license\\\\":\\\\"MIT\\\\"},\\\\"@openzeppelin/contracts/utils/Strings.sol\\\\":{\\\\"content\\\\":\\\\"// SPDX-License-Identifier: MIT\\\\\\\\n\\\\\\\\npragma solidity ^0.8.0;\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @dev String operations.\\\\\\\\n */\\\\\\\\nlibrary Strings {\\\\\\\\n bytes16 private constant _HEX_SYMBOLS = \\\\\\\\\\\\"0123456789abcdef\\\\\\\\\\\\";\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\\\\\\\n */\\\\\\\\n function toString(uint256 value) internal pure returns (string memory) {\\\\\\\\n // Inspired by OraclizeAPI\\\'s implementation - MIT licence\\\\\\\\n // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol\\\\\\\\n\\\\\\\\n if (value == 0) {\\\\\\\\n return \\\\\\\\\\\\"0\\\\\\\\\\\\";\\\\\\\\n }\\\\\\\\n uint256 temp = value;\\\\\\\\n uint256 digits;\\\\\\\\n while (temp != 0) {\\\\\\\\n digits++;\\\\\\\\n temp /= 10;\\\\\\\\n }\\\\\\\\n bytes memory buffer = new bytes(digits);\\\\\\\\n while (value != 0) {\\\\\\\\n digits -= 1;\\\\\\\\n buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));\\\\\\\\n value /= 10;\\\\\\\\n }\\\\\\\\n return string(buffer);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\\\\\\\n */\\\\\\\\n function toHexString(uint256 value) internal pure returns (string memory) {\\\\\\\\n if (value == 0) {\\\\\\\\n return \\\\\\\\\\\\"0x00\\\\\\\\\\\\";\\\\\\\\n }\\\\\\\\n uint256 temp = value;\\\\\\\\n uint256 length = 0;\\\\\\\\n while (temp != 0) {\\\\\\\\n length++;\\\\\\\\n temp >>= 8;\\\\\\\\n }\\\\\\\\n return toHexString(value, length);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\\\\\\\n */\\\\\\\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\\\\\\\n bytes memory buffer = new bytes(2 * length + 2);\\\\\\\\n buffer[0] = \\\\\\\\\\\\"0\\\\\\\\\\\\";\\\\\\\\n buffer[1] = \\\\\\\\\\\\"x\\\\\\\\\\\\";\\\\\\\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\\\\\\\n buffer[i] = _HEX_SYMBOLS[value & 0xf];\\\\\\\\n value >>= 4;\\\\\\\\n }\\\\\\\\n require(value == 0, \\\\\\\\\\\\"Strings: hex length insufficient\\\\\\\\\\\\");\\\\\\\\n return string(buffer);\\\\\\\\n }\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x391d3ba97ab6856a16b225d6ee29617ad15ff00db70f3b4df1ab5ea33aa47c9d\\\\",\\\\"license\\\\":\\\\"MIT\\\\"},\\\\"@openzeppelin/contracts/utils/introspection/ERC165.sol\\\\":{\\\\"content\\\\":\\\\"// SPDX-License-Identifier: MIT\\\\\\\\n\\\\\\\\npragma solidity ^0.8.0;\\\\\\\\n\\\\\\\\nimport \\\\\\\\\\\\"./IERC165.sol\\\\\\\\\\\\";\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @dev Implementation of the {IERC165} interface.\\\\\\\\n *\\\\\\\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\\\\\\\n * for the additional interface id that will be supported. For example:\\\\\\\\n *\\\\\\\\n * ```solidity\\\\\\\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\\\\\\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\\\\\\\n * }\\\\\\\\n * ```\\\\\\\\n *\\\\\\\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\\\\\\\n */\\\\\\\\nabstract contract ERC165 is IERC165 {\\\\\\\\n /**\\\\\\\\n * @dev See {IERC165-supportsInterface}.\\\\\\\\n */\\\\\\\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\\\\\\\n return interfaceId == type(IERC165).interfaceId;\\\\\\\\n }\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x5718c5df9bd67ac68a796961df938821bb5dc0cd4c6118d77e9145afb187409b\\\\",\\\\"license\\\\":\\\\"MIT\\\\"},\\\\"@openzeppelin/contracts/utils/introspection/IERC165.sol\\\\":{\\\\"content\\\\":\\\\"// SPDX-License-Identifier: MIT\\\\\\\\n\\\\\\\\npragma solidity ^0.8.0;\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @dev Interface of the ERC165 standard, as defined in the\\\\\\\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\\\\\\\n *\\\\\\\\n * Implementers can declare support of contract interfaces, which can then be\\\\\\\\n * queried by others ({ERC165Checker}).\\\\\\\\n *\\\\\\\\n * For an implementation, see {ERC165}.\\\\\\\\n */\\\\\\\\ninterface IERC165 {\\\\\\\\n /**\\\\\\\\n * @dev Returns true if this contract implements the interface defined by\\\\\\\\n * `interfaceId`. See the corresponding\\\\\\\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\\\\\\\n * to learn more about how these ids are created.\\\\\\\\n *\\\\\\\\n * This function call must use less than 30 000 gas.\\\\\\\\n */\\\\\\\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0xa28007762d9da9db878dd421960c8cb9a10471f47ab5c1b3309bfe48e9e79ff4\\\\",\\\\"license\\\\":\\\\"MIT\\\\"},\\\\"@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router01.sol\\\\":{\\\\"content\\\\":\\\\"pragma solidity >=0.6.2;\\\\\\\\n\\\\\\\\ninterface IUniswapV2Router01 {\\\\\\\\n function factory() external pure returns (address);\\\\\\\\n function WETH() external pure returns (address);\\\\\\\\n\\\\\\\\n function addLiquidity(\\\\\\\\n address tokenA,\\\\\\\\n address tokenB,\\\\\\\\n uint amountADesired,\\\\\\\\n uint amountBDesired,\\\\\\\\n uint amountAMin,\\\\\\\\n uint amountBMin,\\\\\\\\n address to,\\\\\\\\n uint deadline\\\\\\\\n ) external returns (uint amountA, uint amountB, uint liquidity);\\\\\\\\n function addLiquidityETH(\\\\\\\\n address token,\\\\\\\\n uint amountTokenDesired,\\\\\\\\n uint amountTokenMin,\\\\\\\\n uint amountETHMin,\\\\\\\\n address to,\\\\\\\\n uint deadline\\\\\\\\n ) external payable returns (uint amountToken, uint amountETH, uint liquidity);\\\\\\\\n function removeLiquidity(\\\\\\\\n address tokenA,\\\\\\\\n address tokenB,\\\\\\\\n uint liquidity,\\\\\\\\n uint amountAMin,\\\\\\\\n uint amountBMin,\\\\\\\\n address to,\\\\\\\\n uint deadline\\\\\\\\n ) external returns (uint amountA, uint amountB);\\\\\\\\n function removeLiquidityETH(\\\\\\\\n address token,\\\\\\\\n uint liquidity,\\\\\\\\n uint amountTokenMin,\\\\\\\\n uint amountETHMin,\\\\\\\\n address to,\\\\\\\\n uint deadline\\\\\\\\n ) external returns (uint amountToken, uint amountETH);\\\\\\\\n function removeLiquidityWithPermit(\\\\\\\\n address tokenA,\\\\\\\\n address tokenB,\\\\\\\\n uint liquidity,\\\\\\\\n uint amountAMin,\\\\\\\\n uint amountBMin,\\\\\\\\n address to,\\\\\\\\n uint deadline,\\\\\\\\n bool approveMax, uint8 v, bytes32 r, bytes32 s\\\\\\\\n ) external returns (uint amountA, uint amountB);\\\\\\\\n function removeLiquidityETHWithPermit(\\\\\\\\n address token,\\\\\\\\n uint liquidity,\\\\\\\\n uint amountTokenMin,\\\\\\\\n uint amountETHMin,\\\\\\\\n address to,\\\\\\\\n uint deadline,\\\\\\\\n bool approveMax, uint8 v, bytes32 r, bytes32 s\\\\\\\\n ) external returns (uint amountToken, uint amountETH);\\\\\\\\n function swapExactTokensForTokens(\\\\\\\\n uint amountIn,\\\\\\\\n uint amountOutMin,\\\\\\\\n address[] calldata path,\\\\\\\\n address to,\\\\\\\\n uint deadline\\\\\\\\n ) external returns (uint[] memory amounts);\\\\\\\\n function swapTokensForExactTokens(\\\\\\\\n uint amountOut,\\\\\\\\n uint amountInMax,\\\\\\\\n address[] calldata path,\\\\\\\\n address to,\\\\\\\\n uint deadline\\\\\\\\n ) external returns (uint[] memory amounts);\\\\\\\\n function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)\\\\\\\\n external\\\\\\\\n payable\\\\\\\\n returns (uint[] memory amounts);\\\\\\\\n function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)\\\\\\\\n external\\\\\\\\n returns (uint[] memory amounts);\\\\\\\\n function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)\\\\\\\\n external\\\\\\\\n returns (uint[] memory amounts);\\\\\\\\n function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)\\\\\\\\n external\\\\\\\\n payable\\\\\\\\n returns (uint[] memory amounts);\\\\\\\\n\\\\\\\\n function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);\\\\\\\\n function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);\\\\\\\\n function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);\\\\\\\\n function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);\\\\\\\\n function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x8a3c5c449d4b7cd76513ed6995f4b86e4a86f222c770f8442f5fc128ce29b4d2\\\\"},\\\\"contracts/Interfaces/Interfaces.sol\\\\":{\\\\"content\\\\":\\\\"pragma solidity 0.8.6;\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * SPDX-License-Identifier: GPL-3.0-or-later\\\\\\\\n * Hegic\\\\\\\\n * Copyright (C) 2021 Hegic Protocol\\\\\\\\n *\\\\\\\\n * This program is free software: you can redistribute it and/or modify\\\\\\\\n * it under the terms of the GNU General Public License as published by\\\\\\\\n * the Free Software Foundation, either version 3 of the License, or\\\\\\\\n * (at your option) any later version.\\\\\\\\n *\\\\\\\\n * This program is distributed in the hope that it will be useful,\\\\\\\\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\\\\\\\\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\\\\\\\\n * GNU General Public License for more details.\\\\\\\\n *\\\\\\\\n * You should have received a copy of the GNU General Public License\\\\\\\\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\\\\\\\\n **/\\\\\\\\n\\\\\\\\nimport \\\\\\\\\\\\"@openzeppelin/contracts/token/ERC20/ERC20.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"@openzeppelin/contracts/token/ERC721/ERC721.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"@openzeppelin/contracts/access/Ownable.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"@chainlink/contracts/src/v0.7/interfaces/AggregatorV3Interface.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router01.sol\\\\\\\\\\\\";\\\\\\\\n\\\\\\\\n// /**\\\\\\\\n// * @author 0mllwntrmt3\\\\\\\\n// * @title Hegic Protocol V8888 Interface\\\\\\\\n// * @notice The interface for the price calculator,\\\\\\\\n// * options, pools and staking contracts.\\\\\\\\n// **/\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @notice The interface fot the contract that calculates\\\\\\\\n * the options prices (the premiums) that are adjusted\\\\\\\\n * through balancing the `ImpliedVolRate` parameter.\\\\\\\\n **/\\\\\\\\n\\\\\\\\ninterface IIVLPriceCalculator {\\\\\\\\n event SetImpliedVolRate(uint256 value);\\\\\\\\n event SetSettlementFeeShare(uint256 value);\\\\\\\\n}\\\\\\\\n\\\\\\\\ninterface IPriceCalculator is IIVLPriceCalculator {\\\\\\\\n /**\\\\\\\\n * @param period The option period\\\\\\\\n * @param amount The option size\\\\\\\\n * @param strike The option strike\\\\\\\\n **/\\\\\\\\n function calculateTotalPremium(\\\\\\\\n uint256 period,\\\\\\\\n uint256 amount,\\\\\\\\n uint256 strike\\\\\\\\n ) external view returns (uint256 settlementFee, uint256 premium);\\\\\\\\n}\\\\\\\\n\\\\\\\\ninterface IAtmPremiumCalculator {\\\\\\\\n event SetPolinomCall(int256[5] values);\\\\\\\\n event SetPolinomPut(int256[5] values);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param period The option period\\\\\\\\n * @param amount The option size\\\\\\\\n * @param strike The option strike\\\\\\\\n **/\\\\\\\\n function calculateAtmCallPremium(\\\\\\\\n uint256 period,\\\\\\\\n uint256 amount,\\\\\\\\n uint256 strike\\\\\\\\n ) external view returns (uint256 premium);\\\\\\\\n\\\\\\\\n function calculateAtmPutPremium(\\\\\\\\n uint256 period,\\\\\\\\n uint256 amount,\\\\\\\\n uint256 strike\\\\\\\\n ) external view returns (uint256 premium);\\\\\\\\n}\\\\\\\\n\\\\\\\\ninterface IPremiumCalculator is IIVLPriceCalculator {\\\\\\\\n event SetBorders(uint256[3] values);\\\\\\\\n event SetImpliedVolRates(uint256[4] values);\\\\\\\\n event SetDiscontCall(int256[5] values);\\\\\\\\n event SetDiscontPut(int256[5] values);\\\\\\\\n event SetDiscontSpread(uint8 values);\\\\\\\\n event SetStrikePercentage(uint256 value);\\\\\\\\n event SetPeriodLimits(uint256 min, uint256 max);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param period The option period\\\\\\\\n * @param amount The option size\\\\\\\\n * @param strike The option strike\\\\\\\\n **/\\\\\\\\n function calculatePremium(\\\\\\\\n uint256 period,\\\\\\\\n uint256 amount,\\\\\\\\n uint256 strike\\\\\\\\n ) external view returns (uint256 premium);\\\\\\\\n\\\\\\\\n function priceProvider() external view returns (AggregatorV3Interface);\\\\\\\\n}\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @notice The interface for the contract that manages pools and the options parameters,\\\\\\\\n * accumulates the funds from the liquidity providers and makes the withdrawals for them,\\\\\\\\n * sells the options contracts to the options buyers and collateralizes them,\\\\\\\\n * exercises the ITM (in-the-money) options with the unrealized P&L and settles them,\\\\\\\\n * unlocks the expired options and distributes the premiums among the liquidity providers.\\\\\\\\n **/\\\\\\\\ninterface IHegicPool is IERC721, IPriceCalculator {\\\\\\\\n enum OptionState {Invalid, Active, Exercised, Expired}\\\\\\\\n enum TrancheState {Invalid, Open, Closed}\\\\\\\\n\\\\\\\\n function priceProvider() external view returns (AggregatorV3Interface);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param state The state of the option: Invalid, Active, Exercised, Expired\\\\\\\\n * @param strike The option strike\\\\\\\\n * @param amount The option size\\\\\\\\n * @param lockedAmount The option collateral size locked\\\\\\\\n * @param expired The option expiration timestamp\\\\\\\\n * @param hedgePremium The share of the premium paid for hedging from the losses\\\\\\\\n * @param unhedgePremium The share of the premium paid to the hedged liquidity provider\\\\\\\\n **/\\\\\\\\n struct Option {\\\\\\\\n OptionState state;\\\\\\\\n uint256 strike;\\\\\\\\n uint256 amount;\\\\\\\\n uint256 lockedAmount;\\\\\\\\n uint256 expired;\\\\\\\\n uint256 hedgePremium;\\\\\\\\n uint256 unhedgePremium;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param state The state of the liquidity tranche: Invalid, Open, Closed\\\\\\\\n * @param share The liquidity provider\\\'s share in the pool\\\\\\\\n * @param amount The size of liquidity provided\\\\\\\\n * @param creationTimestamp The liquidity deposit timestamp\\\\\\\\n * @param hedged The liquidity tranche type: hedged or unhedged (classic)\\\\\\\\n **/\\\\\\\\n struct Tranche {\\\\\\\\n TrancheState state;\\\\\\\\n uint256 share;\\\\\\\\n uint256 amount;\\\\\\\\n uint256 creationTimestamp;\\\\\\\\n bool hedged;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param id The ERC721 token ID linked to the option\\\\\\\\n * @param settlementFee The part of the premium that\\\\\\\\n * is distributed among the HEGIC staking participants\\\\\\\\n * @param premium The part of the premium that\\\\\\\\n * is distributed among the liquidity providers\\\\\\\\n **/\\\\\\\\n event Acquired(uint256 indexed id, uint256 settlementFee, uint256 premium);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param id The ERC721 token ID linked to the option\\\\\\\\n * @param profit The profits of the option if exercised\\\\\\\\n **/\\\\\\\\n event Exercised(uint256 indexed id, uint256 profit);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param id The ERC721 token ID linked to the option\\\\\\\\n **/\\\\\\\\n event Expired(uint256 indexed id);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param account The liquidity provider\\\'s address\\\\\\\\n * @param trancheID The liquidity tranche ID\\\\\\\\n **/\\\\\\\\n event Withdrawn(\\\\\\\\n address indexed account,\\\\\\\\n uint256 indexed trancheID,\\\\\\\\n uint256 amount\\\\\\\\n );\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param id The ERC721 token ID linked to the option\\\\\\\\n **/\\\\\\\\n function unlock(uint256 id) external;\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param id The ERC721 token ID linked to the option\\\\\\\\n **/\\\\\\\\n function exercise(uint256 id) external;\\\\\\\\n\\\\\\\\n function setLockupPeriod(uint256, uint256) external;\\\\\\\\n\\\\\\\\n function collateralizationRatio() external view returns (uint256);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param value The hedging pool address\\\\\\\\n **/\\\\\\\\n function setHedgePool(address value) external;\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param trancheID The liquidity tranche ID\\\\\\\\n * @return amount The liquidity to be received with\\\\\\\\n * the positive or negative P&L earned or lost during\\\\\\\\n * the period of holding the liquidity tranche considered\\\\\\\\n **/\\\\\\\\n function withdraw(uint256 trancheID) external returns (uint256 amount);\\\\\\\\n\\\\\\\\n function pricer() external view returns (IPriceCalculator);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @return amount The unhedged liquidity size\\\\\\\\n * (unprotected from the losses on selling the options)\\\\\\\\n **/\\\\\\\\n function unhedgedBalance() external view returns (uint256 amount);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @return amount The hedged liquidity size\\\\\\\\n * (protected from the losses on selling the options)\\\\\\\\n **/\\\\\\\\n function hedgedBalance() external view returns (uint256 amount);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param account The liquidity provider\\\'s address\\\\\\\\n * @param amount The size of the liquidity tranche\\\\\\\\n * @param hedged The type of the liquidity tranche\\\\\\\\n * @param minShare The minimum share in the pool of the user\\\\\\\\n **/\\\\\\\\n function provideFrom(\\\\\\\\n address account,\\\\\\\\n uint256 amount,\\\\\\\\n bool hedged,\\\\\\\\n uint256 minShare\\\\\\\\n ) external returns (uint256 share);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param holder The option buyer address\\\\\\\\n * @param period The option period\\\\\\\\n * @param amount The option size\\\\\\\\n * @param strike The option strike\\\\\\\\n **/\\\\\\\\n function sellOption(\\\\\\\\n address holder,\\\\\\\\n uint256 period,\\\\\\\\n uint256 amount,\\\\\\\\n uint256 strike\\\\\\\\n ) external returns (uint256 id);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param trancheID The liquidity tranche ID\\\\\\\\n * @return amount The amount to be received after the withdrawal\\\\\\\\n **/\\\\\\\\n function withdrawWithoutHedge(uint256 trancheID)\\\\\\\\n external\\\\\\\\n returns (uint256 amount);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @return amount The total liquidity provided into the pool\\\\\\\\n **/\\\\\\\\n function totalBalance() external view returns (uint256 amount);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @return amount The total liquidity locked in the pool\\\\\\\\n **/\\\\\\\\n function lockedAmount() external view returns (uint256 amount);\\\\\\\\n\\\\\\\\n function token() external view returns (IERC20);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @return state The state of the option: Invalid, Active, Exercised, Expired\\\\\\\\n * @return strike The option strike\\\\\\\\n * @return amount The option size\\\\\\\\n * @return lockedAmount The option collateral size locked\\\\\\\\n * @return expired The option expiration timestamp\\\\\\\\n * @return hedgePremium The share of the premium paid for hedging from the losses\\\\\\\\n * @return unhedgePremium The share of the premium paid to the hedged liquidity provider\\\\\\\\n **/\\\\\\\\n function options(uint256 id)\\\\\\\\n external\\\\\\\\n view\\\\\\\\n returns (\\\\\\\\n OptionState state,\\\\\\\\n uint256 strike,\\\\\\\\n uint256 amount,\\\\\\\\n uint256 lockedAmount,\\\\\\\\n uint256 expired,\\\\\\\\n uint256 hedgePremium,\\\\\\\\n uint256 unhedgePremium\\\\\\\\n );\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @return state The state of the liquidity tranche: Invalid, Open, Closed\\\\\\\\n * @return share The liquidity provider\\\'s share in the pool\\\\\\\\n * @return amount The size of liquidity provided\\\\\\\\n * @return creationTimestamp The liquidity deposit timestamp\\\\\\\\n * @return hedged The liquidity tranche type: hedged or unhedged (classic)\\\\\\\\n **/\\\\\\\\n function tranches(uint256 id)\\\\\\\\n external\\\\\\\\n view\\\\\\\\n returns (\\\\\\\\n TrancheState state,\\\\\\\\n uint256 share,\\\\\\\\n uint256 amount,\\\\\\\\n uint256 creationTimestamp,\\\\\\\\n bool hedged\\\\\\\\n );\\\\\\\\n}\\\\\\\\n\\\\\\\\ninterface ISettlementFeeRecipient {\\\\\\\\n function distributeUnrealizedRewards() external;\\\\\\\\n}\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @notice The interface for the contract that stakes HEGIC tokens\\\\\\\\n * through buying microlots (any amount of HEGIC tokens per microlot)\\\\\\\\n * and staking lots (888,000 HEGIC per lot), accumulates the staking\\\\\\\\n * rewards (settlement fees) and distributes the staking rewards among\\\\\\\\n * the microlots and staking lots holders (should be claimed manually).\\\\\\\\n **/\\\\\\\\ninterface IHegicStaking is ISettlementFeeRecipient {\\\\\\\\n event Claim(address indexed account, uint256 amount);\\\\\\\\n event Profit(uint256 amount);\\\\\\\\n event MicroLotsAcquired(address indexed account, uint256 amount);\\\\\\\\n event MicroLotsSold(address indexed account, uint256 amount);\\\\\\\\n\\\\\\\\n function claimProfits(address account) external returns (uint256 profit);\\\\\\\\n\\\\\\\\n function buyStakingLot(uint256 amount) external;\\\\\\\\n\\\\\\\\n function sellStakingLot(uint256 amount) external;\\\\\\\\n\\\\\\\\n function profitOf(address account) external view returns (uint256);\\\\\\\\n}\\\\\\\\n\\\\\\\\ninterface IWETH is IERC20 {\\\\\\\\n function deposit() external payable;\\\\\\\\n\\\\\\\\n function withdraw(uint256 value) external;\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x07aeb681d8d7bda767c00a7747893f04c808cd15cf24a954f5a2b0bd02e3be4a\\\\",\\\\"license\\\\":\\\\"GPL-3.0-or-later\\\\"},\\\\"contracts/OptionsManager/IOptionsManager.sol\\\\":{\\\\"content\\\\":\\\\"pragma solidity 0.8.6;\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * SPDX-License-Identifier: GPL-3.0-or-later\\\\\\\\n * Hegic\\\\\\\\n * Copyright (C) 2021 Hegic Protocol\\\\\\\\n *\\\\\\\\n * This program is free software: you can redistribute it and/or modify\\\\\\\\n * it under the terms of the GNU General Public License as published by\\\\\\\\n * the Free Software Foundation, either version 3 of the License, or\\\\\\\\n * (at your option) any later version.\\\\\\\\n *\\\\\\\\n * This program is distributed in the hope that it will be useful,\\\\\\\\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\\\\\\\\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\\\\\\\\n * GNU General Public License for more details.\\\\\\\\n *\\\\\\\\n * You should have received a copy of the GNU General Public License\\\\\\\\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\\\\\\\\n **/\\\\\\\\n\\\\\\\\nimport \\\\\\\\\\\\"@openzeppelin/contracts/token/ERC721/IERC721.sol\\\\\\\\\\\\";\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @notice The interface for the contract\\\\\\\\n * that tokenizes options as ERC721.\\\\\\\\n **/\\\\\\\\n\\\\\\\\ninterface IOptionsManager is IERC721 {\\\\\\\\n /**\\\\\\\\n * @param holder The option buyer address\\\\\\\\n **/\\\\\\\\n function createOptionFor(address holder) external returns (uint256);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param tokenId The ERC721 token ID linked to the option\\\\\\\\n **/\\\\\\\\n function tokenPool(uint256 tokenId) external returns (address pool);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param spender The option buyer address or another address\\\\\\\\n * with the granted permission to buy/exercise options on the user\\\'s behalf\\\\\\\\n * @param tokenId The ERC721 token ID linked to the option\\\\\\\\n **/\\\\\\\\n function isApprovedOrOwner(address spender, uint256 tokenId)\\\\\\\\n external\\\\\\\\n view\\\\\\\\n returns (bool);\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x8112a4f2f84024d8d97414d17306134350b05e55612125d8b863d0b8892d7156\\\\",\\\\"license\\\\":\\\\"GPL-3.0-or-later\\\\"},\\\\"contracts/Pool/IHegicOperationalTreasury.sol\\\\":{\\\\"content\\\\":\\\\"pragma solidity 0.8.6;\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * SPDX-License-Identifier: GPL-3.0-or-later\\\\\\\\n * Hegic\\\\\\\\n * Copyright (C) 2022 Hegic Protocol\\\\\\\\n *\\\\\\\\n * This program is free software: you can redistribute it and/or modify\\\\\\\\n * it under the terms of the GNU General Public License as published by\\\\\\\\n * the Free Software Foundation, either version 3 of the License, or\\\\\\\\n * (at your option) any later version.\\\\\\\\n *\\\\\\\\n * This program is distributed in the hope that it will be useful,\\\\\\\\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\\\\\\\\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\\\\\\\\n * GNU General Public License for more details.\\\\\\\\n *\\\\\\\\n * You should have received a copy of the GNU General Public License\\\\\\\\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\\\\\\\\n **/\\\\\\\\n\\\\\\\\nimport \\\\\\\\\\\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"../OptionsManager/IOptionsManager.sol\\\\\\\\\\\\";\\\\\\\\n\\\\\\\\ninterface IHegicOperationalTreasury {\\\\\\\\n enum LockedLiquidityState {Unlocked, Locked}\\\\\\\\n\\\\\\\\n event Expired(uint256 indexed id);\\\\\\\\n event Paid(uint256 indexed id, address indexed account, uint256 amount);\\\\\\\\n event Replenished(uint256 amount);\\\\\\\\n\\\\\\\\n struct LockedLiquidity {\\\\\\\\n LockedLiquidityState state;\\\\\\\\n address strategy;\\\\\\\\n uint128 amount;\\\\\\\\n uint128 premium;\\\\\\\\n uint32 expiration;\\\\\\\\n }\\\\\\\\n\\\\\\\\n function manager() external view returns (IOptionsManager);\\\\\\\\n\\\\\\\\n function token() external view returns (IERC20);\\\\\\\\n\\\\\\\\n function lockLiquidityFor(\\\\\\\\n address holder,\\\\\\\\n uint128 amount,\\\\\\\\n uint32 expiration\\\\\\\\n ) external returns (uint256 optionID);\\\\\\\\n\\\\\\\\n function payOff(\\\\\\\\n uint256 lockedLiquidityID,\\\\\\\\n uint256 amount,\\\\\\\\n address account\\\\\\\\n ) external;\\\\\\\\n\\\\\\\\n function lockedByStrategy(address strategy)\\\\\\\\n external\\\\\\\\n view\\\\\\\\n returns (uint256 lockedAmount);\\\\\\\\n\\\\\\\\n function getStakeAndCoverBalance() external view returns (uint256 balance);\\\\\\\\n\\\\\\\\n function totalBalance() external view returns (uint256 totalBalance);\\\\\\\\n\\\\\\\\n function lockedPremium() external view returns (uint256 lockedPremium);\\\\\\\\n\\\\\\\\n function benchmark() external view returns (uint256 benchmark);\\\\\\\\n\\\\\\\\n function totalLocked() external view returns (uint256 totalLocked);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @notice Used for unlocking\\\\\\\\n * liquidity after an expiration\\\\\\\\n * @param lockedLiquidityID The option contract ID\\\\\\\\n **/\\\\\\\\n function unlock(uint256 lockedLiquidityID) external;\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0xa09d31298b96864fe45d080d127d650d5fc1b19753bd5b5c8f7036cca9c83745\\\\",\\\\"license\\\\":\\\\"GPL-3.0-or-later\\\\"},\\\\"contracts/Strategies/HegicStrategy.sol\\\\":{\\\\"content\\\\":\\\\"pragma solidity 0.8.6;\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * SPDX-License-Identifier: GPL-3.0-or-later\\\\\\\\n * Hegic\\\\\\\\n * Copyright (C) 2022 Hegic Protocol\\\\\\\\n *\\\\\\\\n * This program is free software: you can redistribute it and/or modify\\\\\\\\n * it under the terms of the GNU General Public License as published by\\\\\\\\n * the Free Software Foundation, either version 3 of the License, or\\\\\\\\n * (at your option) any later version.\\\\\\\\n *\\\\\\\\n * This program is distributed in the hope that it will be useful,\\\\\\\\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\\\\\\\\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\\\\\\\\n * GNU General Public License for more details.\\\\\\\\n *\\\\\\\\n * You should have received a copy of the GNU General Public License\\\\\\\\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\\\\\\\\n **/\\\\\\\\n\\\\\\\\nimport \\\\\\\\\\\\"@chainlink/contracts/src/v0.7/interfaces/AggregatorV3Interface.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"../Interfaces/Interfaces.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"../Pool/IHegicOperationalTreasury.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"@openzeppelin/contracts/security/ReentrancyGuard.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"./IHegicStrategy.sol\\\\\\\\\\\\";\\\\\\\\n\\\\\\\\nabstract contract HegicStrategy is Ownable, IHegicStrategy, ReentrancyGuard {\\\\\\\\n using SafeERC20 for IERC20;\\\\\\\\n\\\\\\\\n IHegicOperationalTreasury public immutable pool;\\\\\\\\n AggregatorV3Interface public immutable priceProvider;\\\\\\\\n uint8 public collateralizationRatio;\\\\\\\\n uint256 public override lockedLimit;\\\\\\\\n IPremiumCalculator public pricer;\\\\\\\\n uint256 internal immutable spotDecimals; // 1e18\\\\\\\\n\\\\\\\\n uint256 private constant K_DECIMALS = 100;\\\\\\\\n uint256 public k = 100;\\\\\\\\n\\\\\\\\n struct StrategyData {\\\\\\\\n uint128 amount;\\\\\\\\n uint128 strike;\\\\\\\\n }\\\\\\\\n mapping(uint256 => StrategyData) public strategyData;\\\\\\\\n\\\\\\\\n constructor(\\\\\\\\n IHegicOperationalTreasury _pool,\\\\\\\\n AggregatorV3Interface _priceProvider,\\\\\\\\n IPremiumCalculator _pricer,\\\\\\\\n uint8 _collateralizationRatio,\\\\\\\\n uint256 limit,\\\\\\\\n uint8 _spotDecimals\\\\\\\\n ) {\\\\\\\\n pricer = _pricer;\\\\\\\\n pool = _pool;\\\\\\\\n priceProvider = _priceProvider;\\\\\\\\n collateralizationRatio = _collateralizationRatio;\\\\\\\\n lockedLimit = limit;\\\\\\\\n spotDecimals = 10**_spotDecimals;\\\\\\\\n }\\\\\\\\n\\\\\\\\n function setPricer(IPremiumCalculator value) external onlyOwner {\\\\\\\\n pricer = value;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @notice Used for setting a limit\\\\\\\\n * on the total locked liquidity\\\\\\\\n * @param value The maximum locked liquidity\\\\\\\\n **/\\\\\\\\n function setLimit(uint256 value) external onlyOwner {\\\\\\\\n lockedLimit = value;\\\\\\\\n emit SetLimit(value);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @notice Used for viewing the total liquidity\\\\\\\\n * locked up for a specific options strategy\\\\\\\\n **/\\\\\\\\n function getLockedByStrategy()\\\\\\\\n external\\\\\\\\n view\\\\\\\\n override\\\\\\\\n returns (uint256 amount)\\\\\\\\n {\\\\\\\\n return pool.lockedByStrategy(address(this));\\\\\\\\n }\\\\\\\\n\\\\\\\\n function _getAvailableContracts(uint32 period, uint256 strike)\\\\\\\\n internal\\\\\\\\n view\\\\\\\\n virtual\\\\\\\\n returns (uint256 available)\\\\\\\\n {\\\\\\\\n uint256 totalAvailableBalance =\\\\\\\\n pool.getStakeAndCoverBalance() +\\\\\\\\n pool.totalBalance() -\\\\\\\\n pool.totalLocked() -\\\\\\\\n pool.lockedPremium();\\\\\\\\n uint256 availableBalance =\\\\\\\\n lockedLimit - pool.lockedByStrategy(address(this));\\\\\\\\n if (strike == 0) strike = _currentPrice();\\\\\\\\n uint256 lockedAmount =\\\\\\\\n _calculateLockedAmount(uint128(spotDecimals), period, strike);\\\\\\\\n if (availableBalance > totalAvailableBalance) {\\\\\\\\n return (totalAvailableBalance * spotDecimals) / lockedAmount;\\\\\\\\n }\\\\\\\\n return (availableBalance * spotDecimals) / lockedAmount;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @notice Used for buying options/strategies\\\\\\\\n * @param holder The holder address\\\\\\\\n * @param period The option/strategy period\\\\\\\\n * @param amount The option/strategy amount\\\\\\\\n * @param strike The option/strategy strike\\\\\\\\n **/\\\\\\\\n function buy(\\\\\\\\n address holder,\\\\\\\\n uint32 period,\\\\\\\\n uint128 amount,\\\\\\\\n uint256 strike\\\\\\\\n ) external virtual nonReentrant returns (uint256 id) {\\\\\\\\n if (strike == 0) strike = _currentPrice();\\\\\\\\n uint256 premium = _calculatePremium(period, amount, strike);\\\\\\\\n uint128 lockedAmount = _calculateLockedAmount(amount, period, strike);\\\\\\\\n\\\\\\\\n require(\\\\\\\\n pool.lockedByStrategy(address(this)) + lockedAmount <= lockedLimit,\\\\\\\\n \\\\\\\\\\\\"HegicStrategy: The limit is exceeded\\\\\\\\\\\\"\\\\\\\\n );\\\\\\\\n\\\\\\\\n pool.token().safeTransferFrom(msg.sender, address(pool), premium);\\\\\\\\n\\\\\\\\n uint32 expiration = uint32(block.timestamp + period);\\\\\\\\n id = pool.lockLiquidityFor(holder, lockedAmount, expiration);\\\\\\\\n strategyData[id] = StrategyData(uint128(amount), uint128(strike));\\\\\\\\n emit Acquired(id, amount, premium, strike, expiration);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @notice Used for exercising an in-the-money\\\\\\\\n * option/strategy and taking profits\\\\\\\\n * @param optionID The option/strategy ID\\\\\\\\n **/\\\\\\\\n function exercise(uint256 optionID) external {\\\\\\\\n uint256 amount = _profitOf(optionID);\\\\\\\\n require(\\\\\\\\n pool.manager().isApprovedOrOwner(msg.sender, optionID),\\\\\\\\n \\\\\\\\\\\\"HegicStrategy: Msg.sender can\\\'t exercise this option\\\\\\\\\\\\"\\\\\\\\n );\\\\\\\\n require(amount > 0, \\\\\\\\\\\\"HegicStrategy: The profit is zero\\\\\\\\\\\\");\\\\\\\\n pool.payOff(optionID, amount, pool.manager().ownerOf(optionID));\\\\\\\\n }\\\\\\\\n\\\\\\\\n function _calculateLockedAmount(\\\\\\\\n uint128 amount,\\\\\\\\n uint32 period,\\\\\\\\n uint256 strike\\\\\\\\n ) internal view virtual returns (uint128 lockedAmount) {\\\\\\\\n return\\\\\\\\n uint128(\\\\\\\\n (pricer.calculatePremium(\\\\\\\\n uint32(period),\\\\\\\\n uint128(amount),\\\\\\\\n strike\\\\\\\\n ) * k) / K_DECIMALS\\\\\\\\n );\\\\\\\\n }\\\\\\\\n\\\\\\\\n function _calculatePremium(\\\\\\\\n uint256 period,\\\\\\\\n uint256 amount,\\\\\\\\n uint256 strike\\\\\\\\n ) internal view virtual returns (uint256 premium) {\\\\\\\\n if (strike == 0) strike = _currentPrice();\\\\\\\\n premium = pricer.calculatePremium(period, amount, strike);\\\\\\\\n }\\\\\\\\n\\\\\\\\n function calculatePremium(\\\\\\\\n uint32 period,\\\\\\\\n uint256 amount,\\\\\\\\n uint256 strike\\\\\\\\n ) external view returns (uint256 premium, uint256 available) {\\\\\\\\n premium = _calculatePremium(period, amount, strike);\\\\\\\\n available = _getAvailableContracts(period, strike);\\\\\\\\n }\\\\\\\\n\\\\\\\\n function _profitOf(uint256 optionID)\\\\\\\\n internal\\\\\\\\n view\\\\\\\\n virtual\\\\\\\\n returns (uint256 profit);\\\\\\\\n\\\\\\\\n function _currentPrice() internal view returns (uint256 price) {\\\\\\\\n (, int256 latestPrice, , , ) = priceProvider.latestRoundData();\\\\\\\\n price = uint256(latestPrice);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @notice Used for calculating the holder\\\'s\\\\\\\\n * option/strategy unrealized profits\\\\\\\\n * @param optionID The option/strategy ID\\\\\\\\n * @param amount The unrealized profits amount\\\\\\\\n **/\\\\\\\\n function profitOf(uint256 optionID) external view returns (uint256 amount) {\\\\\\\\n return _profitOf(optionID);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @notice Used for setting the collateralization coefficient\\\\\\\\n * @param value The collateralization coefficient\\\\\\\\n **/\\\\\\\\n function setK(uint256 value) external onlyOwner {\\\\\\\\n k = value;\\\\\\\\n }\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x47316928b2d6e8d7d43a04f9d07d3987b3c036869f158b8181a8557ff8342345\\\\",\\\\"license\\\\":\\\\"GPL-3.0-or-later\\\\"},\\\\"contracts/Strategies/HegicStrategySpreadCall.sol\\\\":{\\\\"content\\\\":\\\\"pragma solidity 0.8.6;\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * SPDX-License-Identifier: GPL-3.0-or-later\\\\\\\\n * Hegic\\\\\\\\n * Copyright (C) 2022 Hegic Protocol\\\\\\\\n *\\\\\\\\n * This program is free software: you can redistribute it and/or modify\\\\\\\\n * it under the terms of the GNU General Public License as published by\\\\\\\\n * the Free Software Foundation, either version 3 of the License, or\\\\\\\\n * (at your option) any later version.\\\\\\\\n *\\\\\\\\n * This program is distributed in the hope that it will be useful,\\\\\\\\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\\\\\\\\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\\\\\\\\n * GNU General Public License for more details.\\\\\\\\n *\\\\\\\\n * You should have received a copy of the GNU General Public License\\\\\\\\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\\\\\\\\n **/\\\\\\\\n\\\\\\\\nimport \\\\\\\\\\\\"./HegicStrategy.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"../Interfaces/Interfaces.sol\\\\\\\\\\\\";\\\\\\\\n\\\\\\\\ncontract HegicStrategySpreadCall is HegicStrategy {\\\\\\\\n using SafeERC20 for IERC20;\\\\\\\\n // uint256 private immutable spotDecimals; // 1e18\\\\\\\\n uint256 private constant TOKEN_DECIMALS = 1e6; // 1e6\\\\\\\\n uint8 internal roundedDecimals;\\\\\\\\n uint256 public strikePercentage;\\\\\\\\n\\\\\\\\n constructor(\\\\\\\\n IHegicOperationalTreasury _pool,\\\\\\\\n AggregatorV3Interface _priceProvider,\\\\\\\\n IPremiumCalculator _pricer,\\\\\\\\n uint8 _spotDecimals,\\\\\\\\n uint256 limit,\\\\\\\\n uint256 percentage,\\\\\\\\n uint8 _roundedDecimals\\\\\\\\n ) HegicStrategy(_pool, _priceProvider, _pricer, 10, limit, _spotDecimals) {\\\\\\\\n strikePercentage = percentage;\\\\\\\\n roundedDecimals = _roundedDecimals;\\\\\\\\n }\\\\\\\\n\\\\\\\\n function _profitOf(uint256 optionID)\\\\\\\\n internal\\\\\\\\n view\\\\\\\\n override\\\\\\\\n returns (uint256 amount)\\\\\\\\n {\\\\\\\\n StrategyData memory data = strategyData[optionID];\\\\\\\\n uint256 currentPrice = _currentPrice();\\\\\\\\n uint256 otmStrike =\\\\\\\\n round((data.strike * strikePercentage) / 100, roundedDecimals);\\\\\\\\n uint256 priceDecimals = 10**priceProvider.decimals();\\\\\\\\n if (currentPrice > data.strike && currentPrice < otmStrike) {\\\\\\\\n return\\\\\\\\n ((currentPrice - data.strike) * data.amount * TOKEN_DECIMALS) /\\\\\\\\n spotDecimals /\\\\\\\\n priceDecimals;\\\\\\\\n } else if (currentPrice > data.strike && currentPrice > otmStrike) {\\\\\\\\n return\\\\\\\\n ((otmStrike - data.strike) * data.amount * TOKEN_DECIMALS) /\\\\\\\\n spotDecimals /\\\\\\\\n priceDecimals;\\\\\\\\n }\\\\\\\\n return 0;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @notice Used for buying options/strategies\\\\\\\\n * @param holder The holder address\\\\\\\\n * @param period The option/strategy period\\\\\\\\n * @param amount The option/strategy amount\\\\\\\\n * @param strike The option/strategy strike\\\\\\\\n **/\\\\\\\\n function buy(\\\\\\\\n address holder,\\\\\\\\n uint32 period,\\\\\\\\n uint128 amount,\\\\\\\\n uint256 strike\\\\\\\\n ) external override nonReentrant returns (uint256 id) {\\\\\\\\n if (strike == 0) strike = _currentPrice();\\\\\\\\n uint256 premium = _calculatePremium(period, amount, strike);\\\\\\\\n uint128 lockedAmount = _calculateLockedAmount(amount, period, strike);\\\\\\\\n uint256 otmStrike =\\\\\\\\n round((strike * strikePercentage) / 100, roundedDecimals);\\\\\\\\n\\\\\\\\n require(\\\\\\\\n pool.lockedByStrategy(address(this)) + lockedAmount <= lockedLimit,\\\\\\\\n \\\\\\\\\\\\"HegicStrategy: The limit is exceeded\\\\\\\\\\\\"\\\\\\\\n );\\\\\\\\n\\\\\\\\n pool.token().safeTransferFrom(msg.sender, address(pool), premium);\\\\\\\\n\\\\\\\\n uint32 expiration = uint32(block.timestamp + period);\\\\\\\\n id = pool.lockLiquidityFor(holder, lockedAmount, expiration);\\\\\\\\n strategyData[id] = StrategyData(uint128(amount), uint128(strike));\\\\\\\\n emit AcquiredSpread(id, amount, premium, strike, otmStrike, expiration);\\\\\\\\n }\\\\\\\\n\\\\\\\\n function round(uint256 value, uint8 decimals)\\\\\\\\n public\\\\\\\\n pure\\\\\\\\n returns (uint256 roundedValue)\\\\\\\\n {\\\\\\\\n uint256 a = value / 10**(decimals - 1);\\\\\\\\n if (a % 10 < 5) return (a / 10) * 10**decimals;\\\\\\\\n return (a / 10 + 1) * 10**decimals;\\\\\\\\n }\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0xf208f8d2617f32c7989bb5a168f0e945e586dc5c9904dd1742306dba0a4c311d\\\\",\\\\"license\\\\":\\\\"GPL-3.0-or-later\\\\"},\\\\"contracts/Strategies/IHegicStrategy.sol\\\\":{\\\\"content\\\\":\\\\"pragma solidity 0.8.6;\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * SPDX-License-Identifier: GPL-3.0-or-later\\\\\\\\n * Hegic\\\\\\\\n * Copyright (C) 2022 Hegic Protocol\\\\\\\\n *\\\\\\\\n * This program is free software: you can redistribute it and/or modify\\\\\\\\n * it under the terms of the GNU General Public License as published by\\\\\\\\n * the Free Software Foundation, either version 3 of the License, or\\\\\\\\n * (at your option) any later version.\\\\\\\\n *\\\\\\\\n * This program is distributed in the hope that it will be useful,\\\\\\\\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\\\\\\\\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\\\\\\\\n * GNU General Public License for more details.\\\\\\\\n *\\\\\\\\n * You should have received a copy of the GNU General Public License\\\\\\\\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\\\\\\\\n **/\\\\\\\\n\\\\\\\\ninterface IHegicStrategy {\\\\\\\\n event Acquired(\\\\\\\\n uint256 indexed id,\\\\\\\\n uint256 amount,\\\\\\\\n uint256 premium,\\\\\\\\n uint256 strike,\\\\\\\\n uint32 expiration\\\\\\\\n );\\\\\\\\n\\\\\\\\n event AcquiredStrangle(\\\\\\\\n uint256 indexed id,\\\\\\\\n uint256 amount,\\\\\\\\n uint256 premium,\\\\\\\\n uint256 callStrike,\\\\\\\\n uint256 putStrike,\\\\\\\\n uint32 expiration\\\\\\\\n );\\\\\\\\n\\\\\\\\n event AcquiredSpread(\\\\\\\\n uint256 indexed id,\\\\\\\\n uint256 amount,\\\\\\\\n uint256 premium,\\\\\\\\n uint256 atmStrike,\\\\\\\\n uint256 otmStrike,\\\\\\\\n uint32 expiration\\\\\\\\n );\\\\\\\\n\\\\\\\\n event SetLimit(uint256 limit);\\\\\\\\n\\\\\\\\n function getLockedByStrategy() external view returns (uint256 amount);\\\\\\\\n\\\\\\\\n function lockedLimit() external view returns (uint256 lockedLimit);\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x6cc1a6057f3eb6573548f4c6bae9307b3f943c338f448259a1723af150d0e572\\\\",\\\\"license\\\\":\\\\"GPL-3.0-or-later\\\\"}},\\\\"version\\\\":1}","bytecode":"0x60e060405260646005553480156200001657600080fd5b50604051620020ce380380620020ce83398101604081905262000039916200013d565b868686600a86886200004b33620000d6565b60018055600480546001600160a01b0319166001600160a01b038616179055606086811b6001600160601b03199081166080529086901b1660a0526002805460ff191660ff85161790556003829055620000a781600a62000211565b60c05250505060089490945550506007805460ff191660ff92909216919091179055506200030e945050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b805160ff811681146200013857600080fd5b919050565b600080600080600080600060e0888a0312156200015957600080fd5b87516200016681620002f5565b60208901519097506200017981620002f5565b60408901519096506200018c81620002f5565b94506200019c6060890162000126565b93506080880151925060a08801519150620001ba60c0890162000126565b905092959891949750929550565b600181815b8085111562000209578160001904821115620001ed57620001ed620002df565b80851615620001fb57918102915b93841c9390800290620001cd565b509250929050565b60006200022260ff84168362000229565b9392505050565b6000826200023a57506001620002d9565b816200024957506000620002d9565b81600181146200026257600281146200026d576200028d565b6001915050620002d9565b60ff841115620002815762000281620002df565b50506001821b620002d9565b5060208310610133831016604e8410600b8410161715620002b2575081810a620002d9565b620002be8383620001c8565b8060001904821115620002d557620002d5620002df565b0290505b92915050565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b03811681146200030b57600080fd5b50565b60805160601c60a05160601c60c051611d05620003c9600039600081816111ad015281816111ec0152818161122b015281816113dd015261146801526000818161024f0152818161131e01526114c3015260008181610152015281816104970152818161066b0152818161069c015281816108be01528181610a3501528181610b1901528181610b3b01528181610c2a01528181610e8a01528181610f1b01528181610fac0152818161103d015261110d0152611d056000f3fe608060405234801561001057600080fd5b506004361061012c5760003560e01c8063b07f0a41116100ad578063d3d5c12111610071578063d3d5c1211461028c578063d6c8d1b414610295578063da3c1a76146102e9578063dcaf9c44146102fc578063f2fde38b1461031b57600080fd5b8063b07f0a411461022e578063b4f40c6114610241578063b888879e1461024a578063cd6b9d2814610271578063d03d4aee1461028457600080fd5b806367de8be9116100f457806367de8be9146101dc578063715018a6146101ef5780637632bffb146101f75780638da5cb5b1461020a578063a6138ed91461021b57600080fd5b806310ca5c0f1461013157806316f0115b1461014d57806327ea6f2b1461018c57806329390370146101a1578063370a6ae6146101b4575b600080fd5b61013a60085481565b6040519081526020015b60405180910390f35b6101747f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610144565b61019f61019a366004611946565b61032e565b005b61019f6101af36600461188f565b61039c565b6101c76101c23660046119a8565b6103e8565b60408051928352602083019190915201610144565b61019f6101ea366004611946565b610412565b61019f610441565b61013a610205366004611946565b610477565b6000546001600160a01b0316610174565b600454610174906001600160a01b031681565b61019f61023c366004611946565b610488565b61013a60055481565b6101747f000000000000000000000000000000000000000000000000000000000000000081565b61013a61027f366004611978565b610813565b61013a6108a6565b61013a60035481565b6102c96102a3366004611946565b6006602052600090815260409020546001600160801b0380821691600160801b90041682565b604080516001600160801b03938416815292909116602083015201610144565b61013a6102f73660046118c9565b610945565b6002546103099060ff1681565b60405160ff9091168152602001610144565b61019f61032936600461188f565b610d50565b6000546001600160a01b031633146103615760405162461bcd60e51b815260040161035890611a97565b60405180910390fd5b60038190556040518181527f479881bf41e329f328c21c2cbb11514b05a021cd33ea4e5a576ea6bc03874fd69060200160405180910390a150565b6000546001600160a01b031633146103c65760405162461bcd60e51b815260040161035890611a97565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6000806103fc8563ffffffff168585610deb565b91506104088584610e85565b9050935093915050565b6000546001600160a01b0316331461043c5760405162461bcd60e51b815260040161035890611a97565b600555565b6000546001600160a01b0316331461046b5760405162461bcd60e51b815260040161035890611a97565b6104756000611264565b565b6000610482826112b4565b92915050565b6000610493826112b4565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663481c6a756040518163ffffffff1660e01b815260040160206040518083038186803b1580156104ee57600080fd5b505afa158015610502573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061052691906118ac565b60405163430c208160e01b8152336004820152602481018490526001600160a01b03919091169063430c20819060440160206040518083038186803b15801561056e57600080fd5b505afa158015610582573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a69190611924565b61060f5760405162461bcd60e51b815260206004820152603460248201527f486567696353747261746567793a204d73672e73656e6465722063616e27742060448201527332bc32b931b4b9b2903a3434b99037b83a34b7b760611b6064820152608401610358565b600081116106695760405162461bcd60e51b815260206004820152602160248201527f486567696353747261746567793a205468652070726f666974206973207a65726044820152606f60f81b6064820152608401610358565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638127f0a183837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663481c6a756040518163ffffffff1660e01b815260040160206040518083038186803b1580156106f357600080fd5b505afa158015610707573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072b91906118ac565b6001600160a01b0316636352211e876040518263ffffffff1660e01b815260040161075891815260200190565b60206040518083038186803b15801561077057600080fd5b505afa158015610784573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a891906118ac565b6040516001600160e01b031960e086901b168152600481019390935260248301919091526001600160a01b03166044820152606401600060405180830381600087803b1580156107f757600080fd5b505af115801561080b573d6000803e3d6000fd5b505050505050565b600080610821600184611c1c565b61082c90600a611b3b565b6108369085611ae4565b90506005610845600a83611c6b565b10156108735761085683600a611b3b565b610861600a83611ae4565b61086b9190611be6565b915050610482565b61087e83600a611b3b565b610889600a83611ae4565b610894906001611acc565b61089e9190611be6565b949350505050565b604051634485558360e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063448555839060240160206040518083038186803b15801561090857600080fd5b505afa15801561091c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610940919061195f565b905090565b60006002600154141561099a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610358565b6002600155816109af576109ac6114be565b91505b60006109cb8563ffffffff16856001600160801b031685610deb565b905060006109da85878661155d565b90506000610a066064600854876109f19190611be6565b6109fb9190611ae4565b60075460ff16610813565b600354604051634485558360e01b8152306004820152919250906001600160801b038416906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063448555839060240160206040518083038186803b158015610a7757600080fd5b505afa158015610a8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aaf919061195f565b610ab99190611acc565b1115610b135760405162461bcd60e51b8152602060048201526024808201527f486567696353747261746567793a20546865206c696d697420697320657863656044820152631959195960e21b6064820152608401610358565b610bdb337f0000000000000000000000000000000000000000000000000000000000000000857f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610b9257600080fd5b505afa158015610ba6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bca91906118ac565b6001600160a01b031692919061161a565b6000610bed63ffffffff891642611acc565b60405163d6a6367760e01b81526001600160a01b038b811660048301526001600160801b038616602483015263ffffffff831660448301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d6a6367790606401602060405180830381600087803b158015610c7057600080fd5b505af1158015610c84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca8919061195f565b6040805180820182526001600160801b038a81168083528a82166020808501918252600087815260068252869020945191518416600160801b029190931617909255825191825281018790529081018890526060810184905263ffffffff8316608082015290955085907ff5651c3e067cd659a7ed5d7301e821e52fa3eb7e1618b8bf63ab265f5844c5a29060a00160405180910390a2505060018055509095945050505050565b6000546001600160a01b03163314610d7a5760405162461bcd60e51b815260040161035890611a97565b6001600160a01b038116610ddf5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610358565b610de881611264565b50565b600081610dfd57610dfa6114be565b91505b6004805460405163055bc75d60e21b815291820186905260248201859052604482018490526001600160a01b03169063156f1d749060640160206040518083038186803b158015610e4d57600080fd5b505afa158015610e61573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089e919061195f565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663797be55e6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ee157600080fd5b505afa158015610ef5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f19919061195f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663568914126040518163ffffffff1660e01b815260040160206040518083038186803b158015610f7257600080fd5b505afa158015610f86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610faa919061195f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad7a672f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561100357600080fd5b505afa158015611017573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103b919061195f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166346067d696040518163ffffffff1660e01b815260040160206040518083038186803b15801561109457600080fd5b505afa1580156110a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110cc919061195f565b6110d69190611acc565b6110e09190611c05565b6110ea9190611c05565b604051634485558360e01b81523060048201529091506000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063448555839060240160206040518083038186803b15801561114f57600080fd5b505afa158015611163573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611187919061195f565b6003546111949190611c05565b9050836111a6576111a36114be565b93505b60006111d37f0000000000000000000000000000000000000000000000000000000000000000878761155d565b6001600160801b031690508282111561122557806112117f000000000000000000000000000000000000000000000000000000000000000085611be6565b61121b9190611ae4565b9350505050610482565b806112507f000000000000000000000000000000000000000000000000000000000000000084611be6565b61125a9190611ae4565b9695505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008181526006602090815260408083208151808301909252546001600160801b038082168352600160801b9091041691810191909152816112f46114be565b90506000611318606460085485602001516001600160801b03166109f19190611be6565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561137557600080fd5b505afa158015611389573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ad9190611a2b565b6113b890600a611b3b565b905083602001516001600160801b0316831180156113d557508183105b1561144557807f0000000000000000000000000000000000000000000000000000000000000000620f424086600001516001600160801b031687602001516001600160801b0316876114279190611c05565b6114319190611be6565b61143b9190611be6565b6112509190611ae4565b83602001516001600160801b03168311801561146057508183115b156114b257807f0000000000000000000000000000000000000000000000000000000000000000620f424086600001516001600160801b031687602001516001600160801b0316866114279190611c05565b50600095945050505050565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b15801561151a57600080fd5b505afa15801561152e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155291906119db565b509195945050505050565b6005546004805460405163055bc75d60e21b815263ffffffff8616928101929092526001600160801b03861660248301526044820184905260009260649290916001600160a01b03169063156f1d7490840160206040518083038186803b1580156115c757600080fd5b505afa1580156115db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ff919061195f565b6116099190611be6565b61089e9190611ae4565b9392505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261167490859061167a565b50505050565b60006116cf826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166117519092919063ffffffff16565b80519091501561174c57808060200190518101906116ed9190611924565b61174c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610358565b505050565b606061089e848460008585843b6117aa5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610358565b600080866001600160a01b031685876040516117c69190611a48565b60006040518083038185875af1925050503d8060008114611803576040519150601f19603f3d011682016040523d82523d6000602084013e611808565b606091505b5091509150611818828286611823565b979650505050505050565b60608315611832575081611613565b8251156118425782518084602001fd5b8160405162461bcd60e51b81526004016103589190611a64565b803563ffffffff8116811461187057600080fd5b919050565b805169ffffffffffffffffffff8116811461187057600080fd5b6000602082840312156118a157600080fd5b813561161381611cab565b6000602082840312156118be57600080fd5b815161161381611cab565b600080600080608085870312156118df57600080fd5b84356118ea81611cab565b93506118f86020860161185c565b925060408501356001600160801b038116811461191457600080fd5b9396929550929360600135925050565b60006020828403121561193657600080fd5b8151801515811461161357600080fd5b60006020828403121561195857600080fd5b5035919050565b60006020828403121561197157600080fd5b5051919050565b6000806040838503121561198b57600080fd5b82359150602083013561199d81611cc0565b809150509250929050565b6000806000606084860312156119bd57600080fd5b6119c68461185c565b95602085013595506040909401359392505050565b600080600080600060a086880312156119f357600080fd5b6119fc86611875565b9450602086015193506040860151925060608601519150611a1f60808701611875565b90509295509295909350565b600060208284031215611a3d57600080fd5b815161161381611cc0565b60008251611a5a818460208701611c3f565b9190910192915050565b6020815260008251806020840152611a83816040850160208701611c3f565b601f01601f19169190910160400192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115611adf57611adf611c7f565b500190565b600082611af357611af3611c95565b500490565b600181815b80851115611b33578160001904821115611b1957611b19611c7f565b80851615611b2657918102915b93841c9390800290611afd565b509250929050565b600061161360ff841683600082611b5457506001610482565b81611b6157506000610482565b8160018114611b775760028114611b8157611b9d565b6001915050610482565b60ff841115611b9257611b92611c7f565b50506001821b610482565b5060208310610133831016604e8410600b8410161715611bc0575081810a610482565b611bca8383611af8565b8060001904821115611bde57611bde611c7f565b029392505050565b6000816000190483118215151615611c0057611c00611c7f565b500290565b600082821015611c1757611c17611c7f565b500390565b600060ff821660ff841680821015611c3657611c36611c7f565b90039392505050565b60005b83811015611c5a578181015183820152602001611c42565b838111156116745750506000910152565b600082611c7a57611c7a611c95565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6001600160a01b0381168114610de857600080fd5b60ff81168114610de857600080fdfea2646970667358221220225897f4ce9db505110bf2227d285097a881cbe34856e6e39fb4bfd593b0b84864736f6c63430008060033","deployedBytecode":"0x608060405234801561001057600080fd5b506004361061012c5760003560e01c8063b07f0a41116100ad578063d3d5c12111610071578063d3d5c1211461028c578063d6c8d1b414610295578063da3c1a76146102e9578063dcaf9c44146102fc578063f2fde38b1461031b57600080fd5b8063b07f0a411461022e578063b4f40c6114610241578063b888879e1461024a578063cd6b9d2814610271578063d03d4aee1461028457600080fd5b806367de8be9116100f457806367de8be9146101dc578063715018a6146101ef5780637632bffb146101f75780638da5cb5b1461020a578063a6138ed91461021b57600080fd5b806310ca5c0f1461013157806316f0115b1461014d57806327ea6f2b1461018c57806329390370146101a1578063370a6ae6146101b4575b600080fd5b61013a60085481565b6040519081526020015b60405180910390f35b6101747f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610144565b61019f61019a366004611946565b61032e565b005b61019f6101af36600461188f565b61039c565b6101c76101c23660046119a8565b6103e8565b60408051928352602083019190915201610144565b61019f6101ea366004611946565b610412565b61019f610441565b61013a610205366004611946565b610477565b6000546001600160a01b0316610174565b600454610174906001600160a01b031681565b61019f61023c366004611946565b610488565b61013a60055481565b6101747f000000000000000000000000000000000000000000000000000000000000000081565b61013a61027f366004611978565b610813565b61013a6108a6565b61013a60035481565b6102c96102a3366004611946565b6006602052600090815260409020546001600160801b0380821691600160801b90041682565b604080516001600160801b03938416815292909116602083015201610144565b61013a6102f73660046118c9565b610945565b6002546103099060ff1681565b60405160ff9091168152602001610144565b61019f61032936600461188f565b610d50565b6000546001600160a01b031633146103615760405162461bcd60e51b815260040161035890611a97565b60405180910390fd5b60038190556040518181527f479881bf41e329f328c21c2cbb11514b05a021cd33ea4e5a576ea6bc03874fd69060200160405180910390a150565b6000546001600160a01b031633146103c65760405162461bcd60e51b815260040161035890611a97565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6000806103fc8563ffffffff168585610deb565b91506104088584610e85565b9050935093915050565b6000546001600160a01b0316331461043c5760405162461bcd60e51b815260040161035890611a97565b600555565b6000546001600160a01b0316331461046b5760405162461bcd60e51b815260040161035890611a97565b6104756000611264565b565b6000610482826112b4565b92915050565b6000610493826112b4565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663481c6a756040518163ffffffff1660e01b815260040160206040518083038186803b1580156104ee57600080fd5b505afa158015610502573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061052691906118ac565b60405163430c208160e01b8152336004820152602481018490526001600160a01b03919091169063430c20819060440160206040518083038186803b15801561056e57600080fd5b505afa158015610582573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a69190611924565b61060f5760405162461bcd60e51b815260206004820152603460248201527f486567696353747261746567793a204d73672e73656e6465722063616e27742060448201527332bc32b931b4b9b2903a3434b99037b83a34b7b760611b6064820152608401610358565b600081116106695760405162461bcd60e51b815260206004820152602160248201527f486567696353747261746567793a205468652070726f666974206973207a65726044820152606f60f81b6064820152608401610358565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638127f0a183837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663481c6a756040518163ffffffff1660e01b815260040160206040518083038186803b1580156106f357600080fd5b505afa158015610707573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072b91906118ac565b6001600160a01b0316636352211e876040518263ffffffff1660e01b815260040161075891815260200190565b60206040518083038186803b15801561077057600080fd5b505afa158015610784573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a891906118ac565b6040516001600160e01b031960e086901b168152600481019390935260248301919091526001600160a01b03166044820152606401600060405180830381600087803b1580156107f757600080fd5b505af115801561080b573d6000803e3d6000fd5b505050505050565b600080610821600184611c1c565b61082c90600a611b3b565b6108369085611ae4565b90506005610845600a83611c6b565b10156108735761085683600a611b3b565b610861600a83611ae4565b61086b9190611be6565b915050610482565b61087e83600a611b3b565b610889600a83611ae4565b610894906001611acc565b61089e9190611be6565b949350505050565b604051634485558360e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063448555839060240160206040518083038186803b15801561090857600080fd5b505afa15801561091c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610940919061195f565b905090565b60006002600154141561099a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610358565b6002600155816109af576109ac6114be565b91505b60006109cb8563ffffffff16856001600160801b031685610deb565b905060006109da85878661155d565b90506000610a066064600854876109f19190611be6565b6109fb9190611ae4565b60075460ff16610813565b600354604051634485558360e01b8152306004820152919250906001600160801b038416906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063448555839060240160206040518083038186803b158015610a7757600080fd5b505afa158015610a8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aaf919061195f565b610ab99190611acc565b1115610b135760405162461bcd60e51b8152602060048201526024808201527f486567696353747261746567793a20546865206c696d697420697320657863656044820152631959195960e21b6064820152608401610358565b610bdb337f0000000000000000000000000000000000000000000000000000000000000000857f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610b9257600080fd5b505afa158015610ba6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bca91906118ac565b6001600160a01b031692919061161a565b6000610bed63ffffffff891642611acc565b60405163d6a6367760e01b81526001600160a01b038b811660048301526001600160801b038616602483015263ffffffff831660448301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d6a6367790606401602060405180830381600087803b158015610c7057600080fd5b505af1158015610c84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca8919061195f565b6040805180820182526001600160801b038a81168083528a82166020808501918252600087815260068252869020945191518416600160801b029190931617909255825191825281018790529081018890526060810184905263ffffffff8316608082015290955085907ff5651c3e067cd659a7ed5d7301e821e52fa3eb7e1618b8bf63ab265f5844c5a29060a00160405180910390a2505060018055509095945050505050565b6000546001600160a01b03163314610d7a5760405162461bcd60e51b815260040161035890611a97565b6001600160a01b038116610ddf5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610358565b610de881611264565b50565b600081610dfd57610dfa6114be565b91505b6004805460405163055bc75d60e21b815291820186905260248201859052604482018490526001600160a01b03169063156f1d749060640160206040518083038186803b158015610e4d57600080fd5b505afa158015610e61573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089e919061195f565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663797be55e6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ee157600080fd5b505afa158015610ef5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f19919061195f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663568914126040518163ffffffff1660e01b815260040160206040518083038186803b158015610f7257600080fd5b505afa158015610f86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610faa919061195f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad7a672f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561100357600080fd5b505afa158015611017573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103b919061195f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166346067d696040518163ffffffff1660e01b815260040160206040518083038186803b15801561109457600080fd5b505afa1580156110a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110cc919061195f565b6110d69190611acc565b6110e09190611c05565b6110ea9190611c05565b604051634485558360e01b81523060048201529091506000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063448555839060240160206040518083038186803b15801561114f57600080fd5b505afa158015611163573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611187919061195f565b6003546111949190611c05565b9050836111a6576111a36114be565b93505b60006111d37f0000000000000000000000000000000000000000000000000000000000000000878761155d565b6001600160801b031690508282111561122557806112117f000000000000000000000000000000000000000000000000000000000000000085611be6565b61121b9190611ae4565b9350505050610482565b806112507f000000000000000000000000000000000000000000000000000000000000000084611be6565b61125a9190611ae4565b9695505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008181526006602090815260408083208151808301909252546001600160801b038082168352600160801b9091041691810191909152816112f46114be565b90506000611318606460085485602001516001600160801b03166109f19190611be6565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561137557600080fd5b505afa158015611389573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ad9190611a2b565b6113b890600a611b3b565b905083602001516001600160801b0316831180156113d557508183105b1561144557807f0000000000000000000000000000000000000000000000000000000000000000620f424086600001516001600160801b031687602001516001600160801b0316876114279190611c05565b6114319190611be6565b61143b9190611be6565b6112509190611ae4565b83602001516001600160801b03168311801561146057508183115b156114b257807f0000000000000000000000000000000000000000000000000000000000000000620f424086600001516001600160801b031687602001516001600160801b0316866114279190611c05565b50600095945050505050565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b15801561151a57600080fd5b505afa15801561152e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155291906119db565b509195945050505050565b6005546004805460405163055bc75d60e21b815263ffffffff8616928101929092526001600160801b03861660248301526044820184905260009260649290916001600160a01b03169063156f1d7490840160206040518083038186803b1580156115c757600080fd5b505afa1580156115db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ff919061195f565b6116099190611be6565b61089e9190611ae4565b9392505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261167490859061167a565b50505050565b60006116cf826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166117519092919063ffffffff16565b80519091501561174c57808060200190518101906116ed9190611924565b61174c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610358565b505050565b606061089e848460008585843b6117aa5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610358565b600080866001600160a01b031685876040516117c69190611a48565b60006040518083038185875af1925050503d8060008114611803576040519150601f19603f3d011682016040523d82523d6000602084013e611808565b606091505b5091509150611818828286611823565b979650505050505050565b60608315611832575081611613565b8251156118425782518084602001fd5b8160405162461bcd60e51b81526004016103589190611a64565b803563ffffffff8116811461187057600080fd5b919050565b805169ffffffffffffffffffff8116811461187057600080fd5b6000602082840312156118a157600080fd5b813561161381611cab565b6000602082840312156118be57600080fd5b815161161381611cab565b600080600080608085870312156118df57600080fd5b84356118ea81611cab565b93506118f86020860161185c565b925060408501356001600160801b038116811461191457600080fd5b9396929550929360600135925050565b60006020828403121561193657600080fd5b8151801515811461161357600080fd5b60006020828403121561195857600080fd5b5035919050565b60006020828403121561197157600080fd5b5051919050565b6000806040838503121561198b57600080fd5b82359150602083013561199d81611cc0565b809150509250929050565b6000806000606084860312156119bd57600080fd5b6119c68461185c565b95602085013595506040909401359392505050565b600080600080600060a086880312156119f357600080fd5b6119fc86611875565b9450602086015193506040860151925060608601519150611a1f60808701611875565b90509295509295909350565b600060208284031215611a3d57600080fd5b815161161381611cc0565b60008251611a5a818460208701611c3f565b9190910192915050565b6020815260008251806020840152611a83816040850160208701611c3f565b601f01601f19169190910160400192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115611adf57611adf611c7f565b500190565b600082611af357611af3611c95565b500490565b600181815b80851115611b33578160001904821115611b1957611b19611c7f565b80851615611b2657918102915b93841c9390800290611afd565b509250929050565b600061161360ff841683600082611b5457506001610482565b81611b6157506000610482565b8160018114611b775760028114611b8157611b9d565b6001915050610482565b60ff841115611b9257611b92611c7f565b50506001821b610482565b5060208310610133831016604e8410600b8410161715611bc0575081810a610482565b611bca8383611af8565b8060001904821115611bde57611bde611c7f565b029392505050565b6000816000190483118215151615611c0057611c00611c7f565b500290565b600082821015611c1757611c17611c7f565b500390565b600060ff821660ff841680821015611c3657611c36611c7f565b90039392505050565b60005b83811015611c5a578181015183820152602001611c42565b838111156116745750506000910152565b600082611c7a57611c7a611c95565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6001600160a01b0381168114610de857600080fd5b60ff81168114610de857600080fdfea2646970667358221220225897f4ce9db505110bf2227d285097a881cbe34856e6e39fb4bfd593b0b84864736f6c63430008060033","devdoc":{"kind":"dev","methods":{"buy(address,uint32,uint128,uint256)":{"params":{"amount":"The option/strategy amount","holder":"The holder address","period":"The option/strategy period","strike":"The option/strategy strike*"}},"exercise(uint256)":{"params":{"optionID":"The option/strategy ID*"}},"owner()":{"details":"Returns the address of the current owner."},"profitOf(uint256)":{"params":{"amount":"The unrealized profits amount*","optionID":"The option/strategy ID"}},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."},"setK(uint256)":{"params":{"value":"The collateralization coefficient*"}},"setLimit(uint256)":{"params":{"value":"The maximum locked liquidity*"}},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."}},"version":1},"userdoc":{"kind":"user","methods":{"buy(address,uint32,uint128,uint256)":{"notice":"Used for buying options/strategies"},"exercise(uint256)":{"notice":"Used for exercising an in-the-money option/strategy and taking profits"},"getLockedByStrategy()":{"notice":"Used for viewing the total liquidity locked up for a specific options strategy*"},"profitOf(uint256)":{"notice":"Used for calculating the holder\\\'s option/strategy unrealized profits"},"setK(uint256)":{"notice":"Used for setting the collateralization coefficient"},"setLimit(uint256)":{"notice":"Used for setting a limit on the total locked liquidity"}},"version":1},"storageLayout":{"storage":[{"astId":611,"contract":"contracts/Strategies/HegicStrategySpreadCall.sol:HegicStrategySpreadCall","label":"_owner","offset":0,"slot":"0","type":"t_address"},{"astId":810,"contract":"contracts/Strategies/HegicStrategySpreadCall.sol:HegicStrategySpreadCall","label":"_status","offset":0,"slot":"1","type":"t_uint256"},{"astId":15532,"contract":"contracts/Strategies/HegicStrategySpreadCall.sol:HegicStrategySpreadCall","label":"collateralizationRatio","offset":0,"slot":"2","type":"t_uint8"},{"astId":15535,"contract":"contracts/Strategies/HegicStrategySpreadCall.sol:HegicStrategySpreadCall","label":"lockedLimit","offset":0,"slot":"3","type":"t_uint256"},{"astId":15538,"contract":"contracts/Strategies/HegicStrategySpreadCall.sol:HegicStrategySpreadCall","label":"pricer","offset":0,"slot":"4","type":"t_contract(IPremiumCalculator)7174"},{"astId":15546,"contract":"contracts/Strategies/HegicStrategySpreadCall.sol:HegicStrategySpreadCall","label":"k","offset":0,"slot":"5","type":"t_uint256"},{"astId":15556,"contract":"contracts/Strategies/HegicStrategySpreadCall.sol:HegicStrategySpreadCall","label":"strategyData","offset":0,"slot":"6","type":"t_mapping(t_uint256,t_struct(StrategyData)15551_storage)"},{"astId":16218,"contract":"contracts/Strategies/HegicStrategySpreadCall.sol:HegicStrategySpreadCall","label":"roundedDecimals","offset":0,"slot":"7","type":"t_uint8"},{"astId":16220,"contract":"contracts/Strategies/HegicStrategySpreadCall.sol:HegicStrategySpreadCall","label":"strikePercentage","offset":0,"slot":"8","type":"t_uint256"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_contract(IPremiumCalculator)7174":{"encoding":"inplace","label":"contract IPremiumCalculator","numberOfBytes":"20"},"t_mapping(t_uint256,t_struct(StrategyData)15551_storage)":{"encoding":"mapping","key":"t_uint256","label":"mapping(uint256 => struct HegicStrategy.StrategyData)","numberOfBytes":"32","value":"t_struct(StrategyData)15551_storage"},"t_struct(StrategyData)15551_storage":{"encoding":"inplace","label":"struct HegicStrategy.StrategyData","members":[{"astId":15548,"contract":"contracts/Strategies/HegicStrategySpreadCall.sol:HegicStrategySpreadCall","label":"amount","offset":0,"slot":"0","type":"t_uint128"},{"astId":15550,"contract":"contracts/Strategies/HegicStrategySpreadCall.sol:HegicStrategySpreadCall","label":"strike","offset":16,"slot":"0","type":"t_uint128"}],"numberOfBytes":"32"},"t_uint128":{"encoding":"inplace","label":"uint128","numberOfBytes":"16"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"},"t_uint8":{"encoding":"inplace","label":"uint8","numberOfBytes":"1"}}}}\');\n\n//# sourceURL=webpack://hedge/./src/deployments/arbitrum/HegicStrategySPREAD_CALL_120_ETH_v1.json?')}}]);