@oceanprotocol/lib 0.19.3 → 1.0.0-next.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +81 -0
- package/README.md +1 -1
- package/artifacts/ERC721Factory.sol/ERC721Factory.json +1164 -0
- package/artifacts/addresses/address.json +21 -0
- package/artifacts/communityFee/OPFCommunityFeeCollector.sol/OPFCommunityFeeCollector.json +116 -0
- package/artifacts/pools/FactoryRouter.sol/FactoryRouter.json +1086 -0
- package/artifacts/pools/balancer/BPool.sol/BPool.json +1744 -0
- package/artifacts/pools/dispenser/Dispenser.sol/Dispenser.json +358 -0
- package/artifacts/pools/fixedRate/FixedRateExchange.sol/FixedRateExchange.json +917 -0
- package/artifacts/pools/ssContracts/SideStaking.sol/SideStaking.json +428 -0
- package/artifacts/templates/ERC20Template.sol/ERC20Template.json +1382 -0
- package/artifacts/templates/ERC20TemplateEnterprise.sol/ERC20TemplateEnterprise.json +1530 -0
- package/artifacts/templates/ERC721Template.sol/ERC721Template.json +1534 -0
- package/artifacts/utils/mock/MockERC20.sol/MockERC20.json +302 -0
- package/artifacts/utils/mock/MockERC20Decimals.sol/MockERC20Decimals.json +302 -0
- package/dist/node/lib.js +1 -1
- package/dist/node/lib.js.map +1 -1
- package/dist/node/lib.module.js +1 -1
- package/dist/node/lib.module.js.map +1 -1
- package/dist/node/lib.umd.js +1 -1
- package/dist/node/lib.umd.js.map +1 -1
- package/dist/node/src/@types/Asset.d.ts +36 -0
- package/dist/node/{ocean/interfaces → src/@types}/Compute.d.ts +21 -12
- package/dist/node/src/@types/DDO/Credentials.d.ts +8 -0
- package/dist/node/src/@types/DDO/DDO.d.ts +15 -0
- package/dist/node/src/@types/DDO/Event.d.ts +7 -0
- package/dist/node/src/@types/DDO/Metadata.d.ts +38 -0
- package/dist/node/src/@types/DDO/Service.d.ts +28 -0
- package/dist/node/src/@types/FileMetadata.d.ts +8 -0
- package/dist/node/src/@types/Provider.d.ts +15 -0
- package/dist/node/src/@types/index.d.ts +8 -0
- package/dist/node/src/aquarius/Aquarius.d.ts +10 -0
- package/dist/node/src/aquarius/index.d.ts +1 -0
- package/dist/node/src/factories/NFTFactory.d.ts +70 -0
- package/dist/node/src/factories/index.d.ts +1 -0
- package/dist/node/src/index.d.ts +8 -0
- package/dist/node/src/interfaces/DispenserInterface.d.ts +7 -0
- package/dist/node/src/interfaces/Erc20Interface.d.ts +11 -0
- package/dist/node/src/interfaces/FixedRateInterface.d.ts +19 -0
- package/dist/node/src/interfaces/PoolInterface.d.ts +36 -0
- package/dist/node/src/interfaces/RouterInterface.d.ts +12 -0
- package/dist/node/src/interfaces/index.d.ts +5 -0
- package/dist/node/{models → src/models}/Config.d.ts +10 -6
- package/dist/node/src/models/index.d.ts +1 -0
- package/dist/node/src/pools/Router.d.ts +46 -0
- package/dist/node/src/pools/balancer/Pool.d.ts +73 -0
- package/dist/node/src/pools/balancer/index.d.ts +1 -0
- package/dist/node/src/pools/dispenser/Dispenser.d.ts +37 -0
- package/dist/node/src/pools/dispenser/index.d.ts +1 -0
- package/dist/node/src/pools/fixedRate/FixedRateExchange.d.ts +95 -0
- package/dist/node/src/pools/fixedRate/index.d.ts +1 -0
- package/dist/node/src/pools/index.d.ts +3 -0
- package/dist/node/src/pools/ssContracts/SideStaking.d.ts +28 -0
- package/dist/node/src/pools/ssContracts/index.d.ts +1 -0
- package/dist/node/src/provider/Provider.d.ts +31 -0
- package/dist/node/src/provider/index.d.ts +1 -0
- package/dist/node/src/tokens/Datatoken.d.ts +77 -0
- package/dist/node/src/tokens/NFT.d.ts +57 -0
- package/dist/node/src/tokens/index.d.ts +2 -0
- package/dist/node/src/utils/ConfigHelper.d.ts +6 -0
- package/dist/node/src/utils/Constants.d.ts +1 -0
- package/dist/node/src/utils/ContractParams.d.ts +4 -0
- package/dist/node/src/utils/ConversionTypeHelper.d.ts +3 -0
- package/dist/node/{utils/Datatokens.d.ts → src/utils/DatatokenName.d.ts} +1 -1
- package/dist/node/src/utils/DdoHelpers.d.ts +2 -0
- package/dist/node/src/utils/FetchHelper.d.ts +5 -0
- package/dist/node/{utils → src/utils}/GasUtils.d.ts +0 -0
- package/dist/node/{utils → src/utils}/Logger.d.ts +0 -0
- package/dist/node/src/utils/SignatureUtils.d.ts +8 -0
- package/dist/node/src/utils/index.d.ts +9 -0
- package/package.json +23 -19
- package/dist/node/Instantiable.abstract.d.ts +0 -25
- package/dist/node/balancer/OceanPool.d.ts +0 -94
- package/dist/node/balancer/Pool.d.ts +0 -55
- package/dist/node/balancer/PoolFactory.d.ts +0 -13
- package/dist/node/datatokens/ContractEvent.d.ts +0 -19
- package/dist/node/datatokens/ContractHandler.d.ts +0 -12
- package/dist/node/datatokens/Datatokens.d.ts +0 -42
- package/dist/node/datatokens/EventHandler.d.ts +0 -19
- package/dist/node/datatokens/Network.d.ts +0 -5
- package/dist/node/datatokens/Web3Provider.d.ts +0 -5
- package/dist/node/datatokens/contracts/ContractBase.d.ts +0 -27
- package/dist/node/ddo/DDO.d.ts +0 -36
- package/dist/node/ddo/interfaces/AdditionalInformation.d.ts +0 -16
- package/dist/node/ddo/interfaces/Authentication.d.ts +0 -4
- package/dist/node/ddo/interfaces/BestPrice.d.ts +0 -10
- package/dist/node/ddo/interfaces/Consumable.d.ts +0 -5
- package/dist/node/ddo/interfaces/Credentials.d.ts +0 -9
- package/dist/node/ddo/interfaces/Curation.d.ts +0 -6
- package/dist/node/ddo/interfaces/DataTokenInfo.d.ts +0 -10
- package/dist/node/ddo/interfaces/EditableMetadata.d.ts +0 -9
- package/dist/node/ddo/interfaces/EditableMetadataLinks.d.ts +0 -5
- package/dist/node/ddo/interfaces/Event.d.ts +0 -7
- package/dist/node/ddo/interfaces/File.d.ts +0 -13
- package/dist/node/ddo/interfaces/Metadata.d.ts +0 -15
- package/dist/node/ddo/interfaces/MetadataAlgorithm.d.ts +0 -12
- package/dist/node/ddo/interfaces/MetadataMain.d.ts +0 -12
- package/dist/node/ddo/interfaces/Proof.d.ts +0 -6
- package/dist/node/ddo/interfaces/PublicKey.d.ts +0 -8
- package/dist/node/ddo/interfaces/PurgatoryData.d.ts +0 -4
- package/dist/node/ddo/interfaces/Service.d.ts +0 -99
- package/dist/node/ddo/interfaces/ServicePrices.d.ts +0 -4
- package/dist/node/ddo/interfaces/Status.d.ts +0 -5
- package/dist/node/ddo/interfaces/index.d.ts +0 -17
- package/dist/node/dispenser/Dispenser.d.ts +0 -42
- package/dist/node/exchange/FixedRateExchange.d.ts +0 -57
- package/dist/node/index.d.ts +0 -1
- package/dist/node/lib.d.ts +0 -15
- package/dist/node/metadatacache/MetadataCache.d.ts +0 -41
- package/dist/node/metadatacache/OnChainMetaData.d.ts +0 -29
- package/dist/node/ocean/Account.d.ts +0 -16
- package/dist/node/ocean/Accounts.d.ts +0 -9
- package/dist/node/ocean/Assets.d.ts +0 -56
- package/dist/node/ocean/AssetsCredential.d.ts +0 -6
- package/dist/node/ocean/Compute.d.ts +0 -75
- package/dist/node/ocean/DID.d.ts +0 -8
- package/dist/node/ocean/EventAccessControl.d.ts +0 -9
- package/dist/node/ocean/Ocean.d.ts +0 -34
- package/dist/node/ocean/OceanAuth.d.ts +0 -15
- package/dist/node/ocean/Versions.d.ts +0 -25
- package/dist/node/ocean/utils/SignatureUtils.d.ts +0 -13
- package/dist/node/ocean/utils/Utils.d.ts +0 -8
- package/dist/node/ocean/utils/WebServiceConnector.d.ts +0 -15
- package/dist/node/provider/Provider.d.ts +0 -49
- package/dist/node/utils/AssetResolverHelper.d.ts +0 -8
- package/dist/node/utils/ConfigHelper.d.ts +0 -13
- package/dist/node/utils/ConversionTypeHelpers.d.ts +0 -8
- package/dist/node/utils/GeneratorHelpers.d.ts +0 -1
- package/dist/node/utils/PromiseResolver.d.ts +0 -3
- package/dist/node/utils/SubscribableObserver.d.ts +0 -12
- package/dist/node/utils/SubscribablePromise.d.ts +0 -14
- package/dist/node/utils/Timeout.d.ts +0 -1
- package/dist/node/utils/index.d.ts +0 -9
package/dist/node/lib.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var t=require("uuid"),e=require("decimal.js"),i=require("web3"),r=require("fs"),n=require("save-file"),s=require("node-abort-controller"),o=require("buffer"),a=require("crypto"),h=require("cross-fetch"),u=require("@oceanprotocol/contracts/artifacts/Metadata.json"),l=require("lzma/src/lzma-c"),c=require("@oceanprotocol/contracts/artifacts/DTFactory.json"),d=require("@oceanprotocol/contracts/artifacts/DataTokenTemplate.json"),f=require("@ethereum-navigator/navigator"),m=require("crypto-js"),p=require("@oceanprotocol/contracts/artifacts/BPool.json"),g=require("@oceanprotocol/contracts/artifacts/BFactory.json"),w=require("@oceanprotocol/contracts/artifacts/FixedRateExchange.json"),v=require("@oceanprotocol/contracts/artifacts/Dispenser.json"),y=require("os"),M=require("@oceanprotocol/contracts/artifacts/address.json");function b(t){return t&&"object"==typeof t&&"default"in t?t:{default:t}}var A,x=/*#__PURE__*/b(e),E=/*#__PURE__*/b(i),R=/*#__PURE__*/b(r),S=/*#__PURE__*/b(n),k=/*#__PURE__*/b(s),I=/*#__PURE__*/b(o),O=/*#__PURE__*/b(a),T=/*#__PURE__*/b(u),B=/*#__PURE__*/b(c),C=/*#__PURE__*/b(d),_=/*#__PURE__*/b(p),P=/*#__PURE__*/b(g),D=/*#__PURE__*/b(w),L=/*#__PURE__*/b(v),N=/*#__PURE__*/b(M);function W(){return(W=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var i=arguments[e];for(var r in i)Object.prototype.hasOwnProperty.call(i,r)&&(t[r]=i[r])}return t}).apply(this,arguments)}exports.LogLevel=void 0,(A=exports.LogLevel||(exports.LogLevel={}))[A.None=-1]="None",A[A.Error=0]="Error",A[A.Warn=1]="Warn",A[A.Log=2]="Log",A[A.Verbose=3]="Verbose";class F{constructor(t=exports.LogLevel.Error){this.logLevel=void 0,this.logLevel=t}setLevel(t){this.logLevel=t}bypass(...t){this.dispatch("log",-Infinity,...t)}debug(...t){this.dispatch("debug",exports.LogLevel.Verbose,...t)}log(...t){this.dispatch("log",exports.LogLevel.Log,...t)}warn(...t){this.dispatch("warn",exports.LogLevel.Warn,...t)}error(...t){this.dispatch("error",exports.LogLevel.Error,...t)}dispatch(t,e,...i){this.logLevel>=e&&console[t](...i)}}const U=new F,q=t=>j(t,!0),$=t=>j(t,!1);function j(t="",e){const{valid:i,output:r}=V(t,/^(?:0x)*([a-f0-9]+)$/i,"zeroXTransformer");return(e&&i?"0x":"")+r}const G=t=>z(t,!0);function z(t="",e){const{valid:i,output:r}=V(t,/^(?:0x|did:op:)*([a-f0-9]{40})$/i,"didTransformer");return(e&&i?"did:op:":"")+r}const H=t=>q(z(t,!1)),Z=t=>$(z(t,!1));function V(t,e,i){if("string"!=typeof t)throw U.debug("Not input string:"),U.debug(t),new Error(`[${i}] Expected string, input type: ${typeof t}`);const r=t.match(e);return r?{valid:!0,output:r[1]}:(U.warn(`[${i}] Input transformation failed.`),{valid:!1,output:t})}class J{constructor(){this.completed=!1,this.subscriptions=new Set}subscribe(t,e,i){if(this.completed)throw new Error("Observer completed.");const r={onNext:t,onComplete:e,onError:i};return this.subscriptions.add(r),{unsubscribe:()=>this.subscriptions.delete(r)}}next(t){this.emit("onNext",t)}complete(t){this.emit("onComplete",t),this.unsubscribe()}error(t){this.emit("onError",t),this.unsubscribe()}emit(t,e){Array.from(this.subscriptions).map(e=>e[t]).filter(t=>t&&"function"==typeof t).forEach(t=>t(e))}unsubscribe(){this.completed=!0,this.subscriptions.clear()}}class K{constructor(t){this.observer=new J,this.promise=Object.assign(new Promise((t,e)=>{setTimeout(()=>{this.observer.subscribe(void 0,t,e)},0)}),this),setTimeout(()=>this.init(t),1)}subscribe(t){return this.observer.subscribe(t)}next(t){return this.observer.subscribe(t),this}then(t,e){return Object.assign(this.promise.then(t,e),this)}catch(t){return Object.assign(this.promise.catch(t),this)}finally(t){return Object.assign(this.promise.finally(t),this)}init(t){const e=t(this.observer);Promise.resolve(e).then(t=>{"function"==typeof e.then&&this.observer.complete(t)}).catch(t=>{"function"==typeof e.then&&this.observer.error(t)})}}var X=/^-?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?$/i,Q=Math.ceil,Y=Math.floor,tt="[BigNumber Error] ",et=tt+"Number primitive has more than 15 significant digits: ",it=1e14,rt=[1,10,100,1e3,1e4,1e5,1e6,1e7,1e8,1e9,1e10,1e11,1e12,1e13],nt=1e9;function st(t){var e=0|t;return t>0||t===e?e:e-1}function ot(t){for(var e,i,r=1,n=t.length,s=t[0]+"";r<n;){for(i=14-(e=t[r++]+"").length;i--;e="0"+e);s+=e}for(n=s.length;48===s.charCodeAt(--n););return s.slice(0,n+1||1)}function at(t,e){var i,r,n=t.c,s=e.c,o=t.s,a=e.s,h=t.e,u=e.e;if(!o||!a)return null;if(r=s&&!s[0],(i=n&&!n[0])||r)return i?r?0:-a:o;if(o!=a)return o;if(i=o<0,r=h==u,!n||!s)return r?0:!n^i?1:-1;if(!r)return h>u^i?1:-1;for(a=(h=n.length)<(u=s.length)?h:u,o=0;o<a;o++)if(n[o]!=s[o])return n[o]>s[o]^i?1:-1;return h==u?0:h>u^i?1:-1}function ht(t,e,i,r){if(t<e||t>i||t!==Y(t))throw Error(tt+(r||"Argument")+("number"==typeof t?t<e||t>i?" out of range: ":" not an integer: ":" not a primitive number: ")+String(t))}function ut(t){var e=t.c.length-1;return st(t.e/14)==e&&t.c[e]%2!=0}function lt(t,e){return(t.length>1?t.charAt(0)+"."+t.slice(1):t)+(e<0?"e":"e+")+e}function ct(t,e,i){var r,n;if(e<0){for(n=i+".";++e;n+=i);t=n+t}else if(++e>(r=t.length)){for(n=i,e-=r;--e;n+=i);t+=n}else e<r&&(t=t.slice(0,e)+"."+t.slice(e));return t}var dt=function t(e){var i,r,n,s,o,a,h,u,l,c,d=R.prototype={constructor:R,toString:null,valueOf:null},f=new R(1),m=20,p=4,g=-7,w=21,v=-1e7,y=1e7,M=!1,b=1,A=0,x={prefix:"",groupSize:3,secondaryGroupSize:0,groupSeparator:",",decimalSeparator:".",fractionGroupSize:0,fractionGroupSeparator:" ",suffix:""},E="0123456789abcdefghijklmnopqrstuvwxyz";function R(t,e){var i,s,o,a,h,u,l,c,d=this;if(!(d instanceof R))return new R(t,e);if(null==e){if(t&&!0===t._isBigNumber)return d.s=t.s,void(!t.c||t.e>y?d.c=d.e=null:t.e<v?d.c=[d.e=0]:(d.e=t.e,d.c=t.c.slice()));if((u="number"==typeof t)&&0*t==0){if(d.s=1/t<0?(t=-t,-1):1,t===~~t){for(a=0,h=t;h>=10;h/=10,a++);return void(a>y?d.c=d.e=null:(d.e=a,d.c=[t]))}c=String(t)}else{if(!X.test(c=String(t)))return n(d,c,u);d.s=45==c.charCodeAt(0)?(c=c.slice(1),-1):1}(a=c.indexOf("."))>-1&&(c=c.replace(".","")),(h=c.search(/e/i))>0?(a<0&&(a=h),a+=+c.slice(h+1),c=c.substring(0,h)):a<0&&(a=c.length)}else{if(ht(e,2,E.length,"Base"),10==e)return O(d=new R(t),m+d.e+1,p);if(c=String(t),u="number"==typeof t){if(0*t!=0)return n(d,c,u,e);if(d.s=1/t<0?(c=c.slice(1),-1):1,R.DEBUG&&c.replace(/^0\.0*|\./,"").length>15)throw Error(et+t)}else d.s=45===c.charCodeAt(0)?(c=c.slice(1),-1):1;for(i=E.slice(0,e),a=h=0,l=c.length;h<l;h++)if(i.indexOf(s=c.charAt(h))<0){if("."==s){if(h>a){a=l;continue}}else if(!o&&(c==c.toUpperCase()&&(c=c.toLowerCase())||c==c.toLowerCase()&&(c=c.toUpperCase()))){o=!0,h=-1,a=0;continue}return n(d,String(t),u,e)}u=!1,(a=(c=r(c,e,10,d.s)).indexOf("."))>-1?c=c.replace(".",""):a=c.length}for(h=0;48===c.charCodeAt(h);h++);for(l=c.length;48===c.charCodeAt(--l););if(c=c.slice(h,++l)){if(l-=h,u&&R.DEBUG&&l>15&&(t>9007199254740991||t!==Y(t)))throw Error(et+d.s*t);if((a=a-h-1)>y)d.c=d.e=null;else if(a<v)d.c=[d.e=0];else{if(d.e=a,d.c=[],h=(a+1)%14,a<0&&(h+=14),h<l){for(h&&d.c.push(+c.slice(0,h)),l-=14;h<l;)d.c.push(+c.slice(h,h+=14));h=14-(c=c.slice(h)).length}else h-=l;for(;h--;c+="0");d.c.push(+c)}}else d.c=[d.e=0]}function S(t,e,i,r){var n,s,o,a,h;if(null==i?i=p:ht(i,0,8),!t.c)return t.toString();if(n=t.c[0],o=t.e,null==e)h=ot(t.c),h=1==r||2==r&&(o<=g||o>=w)?lt(h,o):ct(h,o,"0");else if(s=(t=O(new R(t),e,i)).e,a=(h=ot(t.c)).length,1==r||2==r&&(e<=s||s<=g)){for(;a<e;h+="0",a++);h=lt(h,s)}else if(e-=o,h=ct(h,s,"0"),s+1>a){if(--e>0)for(h+=".";e--;h+="0");}else if((e+=s-a)>0)for(s+1==a&&(h+=".");e--;h+="0");return t.s<0&&n?"-"+h:h}function k(t,e){for(var i,r=1,n=new R(t[0]);r<t.length;r++){if(!(i=new R(t[r])).s){n=i;break}e.call(n,i)&&(n=i)}return n}function I(t,e,i){for(var r=1,n=e.length;!e[--n];e.pop());for(n=e[0];n>=10;n/=10,r++);return(i=r+14*i-1)>y?t.c=t.e=null:i<v?t.c=[t.e=0]:(t.e=i,t.c=e),t}function O(t,e,i,r){var n,s,o,a,h,u,l,c=t.c,d=rt;if(c){t:{for(n=1,a=c[0];a>=10;a/=10,n++);if((s=e-n)<0)s+=14,l=(h=c[u=0])/d[n-(o=e)-1]%10|0;else if((u=Q((s+1)/14))>=c.length){if(!r)break t;for(;c.length<=u;c.push(0));h=l=0,n=1,o=(s%=14)-14+1}else{for(h=a=c[u],n=1;a>=10;a/=10,n++);l=(o=(s%=14)-14+n)<0?0:h/d[n-o-1]%10|0}if(r=r||e<0||null!=c[u+1]||(o<0?h:h%d[n-o-1]),r=i<4?(l||r)&&(0==i||i==(t.s<0?3:2)):l>5||5==l&&(4==i||r||6==i&&(s>0?o>0?h/d[n-o]:0:c[u-1])%10&1||i==(t.s<0?8:7)),e<1||!c[0])return c.length=0,r?(c[0]=d[(14-(e-=t.e+1)%14)%14],t.e=-e||0):c[0]=t.e=0,t;if(0==s?(c.length=u,a=1,u--):(c.length=u+1,a=d[14-s],c[u]=o>0?Y(h/d[n-o]%d[o])*a:0),r)for(;;){if(0==u){for(s=1,o=c[0];o>=10;o/=10,s++);for(o=c[0]+=a,a=1;o>=10;o/=10,a++);s!=a&&(t.e++,c[0]==it&&(c[0]=1));break}if(c[u]+=a,c[u]!=it)break;c[u--]=0,a=1}for(s=c.length;0===c[--s];c.pop());}t.e>y?t.c=t.e=null:t.e<v&&(t.c=[t.e=0])}return t}function T(t){var e,i=t.e;return null===i?t.toString():(e=ot(t.c),e=i<=g||i>=w?lt(e,i):ct(e,i,"0"),t.s<0?"-"+e:e)}return R.clone=t,R.ROUND_UP=0,R.ROUND_DOWN=1,R.ROUND_CEIL=2,R.ROUND_FLOOR=3,R.ROUND_HALF_UP=4,R.ROUND_HALF_DOWN=5,R.ROUND_HALF_EVEN=6,R.ROUND_HALF_CEIL=7,R.ROUND_HALF_FLOOR=8,R.EUCLID=9,R.config=R.set=function(t){var e,i;if(null!=t){if("object"!=typeof t)throw Error(tt+"Object expected: "+t);if(t.hasOwnProperty(e="DECIMAL_PLACES")&&(ht(i=t[e],0,nt,e),m=i),t.hasOwnProperty(e="ROUNDING_MODE")&&(ht(i=t[e],0,8,e),p=i),t.hasOwnProperty(e="EXPONENTIAL_AT")&&((i=t[e])&&i.pop?(ht(i[0],-nt,0,e),ht(i[1],0,nt,e),g=i[0],w=i[1]):(ht(i,-nt,nt,e),g=-(w=i<0?-i:i))),t.hasOwnProperty(e="RANGE"))if((i=t[e])&&i.pop)ht(i[0],-nt,-1,e),ht(i[1],1,nt,e),v=i[0],y=i[1];else{if(ht(i,-nt,nt,e),!i)throw Error(tt+e+" cannot be zero: "+i);v=-(y=i<0?-i:i)}if(t.hasOwnProperty(e="CRYPTO")){if((i=t[e])!==!!i)throw Error(tt+e+" not true or false: "+i);if(i){if("undefined"==typeof crypto||!crypto||!crypto.getRandomValues&&!crypto.randomBytes)throw M=!i,Error(tt+"crypto unavailable");M=i}else M=i}if(t.hasOwnProperty(e="MODULO_MODE")&&(ht(i=t[e],0,9,e),b=i),t.hasOwnProperty(e="POW_PRECISION")&&(ht(i=t[e],0,nt,e),A=i),t.hasOwnProperty(e="FORMAT")){if("object"!=typeof(i=t[e]))throw Error(tt+e+" not an object: "+i);x=i}if(t.hasOwnProperty(e="ALPHABET")){if("string"!=typeof(i=t[e])||/^.$|[+-.\s]|(.).*\1/.test(i))throw Error(tt+e+" invalid: "+i);E=i}}return{DECIMAL_PLACES:m,ROUNDING_MODE:p,EXPONENTIAL_AT:[g,w],RANGE:[v,y],CRYPTO:M,MODULO_MODE:b,POW_PRECISION:A,FORMAT:x,ALPHABET:E}},R.isBigNumber=function(t){if(!t||!0!==t._isBigNumber)return!1;if(!R.DEBUG)return!0;var e,i,r=t.c,n=t.e,s=t.s;t:if("[object Array]"=={}.toString.call(r)){if((1===s||-1===s)&&n>=-nt&&n<=nt&&n===Y(n)){if(0===r[0]){if(0===n&&1===r.length)return!0;break t}if((e=(n+1)%14)<1&&(e+=14),String(r[0]).length==e){for(e=0;e<r.length;e++)if((i=r[e])<0||i>=it||i!==Y(i))break t;if(0!==i)return!0}}}else if(null===r&&null===n&&(null===s||1===s||-1===s))return!0;throw Error(tt+"Invalid BigNumber: "+t)},R.maximum=R.max=function(){return k(arguments,d.lt)},R.minimum=R.min=function(){return k(arguments,d.gt)},R.random=(s=9007199254740992,o=Math.random()*s&2097151?function(){return Y(Math.random()*s)}:function(){return 8388608*(1073741824*Math.random()|0)+(8388608*Math.random()|0)},function(t){var e,i,r,n,s,a=0,h=[],u=new R(f);if(null==t?t=m:ht(t,0,nt),n=Q(t/14),M)if(crypto.getRandomValues){for(e=crypto.getRandomValues(new Uint32Array(n*=2));a<n;)(s=131072*e[a]+(e[a+1]>>>11))>=9e15?(i=crypto.getRandomValues(new Uint32Array(2)),e[a]=i[0],e[a+1]=i[1]):(h.push(s%1e14),a+=2);a=n/2}else{if(!crypto.randomBytes)throw M=!1,Error(tt+"crypto unavailable");for(e=crypto.randomBytes(n*=7);a<n;)(s=281474976710656*(31&e[a])+1099511627776*e[a+1]+4294967296*e[a+2]+16777216*e[a+3]+(e[a+4]<<16)+(e[a+5]<<8)+e[a+6])>=9e15?crypto.randomBytes(7).copy(e,a):(h.push(s%1e14),a+=7);a=n/7}if(!M)for(;a<n;)(s=o())<9e15&&(h[a++]=s%1e14);for(t%=14,(n=h[--a])&&t&&(h[a]=Y(n/(s=rt[14-t]))*s);0===h[a];h.pop(),a--);if(a<0)h=[r=0];else{for(r=-1;0===h[0];h.splice(0,1),r-=14);for(a=1,s=h[0];s>=10;s/=10,a++);a<14&&(r-=14-a)}return u.e=r,u.c=h,u}),R.sum=function(){for(var t=1,e=arguments,i=new R(e[0]);t<e.length;)i=i.plus(e[t++]);return i},r=function(){var t="0123456789";function e(t,e,i,r){for(var n,s,o=[0],a=0,h=t.length;a<h;){for(s=o.length;s--;o[s]*=e);for(o[0]+=r.indexOf(t.charAt(a++)),n=0;n<o.length;n++)o[n]>i-1&&(null==o[n+1]&&(o[n+1]=0),o[n+1]+=o[n]/i|0,o[n]%=i)}return o.reverse()}return function(r,n,s,o,a){var h,u,l,c,d,f,g,w,v=r.indexOf("."),y=m,M=p;for(v>=0&&(c=A,A=0,r=r.replace(".",""),f=(w=new R(n)).pow(r.length-v),A=c,w.c=e(ct(ot(f.c),f.e,"0"),10,s,t),w.e=w.c.length),l=c=(g=e(r,n,s,a?(h=E,t):(h=t,E))).length;0==g[--c];g.pop());if(!g[0])return h.charAt(0);if(v<0?--l:(f.c=g,f.e=l,f.s=o,g=(f=i(f,w,y,M,s)).c,d=f.r,l=f.e),v=g[u=l+y+1],c=s/2,d=d||u<0||null!=g[u+1],d=M<4?(null!=v||d)&&(0==M||M==(f.s<0?3:2)):v>c||v==c&&(4==M||d||6==M&&1&g[u-1]||M==(f.s<0?8:7)),u<1||!g[0])r=d?ct(h.charAt(1),-y,h.charAt(0)):h.charAt(0);else{if(g.length=u,d)for(--s;++g[--u]>s;)g[u]=0,u||(++l,g=[1].concat(g));for(c=g.length;!g[--c];);for(v=0,r="";v<=c;r+=h.charAt(g[v++]));r=ct(r,l,h.charAt(0))}return r}}(),i=function(){function t(t,e,i){var r,n,s,o,a=0,h=t.length,u=e%1e7,l=e/1e7|0;for(t=t.slice();h--;)a=((n=u*(s=t[h]%1e7)+(r=l*s+(o=t[h]/1e7|0)*u)%1e7*1e7+a)/i|0)+(r/1e7|0)+l*o,t[h]=n%i;return a&&(t=[a].concat(t)),t}function e(t,e,i,r){var n,s;if(i!=r)s=i>r?1:-1;else for(n=s=0;n<i;n++)if(t[n]!=e[n]){s=t[n]>e[n]?1:-1;break}return s}function i(t,e,i,r){for(var n=0;i--;)t[i]-=n,t[i]=(n=t[i]<e[i]?1:0)*r+t[i]-e[i];for(;!t[0]&&t.length>1;t.splice(0,1));}return function(r,n,s,o,a){var h,u,l,c,d,f,m,p,g,w,v,y,M,b,A,x,E,S=r.s==n.s?1:-1,k=r.c,I=n.c;if(!(k&&k[0]&&I&&I[0]))return new R(r.s&&n.s&&(k?!I||k[0]!=I[0]:I)?k&&0==k[0]||!I?0*S:S/0:NaN);for(g=(p=new R(S)).c=[],S=s+(u=r.e-n.e)+1,a||(a=it,u=st(r.e/14)-st(n.e/14),S=S/14|0),l=0;I[l]==(k[l]||0);l++);if(I[l]>(k[l]||0)&&u--,S<0)g.push(1),c=!0;else{for(b=k.length,x=I.length,l=0,S+=2,(d=Y(a/(I[0]+1)))>1&&(I=t(I,d,a),k=t(k,d,a),x=I.length,b=k.length),M=x,v=(w=k.slice(0,x)).length;v<x;w[v++]=0);E=I.slice(),E=[0].concat(E),A=I[0],I[1]>=a/2&&A++;do{if(d=0,(h=e(I,w,x,v))<0){if(y=w[0],x!=v&&(y=y*a+(w[1]||0)),(d=Y(y/A))>1)for(d>=a&&(d=a-1),m=(f=t(I,d,a)).length,v=w.length;1==e(f,w,m,v);)d--,i(f,x<m?E:I,m,a),m=f.length,h=1;else 0==d&&(h=d=1),m=(f=I.slice()).length;if(m<v&&(f=[0].concat(f)),i(w,f,v,a),v=w.length,-1==h)for(;e(I,w,x,v)<1;)d++,i(w,x<v?E:I,v,a),v=w.length}else 0===h&&(d++,w=[0]);g[l++]=d,w[0]?w[v++]=k[M]||0:(w=[k[M]],v=1)}while((M++<b||null!=w[0])&&S--);c=null!=w[0],g[0]||g.splice(0,1)}if(a==it){for(l=1,S=g[0];S>=10;S/=10,l++);O(p,s+(p.e=l+14*u-1)+1,o,c)}else p.e=u,p.r=+c;return p}}(),a=/^(-?)0([xbo])(?=\w[\w.]*$)/i,h=/^([^.]+)\.$/,u=/^\.([^.]+)$/,l=/^-?(Infinity|NaN)$/,c=/^\s*\+(?=[\w.])|^\s+|\s+$/g,n=function(t,e,i,r){var n,s=i?e:e.replace(c,"");if(l.test(s))t.s=isNaN(s)?null:s<0?-1:1;else{if(!i&&(s=s.replace(a,function(t,e,i){return n="x"==(i=i.toLowerCase())?16:"b"==i?2:8,r&&r!=n?t:e}),r&&(n=r,s=s.replace(h,"$1").replace(u,"0.$1")),e!=s))return new R(s,n);if(R.DEBUG)throw Error(tt+"Not a"+(r?" base "+r:"")+" number: "+e);t.s=null}t.c=t.e=null},d.absoluteValue=d.abs=function(){var t=new R(this);return t.s<0&&(t.s=1),t},d.comparedTo=function(t,e){return at(this,new R(t,e))},d.decimalPlaces=d.dp=function(t,e){var i,r,n,s=this;if(null!=t)return ht(t,0,nt),null==e?e=p:ht(e,0,8),O(new R(s),t+s.e+1,e);if(!(i=s.c))return null;if(r=14*((n=i.length-1)-st(this.e/14)),n=i[n])for(;n%10==0;n/=10,r--);return r<0&&(r=0),r},d.dividedBy=d.div=function(t,e){return i(this,new R(t,e),m,p)},d.dividedToIntegerBy=d.idiv=function(t,e){return i(this,new R(t,e),0,1)},d.exponentiatedBy=d.pow=function(t,e){var i,r,n,s,o,a,h,u,l=this;if((t=new R(t)).c&&!t.isInteger())throw Error(tt+"Exponent not an integer: "+T(t));if(null!=e&&(e=new R(e)),o=t.e>14,!l.c||!l.c[0]||1==l.c[0]&&!l.e&&1==l.c.length||!t.c||!t.c[0])return u=new R(Math.pow(+T(l),o?2-ut(t):+T(t))),e?u.mod(e):u;if(a=t.s<0,e){if(e.c?!e.c[0]:!e.s)return new R(NaN);(r=!a&&l.isInteger()&&e.isInteger())&&(l=l.mod(e))}else{if(t.e>9&&(l.e>0||l.e<-1||(0==l.e?l.c[0]>1||o&&l.c[1]>=24e7:l.c[0]<8e13||o&&l.c[0]<=9999975e7)))return s=l.s<0&&ut(t)?-0:0,l.e>-1&&(s=1/s),new R(a?1/s:s);A&&(s=Q(A/14+2))}for(o?(i=new R(.5),a&&(t.s=1),h=ut(t)):h=(n=Math.abs(+T(t)))%2,u=new R(f);;){if(h){if(!(u=u.times(l)).c)break;s?u.c.length>s&&(u.c.length=s):r&&(u=u.mod(e))}if(n){if(0===(n=Y(n/2)))break;h=n%2}else if(O(t=t.times(i),t.e+1,1),t.e>14)h=ut(t);else{if(0==(n=+T(t)))break;h=n%2}l=l.times(l),s?l.c&&l.c.length>s&&(l.c.length=s):r&&(l=l.mod(e))}return r?u:(a&&(u=f.div(u)),e?u.mod(e):s?O(u,A,p,void 0):u)},d.integerValue=function(t){var e=new R(this);return null==t?t=p:ht(t,0,8),O(e,e.e+1,t)},d.isEqualTo=d.eq=function(t,e){return 0===at(this,new R(t,e))},d.isFinite=function(){return!!this.c},d.isGreaterThan=d.gt=function(t,e){return at(this,new R(t,e))>0},d.isGreaterThanOrEqualTo=d.gte=function(t,e){return 1===(e=at(this,new R(t,e)))||0===e},d.isInteger=function(){return!!this.c&&st(this.e/14)>this.c.length-2},d.isLessThan=d.lt=function(t,e){return at(this,new R(t,e))<0},d.isLessThanOrEqualTo=d.lte=function(t,e){return-1===(e=at(this,new R(t,e)))||0===e},d.isNaN=function(){return!this.s},d.isNegative=function(){return this.s<0},d.isPositive=function(){return this.s>0},d.isZero=function(){return!!this.c&&0==this.c[0]},d.minus=function(t,e){var i,r,n,s,o=this,a=o.s;if(e=(t=new R(t,e)).s,!a||!e)return new R(NaN);if(a!=e)return t.s=-e,o.plus(t);var h=o.e/14,u=t.e/14,l=o.c,c=t.c;if(!h||!u){if(!l||!c)return l?(t.s=-e,t):new R(c?o:NaN);if(!l[0]||!c[0])return c[0]?(t.s=-e,t):new R(l[0]?o:3==p?-0:0)}if(h=st(h),u=st(u),l=l.slice(),a=h-u){for((s=a<0)?(a=-a,n=l):(u=h,n=c),n.reverse(),e=a;e--;n.push(0));n.reverse()}else for(r=(s=(a=l.length)<(e=c.length))?a:e,a=e=0;e<r;e++)if(l[e]!=c[e]){s=l[e]<c[e];break}if(s&&(n=l,l=c,c=n,t.s=-t.s),(e=(r=c.length)-(i=l.length))>0)for(;e--;l[i++]=0);for(e=it-1;r>a;){if(l[--r]<c[r]){for(i=r;i&&!l[--i];l[i]=e);--l[i],l[r]+=it}l[r]-=c[r]}for(;0==l[0];l.splice(0,1),--u);return l[0]?I(t,l,u):(t.s=3==p?-1:1,t.c=[t.e=0],t)},d.modulo=d.mod=function(t,e){var r,n,s=this;return t=new R(t,e),!s.c||!t.s||t.c&&!t.c[0]?new R(NaN):!t.c||s.c&&!s.c[0]?new R(s):(9==b?(n=t.s,t.s=1,r=i(s,t,0,3),t.s=n,r.s*=n):r=i(s,t,0,b),(t=s.minus(r.times(t))).c[0]||1!=b||(t.s=s.s),t)},d.multipliedBy=d.times=function(t,e){var i,r,n,s,o,a,h,u,l,c,d,f,m,p,g,w=this,v=w.c,y=(t=new R(t,e)).c;if(!(v&&y&&v[0]&&y[0]))return!w.s||!t.s||v&&!v[0]&&!y||y&&!y[0]&&!v?t.c=t.e=t.s=null:(t.s*=w.s,v&&y?(t.c=[0],t.e=0):t.c=t.e=null),t;for(r=st(w.e/14)+st(t.e/14),t.s*=w.s,(h=v.length)<(c=y.length)&&(m=v,v=y,y=m,n=h,h=c,c=n),n=h+c,m=[];n--;m.push(0));for(p=it,g=1e7,n=c;--n>=0;){for(i=0,d=y[n]%g,f=y[n]/g|0,s=n+(o=h);s>n;)i=((u=d*(u=v[--o]%g)+(a=f*u+(l=v[o]/g|0)*d)%g*g+m[s]+i)/p|0)+(a/g|0)+f*l,m[s--]=u%p;m[s]=i}return i?++r:m.splice(0,1),I(t,m,r)},d.negated=function(){var t=new R(this);return t.s=-t.s||null,t},d.plus=function(t,e){var i,r=this,n=r.s;if(e=(t=new R(t,e)).s,!n||!e)return new R(NaN);if(n!=e)return t.s=-e,r.minus(t);var s=r.e/14,o=t.e/14,a=r.c,h=t.c;if(!s||!o){if(!a||!h)return new R(n/0);if(!a[0]||!h[0])return h[0]?t:new R(a[0]?r:0*n)}if(s=st(s),o=st(o),a=a.slice(),n=s-o){for(n>0?(o=s,i=h):(n=-n,i=a),i.reverse();n--;i.push(0));i.reverse()}for((n=a.length)-(e=h.length)<0&&(i=h,h=a,a=i,e=n),n=0;e;)n=(a[--e]=a[e]+h[e]+n)/it|0,a[e]=it===a[e]?0:a[e]%it;return n&&(a=[n].concat(a),++o),I(t,a,o)},d.precision=d.sd=function(t,e){var i,r,n,s=this;if(null!=t&&t!==!!t)return ht(t,1,nt),null==e?e=p:ht(e,0,8),O(new R(s),t,e);if(!(i=s.c))return null;if(r=14*(n=i.length-1)+1,n=i[n]){for(;n%10==0;n/=10,r--);for(n=i[0];n>=10;n/=10,r++);}return t&&s.e+1>r&&(r=s.e+1),r},d.shiftedBy=function(t){return ht(t,-9007199254740991,9007199254740991),this.times("1e"+t)},d.squareRoot=d.sqrt=function(){var t,e,r,n,s,o=this,a=o.c,h=o.s,u=o.e,l=m+4,c=new R("0.5");if(1!==h||!a||!a[0])return new R(!h||h<0&&(!a||a[0])?NaN:a?o:1/0);if(0==(h=Math.sqrt(+T(o)))||h==1/0?(((e=ot(a)).length+u)%2==0&&(e+="0"),h=Math.sqrt(+e),u=st((u+1)/2)-(u<0||u%2),r=new R(e=h==1/0?"5e"+u:(e=h.toExponential()).slice(0,e.indexOf("e")+1)+u)):r=new R(h+""),r.c[0])for((h=(u=r.e)+l)<3&&(h=0);;)if(r=c.times((s=r).plus(i(o,s,l,1))),ot(s.c).slice(0,h)===(e=ot(r.c)).slice(0,h)){if(r.e<u&&--h,"9999"!=(e=e.slice(h-3,h+1))&&(n||"4999"!=e)){+e&&(+e.slice(1)||"5"!=e.charAt(0))||(O(r,r.e+m+2,1),t=!r.times(r).eq(o));break}if(!n&&(O(s,s.e+m+2,0),s.times(s).eq(o))){r=s;break}l+=4,h+=4,n=1}return O(r,r.e+m+1,p,t)},d.toExponential=function(t,e){return null!=t&&(ht(t,0,nt),t++),S(this,t,e,1)},d.toFixed=function(t,e){return null!=t&&(ht(t,0,nt),t=t+this.e+1),S(this,t,e)},d.toFormat=function(t,e,i){var r,n=this;if(null==i)null!=t&&e&&"object"==typeof e?(i=e,e=null):t&&"object"==typeof t?(i=t,t=e=null):i=x;else if("object"!=typeof i)throw Error(tt+"Argument not an object: "+i);if(r=n.toFixed(t,e),n.c){var s,o=r.split("."),a=+i.groupSize,h=+i.secondaryGroupSize,u=i.groupSeparator||"",l=o[0],c=o[1],d=n.s<0,f=d?l.slice(1):l,m=f.length;if(h&&(s=a,a=h,h=s,m-=s),a>0&&m>0){for(l=f.substr(0,s=m%a||a);s<m;s+=a)l+=u+f.substr(s,a);h>0&&(l+=u+f.slice(s)),d&&(l="-"+l)}r=c?l+(i.decimalSeparator||"")+((h=+i.fractionGroupSize)?c.replace(new RegExp("\\d{"+h+"}\\B","g"),"$&"+(i.fractionGroupSeparator||"")):c):l}return(i.prefix||"")+r+(i.suffix||"")},d.toFraction=function(t){var e,r,n,s,o,a,h,u,l,c,d,m,g=this,w=g.c;if(null!=t&&(!(h=new R(t)).isInteger()&&(h.c||1!==h.s)||h.lt(f)))throw Error(tt+"Argument "+(h.isInteger()?"out of range: ":"not an integer: ")+T(h));if(!w)return new R(g);for(e=new R(f),l=r=new R(f),n=u=new R(f),m=ot(w),o=e.e=m.length-g.e-1,e.c[0]=rt[(a=o%14)<0?14+a:a],t=!t||h.comparedTo(e)>0?o>0?e:l:h,a=y,y=1/0,h=new R(m),u.c[0]=0;c=i(h,e,0,1),1!=(s=r.plus(c.times(n))).comparedTo(t);)r=n,n=s,l=u.plus(c.times(s=l)),u=s,e=h.minus(c.times(s=e)),h=s;return s=i(t.minus(r),n,0,1),u=u.plus(s.times(l)),r=r.plus(s.times(n)),u.s=l.s=g.s,d=i(l,n,o*=2,p).minus(g).abs().comparedTo(i(u,r,o,p).minus(g).abs())<1?[l,n]:[u,r],y=a,d},d.toNumber=function(){return+T(this)},d.toPrecision=function(t,e){return null!=t&&ht(t,1,nt),S(this,t,e,2)},d.toString=function(t){var e,i=this,n=i.s,s=i.e;return null===s?n?(e="Infinity",n<0&&(e="-"+e)):e="NaN":(null==t?e=s<=g||s>=w?lt(ot(i.c),s):ct(ot(i.c),s,"0"):10===t?e=ct(ot((i=O(new R(i),m+s+1,p)).c),i.e,"0"):(ht(t,2,E.length,"Base"),e=r(ct(ot(i.c),s,"0"),10,t,n,!0)),n<0&&i.c[0]&&(e="-"+e)),e},d.valueOf=d.toJSON=function(){return T(this)},d._isBigNumber=!0,d[Symbol.toStringTag]="BigNumber",d[Symbol.for("nodejs.util.inspect.custom")]=d.valueOf,null!=e&&R.set(e),R}();async function ft(t){return new dt(await t.eth.getGasPrice()).multipliedBy(1.05).integerValue(dt.ROUND_DOWN).toString(10)}function mt(t){return void 0!==t.id}async function pt(t,e){if(mt(t))return{did:t.id,ddo:t};{const i=await e.assets.resolve(t);return{did:i.id,ddo:i}}}var gt={nouns:["Crab","Fish","Seal","Octopus","Shark","Seahorse","Walrus","Starfish","Whale","Orca","Penguin","Jellyfish","Squid","Lobster","Pelican","Shrimp","Oyster","Clam","Seagull","Dolphin","Shell","Cormorant","Otter","Anemone","Turtle","Coral","Ray","Barracuda","Krill","Anchovy","Angelfish","Barnacle","Clownfish","Cod","Cuttlefish","Eel","Fugu","Herring","Haddock","Ling","Mackerel","Manatee","Narwhal","Nautilus","Plankton","Porpoise","Prawn","Pufferfish","Swordfish","Tuna"],adjectives:["adamant","adroit","amatory","ambitious","amused","animistic","antic","arcadian","artistic","astonishing","astounding","baleful","bellicose","bilious","blissful","boorish","brave","breathtaking","brilliant","calamitous","caustic","cerulean","clever","charming","comely","competent","concomitant","confident","contumacious","corpulent","crapulous","creative","dazzling","dedicated","defamatory","delighted","delightful","determined","didactic","dilatory","dowdy","efficacious","effulgent","egregious","empowered","endemic","enthusiastic","equanimous","exceptional","execrable","fabulous","fantastic","fastidious","feckless","fecund","friable","fulsome","garrulous","generous","gentle","guileless","gustatory","heuristic","histrionic","hubristic","incendiary","incredible","insidious","insolent","inspired","intransigent","inveterate","invidious","invigorated","irksome","jejune","juicy","jocular","joyful","judicious","kind","lachrymose","limpid","loquacious","lovely","luminous","mannered","marvelous","mendacious","meretricious","minatory","mordant","motivated","munificent","nefarious","noxious","obtuse","optimistic","parsimonious","pendulous","pernicious","pervasive","petulant","passionate","phenomenal","platitudinous","pleasant","powerful","precipitate","propitious","puckish","querulous","quiescent","rebarbative","recalcitant","redolent","rhadamanthine","risible","ruminative","sagacious","salubrious","sartorial","sclerotic","serpentine","smart","spasmodic","strident","stunning","stupendous","taciturn","tactful","tasty","tenacious","tremendous","tremulous","trenchant","turbulent","turgid","ubiquitous","uxorious","verdant","vibrant","voluble","voracious","wheedling","withering","wonderful","zealous"]};function wt(t){const e=t||gt,i=Math.floor(Math.random()*e.adjectives.length),r=Math.floor(Math.random()*e.nouns.length),n=Math.floor(100*Math.random()),s=e.adjectives[i].replace(/^\w/,t=>t.toUpperCase()),o=e.nouns[r].replace(/^\w/,t=>t.toUpperCase());return{name:`${s} ${o} Token`,symbol:`${(s.substring(0,3)+o.substring(0,3)).toUpperCase()}-${n}`}}var vt={__proto__:null,objectPromiseAll:async t=>((t=[],e=[])=>t.reduce((t,i,r)=>W({},t,{[i]:e[r]}),{}))(Object.keys(t),await Promise.all(Object.values(t))),get LogLevel(){return exports.LogLevel},Logger:F,LoggerInstance:U,zeroX:q,noZeroX:$,zeroXTransformer:j,didPrefixed:G,noDidPrefixed:t=>z(t,!1),didTransformer:z,didZeroX:H,didNoZeroX:Z,generateId:function(e=64){let i="";for(;i.length<e;)i+=t.v4().replace(/-/g,"");return i.substr(0,e)},SubscribablePromise:K,SubscribableObserver:J,getFairGasPrice:ft,isDdo:mt,assetResolve:pt,generateDatatokenName:wt};class yt{constructor(){this._ocean=void 0,this._web3=void 0,this._config=void 0,this._logger=void 0}get ocean(){return this._ocean||U.error("Ocean instance is not defined."),this._ocean}get web3(){return this._web3||U.error("Web3 instance is not defined."),this._web3}get config(){return this._config||U.error("Config instance is not defined."),this._config}get logger(){return U}get instanceConfig(){const{ocean:t,web3:e,config:i,logger:r}=this;return{ocean:t,web3:e,config:i,logger:r}}static async getInstance(t){U.warn("getInstance() methods has needs to be added to child class.")}static setInstanceConfig(t,{ocean:e,config:i,web3:r,logger:n}){t._ocean=e,t._config=i,t._web3=r,t._logger=n}setInstanceConfig(t){yt.setInstanceConfig(this,t)}}class Mt extends yt{constructor(t="0x0",e){super(),this.id=void 0,this.password=void 0,this.token=void 0,this.id=t,e&&this.setInstanceConfig(e)}getId(){return this.id}setId(t){this.id=t}setPassword(t){this.password=t}getPassword(){return this.password}async getTokenBalance(t){if(null===t)return null;const e=[{constant:!0,inputs:[{name:"_owner",type:"address"}],name:"balanceOf",outputs:[{name:"balance",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"}];let i=null;const r=await this.getTokenDecimals(t);try{const n=new this.web3.eth.Contract(e,t,{from:this.id}),s=await n.methods.balanceOf(this.id).call();i=new x.default(s).div(10**r).toString()}catch(t){this.logger.error(`ERROR: Failed to get the balance: ${t.message}`)}return i}async getTokenDecimals(t){let e=18;if(null===t)return e;const i=[{constant:!0,inputs:[],name:"decimals",outputs:[{name:"",type:"uint8"}],type:"function"}];try{const r=new this.web3.eth.Contract(i,t,{from:this.id});e=await r.methods.decimals().call()}catch(t){this.logger.error(`ERROR: Failed to get decimals : ${t.message}`)}return e}async getOceanBalance(){return this.getTokenBalance(this.config.oceanTokenAddress)}async getTokenSymbol(t){return""}async getEtherBalance(){const t=await this.web3.eth.getBalance(this.id,"latest");return this.web3.utils.fromWei(t)}}class bt{static parse(t){let e;t instanceof bt&&(t=t.getDid());const i=t.match(/^did:op:([a-f0-9]{40})$/i);if(i&&(e=new bt(i[1])),!e)throw new Error(`Parsing DID failed, ${t}`);return e}static generate(t){return new bt($(t))}constructor(t){this.id=void 0,this.id=t}getDid(){return`did:op:${this.id}`}getId(){return this.id}}class At extends yt{static async getInstance(t){const e=new At;return e.setInstanceConfig(t),e}async list(){const t=(await this.web3.eth.getAccounts()).map(t=>new Mt(t,this.instanceConfig));return Promise.all(t)}getTokenBalance(t,e){return e.getTokenBalance(t)}getOceanBalance(t){return t.getOceanBalance()}getEtherBalance(t){return t.getEtherBalance()}}class xt{static getWeb3(t={}){return new E.default(t.web3Provider||E.default.givenProvider||new E.default.providers.HttpProvider(t.nodeUri))}}class Et{static serialize(t){return JSON.stringify(t,null,2)}static deserialize(t){const e=JSON.parse(t);return new Et(e)}constructor(t={}){this["@context"]="https://w3id.org/did/v1",this.id=null,this.created=void 0,this.updated=void 0,this.dataToken=void 0,this.publicKey=[],this.authentication=[],this.service=[],this.proof=void 0,this.price=void 0,this.isInPurgatory=void 0,this.purgatoryData=void 0,this.dataTokenInfo=void 0,this.credentials=void 0,this.chainId=void 0,this.event=void 0,Object.assign(this,t,{created:t&&t.created||(new Date).toISOString().replace(/\.[0-9]{3}/,"")})}shortId(){return this.id.replace("did:op:","")}findServiceById(t){if(isNaN(t))throw new Error("index is not set");return this.service.find(e=>e.index===t)}findServiceByType(t){if(!t)throw new Error("serviceType not set");return this.service.find(e=>e.type===t)}getChecksum(){const{attributes:t}=this.findServiceByType("metadata"),{files:e,name:i,author:r,license:n}=t.main,s=[...(e||[]).map(({checksum:t})=>t).filter(t=>!!t),i,r,n,this.id];return xt.getWeb3().utils.sha3(s.join("")).replace(/^0x([a-f0-9]{64})(:!.+)?$/i,"0x$1")}async addProof(t,e,i){if(this.proof)throw new Error("Proof already exists");this.proof={created:(new Date).toISOString().replace(/\.[0-9]{3}/,""),creator:e,type:"AddressHash",signatureValue:xt.getWeb3().utils.sha3(e).replace(/^0x([a-f0-9]{64})(:!.+)?$/i,"0x$1")}}}function Rt(t){if(!Number.isInteger(t))throw new TypeError("Expected an integer, got "+typeof t);const e=new WeakMap,i=new k.default,r=setTimeout(()=>{i.abort()},t);return e.set(i.signal,r),i.signal}const St=require("cross-fetch");class kt{constructor(t){this.logger=void 0,this.logger=t}post(t,e){return this.postWithHeaders(t,e,{"Content-type":"application/json"})}postWithOctet(t,e){return this.postWithHeaders(t,e,{"Content-type":"application/octet-stream"})}postWithHeaders(t,e,i){return this.fetch(t,null!=e?{method:"POST",body:e,headers:i,signal:Rt(5e3)}:{method:"POST",signal:Rt(5e3)})}get(t){return this.fetch(t,{method:"GET",headers:{"Content-type":"application/json"},signal:Rt(5e3)})}put(t,e){return this.fetch(t,null!=e?{method:"PUT",body:e,headers:{"Content-type":"application/json"},signal:Rt(5e3)}:{method:"PUT",headers:{"Content-type":"application/json"},signal:Rt(5e3)})}delete(t,e){return this.fetch(t,null!=e?{method:"DELETE",body:e,headers:{"Content-type":"application/json"},signal:Rt(5e3)}:{method:"DELETE",headers:{"Content-type":"application/json"},signal:Rt(5e3)})}async downloadFile(t,e,i){const r=await this.get(t);if(!r.ok)throw new Error("Response error.");let n;try{n=r.headers.get("content-disposition").match(/attachment;filename=(.+)/)[1]}catch(e){try{n=t.split("/").pop()}catch(t){n=`file${i}`}}if(e)return await new Promise(async(t,i)=>{R.default.mkdirSync(e,{recursive:!0});const s=R.default.createWriteStream(`${e}${n}`);r.body.pipe(s),r.body.on("error",i),s.on("finish",t)}),e;S.default(await r.arrayBuffer(),n)}async downloadFileBrowser(t){const e=document.createElement("a");e.download="",e.href=t,e.click()}async fetch(t,e){const i=await St(t,e);if(!i.ok)throw this.logger.error(`Error requesting [${e.method}] ${t}`),this.logger.error(`Response message: \n${await i.text()}`),i;return i}}class It extends yt{constructor(...t){super(...t),this.nonce=void 0,this.baseUrl=void 0,this.servicesEndpoints=void 0,this.computeAddress=void 0,this.providerAddress=void 0,this.providerVersion=void 0}static async getInstance(t){const e=new It;return e.setInstanceConfig(t),e.nonce="0",await e.setBaseUrl(t.config.providerUri),e}async setBaseUrl(t){return this.baseUrl=t,this.servicesEndpoints=await this.getServiceEndpoints(),!0}get url(){return this.baseUrl}async getServiceEndpoints(){const t=[];try{const e=await(await this.ocean.utils.fetch.get(this.url)).json();this.providerAddress=e.providerAddress,"computeAddress"in e&&(this.computeAddress=e.computeAddress),"version"in e&&(this.providerVersion=e.version);for(const i in e.serviceEndpoints)t.push({serviceName:i,method:e.serviceEndpoints[i][0],urlPath:this.url+e.serviceEndpoints[i][1]});return t}catch(t){return this.logger.error("Finding the service endpoints failed:",t),null}}getEndpointURL(t){return this.servicesEndpoints?this.servicesEndpoints.find(e=>e.serviceName===t):null}async createSignature(t,e){return await this.ocean.utils.signature.signText($(e),t.getId())}async createHashSignature(t,e){return await this.ocean.utils.signature.signWithHash(e,t.getId())}async encrypt(t,e,i){await this.getNonce(i.getId());const r={documentId:t,document:JSON.stringify(e),publisherAddress:i.getId()},n=this.getEncryptEndpoint()?this.getEncryptEndpoint().urlPath:null;if(!n)return null;try{const t=await this.ocean.utils.fetch.post(n,decodeURI(JSON.stringify(r)));return(await t.json()).encryptedDocument}catch(t){throw this.logger.error(t),new Error("HTTP request failed")}}async fileinfo(t){const e={url:t},i=[],r=this.getFileinfoEndpoint()?this.getFileinfoEndpoint().urlPath:null;if(!r)return null;try{const t=await this.ocean.utils.fetch.post(r,JSON.stringify(e)),n=await t.json();for(const t of n)i.push(t);return i}catch(t){return null}}async isFileConsumable(t,e){const i={did:t.getDid()},r=await this.ocean.metadataCache.retrieveDDO(t);if(!r)return!1;const n=r.findServiceById(e);if(!n)return!1;const s=n.serviceEndpoint+"/api/v1/services/fileinfo";try{const t=await this.ocean.utils.fetch.post(s,JSON.stringify(i));return(await t.json())[0].valid}catch(t){return!1}}async getNonce(t){const e=this.getNonceEndpoint()?this.getNonceEndpoint().urlPath:null;if(!e)return null;try{const i=await this.ocean.utils.fetch.get(e+`?userAddress=${t}`);return this.nonce=String((await i.json()).nonce),this.nonce}catch(t){throw this.logger.error(t),new Error("HTTP request failed")}}async initialize(t,e,i,r,n){const{did:s,ddo:o}=await pt(t,this.ocean);let a=this.getInitializeEndpoint()?this.getInitializeEndpoint().urlPath:null;if(!a)return null;a+=`?documentId=${s}`,a+=`&serviceId=${e}`,a+=`&serviceType=${i}`,a+=`&dataToken=${o.dataToken}`,a+=`&consumerAddress=${r}`,n&&(a+="&userdata="+encodeURI(JSON.stringify(n)));try{const t=await this.ocean.utils.fetch.get(a);return await t.text()}catch(t){throw this.logger.error(t),new Error("Asset URL not found or not available.")}}async download(t,e,i,r,n,s,o,a,h=-1,u){await this.getNonce(o.getId());const l=await this.createSignature(o,t+this.nonce),c=this.getDownloadEndpoint()?this.getDownloadEndpoint().urlPath:null;if(!c)return null;const d=a.filter((t,e)=>-1===h||e===h).map(async({index:a})=>{let h=c;h+=`?fileIndex=${a}`,h+=`&documentId=${t}`,h+=`&serviceId=${n}`,h+=`&serviceType=${r}`,h+=`&dataToken=${i}`,h+=`&transferTxId=${e}`,h+=`&consumerAddress=${o.getId()}`,h+=`&signature=${l}`,u&&(h+="&userdata="+encodeURI(JSON.stringify(u)));try{s?await this.ocean.utils.fetch.downloadFile(h,s,a):await this.ocean.utils.fetch.downloadFileBrowser(h)}catch(t){throw this.logger.error("Error consuming assets"),this.logger.error(t),t}});return await Promise.all(d),s}async computeStart(t,e,i,r,n,s,o,a,h,u){const l=e.getId();await this.getNonce(e.getId());const c=Object();c.documentId=$(t);let d=l;d+=t&&`${$(t)}`||"",d+=this.nonce;const f=await this.createHashSignature(e,d);c.signature=f,r&&(c.output=r),i.did&&(c.algorithmDid=i.did),i.meta&&(c.algorithmMeta=i.meta),c.consumerAddress=l,n&&(c.transferTxId=n),i.transferTxId&&(c.algorithmTransferTxId=i.transferTxId),i.dataToken&&(c.algorithmDataToken=i.dataToken),s&&(c.serviceId=s),o&&(c.serviceType=o),a&&(c.dataToken=a),h&&(c.additionalInputs=h),u&&(c.userData=u),i.algoCustomParameters&&(c.algouserdata=i.algoCustomParameters);const m=this.getComputeStartEndpoint()?this.getComputeStartEndpoint().urlPath:null;if(!m)return null;try{const t=await this.ocean.utils.fetch.post(m,JSON.stringify(c));return null!=t&&t.ok?await t.json():(console.error("Compute start failed:",t.status,t.statusText),this.logger.error("Payload was:",c),null)}catch(t){return this.logger.error("Compute start failed:"),this.logger.error(t),this.logger.error("Payload was:",c),null}}async computeStop(t,e,i){const r=e.getId();await this.getNonce(e.getId());const n=Object();n.documentId=$(t);let s=r;s+=i||"",s+=t&&`${$(t)}`||"",s+=this.nonce;const o=await this.createHashSignature(e,s);n.signature=o,n.jobId=i,n.consumerAddress=r;const a=this.getComputeStopEndpoint()?this.getComputeStopEndpoint().urlPath:null;if(!a)return null;try{const t=await this.ocean.utils.fetch.put(a,JSON.stringify(n));return null!=t&&t.ok?await t.json():(this.logger.error("Compute stop failed:",t.status,t.statusText),this.logger.error("Payload was:",n),null)}catch(t){return this.logger.error("Compute stop failed:"),this.logger.error(t),this.logger.error("Payload was:",n),null}}async computeDelete(t,e,i){const r=e.getId();await this.getNonce(e.getId());const n=Object();n.documentId=$(t);let s=r;s+=i||"",s+=t&&`${$(t)}`||"",s+=this.nonce;const o=await this.createHashSignature(e,s);n.signature=o,n.jobId=i,n.consumerAddress=r;const a=this.getComputeDeleteEndpoint()?this.getComputeDeleteEndpoint().urlPath:null;if(!a)return null;try{const t=await this.ocean.utils.fetch.delete(a,JSON.stringify(n));return null!=t&&t.ok?await t.json():(this.logger.error("Delete compute job failed:",t.status,t.statusText),this.logger.error("Payload was:",n),null)}catch(t){return this.logger.error("Delete compute job failed:"),this.logger.error(t),this.logger.error("Payload was:",n),null}}async computeStatus(t,e,i,r,n=!0){const s=e.getId();await this.getNonce(e.getId());let o="?documentId="+$(t);if(n){let r=s;r+=i||"",r+=t&&`${$(t)}`||"",r+=this.nonce,o+=`&signature=${await this.createHashSignature(e,r)}`}o+=i&&`&jobId=${i}`||"",o+=`&consumerAddress=${s}`,o+=r&&`&transferTxId=${r}`||"";const a=this.getComputeStatusEndpoint()?this.getComputeStatusEndpoint().urlPath:null;if(!a)return null;try{const t=await this.ocean.utils.fetch.get(a+o);return null!=t&&t.ok?await t.json():(this.logger.error("Get compute status failed:",t.status,t.statusText),null)}catch(t){return this.logger.error("Get compute status failed"),this.logger.error(t),null}}getInitializeEndpoint(){return this.getEndpointURL("initialize")}getNonceEndpoint(){return this.getEndpointURL("nonce")}getEncryptEndpoint(){return this.getEndpointURL("encrypt")}getFileinfoEndpoint(){return this.getEndpointURL("fileinfo")}getComputeStartEndpoint(){return this.getEndpointURL("computeStart")}getComputeStopEndpoint(){return this.getEndpointURL("computeStop")}getComputeStatusEndpoint(){return this.getEndpointURL("computeStatus")}getComputeDeleteEndpoint(){return this.getEndpointURL("computeDelete")}getDownloadEndpoint(){return this.getEndpointURL("download")}async isValidProvider(t){try{const e=await this.ocean.utils.fetch.get(t);if(null!=e&&e.ok){const t=await e.json();if(t&&t.providerAddress)return!0}return!1}catch(t){return this.logger.error(`Error validating provider: ${t.message}`),!1}}}var Ot="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function Tt(t){var e={exports:{}};return t(e,e.exports),e.exports}function Bt(t){throw new Error('Could not dynamically require "'+t+'". Please configure the dynamicRequireTargets option of @rollup/plugin-commonjs appropriately for this require call to behave properly.')}var Ct=Tt(function(t){!function(t,e){function i(t,e){if(!t)throw new Error(e||"Assertion failed")}function r(t,e){t.super_=e;var i=function(){};i.prototype=e.prototype,t.prototype=new i,t.prototype.constructor=t}function n(t,e,i){if(n.isBN(t))return t;this.negative=0,this.words=null,this.length=0,this.red=null,null!==t&&("le"!==e&&"be"!==e||(i=e,e=10),this._init(t||0,e||10,i||"be"))}var s;"object"==typeof t?t.exports=n:e.BN=n,n.BN=n,n.wordSize=26;try{s=Bt("buffer").Buffer}catch(t){}function o(t,e,i){for(var r=0,n=Math.min(t.length,i),s=e;s<n;s++){var o=t.charCodeAt(s)-48;r<<=4,r|=o>=49&&o<=54?o-49+10:o>=17&&o<=22?o-17+10:15&o}return r}function a(t,e,i,r){for(var n=0,s=Math.min(t.length,i),o=e;o<s;o++){var a=t.charCodeAt(o)-48;n*=r,n+=a>=49?a-49+10:a>=17?a-17+10:a}return n}n.isBN=function(t){return t instanceof n||null!==t&&"object"==typeof t&&t.constructor.wordSize===n.wordSize&&Array.isArray(t.words)},n.max=function(t,e){return t.cmp(e)>0?t:e},n.min=function(t,e){return t.cmp(e)<0?t:e},n.prototype._init=function(t,e,r){if("number"==typeof t)return this._initNumber(t,e,r);if("object"==typeof t)return this._initArray(t,e,r);"hex"===e&&(e=16),i(e===(0|e)&&e>=2&&e<=36);var n=0;"-"===(t=t.toString().replace(/\s+/g,""))[0]&&n++,16===e?this._parseHex(t,n):this._parseBase(t,e,n),"-"===t[0]&&(this.negative=1),this.strip(),"le"===r&&this._initArray(this.toArray(),e,r)},n.prototype._initNumber=function(t,e,r){t<0&&(this.negative=1,t=-t),t<67108864?(this.words=[67108863&t],this.length=1):t<4503599627370496?(this.words=[67108863&t,t/67108864&67108863],this.length=2):(i(t<9007199254740992),this.words=[67108863&t,t/67108864&67108863,1],this.length=3),"le"===r&&this._initArray(this.toArray(),e,r)},n.prototype._initArray=function(t,e,r){if(i("number"==typeof t.length),t.length<=0)return this.words=[0],this.length=1,this;this.length=Math.ceil(t.length/3),this.words=new Array(this.length);for(var n=0;n<this.length;n++)this.words[n]=0;var s,o,a=0;if("be"===r)for(n=t.length-1,s=0;n>=0;n-=3)this.words[s]|=(o=t[n]|t[n-1]<<8|t[n-2]<<16)<<a&67108863,this.words[s+1]=o>>>26-a&67108863,(a+=24)>=26&&(a-=26,s++);else if("le"===r)for(n=0,s=0;n<t.length;n+=3)this.words[s]|=(o=t[n]|t[n+1]<<8|t[n+2]<<16)<<a&67108863,this.words[s+1]=o>>>26-a&67108863,(a+=24)>=26&&(a-=26,s++);return this.strip()},n.prototype._parseHex=function(t,e){this.length=Math.ceil((t.length-e)/6),this.words=new Array(this.length);for(var i=0;i<this.length;i++)this.words[i]=0;var r,n,s=0;for(i=t.length-6,r=0;i>=e;i-=6)n=o(t,i,i+6),this.words[r]|=n<<s&67108863,this.words[r+1]|=n>>>26-s&4194303,(s+=24)>=26&&(s-=26,r++);i+6!==e&&(n=o(t,e,i+6),this.words[r]|=n<<s&67108863,this.words[r+1]|=n>>>26-s&4194303),this.strip()},n.prototype._parseBase=function(t,e,i){this.words=[0],this.length=1;for(var r=0,n=1;n<=67108863;n*=e)r++;r--,n=n/e|0;for(var s=t.length-i,o=s%r,h=Math.min(s,s-o)+i,u=0,l=i;l<h;l+=r)u=a(t,l,l+r,e),this.imuln(n),this.words[0]+u<67108864?this.words[0]+=u:this._iaddn(u);if(0!==o){var c=1;for(u=a(t,l,t.length,e),l=0;l<o;l++)c*=e;this.imuln(c),this.words[0]+u<67108864?this.words[0]+=u:this._iaddn(u)}},n.prototype.copy=function(t){t.words=new Array(this.length);for(var e=0;e<this.length;e++)t.words[e]=this.words[e];t.length=this.length,t.negative=this.negative,t.red=this.red},n.prototype.clone=function(){var t=new n(null);return this.copy(t),t},n.prototype._expand=function(t){for(;this.length<t;)this.words[this.length++]=0;return this},n.prototype.strip=function(){for(;this.length>1&&0===this.words[this.length-1];)this.length--;return this._normSign()},n.prototype._normSign=function(){return 1===this.length&&0===this.words[0]&&(this.negative=0),this},n.prototype.inspect=function(){return(this.red?"<BN-R: ":"<BN: ")+this.toString(16)+">"};var h=["","0","00","000","0000","00000","000000","0000000","00000000","000000000","0000000000","00000000000","000000000000","0000000000000","00000000000000","000000000000000","0000000000000000","00000000000000000","000000000000000000","0000000000000000000","00000000000000000000","000000000000000000000","0000000000000000000000","00000000000000000000000","000000000000000000000000","0000000000000000000000000"],u=[0,0,25,16,12,11,10,9,8,8,7,7,7,7,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5],l=[0,0,33554432,43046721,16777216,48828125,60466176,40353607,16777216,43046721,1e7,19487171,35831808,62748517,7529536,11390625,16777216,24137569,34012224,47045881,64e6,4084101,5153632,6436343,7962624,9765625,11881376,14348907,17210368,20511149,243e5,28629151,33554432,39135393,45435424,52521875,60466176];function c(t,e,i){i.negative=e.negative^t.negative;var r=t.length+e.length|0;i.length=r,r=r-1|0;var n=0|t.words[0],s=0|e.words[0],o=n*s,a=o/67108864|0;i.words[0]=67108863&o;for(var h=1;h<r;h++){for(var u=a>>>26,l=67108863&a,c=Math.min(h,e.length-1),d=Math.max(0,h-t.length+1);d<=c;d++)u+=(o=(n=0|t.words[h-d|0])*(s=0|e.words[d])+l)/67108864|0,l=67108863&o;i.words[h]=0|l,a=0|u}return 0!==a?i.words[h]=0|a:i.length--,i.strip()}n.prototype.toString=function(t,e){var r;if(e=0|e||1,16===(t=t||10)||"hex"===t){r="";for(var n=0,s=0,o=0;o<this.length;o++){var a=this.words[o],c=(16777215&(a<<n|s)).toString(16);r=0!=(s=a>>>24-n&16777215)||o!==this.length-1?h[6-c.length]+c+r:c+r,(n+=2)>=26&&(n-=26,o--)}for(0!==s&&(r=s.toString(16)+r);r.length%e!=0;)r="0"+r;return 0!==this.negative&&(r="-"+r),r}if(t===(0|t)&&t>=2&&t<=36){var d=u[t],f=l[t];r="";var m=this.clone();for(m.negative=0;!m.isZero();){var p=m.modn(f).toString(t);r=(m=m.idivn(f)).isZero()?p+r:h[d-p.length]+p+r}for(this.isZero()&&(r="0"+r);r.length%e!=0;)r="0"+r;return 0!==this.negative&&(r="-"+r),r}i(!1,"Base should be between 2 and 36")},n.prototype.toNumber=function(){var t=this.words[0];return 2===this.length?t+=67108864*this.words[1]:3===this.length&&1===this.words[2]?t+=4503599627370496+67108864*this.words[1]:this.length>2&&i(!1,"Number can only safely store up to 53 bits"),0!==this.negative?-t:t},n.prototype.toJSON=function(){return this.toString(16)},n.prototype.toBuffer=function(t,e){return i(void 0!==s),this.toArrayLike(s,t,e)},n.prototype.toArray=function(t,e){return this.toArrayLike(Array,t,e)},n.prototype.toArrayLike=function(t,e,r){var n=this.byteLength(),s=r||Math.max(1,n);i(n<=s,"byte array longer than desired length"),i(s>0,"Requested array length <= 0"),this.strip();var o,a,h="le"===e,u=new t(s),l=this.clone();if(h){for(a=0;!l.isZero();a++)o=l.andln(255),l.iushrn(8),u[a]=o;for(;a<s;a++)u[a]=0}else{for(a=0;a<s-n;a++)u[a]=0;for(a=0;!l.isZero();a++)o=l.andln(255),l.iushrn(8),u[s-a-1]=o}return u},n.prototype._countBits=Math.clz32?function(t){return 32-Math.clz32(t)}:function(t){var e=t,i=0;return e>=4096&&(i+=13,e>>>=13),e>=64&&(i+=7,e>>>=7),e>=8&&(i+=4,e>>>=4),e>=2&&(i+=2,e>>>=2),i+e},n.prototype._zeroBits=function(t){if(0===t)return 26;var e=t,i=0;return 0==(8191&e)&&(i+=13,e>>>=13),0==(127&e)&&(i+=7,e>>>=7),0==(15&e)&&(i+=4,e>>>=4),0==(3&e)&&(i+=2,e>>>=2),0==(1&e)&&i++,i},n.prototype.bitLength=function(){var t=this._countBits(this.words[this.length-1]);return 26*(this.length-1)+t},n.prototype.zeroBits=function(){if(this.isZero())return 0;for(var t=0,e=0;e<this.length;e++){var i=this._zeroBits(this.words[e]);if(t+=i,26!==i)break}return t},n.prototype.byteLength=function(){return Math.ceil(this.bitLength()/8)},n.prototype.toTwos=function(t){return 0!==this.negative?this.abs().inotn(t).iaddn(1):this.clone()},n.prototype.fromTwos=function(t){return this.testn(t-1)?this.notn(t).iaddn(1).ineg():this.clone()},n.prototype.isNeg=function(){return 0!==this.negative},n.prototype.neg=function(){return this.clone().ineg()},n.prototype.ineg=function(){return this.isZero()||(this.negative^=1),this},n.prototype.iuor=function(t){for(;this.length<t.length;)this.words[this.length++]=0;for(var e=0;e<t.length;e++)this.words[e]=this.words[e]|t.words[e];return this.strip()},n.prototype.ior=function(t){return i(0==(this.negative|t.negative)),this.iuor(t)},n.prototype.or=function(t){return this.length>t.length?this.clone().ior(t):t.clone().ior(this)},n.prototype.uor=function(t){return this.length>t.length?this.clone().iuor(t):t.clone().iuor(this)},n.prototype.iuand=function(t){var e;e=this.length>t.length?t:this;for(var i=0;i<e.length;i++)this.words[i]=this.words[i]&t.words[i];return this.length=e.length,this.strip()},n.prototype.iand=function(t){return i(0==(this.negative|t.negative)),this.iuand(t)},n.prototype.and=function(t){return this.length>t.length?this.clone().iand(t):t.clone().iand(this)},n.prototype.uand=function(t){return this.length>t.length?this.clone().iuand(t):t.clone().iuand(this)},n.prototype.iuxor=function(t){var e,i;this.length>t.length?(e=this,i=t):(e=t,i=this);for(var r=0;r<i.length;r++)this.words[r]=e.words[r]^i.words[r];if(this!==e)for(;r<e.length;r++)this.words[r]=e.words[r];return this.length=e.length,this.strip()},n.prototype.ixor=function(t){return i(0==(this.negative|t.negative)),this.iuxor(t)},n.prototype.xor=function(t){return this.length>t.length?this.clone().ixor(t):t.clone().ixor(this)},n.prototype.uxor=function(t){return this.length>t.length?this.clone().iuxor(t):t.clone().iuxor(this)},n.prototype.inotn=function(t){i("number"==typeof t&&t>=0);var e=0|Math.ceil(t/26),r=t%26;this._expand(e),r>0&&e--;for(var n=0;n<e;n++)this.words[n]=67108863&~this.words[n];return r>0&&(this.words[n]=~this.words[n]&67108863>>26-r),this.strip()},n.prototype.notn=function(t){return this.clone().inotn(t)},n.prototype.setn=function(t,e){i("number"==typeof t&&t>=0);var r=t/26|0,n=t%26;return this._expand(r+1),this.words[r]=e?this.words[r]|1<<n:this.words[r]&~(1<<n),this.strip()},n.prototype.iadd=function(t){var e,i,r;if(0!==this.negative&&0===t.negative)return this.negative=0,e=this.isub(t),this.negative^=1,this._normSign();if(0===this.negative&&0!==t.negative)return t.negative=0,e=this.isub(t),t.negative=1,e._normSign();this.length>t.length?(i=this,r=t):(i=t,r=this);for(var n=0,s=0;s<r.length;s++)this.words[s]=67108863&(e=(0|i.words[s])+(0|r.words[s])+n),n=e>>>26;for(;0!==n&&s<i.length;s++)this.words[s]=67108863&(e=(0|i.words[s])+n),n=e>>>26;if(this.length=i.length,0!==n)this.words[this.length]=n,this.length++;else if(i!==this)for(;s<i.length;s++)this.words[s]=i.words[s];return this},n.prototype.add=function(t){var e;return 0!==t.negative&&0===this.negative?(t.negative=0,e=this.sub(t),t.negative^=1,e):0===t.negative&&0!==this.negative?(this.negative=0,e=t.sub(this),this.negative=1,e):this.length>t.length?this.clone().iadd(t):t.clone().iadd(this)},n.prototype.isub=function(t){if(0!==t.negative){t.negative=0;var e=this.iadd(t);return t.negative=1,e._normSign()}if(0!==this.negative)return this.negative=0,this.iadd(t),this.negative=1,this._normSign();var i,r,n=this.cmp(t);if(0===n)return this.negative=0,this.length=1,this.words[0]=0,this;n>0?(i=this,r=t):(i=t,r=this);for(var s=0,o=0;o<r.length;o++)s=(e=(0|i.words[o])-(0|r.words[o])+s)>>26,this.words[o]=67108863&e;for(;0!==s&&o<i.length;o++)s=(e=(0|i.words[o])+s)>>26,this.words[o]=67108863&e;if(0===s&&o<i.length&&i!==this)for(;o<i.length;o++)this.words[o]=i.words[o];return this.length=Math.max(this.length,o),i!==this&&(this.negative=1),this.strip()},n.prototype.sub=function(t){return this.clone().isub(t)};var d=function(t,e,i){var r,n,s,o=t.words,a=e.words,h=i.words,u=0,l=0|o[0],c=8191&l,d=l>>>13,f=0|o[1],m=8191&f,p=f>>>13,g=0|o[2],w=8191&g,v=g>>>13,y=0|o[3],M=8191&y,b=y>>>13,A=0|o[4],x=8191&A,E=A>>>13,R=0|o[5],S=8191&R,k=R>>>13,I=0|o[6],O=8191&I,T=I>>>13,B=0|o[7],C=8191&B,_=B>>>13,P=0|o[8],D=8191&P,L=P>>>13,N=0|o[9],W=8191&N,F=N>>>13,U=0|a[0],q=8191&U,$=U>>>13,j=0|a[1],G=8191&j,z=j>>>13,H=0|a[2],Z=8191&H,V=H>>>13,J=0|a[3],K=8191&J,X=J>>>13,Q=0|a[4],Y=8191&Q,tt=Q>>>13,et=0|a[5],it=8191&et,rt=et>>>13,nt=0|a[6],st=8191&nt,ot=nt>>>13,at=0|a[7],ht=8191&at,ut=at>>>13,lt=0|a[8],ct=8191<,dt=lt>>>13,ft=0|a[9],mt=8191&ft,pt=ft>>>13;i.negative=t.negative^e.negative,i.length=19;var gt=(u+(r=Math.imul(c,q))|0)+((8191&(n=(n=Math.imul(c,$))+Math.imul(d,q)|0))<<13)|0;u=((s=Math.imul(d,$))+(n>>>13)|0)+(gt>>>26)|0,gt&=67108863,r=Math.imul(m,q),n=(n=Math.imul(m,$))+Math.imul(p,q)|0,s=Math.imul(p,$);var wt=(u+(r=r+Math.imul(c,G)|0)|0)+((8191&(n=(n=n+Math.imul(c,z)|0)+Math.imul(d,G)|0))<<13)|0;u=((s=s+Math.imul(d,z)|0)+(n>>>13)|0)+(wt>>>26)|0,wt&=67108863,r=Math.imul(w,q),n=(n=Math.imul(w,$))+Math.imul(v,q)|0,s=Math.imul(v,$),r=r+Math.imul(m,G)|0,n=(n=n+Math.imul(m,z)|0)+Math.imul(p,G)|0,s=s+Math.imul(p,z)|0;var vt=(u+(r=r+Math.imul(c,Z)|0)|0)+((8191&(n=(n=n+Math.imul(c,V)|0)+Math.imul(d,Z)|0))<<13)|0;u=((s=s+Math.imul(d,V)|0)+(n>>>13)|0)+(vt>>>26)|0,vt&=67108863,r=Math.imul(M,q),n=(n=Math.imul(M,$))+Math.imul(b,q)|0,s=Math.imul(b,$),r=r+Math.imul(w,G)|0,n=(n=n+Math.imul(w,z)|0)+Math.imul(v,G)|0,s=s+Math.imul(v,z)|0,r=r+Math.imul(m,Z)|0,n=(n=n+Math.imul(m,V)|0)+Math.imul(p,Z)|0,s=s+Math.imul(p,V)|0;var yt=(u+(r=r+Math.imul(c,K)|0)|0)+((8191&(n=(n=n+Math.imul(c,X)|0)+Math.imul(d,K)|0))<<13)|0;u=((s=s+Math.imul(d,X)|0)+(n>>>13)|0)+(yt>>>26)|0,yt&=67108863,r=Math.imul(x,q),n=(n=Math.imul(x,$))+Math.imul(E,q)|0,s=Math.imul(E,$),r=r+Math.imul(M,G)|0,n=(n=n+Math.imul(M,z)|0)+Math.imul(b,G)|0,s=s+Math.imul(b,z)|0,r=r+Math.imul(w,Z)|0,n=(n=n+Math.imul(w,V)|0)+Math.imul(v,Z)|0,s=s+Math.imul(v,V)|0,r=r+Math.imul(m,K)|0,n=(n=n+Math.imul(m,X)|0)+Math.imul(p,K)|0,s=s+Math.imul(p,X)|0;var Mt=(u+(r=r+Math.imul(c,Y)|0)|0)+((8191&(n=(n=n+Math.imul(c,tt)|0)+Math.imul(d,Y)|0))<<13)|0;u=((s=s+Math.imul(d,tt)|0)+(n>>>13)|0)+(Mt>>>26)|0,Mt&=67108863,r=Math.imul(S,q),n=(n=Math.imul(S,$))+Math.imul(k,q)|0,s=Math.imul(k,$),r=r+Math.imul(x,G)|0,n=(n=n+Math.imul(x,z)|0)+Math.imul(E,G)|0,s=s+Math.imul(E,z)|0,r=r+Math.imul(M,Z)|0,n=(n=n+Math.imul(M,V)|0)+Math.imul(b,Z)|0,s=s+Math.imul(b,V)|0,r=r+Math.imul(w,K)|0,n=(n=n+Math.imul(w,X)|0)+Math.imul(v,K)|0,s=s+Math.imul(v,X)|0,r=r+Math.imul(m,Y)|0,n=(n=n+Math.imul(m,tt)|0)+Math.imul(p,Y)|0,s=s+Math.imul(p,tt)|0;var bt=(u+(r=r+Math.imul(c,it)|0)|0)+((8191&(n=(n=n+Math.imul(c,rt)|0)+Math.imul(d,it)|0))<<13)|0;u=((s=s+Math.imul(d,rt)|0)+(n>>>13)|0)+(bt>>>26)|0,bt&=67108863,r=Math.imul(O,q),n=(n=Math.imul(O,$))+Math.imul(T,q)|0,s=Math.imul(T,$),r=r+Math.imul(S,G)|0,n=(n=n+Math.imul(S,z)|0)+Math.imul(k,G)|0,s=s+Math.imul(k,z)|0,r=r+Math.imul(x,Z)|0,n=(n=n+Math.imul(x,V)|0)+Math.imul(E,Z)|0,s=s+Math.imul(E,V)|0,r=r+Math.imul(M,K)|0,n=(n=n+Math.imul(M,X)|0)+Math.imul(b,K)|0,s=s+Math.imul(b,X)|0,r=r+Math.imul(w,Y)|0,n=(n=n+Math.imul(w,tt)|0)+Math.imul(v,Y)|0,s=s+Math.imul(v,tt)|0,r=r+Math.imul(m,it)|0,n=(n=n+Math.imul(m,rt)|0)+Math.imul(p,it)|0,s=s+Math.imul(p,rt)|0;var At=(u+(r=r+Math.imul(c,st)|0)|0)+((8191&(n=(n=n+Math.imul(c,ot)|0)+Math.imul(d,st)|0))<<13)|0;u=((s=s+Math.imul(d,ot)|0)+(n>>>13)|0)+(At>>>26)|0,At&=67108863,r=Math.imul(C,q),n=(n=Math.imul(C,$))+Math.imul(_,q)|0,s=Math.imul(_,$),r=r+Math.imul(O,G)|0,n=(n=n+Math.imul(O,z)|0)+Math.imul(T,G)|0,s=s+Math.imul(T,z)|0,r=r+Math.imul(S,Z)|0,n=(n=n+Math.imul(S,V)|0)+Math.imul(k,Z)|0,s=s+Math.imul(k,V)|0,r=r+Math.imul(x,K)|0,n=(n=n+Math.imul(x,X)|0)+Math.imul(E,K)|0,s=s+Math.imul(E,X)|0,r=r+Math.imul(M,Y)|0,n=(n=n+Math.imul(M,tt)|0)+Math.imul(b,Y)|0,s=s+Math.imul(b,tt)|0,r=r+Math.imul(w,it)|0,n=(n=n+Math.imul(w,rt)|0)+Math.imul(v,it)|0,s=s+Math.imul(v,rt)|0,r=r+Math.imul(m,st)|0,n=(n=n+Math.imul(m,ot)|0)+Math.imul(p,st)|0,s=s+Math.imul(p,ot)|0;var xt=(u+(r=r+Math.imul(c,ht)|0)|0)+((8191&(n=(n=n+Math.imul(c,ut)|0)+Math.imul(d,ht)|0))<<13)|0;u=((s=s+Math.imul(d,ut)|0)+(n>>>13)|0)+(xt>>>26)|0,xt&=67108863,r=Math.imul(D,q),n=(n=Math.imul(D,$))+Math.imul(L,q)|0,s=Math.imul(L,$),r=r+Math.imul(C,G)|0,n=(n=n+Math.imul(C,z)|0)+Math.imul(_,G)|0,s=s+Math.imul(_,z)|0,r=r+Math.imul(O,Z)|0,n=(n=n+Math.imul(O,V)|0)+Math.imul(T,Z)|0,s=s+Math.imul(T,V)|0,r=r+Math.imul(S,K)|0,n=(n=n+Math.imul(S,X)|0)+Math.imul(k,K)|0,s=s+Math.imul(k,X)|0,r=r+Math.imul(x,Y)|0,n=(n=n+Math.imul(x,tt)|0)+Math.imul(E,Y)|0,s=s+Math.imul(E,tt)|0,r=r+Math.imul(M,it)|0,n=(n=n+Math.imul(M,rt)|0)+Math.imul(b,it)|0,s=s+Math.imul(b,rt)|0,r=r+Math.imul(w,st)|0,n=(n=n+Math.imul(w,ot)|0)+Math.imul(v,st)|0,s=s+Math.imul(v,ot)|0,r=r+Math.imul(m,ht)|0,n=(n=n+Math.imul(m,ut)|0)+Math.imul(p,ht)|0,s=s+Math.imul(p,ut)|0;var Et=(u+(r=r+Math.imul(c,ct)|0)|0)+((8191&(n=(n=n+Math.imul(c,dt)|0)+Math.imul(d,ct)|0))<<13)|0;u=((s=s+Math.imul(d,dt)|0)+(n>>>13)|0)+(Et>>>26)|0,Et&=67108863,r=Math.imul(W,q),n=(n=Math.imul(W,$))+Math.imul(F,q)|0,s=Math.imul(F,$),r=r+Math.imul(D,G)|0,n=(n=n+Math.imul(D,z)|0)+Math.imul(L,G)|0,s=s+Math.imul(L,z)|0,r=r+Math.imul(C,Z)|0,n=(n=n+Math.imul(C,V)|0)+Math.imul(_,Z)|0,s=s+Math.imul(_,V)|0,r=r+Math.imul(O,K)|0,n=(n=n+Math.imul(O,X)|0)+Math.imul(T,K)|0,s=s+Math.imul(T,X)|0,r=r+Math.imul(S,Y)|0,n=(n=n+Math.imul(S,tt)|0)+Math.imul(k,Y)|0,s=s+Math.imul(k,tt)|0,r=r+Math.imul(x,it)|0,n=(n=n+Math.imul(x,rt)|0)+Math.imul(E,it)|0,s=s+Math.imul(E,rt)|0,r=r+Math.imul(M,st)|0,n=(n=n+Math.imul(M,ot)|0)+Math.imul(b,st)|0,s=s+Math.imul(b,ot)|0,r=r+Math.imul(w,ht)|0,n=(n=n+Math.imul(w,ut)|0)+Math.imul(v,ht)|0,s=s+Math.imul(v,ut)|0,r=r+Math.imul(m,ct)|0,n=(n=n+Math.imul(m,dt)|0)+Math.imul(p,ct)|0,s=s+Math.imul(p,dt)|0;var Rt=(u+(r=r+Math.imul(c,mt)|0)|0)+((8191&(n=(n=n+Math.imul(c,pt)|0)+Math.imul(d,mt)|0))<<13)|0;u=((s=s+Math.imul(d,pt)|0)+(n>>>13)|0)+(Rt>>>26)|0,Rt&=67108863,r=Math.imul(W,G),n=(n=Math.imul(W,z))+Math.imul(F,G)|0,s=Math.imul(F,z),r=r+Math.imul(D,Z)|0,n=(n=n+Math.imul(D,V)|0)+Math.imul(L,Z)|0,s=s+Math.imul(L,V)|0,r=r+Math.imul(C,K)|0,n=(n=n+Math.imul(C,X)|0)+Math.imul(_,K)|0,s=s+Math.imul(_,X)|0,r=r+Math.imul(O,Y)|0,n=(n=n+Math.imul(O,tt)|0)+Math.imul(T,Y)|0,s=s+Math.imul(T,tt)|0,r=r+Math.imul(S,it)|0,n=(n=n+Math.imul(S,rt)|0)+Math.imul(k,it)|0,s=s+Math.imul(k,rt)|0,r=r+Math.imul(x,st)|0,n=(n=n+Math.imul(x,ot)|0)+Math.imul(E,st)|0,s=s+Math.imul(E,ot)|0,r=r+Math.imul(M,ht)|0,n=(n=n+Math.imul(M,ut)|0)+Math.imul(b,ht)|0,s=s+Math.imul(b,ut)|0,r=r+Math.imul(w,ct)|0,n=(n=n+Math.imul(w,dt)|0)+Math.imul(v,ct)|0,s=s+Math.imul(v,dt)|0;var St=(u+(r=r+Math.imul(m,mt)|0)|0)+((8191&(n=(n=n+Math.imul(m,pt)|0)+Math.imul(p,mt)|0))<<13)|0;u=((s=s+Math.imul(p,pt)|0)+(n>>>13)|0)+(St>>>26)|0,St&=67108863,r=Math.imul(W,Z),n=(n=Math.imul(W,V))+Math.imul(F,Z)|0,s=Math.imul(F,V),r=r+Math.imul(D,K)|0,n=(n=n+Math.imul(D,X)|0)+Math.imul(L,K)|0,s=s+Math.imul(L,X)|0,r=r+Math.imul(C,Y)|0,n=(n=n+Math.imul(C,tt)|0)+Math.imul(_,Y)|0,s=s+Math.imul(_,tt)|0,r=r+Math.imul(O,it)|0,n=(n=n+Math.imul(O,rt)|0)+Math.imul(T,it)|0,s=s+Math.imul(T,rt)|0,r=r+Math.imul(S,st)|0,n=(n=n+Math.imul(S,ot)|0)+Math.imul(k,st)|0,s=s+Math.imul(k,ot)|0,r=r+Math.imul(x,ht)|0,n=(n=n+Math.imul(x,ut)|0)+Math.imul(E,ht)|0,s=s+Math.imul(E,ut)|0,r=r+Math.imul(M,ct)|0,n=(n=n+Math.imul(M,dt)|0)+Math.imul(b,ct)|0,s=s+Math.imul(b,dt)|0;var kt=(u+(r=r+Math.imul(w,mt)|0)|0)+((8191&(n=(n=n+Math.imul(w,pt)|0)+Math.imul(v,mt)|0))<<13)|0;u=((s=s+Math.imul(v,pt)|0)+(n>>>13)|0)+(kt>>>26)|0,kt&=67108863,r=Math.imul(W,K),n=(n=Math.imul(W,X))+Math.imul(F,K)|0,s=Math.imul(F,X),r=r+Math.imul(D,Y)|0,n=(n=n+Math.imul(D,tt)|0)+Math.imul(L,Y)|0,s=s+Math.imul(L,tt)|0,r=r+Math.imul(C,it)|0,n=(n=n+Math.imul(C,rt)|0)+Math.imul(_,it)|0,s=s+Math.imul(_,rt)|0,r=r+Math.imul(O,st)|0,n=(n=n+Math.imul(O,ot)|0)+Math.imul(T,st)|0,s=s+Math.imul(T,ot)|0,r=r+Math.imul(S,ht)|0,n=(n=n+Math.imul(S,ut)|0)+Math.imul(k,ht)|0,s=s+Math.imul(k,ut)|0,r=r+Math.imul(x,ct)|0,n=(n=n+Math.imul(x,dt)|0)+Math.imul(E,ct)|0,s=s+Math.imul(E,dt)|0;var It=(u+(r=r+Math.imul(M,mt)|0)|0)+((8191&(n=(n=n+Math.imul(M,pt)|0)+Math.imul(b,mt)|0))<<13)|0;u=((s=s+Math.imul(b,pt)|0)+(n>>>13)|0)+(It>>>26)|0,It&=67108863,r=Math.imul(W,Y),n=(n=Math.imul(W,tt))+Math.imul(F,Y)|0,s=Math.imul(F,tt),r=r+Math.imul(D,it)|0,n=(n=n+Math.imul(D,rt)|0)+Math.imul(L,it)|0,s=s+Math.imul(L,rt)|0,r=r+Math.imul(C,st)|0,n=(n=n+Math.imul(C,ot)|0)+Math.imul(_,st)|0,s=s+Math.imul(_,ot)|0,r=r+Math.imul(O,ht)|0,n=(n=n+Math.imul(O,ut)|0)+Math.imul(T,ht)|0,s=s+Math.imul(T,ut)|0,r=r+Math.imul(S,ct)|0,n=(n=n+Math.imul(S,dt)|0)+Math.imul(k,ct)|0,s=s+Math.imul(k,dt)|0;var Ot=(u+(r=r+Math.imul(x,mt)|0)|0)+((8191&(n=(n=n+Math.imul(x,pt)|0)+Math.imul(E,mt)|0))<<13)|0;u=((s=s+Math.imul(E,pt)|0)+(n>>>13)|0)+(Ot>>>26)|0,Ot&=67108863,r=Math.imul(W,it),n=(n=Math.imul(W,rt))+Math.imul(F,it)|0,s=Math.imul(F,rt),r=r+Math.imul(D,st)|0,n=(n=n+Math.imul(D,ot)|0)+Math.imul(L,st)|0,s=s+Math.imul(L,ot)|0,r=r+Math.imul(C,ht)|0,n=(n=n+Math.imul(C,ut)|0)+Math.imul(_,ht)|0,s=s+Math.imul(_,ut)|0,r=r+Math.imul(O,ct)|0,n=(n=n+Math.imul(O,dt)|0)+Math.imul(T,ct)|0,s=s+Math.imul(T,dt)|0;var Tt=(u+(r=r+Math.imul(S,mt)|0)|0)+((8191&(n=(n=n+Math.imul(S,pt)|0)+Math.imul(k,mt)|0))<<13)|0;u=((s=s+Math.imul(k,pt)|0)+(n>>>13)|0)+(Tt>>>26)|0,Tt&=67108863,r=Math.imul(W,st),n=(n=Math.imul(W,ot))+Math.imul(F,st)|0,s=Math.imul(F,ot),r=r+Math.imul(D,ht)|0,n=(n=n+Math.imul(D,ut)|0)+Math.imul(L,ht)|0,s=s+Math.imul(L,ut)|0,r=r+Math.imul(C,ct)|0,n=(n=n+Math.imul(C,dt)|0)+Math.imul(_,ct)|0,s=s+Math.imul(_,dt)|0;var Bt=(u+(r=r+Math.imul(O,mt)|0)|0)+((8191&(n=(n=n+Math.imul(O,pt)|0)+Math.imul(T,mt)|0))<<13)|0;u=((s=s+Math.imul(T,pt)|0)+(n>>>13)|0)+(Bt>>>26)|0,Bt&=67108863,r=Math.imul(W,ht),n=(n=Math.imul(W,ut))+Math.imul(F,ht)|0,s=Math.imul(F,ut),r=r+Math.imul(D,ct)|0,n=(n=n+Math.imul(D,dt)|0)+Math.imul(L,ct)|0,s=s+Math.imul(L,dt)|0;var Ct=(u+(r=r+Math.imul(C,mt)|0)|0)+((8191&(n=(n=n+Math.imul(C,pt)|0)+Math.imul(_,mt)|0))<<13)|0;u=((s=s+Math.imul(_,pt)|0)+(n>>>13)|0)+(Ct>>>26)|0,Ct&=67108863,r=Math.imul(W,ct),n=(n=Math.imul(W,dt))+Math.imul(F,ct)|0,s=Math.imul(F,dt);var _t=(u+(r=r+Math.imul(D,mt)|0)|0)+((8191&(n=(n=n+Math.imul(D,pt)|0)+Math.imul(L,mt)|0))<<13)|0;u=((s=s+Math.imul(L,pt)|0)+(n>>>13)|0)+(_t>>>26)|0,_t&=67108863;var Pt=(u+(r=Math.imul(W,mt))|0)+((8191&(n=(n=Math.imul(W,pt))+Math.imul(F,mt)|0))<<13)|0;return u=((s=Math.imul(F,pt))+(n>>>13)|0)+(Pt>>>26)|0,Pt&=67108863,h[0]=gt,h[1]=wt,h[2]=vt,h[3]=yt,h[4]=Mt,h[5]=bt,h[6]=At,h[7]=xt,h[8]=Et,h[9]=Rt,h[10]=St,h[11]=kt,h[12]=It,h[13]=Ot,h[14]=Tt,h[15]=Bt,h[16]=Ct,h[17]=_t,h[18]=Pt,0!==u&&(h[19]=u,i.length++),i};function f(t,e,i){return(new m).mulp(t,e,i)}function m(t,e){this.x=t,this.y=e}Math.imul||(d=c),n.prototype.mulTo=function(t,e){var i=this.length+t.length;return 10===this.length&&10===t.length?d(this,t,e):i<63?c(this,t,e):i<1024?function(t,e,i){i.negative=e.negative^t.negative,i.length=t.length+e.length;for(var r=0,n=0,s=0;s<i.length-1;s++){var o=n;n=0;for(var a=67108863&r,h=Math.min(s,e.length-1),u=Math.max(0,s-t.length+1);u<=h;u++){var l=(0|t.words[s-u])*(0|e.words[u]),c=67108863&l;a=67108863&(c=c+a|0),n+=(o=(o=o+(l/67108864|0)|0)+(c>>>26)|0)>>>26,o&=67108863}i.words[s]=a,r=o,o=n}return 0!==r?i.words[s]=r:i.length--,i.strip()}(this,t,e):f(this,t,e)},m.prototype.makeRBT=function(t){for(var e=new Array(t),i=n.prototype._countBits(t)-1,r=0;r<t;r++)e[r]=this.revBin(r,i,t);return e},m.prototype.revBin=function(t,e,i){if(0===t||t===i-1)return t;for(var r=0,n=0;n<e;n++)r|=(1&t)<<e-n-1,t>>=1;return r},m.prototype.permute=function(t,e,i,r,n,s){for(var o=0;o<s;o++)r[o]=e[t[o]],n[o]=i[t[o]]},m.prototype.transform=function(t,e,i,r,n,s){this.permute(s,t,e,i,r,n);for(var o=1;o<n;o<<=1)for(var a=o<<1,h=Math.cos(2*Math.PI/a),u=Math.sin(2*Math.PI/a),l=0;l<n;l+=a)for(var c=h,d=u,f=0;f<o;f++){var m=i[l+f],p=r[l+f],g=i[l+f+o],w=r[l+f+o],v=c*g-d*w;w=c*w+d*g,i[l+f]=m+(g=v),r[l+f]=p+w,i[l+f+o]=m-g,r[l+f+o]=p-w,f!==a&&(v=h*c-u*d,d=h*d+u*c,c=v)}},m.prototype.guessLen13b=function(t,e){var i=1|Math.max(e,t),r=1&i,n=0;for(i=i/2|0;i;i>>>=1)n++;return 1<<n+1+r},m.prototype.conjugate=function(t,e,i){if(!(i<=1))for(var r=0;r<i/2;r++){var n=t[r];t[r]=t[i-r-1],t[i-r-1]=n,n=e[r],e[r]=-e[i-r-1],e[i-r-1]=-n}},m.prototype.normalize13b=function(t,e){for(var i=0,r=0;r<e/2;r++){var n=8192*Math.round(t[2*r+1]/e)+Math.round(t[2*r]/e)+i;t[r]=67108863&n,i=n<67108864?0:n/67108864|0}return t},m.prototype.convert13b=function(t,e,r,n){for(var s=0,o=0;o<e;o++)r[2*o]=8191&(s+=0|t[o]),r[2*o+1]=8191&(s>>>=13),s>>>=13;for(o=2*e;o<n;++o)r[o]=0;i(0===s),i(0==(-8192&s))},m.prototype.stub=function(t){for(var e=new Array(t),i=0;i<t;i++)e[i]=0;return e},m.prototype.mulp=function(t,e,i){var r=2*this.guessLen13b(t.length,e.length),n=this.makeRBT(r),s=this.stub(r),o=new Array(r),a=new Array(r),h=new Array(r),u=new Array(r),l=new Array(r),c=new Array(r),d=i.words;d.length=r,this.convert13b(t.words,t.length,o,r),this.convert13b(e.words,e.length,u,r),this.transform(o,s,a,h,r,n),this.transform(u,s,l,c,r,n);for(var f=0;f<r;f++){var m=a[f]*l[f]-h[f]*c[f];h[f]=a[f]*c[f]+h[f]*l[f],a[f]=m}return this.conjugate(a,h,r),this.transform(a,h,d,s,r,n),this.conjugate(d,s,r),this.normalize13b(d,r),i.negative=t.negative^e.negative,i.length=t.length+e.length,i.strip()},n.prototype.mul=function(t){var e=new n(null);return e.words=new Array(this.length+t.length),this.mulTo(t,e)},n.prototype.mulf=function(t){var e=new n(null);return e.words=new Array(this.length+t.length),f(this,t,e)},n.prototype.imul=function(t){return this.clone().mulTo(t,this)},n.prototype.imuln=function(t){i("number"==typeof t),i(t<67108864);for(var e=0,r=0;r<this.length;r++){var n=(0|this.words[r])*t,s=(67108863&n)+(67108863&e);e>>=26,e+=n/67108864|0,e+=s>>>26,this.words[r]=67108863&s}return 0!==e&&(this.words[r]=e,this.length++),this},n.prototype.muln=function(t){return this.clone().imuln(t)},n.prototype.sqr=function(){return this.mul(this)},n.prototype.isqr=function(){return this.imul(this.clone())},n.prototype.pow=function(t){var e=function(t){for(var e=new Array(t.bitLength()),i=0;i<e.length;i++){var r=i%26;e[i]=(t.words[i/26|0]&1<<r)>>>r}return e}(t);if(0===e.length)return new n(1);for(var i=this,r=0;r<e.length&&0===e[r];r++,i=i.sqr());if(++r<e.length)for(var s=i.sqr();r<e.length;r++,s=s.sqr())0!==e[r]&&(i=i.mul(s));return i},n.prototype.iushln=function(t){i("number"==typeof t&&t>=0);var e,r=t%26,n=(t-r)/26,s=67108863>>>26-r<<26-r;if(0!==r){var o=0;for(e=0;e<this.length;e++){var a=this.words[e]&s;this.words[e]=(0|this.words[e])-a<<r|o,o=a>>>26-r}o&&(this.words[e]=o,this.length++)}if(0!==n){for(e=this.length-1;e>=0;e--)this.words[e+n]=this.words[e];for(e=0;e<n;e++)this.words[e]=0;this.length+=n}return this.strip()},n.prototype.ishln=function(t){return i(0===this.negative),this.iushln(t)},n.prototype.iushrn=function(t,e,r){var n;i("number"==typeof t&&t>=0),n=e?(e-e%26)/26:0;var s=t%26,o=Math.min((t-s)/26,this.length),a=67108863^67108863>>>s<<s,h=r;if(n-=o,n=Math.max(0,n),h){for(var u=0;u<o;u++)h.words[u]=this.words[u];h.length=o}if(0===o);else if(this.length>o)for(this.length-=o,u=0;u<this.length;u++)this.words[u]=this.words[u+o];else this.words[0]=0,this.length=1;var l=0;for(u=this.length-1;u>=0&&(0!==l||u>=n);u--){var c=0|this.words[u];this.words[u]=l<<26-s|c>>>s,l=c&a}return h&&0!==l&&(h.words[h.length++]=l),0===this.length&&(this.words[0]=0,this.length=1),this.strip()},n.prototype.ishrn=function(t,e,r){return i(0===this.negative),this.iushrn(t,e,r)},n.prototype.shln=function(t){return this.clone().ishln(t)},n.prototype.ushln=function(t){return this.clone().iushln(t)},n.prototype.shrn=function(t){return this.clone().ishrn(t)},n.prototype.ushrn=function(t){return this.clone().iushrn(t)},n.prototype.testn=function(t){i("number"==typeof t&&t>=0);var e=t%26,r=(t-e)/26;return!(this.length<=r||!(this.words[r]&1<<e))},n.prototype.imaskn=function(t){i("number"==typeof t&&t>=0);var e=t%26,r=(t-e)/26;return i(0===this.negative,"imaskn works only with positive numbers"),this.length<=r?this:(0!==e&&r++,this.length=Math.min(r,this.length),0!==e&&(this.words[this.length-1]&=67108863^67108863>>>e<<e),this.strip())},n.prototype.maskn=function(t){return this.clone().imaskn(t)},n.prototype.iaddn=function(t){return i("number"==typeof t),i(t<67108864),t<0?this.isubn(-t):0!==this.negative?1===this.length&&(0|this.words[0])<t?(this.words[0]=t-(0|this.words[0]),this.negative=0,this):(this.negative=0,this.isubn(t),this.negative=1,this):this._iaddn(t)},n.prototype._iaddn=function(t){this.words[0]+=t;for(var e=0;e<this.length&&this.words[e]>=67108864;e++)this.words[e]-=67108864,e===this.length-1?this.words[e+1]=1:this.words[e+1]++;return this.length=Math.max(this.length,e+1),this},n.prototype.isubn=function(t){if(i("number"==typeof t),i(t<67108864),t<0)return this.iaddn(-t);if(0!==this.negative)return this.negative=0,this.iaddn(t),this.negative=1,this;if(this.words[0]-=t,1===this.length&&this.words[0]<0)this.words[0]=-this.words[0],this.negative=1;else for(var e=0;e<this.length&&this.words[e]<0;e++)this.words[e]+=67108864,this.words[e+1]-=1;return this.strip()},n.prototype.addn=function(t){return this.clone().iaddn(t)},n.prototype.subn=function(t){return this.clone().isubn(t)},n.prototype.iabs=function(){return this.negative=0,this},n.prototype.abs=function(){return this.clone().iabs()},n.prototype._ishlnsubmul=function(t,e,r){var n,s;this._expand(t.length+r);var o=0;for(n=0;n<t.length;n++){s=(0|this.words[n+r])+o;var a=(0|t.words[n])*e;o=((s-=67108863&a)>>26)-(a/67108864|0),this.words[n+r]=67108863&s}for(;n<this.length-r;n++)o=(s=(0|this.words[n+r])+o)>>26,this.words[n+r]=67108863&s;if(0===o)return this.strip();for(i(-1===o),o=0,n=0;n<this.length;n++)o=(s=-(0|this.words[n])+o)>>26,this.words[n]=67108863&s;return this.negative=1,this.strip()},n.prototype._wordDiv=function(t,e){var i,r=this.clone(),s=t,o=0|s.words[s.length-1];0!=(i=26-this._countBits(o))&&(s=s.ushln(i),r.iushln(i),o=0|s.words[s.length-1]);var a,h=r.length-s.length;if("mod"!==e){(a=new n(null)).length=h+1,a.words=new Array(a.length);for(var u=0;u<a.length;u++)a.words[u]=0}var l=r.clone()._ishlnsubmul(s,1,h);0===l.negative&&(r=l,a&&(a.words[h]=1));for(var c=h-1;c>=0;c--){var d=67108864*(0|r.words[s.length+c])+(0|r.words[s.length+c-1]);for(d=Math.min(d/o|0,67108863),r._ishlnsubmul(s,d,c);0!==r.negative;)d--,r.negative=0,r._ishlnsubmul(s,1,c),r.isZero()||(r.negative^=1);a&&(a.words[c]=d)}return a&&a.strip(),r.strip(),"div"!==e&&0!==i&&r.iushrn(i),{div:a||null,mod:r}},n.prototype.divmod=function(t,e,r){return i(!t.isZero()),this.isZero()?{div:new n(0),mod:new n(0)}:0!==this.negative&&0===t.negative?(a=this.neg().divmod(t,e),"mod"!==e&&(s=a.div.neg()),"div"!==e&&(o=a.mod.neg(),r&&0!==o.negative&&o.iadd(t)),{div:s,mod:o}):0===this.negative&&0!==t.negative?(a=this.divmod(t.neg(),e),"mod"!==e&&(s=a.div.neg()),{div:s,mod:a.mod}):0!=(this.negative&t.negative)?(a=this.neg().divmod(t.neg(),e),"div"!==e&&(o=a.mod.neg(),r&&0!==o.negative&&o.isub(t)),{div:a.div,mod:o}):t.length>this.length||this.cmp(t)<0?{div:new n(0),mod:this}:1===t.length?"div"===e?{div:this.divn(t.words[0]),mod:null}:"mod"===e?{div:null,mod:new n(this.modn(t.words[0]))}:{div:this.divn(t.words[0]),mod:new n(this.modn(t.words[0]))}:this._wordDiv(t,e);var s,o,a},n.prototype.div=function(t){return this.divmod(t,"div",!1).div},n.prototype.mod=function(t){return this.divmod(t,"mod",!1).mod},n.prototype.umod=function(t){return this.divmod(t,"mod",!0).mod},n.prototype.divRound=function(t){var e=this.divmod(t);if(e.mod.isZero())return e.div;var i=0!==e.div.negative?e.mod.isub(t):e.mod,r=t.ushrn(1),n=t.andln(1),s=i.cmp(r);return s<0||1===n&&0===s?e.div:0!==e.div.negative?e.div.isubn(1):e.div.iaddn(1)},n.prototype.modn=function(t){i(t<=67108863);for(var e=(1<<26)%t,r=0,n=this.length-1;n>=0;n--)r=(e*r+(0|this.words[n]))%t;return r},n.prototype.idivn=function(t){i(t<=67108863);for(var e=0,r=this.length-1;r>=0;r--){var n=(0|this.words[r])+67108864*e;this.words[r]=n/t|0,e=n%t}return this.strip()},n.prototype.divn=function(t){return this.clone().idivn(t)},n.prototype.egcd=function(t){i(0===t.negative),i(!t.isZero());var e=this,r=t.clone();e=0!==e.negative?e.umod(t):e.clone();for(var s=new n(1),o=new n(0),a=new n(0),h=new n(1),u=0;e.isEven()&&r.isEven();)e.iushrn(1),r.iushrn(1),++u;for(var l=r.clone(),c=e.clone();!e.isZero();){for(var d=0,f=1;0==(e.words[0]&f)&&d<26;++d,f<<=1);if(d>0)for(e.iushrn(d);d-- >0;)(s.isOdd()||o.isOdd())&&(s.iadd(l),o.isub(c)),s.iushrn(1),o.iushrn(1);for(var m=0,p=1;0==(r.words[0]&p)&&m<26;++m,p<<=1);if(m>0)for(r.iushrn(m);m-- >0;)(a.isOdd()||h.isOdd())&&(a.iadd(l),h.isub(c)),a.iushrn(1),h.iushrn(1);e.cmp(r)>=0?(e.isub(r),s.isub(a),o.isub(h)):(r.isub(e),a.isub(s),h.isub(o))}return{a:a,b:h,gcd:r.iushln(u)}},n.prototype._invmp=function(t){i(0===t.negative),i(!t.isZero());var e=this,r=t.clone();e=0!==e.negative?e.umod(t):e.clone();for(var s,o=new n(1),a=new n(0),h=r.clone();e.cmpn(1)>0&&r.cmpn(1)>0;){for(var u=0,l=1;0==(e.words[0]&l)&&u<26;++u,l<<=1);if(u>0)for(e.iushrn(u);u-- >0;)o.isOdd()&&o.iadd(h),o.iushrn(1);for(var c=0,d=1;0==(r.words[0]&d)&&c<26;++c,d<<=1);if(c>0)for(r.iushrn(c);c-- >0;)a.isOdd()&&a.iadd(h),a.iushrn(1);e.cmp(r)>=0?(e.isub(r),o.isub(a)):(r.isub(e),a.isub(o))}return(s=0===e.cmpn(1)?o:a).cmpn(0)<0&&s.iadd(t),s},n.prototype.gcd=function(t){if(this.isZero())return t.abs();if(t.isZero())return this.abs();var e=this.clone(),i=t.clone();e.negative=0,i.negative=0;for(var r=0;e.isEven()&&i.isEven();r++)e.iushrn(1),i.iushrn(1);for(;;){for(;e.isEven();)e.iushrn(1);for(;i.isEven();)i.iushrn(1);var n=e.cmp(i);if(n<0){var s=e;e=i,i=s}else if(0===n||0===i.cmpn(1))break;e.isub(i)}return i.iushln(r)},n.prototype.invm=function(t){return this.egcd(t).a.umod(t)},n.prototype.isEven=function(){return 0==(1&this.words[0])},n.prototype.isOdd=function(){return 1==(1&this.words[0])},n.prototype.andln=function(t){return this.words[0]&t},n.prototype.bincn=function(t){i("number"==typeof t);var e=t%26,r=(t-e)/26,n=1<<e;if(this.length<=r)return this._expand(r+1),this.words[r]|=n,this;for(var s=n,o=r;0!==s&&o<this.length;o++){var a=0|this.words[o];s=(a+=s)>>>26,this.words[o]=a&=67108863}return 0!==s&&(this.words[o]=s,this.length++),this},n.prototype.isZero=function(){return 1===this.length&&0===this.words[0]},n.prototype.cmpn=function(t){var e,r=t<0;if(0!==this.negative&&!r)return-1;if(0===this.negative&&r)return 1;if(this.strip(),this.length>1)e=1;else{r&&(t=-t),i(t<=67108863,"Number is too big");var n=0|this.words[0];e=n===t?0:n<t?-1:1}return 0!==this.negative?0|-e:e},n.prototype.cmp=function(t){if(0!==this.negative&&0===t.negative)return-1;if(0===this.negative&&0!==t.negative)return 1;var e=this.ucmp(t);return 0!==this.negative?0|-e:e},n.prototype.ucmp=function(t){if(this.length>t.length)return 1;if(this.length<t.length)return-1;for(var e=0,i=this.length-1;i>=0;i--){var r=0|this.words[i],n=0|t.words[i];if(r!==n){r<n?e=-1:r>n&&(e=1);break}}return e},n.prototype.gtn=function(t){return 1===this.cmpn(t)},n.prototype.gt=function(t){return 1===this.cmp(t)},n.prototype.gten=function(t){return this.cmpn(t)>=0},n.prototype.gte=function(t){return this.cmp(t)>=0},n.prototype.ltn=function(t){return-1===this.cmpn(t)},n.prototype.lt=function(t){return-1===this.cmp(t)},n.prototype.lten=function(t){return this.cmpn(t)<=0},n.prototype.lte=function(t){return this.cmp(t)<=0},n.prototype.eqn=function(t){return 0===this.cmpn(t)},n.prototype.eq=function(t){return 0===this.cmp(t)},n.red=function(t){return new b(t)},n.prototype.toRed=function(t){return i(!this.red,"Already a number in reduction context"),i(0===this.negative,"red works only with positives"),t.convertTo(this)._forceRed(t)},n.prototype.fromRed=function(){return i(this.red,"fromRed works only with numbers in reduction context"),this.red.convertFrom(this)},n.prototype._forceRed=function(t){return this.red=t,this},n.prototype.forceRed=function(t){return i(!this.red,"Already a number in reduction context"),this._forceRed(t)},n.prototype.redAdd=function(t){return i(this.red,"redAdd works only with red numbers"),this.red.add(this,t)},n.prototype.redIAdd=function(t){return i(this.red,"redIAdd works only with red numbers"),this.red.iadd(this,t)},n.prototype.redSub=function(t){return i(this.red,"redSub works only with red numbers"),this.red.sub(this,t)},n.prototype.redISub=function(t){return i(this.red,"redISub works only with red numbers"),this.red.isub(this,t)},n.prototype.redShl=function(t){return i(this.red,"redShl works only with red numbers"),this.red.shl(this,t)},n.prototype.redMul=function(t){return i(this.red,"redMul works only with red numbers"),this.red._verify2(this,t),this.red.mul(this,t)},n.prototype.redIMul=function(t){return i(this.red,"redMul works only with red numbers"),this.red._verify2(this,t),this.red.imul(this,t)},n.prototype.redSqr=function(){return i(this.red,"redSqr works only with red numbers"),this.red._verify1(this),this.red.sqr(this)},n.prototype.redISqr=function(){return i(this.red,"redISqr works only with red numbers"),this.red._verify1(this),this.red.isqr(this)},n.prototype.redSqrt=function(){return i(this.red,"redSqrt works only with red numbers"),this.red._verify1(this),this.red.sqrt(this)},n.prototype.redInvm=function(){return i(this.red,"redInvm works only with red numbers"),this.red._verify1(this),this.red.invm(this)},n.prototype.redNeg=function(){return i(this.red,"redNeg works only with red numbers"),this.red._verify1(this),this.red.neg(this)},n.prototype.redPow=function(t){return i(this.red&&!t.red,"redPow(normalNum)"),this.red._verify1(this),this.red.pow(this,t)};var p={k256:null,p224:null,p192:null,p25519:null};function g(t,e){this.name=t,this.p=new n(e,16),this.n=this.p.bitLength(),this.k=new n(1).iushln(this.n).isub(this.p),this.tmp=this._tmp()}function w(){g.call(this,"k256","ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f")}function v(){g.call(this,"p224","ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001")}function y(){g.call(this,"p192","ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff")}function M(){g.call(this,"25519","7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed")}function b(t){if("string"==typeof t){var e=n._prime(t);this.m=e.p,this.prime=e}else i(t.gtn(1),"modulus must be greater than 1"),this.m=t,this.prime=null}function A(t){b.call(this,t),this.shift=this.m.bitLength(),this.shift%26!=0&&(this.shift+=26-this.shift%26),this.r=new n(1).iushln(this.shift),this.r2=this.imod(this.r.sqr()),this.rinv=this.r._invmp(this.m),this.minv=this.rinv.mul(this.r).isubn(1).div(this.m),this.minv=this.minv.umod(this.r),this.minv=this.r.sub(this.minv)}g.prototype._tmp=function(){var t=new n(null);return t.words=new Array(Math.ceil(this.n/13)),t},g.prototype.ireduce=function(t){var e,i=t;do{this.split(i,this.tmp),e=(i=(i=this.imulK(i)).iadd(this.tmp)).bitLength()}while(e>this.n);var r=e<this.n?-1:i.ucmp(this.p);return 0===r?(i.words[0]=0,i.length=1):r>0?i.isub(this.p):i.strip(),i},g.prototype.split=function(t,e){t.iushrn(this.n,0,e)},g.prototype.imulK=function(t){return t.imul(this.k)},r(w,g),w.prototype.split=function(t,e){for(var i=4194303,r=Math.min(t.length,9),n=0;n<r;n++)e.words[n]=t.words[n];if(e.length=r,t.length<=9)return t.words[0]=0,void(t.length=1);var s=t.words[9];for(e.words[e.length++]=s&i,n=10;n<t.length;n++){var o=0|t.words[n];t.words[n-10]=(o&i)<<4|s>>>22,s=o}t.words[n-10]=s>>>=22,t.length-=0===s&&t.length>10?10:9},w.prototype.imulK=function(t){t.words[t.length]=0,t.words[t.length+1]=0,t.length+=2;for(var e=0,i=0;i<t.length;i++){var r=0|t.words[i];t.words[i]=67108863&(e+=977*r),e=64*r+(e/67108864|0)}return 0===t.words[t.length-1]&&(t.length--,0===t.words[t.length-1]&&t.length--),t},r(v,g),r(y,g),r(M,g),M.prototype.imulK=function(t){for(var e=0,i=0;i<t.length;i++){var r=19*(0|t.words[i])+e,n=67108863&r;r>>>=26,t.words[i]=n,e=r}return 0!==e&&(t.words[t.length++]=e),t},n._prime=function(t){if(p[t])return p[t];var e;if("k256"===t)e=new w;else if("p224"===t)e=new v;else if("p192"===t)e=new y;else{if("p25519"!==t)throw new Error("Unknown prime "+t);e=new M}return p[t]=e,e},b.prototype._verify1=function(t){i(0===t.negative,"red works only with positives"),i(t.red,"red works only with red numbers")},b.prototype._verify2=function(t,e){i(0==(t.negative|e.negative),"red works only with positives"),i(t.red&&t.red===e.red,"red works only with red numbers")},b.prototype.imod=function(t){return this.prime?this.prime.ireduce(t)._forceRed(this):t.umod(this.m)._forceRed(this)},b.prototype.neg=function(t){return t.isZero()?t.clone():this.m.sub(t)._forceRed(this)},b.prototype.add=function(t,e){this._verify2(t,e);var i=t.add(e);return i.cmp(this.m)>=0&&i.isub(this.m),i._forceRed(this)},b.prototype.iadd=function(t,e){this._verify2(t,e);var i=t.iadd(e);return i.cmp(this.m)>=0&&i.isub(this.m),i},b.prototype.sub=function(t,e){this._verify2(t,e);var i=t.sub(e);return i.cmpn(0)<0&&i.iadd(this.m),i._forceRed(this)},b.prototype.isub=function(t,e){this._verify2(t,e);var i=t.isub(e);return i.cmpn(0)<0&&i.iadd(this.m),i},b.prototype.shl=function(t,e){return this._verify1(t),this.imod(t.ushln(e))},b.prototype.imul=function(t,e){return this._verify2(t,e),this.imod(t.imul(e))},b.prototype.mul=function(t,e){return this._verify2(t,e),this.imod(t.mul(e))},b.prototype.isqr=function(t){return this.imul(t,t.clone())},b.prototype.sqr=function(t){return this.mul(t,t)},b.prototype.sqrt=function(t){if(t.isZero())return t.clone();var e=this.m.andln(3);if(i(e%2==1),3===e){var r=this.m.add(new n(1)).iushrn(2);return this.pow(t,r)}for(var s=this.m.subn(1),o=0;!s.isZero()&&0===s.andln(1);)o++,s.iushrn(1);i(!s.isZero());var a=new n(1).toRed(this),h=a.redNeg(),u=this.m.subn(1).iushrn(1),l=this.m.bitLength();for(l=new n(2*l*l).toRed(this);0!==this.pow(l,u).cmp(h);)l.redIAdd(h);for(var c=this.pow(l,s),d=this.pow(t,s.addn(1).iushrn(1)),f=this.pow(t,s),m=o;0!==f.cmp(a);){for(var p=f,g=0;0!==p.cmp(a);g++)p=p.redSqr();i(g<m);var w=this.pow(c,new n(1).iushln(m-g-1));d=d.redMul(w),c=w.redSqr(),f=f.redMul(c),m=g}return d},b.prototype.invm=function(t){var e=t._invmp(this.m);return 0!==e.negative?(e.negative=0,this.imod(e).redNeg()):this.imod(e)},b.prototype.pow=function(t,e){if(e.isZero())return new n(1);if(0===e.cmpn(1))return t.clone();var i=new Array(16);i[0]=new n(1).toRed(this),i[1]=t;for(var r=2;r<i.length;r++)i[r]=this.mul(i[r-1],t);var s=i[0],o=0,a=0,h=e.bitLength()%26;for(0===h&&(h=26),r=e.length-1;r>=0;r--){for(var u=e.words[r],l=h-1;l>=0;l--){var c=u>>l&1;s!==i[0]&&(s=this.sqr(s)),0!==c||0!==o?(o<<=1,o|=c,(4==++a||0===r&&0===l)&&(s=this.mul(s,i[o]),a=0,o=0)):a=0}h=26}return s},b.prototype.convertTo=function(t){var e=t.umod(this.m);return e===t?e.clone():e},b.prototype.convertFrom=function(t){var e=t.clone();return e.red=null,e},n.mont=function(t){return new A(t)},r(A,b),A.prototype.convertTo=function(t){return this.imod(t.ushln(this.shift))},A.prototype.convertFrom=function(t){var e=this.imod(t.mul(this.rinv));return e.red=null,e},A.prototype.imul=function(t,e){if(t.isZero()||e.isZero())return t.words[0]=0,t.length=1,t;var i=t.imul(e),r=i.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),n=i.isub(r).iushrn(this.shift),s=n;return n.cmp(this.m)>=0?s=n.isub(this.m):n.cmpn(0)<0&&(s=n.iadd(this.m)),s._forceRed(this)},A.prototype.mul=function(t,e){if(t.isZero()||e.isZero())return new n(0)._forceRed(this);var i=t.mul(e),r=i.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),s=i.isub(r).iushrn(this.shift),o=s;return s.cmp(this.m)>=0?o=s.isub(this.m):s.cmpn(0)<0&&(o=s.iadd(this.m)),o._forceRed(this)},A.prototype.invm=function(t){return this.imod(t._invmp(this.m).mul(this.r2))._forceRed(this)}}(t,Ot)}),_t=Tt(function(t){!function(t,e){function i(t,e){if(!t)throw new Error(e||"Assertion failed")}function r(t,e){t.super_=e;var i=function(){};i.prototype=e.prototype,t.prototype=new i,t.prototype.constructor=t}function n(t,e,i){if(n.isBN(t))return t;this.negative=0,this.words=null,this.length=0,this.red=null,null!==t&&("le"!==e&&"be"!==e||(i=e,e=10),this._init(t||0,e||10,i||"be"))}var s;"object"==typeof t?t.exports=n:e.BN=n,n.BN=n,n.wordSize=26;try{s=Bt("buffer").Buffer}catch(t){}function o(t,e,i){for(var r=0,n=Math.min(t.length,i),s=e;s<n;s++){var o=t.charCodeAt(s)-48;r<<=4,r|=o>=49&&o<=54?o-49+10:o>=17&&o<=22?o-17+10:15&o}return r}function a(t,e,i,r){for(var n=0,s=Math.min(t.length,i),o=e;o<s;o++){var a=t.charCodeAt(o)-48;n*=r,n+=a>=49?a-49+10:a>=17?a-17+10:a}return n}n.isBN=function(t){return t instanceof n||null!==t&&"object"==typeof t&&t.constructor.wordSize===n.wordSize&&Array.isArray(t.words)},n.max=function(t,e){return t.cmp(e)>0?t:e},n.min=function(t,e){return t.cmp(e)<0?t:e},n.prototype._init=function(t,e,r){if("number"==typeof t)return this._initNumber(t,e,r);if("object"==typeof t)return this._initArray(t,e,r);"hex"===e&&(e=16),i(e===(0|e)&&e>=2&&e<=36);var n=0;"-"===(t=t.toString().replace(/\s+/g,""))[0]&&n++,16===e?this._parseHex(t,n):this._parseBase(t,e,n),"-"===t[0]&&(this.negative=1),this.strip(),"le"===r&&this._initArray(this.toArray(),e,r)},n.prototype._initNumber=function(t,e,r){t<0&&(this.negative=1,t=-t),t<67108864?(this.words=[67108863&t],this.length=1):t<4503599627370496?(this.words=[67108863&t,t/67108864&67108863],this.length=2):(i(t<9007199254740992),this.words=[67108863&t,t/67108864&67108863,1],this.length=3),"le"===r&&this._initArray(this.toArray(),e,r)},n.prototype._initArray=function(t,e,r){if(i("number"==typeof t.length),t.length<=0)return this.words=[0],this.length=1,this;this.length=Math.ceil(t.length/3),this.words=new Array(this.length);for(var n=0;n<this.length;n++)this.words[n]=0;var s,o,a=0;if("be"===r)for(n=t.length-1,s=0;n>=0;n-=3)this.words[s]|=(o=t[n]|t[n-1]<<8|t[n-2]<<16)<<a&67108863,this.words[s+1]=o>>>26-a&67108863,(a+=24)>=26&&(a-=26,s++);else if("le"===r)for(n=0,s=0;n<t.length;n+=3)this.words[s]|=(o=t[n]|t[n+1]<<8|t[n+2]<<16)<<a&67108863,this.words[s+1]=o>>>26-a&67108863,(a+=24)>=26&&(a-=26,s++);return this.strip()},n.prototype._parseHex=function(t,e){this.length=Math.ceil((t.length-e)/6),this.words=new Array(this.length);for(var i=0;i<this.length;i++)this.words[i]=0;var r,n,s=0;for(i=t.length-6,r=0;i>=e;i-=6)n=o(t,i,i+6),this.words[r]|=n<<s&67108863,this.words[r+1]|=n>>>26-s&4194303,(s+=24)>=26&&(s-=26,r++);i+6!==e&&(n=o(t,e,i+6),this.words[r]|=n<<s&67108863,this.words[r+1]|=n>>>26-s&4194303),this.strip()},n.prototype._parseBase=function(t,e,i){this.words=[0],this.length=1;for(var r=0,n=1;n<=67108863;n*=e)r++;r--,n=n/e|0;for(var s=t.length-i,o=s%r,h=Math.min(s,s-o)+i,u=0,l=i;l<h;l+=r)u=a(t,l,l+r,e),this.imuln(n),this.words[0]+u<67108864?this.words[0]+=u:this._iaddn(u);if(0!==o){var c=1;for(u=a(t,l,t.length,e),l=0;l<o;l++)c*=e;this.imuln(c),this.words[0]+u<67108864?this.words[0]+=u:this._iaddn(u)}},n.prototype.copy=function(t){t.words=new Array(this.length);for(var e=0;e<this.length;e++)t.words[e]=this.words[e];t.length=this.length,t.negative=this.negative,t.red=this.red},n.prototype.clone=function(){var t=new n(null);return this.copy(t),t},n.prototype._expand=function(t){for(;this.length<t;)this.words[this.length++]=0;return this},n.prototype.strip=function(){for(;this.length>1&&0===this.words[this.length-1];)this.length--;return this._normSign()},n.prototype._normSign=function(){return 1===this.length&&0===this.words[0]&&(this.negative=0),this},n.prototype.inspect=function(){return(this.red?"<BN-R: ":"<BN: ")+this.toString(16)+">"};var h=["","0","00","000","0000","00000","000000","0000000","00000000","000000000","0000000000","00000000000","000000000000","0000000000000","00000000000000","000000000000000","0000000000000000","00000000000000000","000000000000000000","0000000000000000000","00000000000000000000","000000000000000000000","0000000000000000000000","00000000000000000000000","000000000000000000000000","0000000000000000000000000"],u=[0,0,25,16,12,11,10,9,8,8,7,7,7,7,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5],l=[0,0,33554432,43046721,16777216,48828125,60466176,40353607,16777216,43046721,1e7,19487171,35831808,62748517,7529536,11390625,16777216,24137569,34012224,47045881,64e6,4084101,5153632,6436343,7962624,9765625,11881376,14348907,17210368,20511149,243e5,28629151,33554432,39135393,45435424,52521875,60466176];function c(t,e,i){i.negative=e.negative^t.negative;var r=t.length+e.length|0;i.length=r,r=r-1|0;var n=0|t.words[0],s=0|e.words[0],o=n*s,a=o/67108864|0;i.words[0]=67108863&o;for(var h=1;h<r;h++){for(var u=a>>>26,l=67108863&a,c=Math.min(h,e.length-1),d=Math.max(0,h-t.length+1);d<=c;d++)u+=(o=(n=0|t.words[h-d|0])*(s=0|e.words[d])+l)/67108864|0,l=67108863&o;i.words[h]=0|l,a=0|u}return 0!==a?i.words[h]=0|a:i.length--,i.strip()}n.prototype.toString=function(t,e){var r;if(e=0|e||1,16===(t=t||10)||"hex"===t){r="";for(var n=0,s=0,o=0;o<this.length;o++){var a=this.words[o],c=(16777215&(a<<n|s)).toString(16);r=0!=(s=a>>>24-n&16777215)||o!==this.length-1?h[6-c.length]+c+r:c+r,(n+=2)>=26&&(n-=26,o--)}for(0!==s&&(r=s.toString(16)+r);r.length%e!=0;)r="0"+r;return 0!==this.negative&&(r="-"+r),r}if(t===(0|t)&&t>=2&&t<=36){var d=u[t],f=l[t];r="";var m=this.clone();for(m.negative=0;!m.isZero();){var p=m.modn(f).toString(t);r=(m=m.idivn(f)).isZero()?p+r:h[d-p.length]+p+r}for(this.isZero()&&(r="0"+r);r.length%e!=0;)r="0"+r;return 0!==this.negative&&(r="-"+r),r}i(!1,"Base should be between 2 and 36")},n.prototype.toNumber=function(){var t=this.words[0];return 2===this.length?t+=67108864*this.words[1]:3===this.length&&1===this.words[2]?t+=4503599627370496+67108864*this.words[1]:this.length>2&&i(!1,"Number can only safely store up to 53 bits"),0!==this.negative?-t:t},n.prototype.toJSON=function(){return this.toString(16)},n.prototype.toBuffer=function(t,e){return i(void 0!==s),this.toArrayLike(s,t,e)},n.prototype.toArray=function(t,e){return this.toArrayLike(Array,t,e)},n.prototype.toArrayLike=function(t,e,r){var n=this.byteLength(),s=r||Math.max(1,n);i(n<=s,"byte array longer than desired length"),i(s>0,"Requested array length <= 0"),this.strip();var o,a,h="le"===e,u=new t(s),l=this.clone();if(h){for(a=0;!l.isZero();a++)o=l.andln(255),l.iushrn(8),u[a]=o;for(;a<s;a++)u[a]=0}else{for(a=0;a<s-n;a++)u[a]=0;for(a=0;!l.isZero();a++)o=l.andln(255),l.iushrn(8),u[s-a-1]=o}return u},n.prototype._countBits=Math.clz32?function(t){return 32-Math.clz32(t)}:function(t){var e=t,i=0;return e>=4096&&(i+=13,e>>>=13),e>=64&&(i+=7,e>>>=7),e>=8&&(i+=4,e>>>=4),e>=2&&(i+=2,e>>>=2),i+e},n.prototype._zeroBits=function(t){if(0===t)return 26;var e=t,i=0;return 0==(8191&e)&&(i+=13,e>>>=13),0==(127&e)&&(i+=7,e>>>=7),0==(15&e)&&(i+=4,e>>>=4),0==(3&e)&&(i+=2,e>>>=2),0==(1&e)&&i++,i},n.prototype.bitLength=function(){var t=this._countBits(this.words[this.length-1]);return 26*(this.length-1)+t},n.prototype.zeroBits=function(){if(this.isZero())return 0;for(var t=0,e=0;e<this.length;e++){var i=this._zeroBits(this.words[e]);if(t+=i,26!==i)break}return t},n.prototype.byteLength=function(){return Math.ceil(this.bitLength()/8)},n.prototype.toTwos=function(t){return 0!==this.negative?this.abs().inotn(t).iaddn(1):this.clone()},n.prototype.fromTwos=function(t){return this.testn(t-1)?this.notn(t).iaddn(1).ineg():this.clone()},n.prototype.isNeg=function(){return 0!==this.negative},n.prototype.neg=function(){return this.clone().ineg()},n.prototype.ineg=function(){return this.isZero()||(this.negative^=1),this},n.prototype.iuor=function(t){for(;this.length<t.length;)this.words[this.length++]=0;for(var e=0;e<t.length;e++)this.words[e]=this.words[e]|t.words[e];return this.strip()},n.prototype.ior=function(t){return i(0==(this.negative|t.negative)),this.iuor(t)},n.prototype.or=function(t){return this.length>t.length?this.clone().ior(t):t.clone().ior(this)},n.prototype.uor=function(t){return this.length>t.length?this.clone().iuor(t):t.clone().iuor(this)},n.prototype.iuand=function(t){var e;e=this.length>t.length?t:this;for(var i=0;i<e.length;i++)this.words[i]=this.words[i]&t.words[i];return this.length=e.length,this.strip()},n.prototype.iand=function(t){return i(0==(this.negative|t.negative)),this.iuand(t)},n.prototype.and=function(t){return this.length>t.length?this.clone().iand(t):t.clone().iand(this)},n.prototype.uand=function(t){return this.length>t.length?this.clone().iuand(t):t.clone().iuand(this)},n.prototype.iuxor=function(t){var e,i;this.length>t.length?(e=this,i=t):(e=t,i=this);for(var r=0;r<i.length;r++)this.words[r]=e.words[r]^i.words[r];if(this!==e)for(;r<e.length;r++)this.words[r]=e.words[r];return this.length=e.length,this.strip()},n.prototype.ixor=function(t){return i(0==(this.negative|t.negative)),this.iuxor(t)},n.prototype.xor=function(t){return this.length>t.length?this.clone().ixor(t):t.clone().ixor(this)},n.prototype.uxor=function(t){return this.length>t.length?this.clone().iuxor(t):t.clone().iuxor(this)},n.prototype.inotn=function(t){i("number"==typeof t&&t>=0);var e=0|Math.ceil(t/26),r=t%26;this._expand(e),r>0&&e--;for(var n=0;n<e;n++)this.words[n]=67108863&~this.words[n];return r>0&&(this.words[n]=~this.words[n]&67108863>>26-r),this.strip()},n.prototype.notn=function(t){return this.clone().inotn(t)},n.prototype.setn=function(t,e){i("number"==typeof t&&t>=0);var r=t/26|0,n=t%26;return this._expand(r+1),this.words[r]=e?this.words[r]|1<<n:this.words[r]&~(1<<n),this.strip()},n.prototype.iadd=function(t){var e,i,r;if(0!==this.negative&&0===t.negative)return this.negative=0,e=this.isub(t),this.negative^=1,this._normSign();if(0===this.negative&&0!==t.negative)return t.negative=0,e=this.isub(t),t.negative=1,e._normSign();this.length>t.length?(i=this,r=t):(i=t,r=this);for(var n=0,s=0;s<r.length;s++)this.words[s]=67108863&(e=(0|i.words[s])+(0|r.words[s])+n),n=e>>>26;for(;0!==n&&s<i.length;s++)this.words[s]=67108863&(e=(0|i.words[s])+n),n=e>>>26;if(this.length=i.length,0!==n)this.words[this.length]=n,this.length++;else if(i!==this)for(;s<i.length;s++)this.words[s]=i.words[s];return this},n.prototype.add=function(t){var e;return 0!==t.negative&&0===this.negative?(t.negative=0,e=this.sub(t),t.negative^=1,e):0===t.negative&&0!==this.negative?(this.negative=0,e=t.sub(this),this.negative=1,e):this.length>t.length?this.clone().iadd(t):t.clone().iadd(this)},n.prototype.isub=function(t){if(0!==t.negative){t.negative=0;var e=this.iadd(t);return t.negative=1,e._normSign()}if(0!==this.negative)return this.negative=0,this.iadd(t),this.negative=1,this._normSign();var i,r,n=this.cmp(t);if(0===n)return this.negative=0,this.length=1,this.words[0]=0,this;n>0?(i=this,r=t):(i=t,r=this);for(var s=0,o=0;o<r.length;o++)s=(e=(0|i.words[o])-(0|r.words[o])+s)>>26,this.words[o]=67108863&e;for(;0!==s&&o<i.length;o++)s=(e=(0|i.words[o])+s)>>26,this.words[o]=67108863&e;if(0===s&&o<i.length&&i!==this)for(;o<i.length;o++)this.words[o]=i.words[o];return this.length=Math.max(this.length,o),i!==this&&(this.negative=1),this.strip()},n.prototype.sub=function(t){return this.clone().isub(t)};var d=function(t,e,i){var r,n,s,o=t.words,a=e.words,h=i.words,u=0,l=0|o[0],c=8191&l,d=l>>>13,f=0|o[1],m=8191&f,p=f>>>13,g=0|o[2],w=8191&g,v=g>>>13,y=0|o[3],M=8191&y,b=y>>>13,A=0|o[4],x=8191&A,E=A>>>13,R=0|o[5],S=8191&R,k=R>>>13,I=0|o[6],O=8191&I,T=I>>>13,B=0|o[7],C=8191&B,_=B>>>13,P=0|o[8],D=8191&P,L=P>>>13,N=0|o[9],W=8191&N,F=N>>>13,U=0|a[0],q=8191&U,$=U>>>13,j=0|a[1],G=8191&j,z=j>>>13,H=0|a[2],Z=8191&H,V=H>>>13,J=0|a[3],K=8191&J,X=J>>>13,Q=0|a[4],Y=8191&Q,tt=Q>>>13,et=0|a[5],it=8191&et,rt=et>>>13,nt=0|a[6],st=8191&nt,ot=nt>>>13,at=0|a[7],ht=8191&at,ut=at>>>13,lt=0|a[8],ct=8191<,dt=lt>>>13,ft=0|a[9],mt=8191&ft,pt=ft>>>13;i.negative=t.negative^e.negative,i.length=19;var gt=(u+(r=Math.imul(c,q))|0)+((8191&(n=(n=Math.imul(c,$))+Math.imul(d,q)|0))<<13)|0;u=((s=Math.imul(d,$))+(n>>>13)|0)+(gt>>>26)|0,gt&=67108863,r=Math.imul(m,q),n=(n=Math.imul(m,$))+Math.imul(p,q)|0,s=Math.imul(p,$);var wt=(u+(r=r+Math.imul(c,G)|0)|0)+((8191&(n=(n=n+Math.imul(c,z)|0)+Math.imul(d,G)|0))<<13)|0;u=((s=s+Math.imul(d,z)|0)+(n>>>13)|0)+(wt>>>26)|0,wt&=67108863,r=Math.imul(w,q),n=(n=Math.imul(w,$))+Math.imul(v,q)|0,s=Math.imul(v,$),r=r+Math.imul(m,G)|0,n=(n=n+Math.imul(m,z)|0)+Math.imul(p,G)|0,s=s+Math.imul(p,z)|0;var vt=(u+(r=r+Math.imul(c,Z)|0)|0)+((8191&(n=(n=n+Math.imul(c,V)|0)+Math.imul(d,Z)|0))<<13)|0;u=((s=s+Math.imul(d,V)|0)+(n>>>13)|0)+(vt>>>26)|0,vt&=67108863,r=Math.imul(M,q),n=(n=Math.imul(M,$))+Math.imul(b,q)|0,s=Math.imul(b,$),r=r+Math.imul(w,G)|0,n=(n=n+Math.imul(w,z)|0)+Math.imul(v,G)|0,s=s+Math.imul(v,z)|0,r=r+Math.imul(m,Z)|0,n=(n=n+Math.imul(m,V)|0)+Math.imul(p,Z)|0,s=s+Math.imul(p,V)|0;var yt=(u+(r=r+Math.imul(c,K)|0)|0)+((8191&(n=(n=n+Math.imul(c,X)|0)+Math.imul(d,K)|0))<<13)|0;u=((s=s+Math.imul(d,X)|0)+(n>>>13)|0)+(yt>>>26)|0,yt&=67108863,r=Math.imul(x,q),n=(n=Math.imul(x,$))+Math.imul(E,q)|0,s=Math.imul(E,$),r=r+Math.imul(M,G)|0,n=(n=n+Math.imul(M,z)|0)+Math.imul(b,G)|0,s=s+Math.imul(b,z)|0,r=r+Math.imul(w,Z)|0,n=(n=n+Math.imul(w,V)|0)+Math.imul(v,Z)|0,s=s+Math.imul(v,V)|0,r=r+Math.imul(m,K)|0,n=(n=n+Math.imul(m,X)|0)+Math.imul(p,K)|0,s=s+Math.imul(p,X)|0;var Mt=(u+(r=r+Math.imul(c,Y)|0)|0)+((8191&(n=(n=n+Math.imul(c,tt)|0)+Math.imul(d,Y)|0))<<13)|0;u=((s=s+Math.imul(d,tt)|0)+(n>>>13)|0)+(Mt>>>26)|0,Mt&=67108863,r=Math.imul(S,q),n=(n=Math.imul(S,$))+Math.imul(k,q)|0,s=Math.imul(k,$),r=r+Math.imul(x,G)|0,n=(n=n+Math.imul(x,z)|0)+Math.imul(E,G)|0,s=s+Math.imul(E,z)|0,r=r+Math.imul(M,Z)|0,n=(n=n+Math.imul(M,V)|0)+Math.imul(b,Z)|0,s=s+Math.imul(b,V)|0,r=r+Math.imul(w,K)|0,n=(n=n+Math.imul(w,X)|0)+Math.imul(v,K)|0,s=s+Math.imul(v,X)|0,r=r+Math.imul(m,Y)|0,n=(n=n+Math.imul(m,tt)|0)+Math.imul(p,Y)|0,s=s+Math.imul(p,tt)|0;var bt=(u+(r=r+Math.imul(c,it)|0)|0)+((8191&(n=(n=n+Math.imul(c,rt)|0)+Math.imul(d,it)|0))<<13)|0;u=((s=s+Math.imul(d,rt)|0)+(n>>>13)|0)+(bt>>>26)|0,bt&=67108863,r=Math.imul(O,q),n=(n=Math.imul(O,$))+Math.imul(T,q)|0,s=Math.imul(T,$),r=r+Math.imul(S,G)|0,n=(n=n+Math.imul(S,z)|0)+Math.imul(k,G)|0,s=s+Math.imul(k,z)|0,r=r+Math.imul(x,Z)|0,n=(n=n+Math.imul(x,V)|0)+Math.imul(E,Z)|0,s=s+Math.imul(E,V)|0,r=r+Math.imul(M,K)|0,n=(n=n+Math.imul(M,X)|0)+Math.imul(b,K)|0,s=s+Math.imul(b,X)|0,r=r+Math.imul(w,Y)|0,n=(n=n+Math.imul(w,tt)|0)+Math.imul(v,Y)|0,s=s+Math.imul(v,tt)|0,r=r+Math.imul(m,it)|0,n=(n=n+Math.imul(m,rt)|0)+Math.imul(p,it)|0,s=s+Math.imul(p,rt)|0;var At=(u+(r=r+Math.imul(c,st)|0)|0)+((8191&(n=(n=n+Math.imul(c,ot)|0)+Math.imul(d,st)|0))<<13)|0;u=((s=s+Math.imul(d,ot)|0)+(n>>>13)|0)+(At>>>26)|0,At&=67108863,r=Math.imul(C,q),n=(n=Math.imul(C,$))+Math.imul(_,q)|0,s=Math.imul(_,$),r=r+Math.imul(O,G)|0,n=(n=n+Math.imul(O,z)|0)+Math.imul(T,G)|0,s=s+Math.imul(T,z)|0,r=r+Math.imul(S,Z)|0,n=(n=n+Math.imul(S,V)|0)+Math.imul(k,Z)|0,s=s+Math.imul(k,V)|0,r=r+Math.imul(x,K)|0,n=(n=n+Math.imul(x,X)|0)+Math.imul(E,K)|0,s=s+Math.imul(E,X)|0,r=r+Math.imul(M,Y)|0,n=(n=n+Math.imul(M,tt)|0)+Math.imul(b,Y)|0,s=s+Math.imul(b,tt)|0,r=r+Math.imul(w,it)|0,n=(n=n+Math.imul(w,rt)|0)+Math.imul(v,it)|0,s=s+Math.imul(v,rt)|0,r=r+Math.imul(m,st)|0,n=(n=n+Math.imul(m,ot)|0)+Math.imul(p,st)|0,s=s+Math.imul(p,ot)|0;var xt=(u+(r=r+Math.imul(c,ht)|0)|0)+((8191&(n=(n=n+Math.imul(c,ut)|0)+Math.imul(d,ht)|0))<<13)|0;u=((s=s+Math.imul(d,ut)|0)+(n>>>13)|0)+(xt>>>26)|0,xt&=67108863,r=Math.imul(D,q),n=(n=Math.imul(D,$))+Math.imul(L,q)|0,s=Math.imul(L,$),r=r+Math.imul(C,G)|0,n=(n=n+Math.imul(C,z)|0)+Math.imul(_,G)|0,s=s+Math.imul(_,z)|0,r=r+Math.imul(O,Z)|0,n=(n=n+Math.imul(O,V)|0)+Math.imul(T,Z)|0,s=s+Math.imul(T,V)|0,r=r+Math.imul(S,K)|0,n=(n=n+Math.imul(S,X)|0)+Math.imul(k,K)|0,s=s+Math.imul(k,X)|0,r=r+Math.imul(x,Y)|0,n=(n=n+Math.imul(x,tt)|0)+Math.imul(E,Y)|0,s=s+Math.imul(E,tt)|0,r=r+Math.imul(M,it)|0,n=(n=n+Math.imul(M,rt)|0)+Math.imul(b,it)|0,s=s+Math.imul(b,rt)|0,r=r+Math.imul(w,st)|0,n=(n=n+Math.imul(w,ot)|0)+Math.imul(v,st)|0,s=s+Math.imul(v,ot)|0,r=r+Math.imul(m,ht)|0,n=(n=n+Math.imul(m,ut)|0)+Math.imul(p,ht)|0,s=s+Math.imul(p,ut)|0;var Et=(u+(r=r+Math.imul(c,ct)|0)|0)+((8191&(n=(n=n+Math.imul(c,dt)|0)+Math.imul(d,ct)|0))<<13)|0;u=((s=s+Math.imul(d,dt)|0)+(n>>>13)|0)+(Et>>>26)|0,Et&=67108863,r=Math.imul(W,q),n=(n=Math.imul(W,$))+Math.imul(F,q)|0,s=Math.imul(F,$),r=r+Math.imul(D,G)|0,n=(n=n+Math.imul(D,z)|0)+Math.imul(L,G)|0,s=s+Math.imul(L,z)|0,r=r+Math.imul(C,Z)|0,n=(n=n+Math.imul(C,V)|0)+Math.imul(_,Z)|0,s=s+Math.imul(_,V)|0,r=r+Math.imul(O,K)|0,n=(n=n+Math.imul(O,X)|0)+Math.imul(T,K)|0,s=s+Math.imul(T,X)|0,r=r+Math.imul(S,Y)|0,n=(n=n+Math.imul(S,tt)|0)+Math.imul(k,Y)|0,s=s+Math.imul(k,tt)|0,r=r+Math.imul(x,it)|0,n=(n=n+Math.imul(x,rt)|0)+Math.imul(E,it)|0,s=s+Math.imul(E,rt)|0,r=r+Math.imul(M,st)|0,n=(n=n+Math.imul(M,ot)|0)+Math.imul(b,st)|0,s=s+Math.imul(b,ot)|0,r=r+Math.imul(w,ht)|0,n=(n=n+Math.imul(w,ut)|0)+Math.imul(v,ht)|0,s=s+Math.imul(v,ut)|0,r=r+Math.imul(m,ct)|0,n=(n=n+Math.imul(m,dt)|0)+Math.imul(p,ct)|0,s=s+Math.imul(p,dt)|0;var Rt=(u+(r=r+Math.imul(c,mt)|0)|0)+((8191&(n=(n=n+Math.imul(c,pt)|0)+Math.imul(d,mt)|0))<<13)|0;u=((s=s+Math.imul(d,pt)|0)+(n>>>13)|0)+(Rt>>>26)|0,Rt&=67108863,r=Math.imul(W,G),n=(n=Math.imul(W,z))+Math.imul(F,G)|0,s=Math.imul(F,z),r=r+Math.imul(D,Z)|0,n=(n=n+Math.imul(D,V)|0)+Math.imul(L,Z)|0,s=s+Math.imul(L,V)|0,r=r+Math.imul(C,K)|0,n=(n=n+Math.imul(C,X)|0)+Math.imul(_,K)|0,s=s+Math.imul(_,X)|0,r=r+Math.imul(O,Y)|0,n=(n=n+Math.imul(O,tt)|0)+Math.imul(T,Y)|0,s=s+Math.imul(T,tt)|0,r=r+Math.imul(S,it)|0,n=(n=n+Math.imul(S,rt)|0)+Math.imul(k,it)|0,s=s+Math.imul(k,rt)|0,r=r+Math.imul(x,st)|0,n=(n=n+Math.imul(x,ot)|0)+Math.imul(E,st)|0,s=s+Math.imul(E,ot)|0,r=r+Math.imul(M,ht)|0,n=(n=n+Math.imul(M,ut)|0)+Math.imul(b,ht)|0,s=s+Math.imul(b,ut)|0,r=r+Math.imul(w,ct)|0,n=(n=n+Math.imul(w,dt)|0)+Math.imul(v,ct)|0,s=s+Math.imul(v,dt)|0;var St=(u+(r=r+Math.imul(m,mt)|0)|0)+((8191&(n=(n=n+Math.imul(m,pt)|0)+Math.imul(p,mt)|0))<<13)|0;u=((s=s+Math.imul(p,pt)|0)+(n>>>13)|0)+(St>>>26)|0,St&=67108863,r=Math.imul(W,Z),n=(n=Math.imul(W,V))+Math.imul(F,Z)|0,s=Math.imul(F,V),r=r+Math.imul(D,K)|0,n=(n=n+Math.imul(D,X)|0)+Math.imul(L,K)|0,s=s+Math.imul(L,X)|0,r=r+Math.imul(C,Y)|0,n=(n=n+Math.imul(C,tt)|0)+Math.imul(_,Y)|0,s=s+Math.imul(_,tt)|0,r=r+Math.imul(O,it)|0,n=(n=n+Math.imul(O,rt)|0)+Math.imul(T,it)|0,s=s+Math.imul(T,rt)|0,r=r+Math.imul(S,st)|0,n=(n=n+Math.imul(S,ot)|0)+Math.imul(k,st)|0,s=s+Math.imul(k,ot)|0,r=r+Math.imul(x,ht)|0,n=(n=n+Math.imul(x,ut)|0)+Math.imul(E,ht)|0,s=s+Math.imul(E,ut)|0,r=r+Math.imul(M,ct)|0,n=(n=n+Math.imul(M,dt)|0)+Math.imul(b,ct)|0,s=s+Math.imul(b,dt)|0;var kt=(u+(r=r+Math.imul(w,mt)|0)|0)+((8191&(n=(n=n+Math.imul(w,pt)|0)+Math.imul(v,mt)|0))<<13)|0;u=((s=s+Math.imul(v,pt)|0)+(n>>>13)|0)+(kt>>>26)|0,kt&=67108863,r=Math.imul(W,K),n=(n=Math.imul(W,X))+Math.imul(F,K)|0,s=Math.imul(F,X),r=r+Math.imul(D,Y)|0,n=(n=n+Math.imul(D,tt)|0)+Math.imul(L,Y)|0,s=s+Math.imul(L,tt)|0,r=r+Math.imul(C,it)|0,n=(n=n+Math.imul(C,rt)|0)+Math.imul(_,it)|0,s=s+Math.imul(_,rt)|0,r=r+Math.imul(O,st)|0,n=(n=n+Math.imul(O,ot)|0)+Math.imul(T,st)|0,s=s+Math.imul(T,ot)|0,r=r+Math.imul(S,ht)|0,n=(n=n+Math.imul(S,ut)|0)+Math.imul(k,ht)|0,s=s+Math.imul(k,ut)|0,r=r+Math.imul(x,ct)|0,n=(n=n+Math.imul(x,dt)|0)+Math.imul(E,ct)|0,s=s+Math.imul(E,dt)|0;var It=(u+(r=r+Math.imul(M,mt)|0)|0)+((8191&(n=(n=n+Math.imul(M,pt)|0)+Math.imul(b,mt)|0))<<13)|0;u=((s=s+Math.imul(b,pt)|0)+(n>>>13)|0)+(It>>>26)|0,It&=67108863,r=Math.imul(W,Y),n=(n=Math.imul(W,tt))+Math.imul(F,Y)|0,s=Math.imul(F,tt),r=r+Math.imul(D,it)|0,n=(n=n+Math.imul(D,rt)|0)+Math.imul(L,it)|0,s=s+Math.imul(L,rt)|0,r=r+Math.imul(C,st)|0,n=(n=n+Math.imul(C,ot)|0)+Math.imul(_,st)|0,s=s+Math.imul(_,ot)|0,r=r+Math.imul(O,ht)|0,n=(n=n+Math.imul(O,ut)|0)+Math.imul(T,ht)|0,s=s+Math.imul(T,ut)|0,r=r+Math.imul(S,ct)|0,n=(n=n+Math.imul(S,dt)|0)+Math.imul(k,ct)|0,s=s+Math.imul(k,dt)|0;var Ot=(u+(r=r+Math.imul(x,mt)|0)|0)+((8191&(n=(n=n+Math.imul(x,pt)|0)+Math.imul(E,mt)|0))<<13)|0;u=((s=s+Math.imul(E,pt)|0)+(n>>>13)|0)+(Ot>>>26)|0,Ot&=67108863,r=Math.imul(W,it),n=(n=Math.imul(W,rt))+Math.imul(F,it)|0,s=Math.imul(F,rt),r=r+Math.imul(D,st)|0,n=(n=n+Math.imul(D,ot)|0)+Math.imul(L,st)|0,s=s+Math.imul(L,ot)|0,r=r+Math.imul(C,ht)|0,n=(n=n+Math.imul(C,ut)|0)+Math.imul(_,ht)|0,s=s+Math.imul(_,ut)|0,r=r+Math.imul(O,ct)|0,n=(n=n+Math.imul(O,dt)|0)+Math.imul(T,ct)|0,s=s+Math.imul(T,dt)|0;var Tt=(u+(r=r+Math.imul(S,mt)|0)|0)+((8191&(n=(n=n+Math.imul(S,pt)|0)+Math.imul(k,mt)|0))<<13)|0;u=((s=s+Math.imul(k,pt)|0)+(n>>>13)|0)+(Tt>>>26)|0,Tt&=67108863,r=Math.imul(W,st),n=(n=Math.imul(W,ot))+Math.imul(F,st)|0,s=Math.imul(F,ot),r=r+Math.imul(D,ht)|0,n=(n=n+Math.imul(D,ut)|0)+Math.imul(L,ht)|0,s=s+Math.imul(L,ut)|0,r=r+Math.imul(C,ct)|0,n=(n=n+Math.imul(C,dt)|0)+Math.imul(_,ct)|0,s=s+Math.imul(_,dt)|0;var Bt=(u+(r=r+Math.imul(O,mt)|0)|0)+((8191&(n=(n=n+Math.imul(O,pt)|0)+Math.imul(T,mt)|0))<<13)|0;u=((s=s+Math.imul(T,pt)|0)+(n>>>13)|0)+(Bt>>>26)|0,Bt&=67108863,r=Math.imul(W,ht),n=(n=Math.imul(W,ut))+Math.imul(F,ht)|0,s=Math.imul(F,ut),r=r+Math.imul(D,ct)|0,n=(n=n+Math.imul(D,dt)|0)+Math.imul(L,ct)|0,s=s+Math.imul(L,dt)|0;var Ct=(u+(r=r+Math.imul(C,mt)|0)|0)+((8191&(n=(n=n+Math.imul(C,pt)|0)+Math.imul(_,mt)|0))<<13)|0;u=((s=s+Math.imul(_,pt)|0)+(n>>>13)|0)+(Ct>>>26)|0,Ct&=67108863,r=Math.imul(W,ct),n=(n=Math.imul(W,dt))+Math.imul(F,ct)|0,s=Math.imul(F,dt);var _t=(u+(r=r+Math.imul(D,mt)|0)|0)+((8191&(n=(n=n+Math.imul(D,pt)|0)+Math.imul(L,mt)|0))<<13)|0;u=((s=s+Math.imul(L,pt)|0)+(n>>>13)|0)+(_t>>>26)|0,_t&=67108863;var Pt=(u+(r=Math.imul(W,mt))|0)+((8191&(n=(n=Math.imul(W,pt))+Math.imul(F,mt)|0))<<13)|0;return u=((s=Math.imul(F,pt))+(n>>>13)|0)+(Pt>>>26)|0,Pt&=67108863,h[0]=gt,h[1]=wt,h[2]=vt,h[3]=yt,h[4]=Mt,h[5]=bt,h[6]=At,h[7]=xt,h[8]=Et,h[9]=Rt,h[10]=St,h[11]=kt,h[12]=It,h[13]=Ot,h[14]=Tt,h[15]=Bt,h[16]=Ct,h[17]=_t,h[18]=Pt,0!==u&&(h[19]=u,i.length++),i};function f(t,e,i){return(new m).mulp(t,e,i)}function m(t,e){this.x=t,this.y=e}Math.imul||(d=c),n.prototype.mulTo=function(t,e){var i=this.length+t.length;return 10===this.length&&10===t.length?d(this,t,e):i<63?c(this,t,e):i<1024?function(t,e,i){i.negative=e.negative^t.negative,i.length=t.length+e.length;for(var r=0,n=0,s=0;s<i.length-1;s++){var o=n;n=0;for(var a=67108863&r,h=Math.min(s,e.length-1),u=Math.max(0,s-t.length+1);u<=h;u++){var l=(0|t.words[s-u])*(0|e.words[u]),c=67108863&l;a=67108863&(c=c+a|0),n+=(o=(o=o+(l/67108864|0)|0)+(c>>>26)|0)>>>26,o&=67108863}i.words[s]=a,r=o,o=n}return 0!==r?i.words[s]=r:i.length--,i.strip()}(this,t,e):f(this,t,e)},m.prototype.makeRBT=function(t){for(var e=new Array(t),i=n.prototype._countBits(t)-1,r=0;r<t;r++)e[r]=this.revBin(r,i,t);return e},m.prototype.revBin=function(t,e,i){if(0===t||t===i-1)return t;for(var r=0,n=0;n<e;n++)r|=(1&t)<<e-n-1,t>>=1;return r},m.prototype.permute=function(t,e,i,r,n,s){for(var o=0;o<s;o++)r[o]=e[t[o]],n[o]=i[t[o]]},m.prototype.transform=function(t,e,i,r,n,s){this.permute(s,t,e,i,r,n);for(var o=1;o<n;o<<=1)for(var a=o<<1,h=Math.cos(2*Math.PI/a),u=Math.sin(2*Math.PI/a),l=0;l<n;l+=a)for(var c=h,d=u,f=0;f<o;f++){var m=i[l+f],p=r[l+f],g=i[l+f+o],w=r[l+f+o],v=c*g-d*w;w=c*w+d*g,i[l+f]=m+(g=v),r[l+f]=p+w,i[l+f+o]=m-g,r[l+f+o]=p-w,f!==a&&(v=h*c-u*d,d=h*d+u*c,c=v)}},m.prototype.guessLen13b=function(t,e){var i=1|Math.max(e,t),r=1&i,n=0;for(i=i/2|0;i;i>>>=1)n++;return 1<<n+1+r},m.prototype.conjugate=function(t,e,i){if(!(i<=1))for(var r=0;r<i/2;r++){var n=t[r];t[r]=t[i-r-1],t[i-r-1]=n,n=e[r],e[r]=-e[i-r-1],e[i-r-1]=-n}},m.prototype.normalize13b=function(t,e){for(var i=0,r=0;r<e/2;r++){var n=8192*Math.round(t[2*r+1]/e)+Math.round(t[2*r]/e)+i;t[r]=67108863&n,i=n<67108864?0:n/67108864|0}return t},m.prototype.convert13b=function(t,e,r,n){for(var s=0,o=0;o<e;o++)r[2*o]=8191&(s+=0|t[o]),r[2*o+1]=8191&(s>>>=13),s>>>=13;for(o=2*e;o<n;++o)r[o]=0;i(0===s),i(0==(-8192&s))},m.prototype.stub=function(t){for(var e=new Array(t),i=0;i<t;i++)e[i]=0;return e},m.prototype.mulp=function(t,e,i){var r=2*this.guessLen13b(t.length,e.length),n=this.makeRBT(r),s=this.stub(r),o=new Array(r),a=new Array(r),h=new Array(r),u=new Array(r),l=new Array(r),c=new Array(r),d=i.words;d.length=r,this.convert13b(t.words,t.length,o,r),this.convert13b(e.words,e.length,u,r),this.transform(o,s,a,h,r,n),this.transform(u,s,l,c,r,n);for(var f=0;f<r;f++){var m=a[f]*l[f]-h[f]*c[f];h[f]=a[f]*c[f]+h[f]*l[f],a[f]=m}return this.conjugate(a,h,r),this.transform(a,h,d,s,r,n),this.conjugate(d,s,r),this.normalize13b(d,r),i.negative=t.negative^e.negative,i.length=t.length+e.length,i.strip()},n.prototype.mul=function(t){var e=new n(null);return e.words=new Array(this.length+t.length),this.mulTo(t,e)},n.prototype.mulf=function(t){var e=new n(null);return e.words=new Array(this.length+t.length),f(this,t,e)},n.prototype.imul=function(t){return this.clone().mulTo(t,this)},n.prototype.imuln=function(t){i("number"==typeof t),i(t<67108864);for(var e=0,r=0;r<this.length;r++){var n=(0|this.words[r])*t,s=(67108863&n)+(67108863&e);e>>=26,e+=n/67108864|0,e+=s>>>26,this.words[r]=67108863&s}return 0!==e&&(this.words[r]=e,this.length++),this},n.prototype.muln=function(t){return this.clone().imuln(t)},n.prototype.sqr=function(){return this.mul(this)},n.prototype.isqr=function(){return this.imul(this.clone())},n.prototype.pow=function(t){var e=function(t){for(var e=new Array(t.bitLength()),i=0;i<e.length;i++){var r=i%26;e[i]=(t.words[i/26|0]&1<<r)>>>r}return e}(t);if(0===e.length)return new n(1);for(var i=this,r=0;r<e.length&&0===e[r];r++,i=i.sqr());if(++r<e.length)for(var s=i.sqr();r<e.length;r++,s=s.sqr())0!==e[r]&&(i=i.mul(s));return i},n.prototype.iushln=function(t){i("number"==typeof t&&t>=0);var e,r=t%26,n=(t-r)/26,s=67108863>>>26-r<<26-r;if(0!==r){var o=0;for(e=0;e<this.length;e++){var a=this.words[e]&s;this.words[e]=(0|this.words[e])-a<<r|o,o=a>>>26-r}o&&(this.words[e]=o,this.length++)}if(0!==n){for(e=this.length-1;e>=0;e--)this.words[e+n]=this.words[e];for(e=0;e<n;e++)this.words[e]=0;this.length+=n}return this.strip()},n.prototype.ishln=function(t){return i(0===this.negative),this.iushln(t)},n.prototype.iushrn=function(t,e,r){var n;i("number"==typeof t&&t>=0),n=e?(e-e%26)/26:0;var s=t%26,o=Math.min((t-s)/26,this.length),a=67108863^67108863>>>s<<s,h=r;if(n-=o,n=Math.max(0,n),h){for(var u=0;u<o;u++)h.words[u]=this.words[u];h.length=o}if(0===o);else if(this.length>o)for(this.length-=o,u=0;u<this.length;u++)this.words[u]=this.words[u+o];else this.words[0]=0,this.length=1;var l=0;for(u=this.length-1;u>=0&&(0!==l||u>=n);u--){var c=0|this.words[u];this.words[u]=l<<26-s|c>>>s,l=c&a}return h&&0!==l&&(h.words[h.length++]=l),0===this.length&&(this.words[0]=0,this.length=1),this.strip()},n.prototype.ishrn=function(t,e,r){return i(0===this.negative),this.iushrn(t,e,r)},n.prototype.shln=function(t){return this.clone().ishln(t)},n.prototype.ushln=function(t){return this.clone().iushln(t)},n.prototype.shrn=function(t){return this.clone().ishrn(t)},n.prototype.ushrn=function(t){return this.clone().iushrn(t)},n.prototype.testn=function(t){i("number"==typeof t&&t>=0);var e=t%26,r=(t-e)/26;return!(this.length<=r||!(this.words[r]&1<<e))},n.prototype.imaskn=function(t){i("number"==typeof t&&t>=0);var e=t%26,r=(t-e)/26;return i(0===this.negative,"imaskn works only with positive numbers"),this.length<=r?this:(0!==e&&r++,this.length=Math.min(r,this.length),0!==e&&(this.words[this.length-1]&=67108863^67108863>>>e<<e),this.strip())},n.prototype.maskn=function(t){return this.clone().imaskn(t)},n.prototype.iaddn=function(t){return i("number"==typeof t),i(t<67108864),t<0?this.isubn(-t):0!==this.negative?1===this.length&&(0|this.words[0])<t?(this.words[0]=t-(0|this.words[0]),this.negative=0,this):(this.negative=0,this.isubn(t),this.negative=1,this):this._iaddn(t)},n.prototype._iaddn=function(t){this.words[0]+=t;for(var e=0;e<this.length&&this.words[e]>=67108864;e++)this.words[e]-=67108864,e===this.length-1?this.words[e+1]=1:this.words[e+1]++;return this.length=Math.max(this.length,e+1),this},n.prototype.isubn=function(t){if(i("number"==typeof t),i(t<67108864),t<0)return this.iaddn(-t);if(0!==this.negative)return this.negative=0,this.iaddn(t),this.negative=1,this;if(this.words[0]-=t,1===this.length&&this.words[0]<0)this.words[0]=-this.words[0],this.negative=1;else for(var e=0;e<this.length&&this.words[e]<0;e++)this.words[e]+=67108864,this.words[e+1]-=1;return this.strip()},n.prototype.addn=function(t){return this.clone().iaddn(t)},n.prototype.subn=function(t){return this.clone().isubn(t)},n.prototype.iabs=function(){return this.negative=0,this},n.prototype.abs=function(){return this.clone().iabs()},n.prototype._ishlnsubmul=function(t,e,r){var n,s;this._expand(t.length+r);var o=0;for(n=0;n<t.length;n++){s=(0|this.words[n+r])+o;var a=(0|t.words[n])*e;o=((s-=67108863&a)>>26)-(a/67108864|0),this.words[n+r]=67108863&s}for(;n<this.length-r;n++)o=(s=(0|this.words[n+r])+o)>>26,this.words[n+r]=67108863&s;if(0===o)return this.strip();for(i(-1===o),o=0,n=0;n<this.length;n++)o=(s=-(0|this.words[n])+o)>>26,this.words[n]=67108863&s;return this.negative=1,this.strip()},n.prototype._wordDiv=function(t,e){var i,r=this.clone(),s=t,o=0|s.words[s.length-1];0!=(i=26-this._countBits(o))&&(s=s.ushln(i),r.iushln(i),o=0|s.words[s.length-1]);var a,h=r.length-s.length;if("mod"!==e){(a=new n(null)).length=h+1,a.words=new Array(a.length);for(var u=0;u<a.length;u++)a.words[u]=0}var l=r.clone()._ishlnsubmul(s,1,h);0===l.negative&&(r=l,a&&(a.words[h]=1));for(var c=h-1;c>=0;c--){var d=67108864*(0|r.words[s.length+c])+(0|r.words[s.length+c-1]);for(d=Math.min(d/o|0,67108863),r._ishlnsubmul(s,d,c);0!==r.negative;)d--,r.negative=0,r._ishlnsubmul(s,1,c),r.isZero()||(r.negative^=1);a&&(a.words[c]=d)}return a&&a.strip(),r.strip(),"div"!==e&&0!==i&&r.iushrn(i),{div:a||null,mod:r}},n.prototype.divmod=function(t,e,r){return i(!t.isZero()),this.isZero()?{div:new n(0),mod:new n(0)}:0!==this.negative&&0===t.negative?(a=this.neg().divmod(t,e),"mod"!==e&&(s=a.div.neg()),"div"!==e&&(o=a.mod.neg(),r&&0!==o.negative&&o.iadd(t)),{div:s,mod:o}):0===this.negative&&0!==t.negative?(a=this.divmod(t.neg(),e),"mod"!==e&&(s=a.div.neg()),{div:s,mod:a.mod}):0!=(this.negative&t.negative)?(a=this.neg().divmod(t.neg(),e),"div"!==e&&(o=a.mod.neg(),r&&0!==o.negative&&o.isub(t)),{div:a.div,mod:o}):t.length>this.length||this.cmp(t)<0?{div:new n(0),mod:this}:1===t.length?"div"===e?{div:this.divn(t.words[0]),mod:null}:"mod"===e?{div:null,mod:new n(this.modn(t.words[0]))}:{div:this.divn(t.words[0]),mod:new n(this.modn(t.words[0]))}:this._wordDiv(t,e);var s,o,a},n.prototype.div=function(t){return this.divmod(t,"div",!1).div},n.prototype.mod=function(t){return this.divmod(t,"mod",!1).mod},n.prototype.umod=function(t){return this.divmod(t,"mod",!0).mod},n.prototype.divRound=function(t){var e=this.divmod(t);if(e.mod.isZero())return e.div;var i=0!==e.div.negative?e.mod.isub(t):e.mod,r=t.ushrn(1),n=t.andln(1),s=i.cmp(r);return s<0||1===n&&0===s?e.div:0!==e.div.negative?e.div.isubn(1):e.div.iaddn(1)},n.prototype.modn=function(t){i(t<=67108863);for(var e=(1<<26)%t,r=0,n=this.length-1;n>=0;n--)r=(e*r+(0|this.words[n]))%t;return r},n.prototype.idivn=function(t){i(t<=67108863);for(var e=0,r=this.length-1;r>=0;r--){var n=(0|this.words[r])+67108864*e;this.words[r]=n/t|0,e=n%t}return this.strip()},n.prototype.divn=function(t){return this.clone().idivn(t)},n.prototype.egcd=function(t){i(0===t.negative),i(!t.isZero());var e=this,r=t.clone();e=0!==e.negative?e.umod(t):e.clone();for(var s=new n(1),o=new n(0),a=new n(0),h=new n(1),u=0;e.isEven()&&r.isEven();)e.iushrn(1),r.iushrn(1),++u;for(var l=r.clone(),c=e.clone();!e.isZero();){for(var d=0,f=1;0==(e.words[0]&f)&&d<26;++d,f<<=1);if(d>0)for(e.iushrn(d);d-- >0;)(s.isOdd()||o.isOdd())&&(s.iadd(l),o.isub(c)),s.iushrn(1),o.iushrn(1);for(var m=0,p=1;0==(r.words[0]&p)&&m<26;++m,p<<=1);if(m>0)for(r.iushrn(m);m-- >0;)(a.isOdd()||h.isOdd())&&(a.iadd(l),h.isub(c)),a.iushrn(1),h.iushrn(1);e.cmp(r)>=0?(e.isub(r),s.isub(a),o.isub(h)):(r.isub(e),a.isub(s),h.isub(o))}return{a:a,b:h,gcd:r.iushln(u)}},n.prototype._invmp=function(t){i(0===t.negative),i(!t.isZero());var e=this,r=t.clone();e=0!==e.negative?e.umod(t):e.clone();for(var s,o=new n(1),a=new n(0),h=r.clone();e.cmpn(1)>0&&r.cmpn(1)>0;){for(var u=0,l=1;0==(e.words[0]&l)&&u<26;++u,l<<=1);if(u>0)for(e.iushrn(u);u-- >0;)o.isOdd()&&o.iadd(h),o.iushrn(1);for(var c=0,d=1;0==(r.words[0]&d)&&c<26;++c,d<<=1);if(c>0)for(r.iushrn(c);c-- >0;)a.isOdd()&&a.iadd(h),a.iushrn(1);e.cmp(r)>=0?(e.isub(r),o.isub(a)):(r.isub(e),a.isub(o))}return(s=0===e.cmpn(1)?o:a).cmpn(0)<0&&s.iadd(t),s},n.prototype.gcd=function(t){if(this.isZero())return t.abs();if(t.isZero())return this.abs();var e=this.clone(),i=t.clone();e.negative=0,i.negative=0;for(var r=0;e.isEven()&&i.isEven();r++)e.iushrn(1),i.iushrn(1);for(;;){for(;e.isEven();)e.iushrn(1);for(;i.isEven();)i.iushrn(1);var n=e.cmp(i);if(n<0){var s=e;e=i,i=s}else if(0===n||0===i.cmpn(1))break;e.isub(i)}return i.iushln(r)},n.prototype.invm=function(t){return this.egcd(t).a.umod(t)},n.prototype.isEven=function(){return 0==(1&this.words[0])},n.prototype.isOdd=function(){return 1==(1&this.words[0])},n.prototype.andln=function(t){return this.words[0]&t},n.prototype.bincn=function(t){i("number"==typeof t);var e=t%26,r=(t-e)/26,n=1<<e;if(this.length<=r)return this._expand(r+1),this.words[r]|=n,this;for(var s=n,o=r;0!==s&&o<this.length;o++){var a=0|this.words[o];s=(a+=s)>>>26,this.words[o]=a&=67108863}return 0!==s&&(this.words[o]=s,this.length++),this},n.prototype.isZero=function(){return 1===this.length&&0===this.words[0]},n.prototype.cmpn=function(t){var e,r=t<0;if(0!==this.negative&&!r)return-1;if(0===this.negative&&r)return 1;if(this.strip(),this.length>1)e=1;else{r&&(t=-t),i(t<=67108863,"Number is too big");var n=0|this.words[0];e=n===t?0:n<t?-1:1}return 0!==this.negative?0|-e:e},n.prototype.cmp=function(t){if(0!==this.negative&&0===t.negative)return-1;if(0===this.negative&&0!==t.negative)return 1;var e=this.ucmp(t);return 0!==this.negative?0|-e:e},n.prototype.ucmp=function(t){if(this.length>t.length)return 1;if(this.length<t.length)return-1;for(var e=0,i=this.length-1;i>=0;i--){var r=0|this.words[i],n=0|t.words[i];if(r!==n){r<n?e=-1:r>n&&(e=1);break}}return e},n.prototype.gtn=function(t){return 1===this.cmpn(t)},n.prototype.gt=function(t){return 1===this.cmp(t)},n.prototype.gten=function(t){return this.cmpn(t)>=0},n.prototype.gte=function(t){return this.cmp(t)>=0},n.prototype.ltn=function(t){return-1===this.cmpn(t)},n.prototype.lt=function(t){return-1===this.cmp(t)},n.prototype.lten=function(t){return this.cmpn(t)<=0},n.prototype.lte=function(t){return this.cmp(t)<=0},n.prototype.eqn=function(t){return 0===this.cmpn(t)},n.prototype.eq=function(t){return 0===this.cmp(t)},n.red=function(t){return new b(t)},n.prototype.toRed=function(t){return i(!this.red,"Already a number in reduction context"),i(0===this.negative,"red works only with positives"),t.convertTo(this)._forceRed(t)},n.prototype.fromRed=function(){return i(this.red,"fromRed works only with numbers in reduction context"),this.red.convertFrom(this)},n.prototype._forceRed=function(t){return this.red=t,this},n.prototype.forceRed=function(t){return i(!this.red,"Already a number in reduction context"),this._forceRed(t)},n.prototype.redAdd=function(t){return i(this.red,"redAdd works only with red numbers"),this.red.add(this,t)},n.prototype.redIAdd=function(t){return i(this.red,"redIAdd works only with red numbers"),this.red.iadd(this,t)},n.prototype.redSub=function(t){return i(this.red,"redSub works only with red numbers"),this.red.sub(this,t)},n.prototype.redISub=function(t){return i(this.red,"redISub works only with red numbers"),this.red.isub(this,t)},n.prototype.redShl=function(t){return i(this.red,"redShl works only with red numbers"),this.red.shl(this,t)},n.prototype.redMul=function(t){return i(this.red,"redMul works only with red numbers"),this.red._verify2(this,t),this.red.mul(this,t)},n.prototype.redIMul=function(t){return i(this.red,"redMul works only with red numbers"),this.red._verify2(this,t),this.red.imul(this,t)},n.prototype.redSqr=function(){return i(this.red,"redSqr works only with red numbers"),this.red._verify1(this),this.red.sqr(this)},n.prototype.redISqr=function(){return i(this.red,"redISqr works only with red numbers"),this.red._verify1(this),this.red.isqr(this)},n.prototype.redSqrt=function(){return i(this.red,"redSqrt works only with red numbers"),this.red._verify1(this),this.red.sqrt(this)},n.prototype.redInvm=function(){return i(this.red,"redInvm works only with red numbers"),this.red._verify1(this),this.red.invm(this)},n.prototype.redNeg=function(){return i(this.red,"redNeg works only with red numbers"),this.red._verify1(this),this.red.neg(this)},n.prototype.redPow=function(t){return i(this.red&&!t.red,"redPow(normalNum)"),this.red._verify1(this),this.red.pow(this,t)};var p={k256:null,p224:null,p192:null,p25519:null};function g(t,e){this.name=t,this.p=new n(e,16),this.n=this.p.bitLength(),this.k=new n(1).iushln(this.n).isub(this.p),this.tmp=this._tmp()}function w(){g.call(this,"k256","ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f")}function v(){g.call(this,"p224","ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001")}function y(){g.call(this,"p192","ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff")}function M(){g.call(this,"25519","7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed")}function b(t){if("string"==typeof t){var e=n._prime(t);this.m=e.p,this.prime=e}else i(t.gtn(1),"modulus must be greater than 1"),this.m=t,this.prime=null}function A(t){b.call(this,t),this.shift=this.m.bitLength(),this.shift%26!=0&&(this.shift+=26-this.shift%26),this.r=new n(1).iushln(this.shift),this.r2=this.imod(this.r.sqr()),this.rinv=this.r._invmp(this.m),this.minv=this.rinv.mul(this.r).isubn(1).div(this.m),this.minv=this.minv.umod(this.r),this.minv=this.r.sub(this.minv)}g.prototype._tmp=function(){var t=new n(null);return t.words=new Array(Math.ceil(this.n/13)),t},g.prototype.ireduce=function(t){var e,i=t;do{this.split(i,this.tmp),e=(i=(i=this.imulK(i)).iadd(this.tmp)).bitLength()}while(e>this.n);var r=e<this.n?-1:i.ucmp(this.p);return 0===r?(i.words[0]=0,i.length=1):r>0?i.isub(this.p):i.strip(),i},g.prototype.split=function(t,e){t.iushrn(this.n,0,e)},g.prototype.imulK=function(t){return t.imul(this.k)},r(w,g),w.prototype.split=function(t,e){for(var i=4194303,r=Math.min(t.length,9),n=0;n<r;n++)e.words[n]=t.words[n];if(e.length=r,t.length<=9)return t.words[0]=0,void(t.length=1);var s=t.words[9];for(e.words[e.length++]=s&i,n=10;n<t.length;n++){var o=0|t.words[n];t.words[n-10]=(o&i)<<4|s>>>22,s=o}t.words[n-10]=s>>>=22,t.length-=0===s&&t.length>10?10:9},w.prototype.imulK=function(t){t.words[t.length]=0,t.words[t.length+1]=0,t.length+=2;for(var e=0,i=0;i<t.length;i++){var r=0|t.words[i];t.words[i]=67108863&(e+=977*r),e=64*r+(e/67108864|0)}return 0===t.words[t.length-1]&&(t.length--,0===t.words[t.length-1]&&t.length--),t},r(v,g),r(y,g),r(M,g),M.prototype.imulK=function(t){for(var e=0,i=0;i<t.length;i++){var r=19*(0|t.words[i])+e,n=67108863&r;r>>>=26,t.words[i]=n,e=r}return 0!==e&&(t.words[t.length++]=e),t},n._prime=function(t){if(p[t])return p[t];var e;if("k256"===t)e=new w;else if("p224"===t)e=new v;else if("p192"===t)e=new y;else{if("p25519"!==t)throw new Error("Unknown prime "+t);e=new M}return p[t]=e,e},b.prototype._verify1=function(t){i(0===t.negative,"red works only with positives"),i(t.red,"red works only with red numbers")},b.prototype._verify2=function(t,e){i(0==(t.negative|e.negative),"red works only with positives"),i(t.red&&t.red===e.red,"red works only with red numbers")},b.prototype.imod=function(t){return this.prime?this.prime.ireduce(t)._forceRed(this):t.umod(this.m)._forceRed(this)},b.prototype.neg=function(t){return t.isZero()?t.clone():this.m.sub(t)._forceRed(this)},b.prototype.add=function(t,e){this._verify2(t,e);var i=t.add(e);return i.cmp(this.m)>=0&&i.isub(this.m),i._forceRed(this)},b.prototype.iadd=function(t,e){this._verify2(t,e);var i=t.iadd(e);return i.cmp(this.m)>=0&&i.isub(this.m),i},b.prototype.sub=function(t,e){this._verify2(t,e);var i=t.sub(e);return i.cmpn(0)<0&&i.iadd(this.m),i._forceRed(this)},b.prototype.isub=function(t,e){this._verify2(t,e);var i=t.isub(e);return i.cmpn(0)<0&&i.iadd(this.m),i},b.prototype.shl=function(t,e){return this._verify1(t),this.imod(t.ushln(e))},b.prototype.imul=function(t,e){return this._verify2(t,e),this.imod(t.imul(e))},b.prototype.mul=function(t,e){return this._verify2(t,e),this.imod(t.mul(e))},b.prototype.isqr=function(t){return this.imul(t,t.clone())},b.prototype.sqr=function(t){return this.mul(t,t)},b.prototype.sqrt=function(t){if(t.isZero())return t.clone();var e=this.m.andln(3);if(i(e%2==1),3===e){var r=this.m.add(new n(1)).iushrn(2);return this.pow(t,r)}for(var s=this.m.subn(1),o=0;!s.isZero()&&0===s.andln(1);)o++,s.iushrn(1);i(!s.isZero());var a=new n(1).toRed(this),h=a.redNeg(),u=this.m.subn(1).iushrn(1),l=this.m.bitLength();for(l=new n(2*l*l).toRed(this);0!==this.pow(l,u).cmp(h);)l.redIAdd(h);for(var c=this.pow(l,s),d=this.pow(t,s.addn(1).iushrn(1)),f=this.pow(t,s),m=o;0!==f.cmp(a);){for(var p=f,g=0;0!==p.cmp(a);g++)p=p.redSqr();i(g<m);var w=this.pow(c,new n(1).iushln(m-g-1));d=d.redMul(w),c=w.redSqr(),f=f.redMul(c),m=g}return d},b.prototype.invm=function(t){var e=t._invmp(this.m);return 0!==e.negative?(e.negative=0,this.imod(e).redNeg()):this.imod(e)},b.prototype.pow=function(t,e){if(e.isZero())return new n(1);if(0===e.cmpn(1))return t.clone();var i=new Array(16);i[0]=new n(1).toRed(this),i[1]=t;for(var r=2;r<i.length;r++)i[r]=this.mul(i[r-1],t);var s=i[0],o=0,a=0,h=e.bitLength()%26;for(0===h&&(h=26),r=e.length-1;r>=0;r--){for(var u=e.words[r],l=h-1;l>=0;l--){var c=u>>l&1;s!==i[0]&&(s=this.sqr(s)),0!==c||0!==o?(o<<=1,o|=c,(4==++a||0===r&&0===l)&&(s=this.mul(s,i[o]),a=0,o=0)):a=0}h=26}return s},b.prototype.convertTo=function(t){var e=t.umod(this.m);return e===t?e.clone():e},b.prototype.convertFrom=function(t){var e=t.clone();return e.red=null,e},n.mont=function(t){return new A(t)},r(A,b),A.prototype.convertTo=function(t){return this.imod(t.ushln(this.shift))},A.prototype.convertFrom=function(t){var e=this.imod(t.mul(this.rinv));return e.red=null,e},A.prototype.imul=function(t,e){if(t.isZero()||e.isZero())return t.words[0]=0,t.length=1,t;var i=t.imul(e),r=i.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),n=i.isub(r).iushrn(this.shift),s=n;return n.cmp(this.m)>=0?s=n.isub(this.m):n.cmpn(0)<0&&(s=n.iadd(this.m)),s._forceRed(this)},A.prototype.mul=function(t,e){if(t.isZero()||e.isZero())return new n(0)._forceRed(this);var i=t.mul(e),r=i.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),s=i.isub(r).iushrn(this.shift),o=s;return s.cmp(this.m)>=0?o=s.isub(this.m):s.cmpn(0)<0&&(o=s.iadd(this.m)),o._forceRed(this)},A.prototype.invm=function(t){return this.imod(t._invmp(this.m).mul(this.r2))._forceRed(this)}}(t,Ot)}),Pt=function(t){return"string"!=typeof t?t:function(t){if("string"!=typeof t)throw new Error("[is-hex-prefixed] value must be type 'string', is currently type "+typeof t+", while checking isHexPrefixed.");return"0x"===t.slice(0,2)}(t)?t.slice(2):t},Dt=function(t){if("string"==typeof t||"number"==typeof t){var e=new _t(1),i=String(t).toLowerCase().trim(),r="0x"===i.substr(0,2)||"-0x"===i.substr(0,3),n=Pt(i);if("-"===n.substr(0,1)&&(n=Pt(n.slice(1)),e=new _t(-1,10)),!(n=""===n?"0":n).match(/^-?[0-9]+$/)&&n.match(/^[0-9A-Fa-f]+$/)||n.match(/^[a-fA-F]+$/)||!0===r&&n.match(/^[0-9A-Fa-f]+$/))return new _t(n,16).mul(e);if((n.match(/^-?[0-9]+$/)||""===n)&&!1===r)return new _t(n,10).mul(e)}else if("object"==typeof t&&t.toString&&!t.pop&&!t.push&&t.toString(10).match(/^-?[0-9]+$/)&&(t.mul||t.dividedToIntegerBy))return new _t(t.toString(10),10);throw new Error("[number-to-bn] while converting number "+JSON.stringify(t)+" to BN.js instance, error: invalid number value. Value must be an integer, hex string, BN or BigNumber instance. Note, decimals are not supported.")},Lt=new Ct(0),Nt=new Ct(-1),Wt={noether:"0",wei:"1",kwei:"1000",Kwei:"1000",babbage:"1000",femtoether:"1000",mwei:"1000000",Mwei:"1000000",lovelace:"1000000",picoether:"1000000",gwei:"1000000000",Gwei:"1000000000",shannon:"1000000000",nanoether:"1000000000",nano:"1000000000",szabo:"1000000000000",microether:"1000000000000",micro:"1000000000000",finney:"1000000000000000",milliether:"1000000000000000",milli:"1000000000000000",ether:"1000000000000000000",kether:"1000000000000000000000",grand:"1000000000000000000000",mether:"1000000000000000000000000",gether:"1000000000000000000000000000",tether:"1000000000000000000000000000000"};function Ft(t){var e=t?t.toLowerCase():"ether",i=Wt[e];if("string"!=typeof i)throw new Error("[ethjs-unit] the unit provided "+t+" doesn't exists, please use the one of the following units "+JSON.stringify(Wt,null,2));return new Ct(i,10)}function Ut(t){if("string"==typeof t){if(!t.match(/^-?[0-9.]+$/))throw new Error("while converting number to string, invalid number value '"+t+"', should be a number matching (^-?[0-9.]+).");return t}if("number"==typeof t)return String(t);if("object"==typeof t&&t.toString&&(t.toTwos||t.dividedToIntegerBy))return t.toPrecision?String(t.toPrecision()):t.toString(10);throw new Error("while converting number to string, invalid number value '"+t+"' type "+typeof t+".")}var qt={unitMap:Wt,numberToString:Ut,getValueOfUnit:Ft,fromWei:function(t,e,i){var r=Dt(t),n=r.lt(Lt),s=Ft(e),o=Wt[e].length-1||1,a=i||{};n&&(r=r.mul(Nt));for(var h=r.mod(s).toString(10);h.length<o;)h="0"+h;a.pad||(h=h.match(/^([0-9]*[1-9]|0)(0*)/)[1]);var u=r.div(s).toString(10);a.commify&&(u=u.replace(/\B(?=(\d{3})+(?!\d))/g,","));var l=u+("0"==h?"":"."+h);return n&&(l="-"+l),l},toWei:function(t,e){var i=Ut(t),r=Ft(e),n=Wt[e].length-1||1,s="-"===i.substring(0,1);if(s&&(i=i.substring(1)),"."===i)throw new Error("[ethjs-unit] while converting number "+t+" to wei, invalid value");var o=i.split(".");if(o.length>2)throw new Error("[ethjs-unit] while converting number "+t+" to wei, too many decimal points");var a=o[0],h=o[1];if(a||(a="0"),h||(h="0"),h.length>n)throw new Error("[ethjs-unit] while converting number "+t+" to wei, too many decimal places");for(;h.length<n;)h+="0";a=new Ct(a),h=new Ct(h);var u=a.mul(r).add(h);return s&&(u=u.mul(Nt)),new Ct(u.toString(10),10)}},$t=Tt(function(t){!function(t,e){function i(t,e){if(!t)throw new Error(e||"Assertion failed")}function r(t,e){t.super_=e;var i=function(){};i.prototype=e.prototype,t.prototype=new i,t.prototype.constructor=t}function n(t,e,i){if(n.isBN(t))return t;this.negative=0,this.words=null,this.length=0,this.red=null,null!==t&&("le"!==e&&"be"!==e||(i=e,e=10),this._init(t||0,e||10,i||"be"))}var s;"object"==typeof t?t.exports=n:e.BN=n,n.BN=n,n.wordSize=26;try{s=I.default.Buffer}catch(t){}function o(t,e,i){for(var r=0,n=Math.min(t.length,i),s=e;s<n;s++){var o=t.charCodeAt(s)-48;r<<=4,r|=o>=49&&o<=54?o-49+10:o>=17&&o<=22?o-17+10:15&o}return r}function a(t,e,i,r){for(var n=0,s=Math.min(t.length,i),o=e;o<s;o++){var a=t.charCodeAt(o)-48;n*=r,n+=a>=49?a-49+10:a>=17?a-17+10:a}return n}n.isBN=function(t){return t instanceof n||null!==t&&"object"==typeof t&&t.constructor.wordSize===n.wordSize&&Array.isArray(t.words)},n.max=function(t,e){return t.cmp(e)>0?t:e},n.min=function(t,e){return t.cmp(e)<0?t:e},n.prototype._init=function(t,e,r){if("number"==typeof t)return this._initNumber(t,e,r);if("object"==typeof t)return this._initArray(t,e,r);"hex"===e&&(e=16),i(e===(0|e)&&e>=2&&e<=36);var n=0;"-"===(t=t.toString().replace(/\s+/g,""))[0]&&n++,16===e?this._parseHex(t,n):this._parseBase(t,e,n),"-"===t[0]&&(this.negative=1),this.strip(),"le"===r&&this._initArray(this.toArray(),e,r)},n.prototype._initNumber=function(t,e,r){t<0&&(this.negative=1,t=-t),t<67108864?(this.words=[67108863&t],this.length=1):t<4503599627370496?(this.words=[67108863&t,t/67108864&67108863],this.length=2):(i(t<9007199254740992),this.words=[67108863&t,t/67108864&67108863,1],this.length=3),"le"===r&&this._initArray(this.toArray(),e,r)},n.prototype._initArray=function(t,e,r){if(i("number"==typeof t.length),t.length<=0)return this.words=[0],this.length=1,this;this.length=Math.ceil(t.length/3),this.words=new Array(this.length);for(var n=0;n<this.length;n++)this.words[n]=0;var s,o,a=0;if("be"===r)for(n=t.length-1,s=0;n>=0;n-=3)this.words[s]|=(o=t[n]|t[n-1]<<8|t[n-2]<<16)<<a&67108863,this.words[s+1]=o>>>26-a&67108863,(a+=24)>=26&&(a-=26,s++);else if("le"===r)for(n=0,s=0;n<t.length;n+=3)this.words[s]|=(o=t[n]|t[n+1]<<8|t[n+2]<<16)<<a&67108863,this.words[s+1]=o>>>26-a&67108863,(a+=24)>=26&&(a-=26,s++);return this.strip()},n.prototype._parseHex=function(t,e){this.length=Math.ceil((t.length-e)/6),this.words=new Array(this.length);for(var i=0;i<this.length;i++)this.words[i]=0;var r,n,s=0;for(i=t.length-6,r=0;i>=e;i-=6)n=o(t,i,i+6),this.words[r]|=n<<s&67108863,this.words[r+1]|=n>>>26-s&4194303,(s+=24)>=26&&(s-=26,r++);i+6!==e&&(n=o(t,e,i+6),this.words[r]|=n<<s&67108863,this.words[r+1]|=n>>>26-s&4194303),this.strip()},n.prototype._parseBase=function(t,e,i){this.words=[0],this.length=1;for(var r=0,n=1;n<=67108863;n*=e)r++;r--,n=n/e|0;for(var s=t.length-i,o=s%r,h=Math.min(s,s-o)+i,u=0,l=i;l<h;l+=r)u=a(t,l,l+r,e),this.imuln(n),this.words[0]+u<67108864?this.words[0]+=u:this._iaddn(u);if(0!==o){var c=1;for(u=a(t,l,t.length,e),l=0;l<o;l++)c*=e;this.imuln(c),this.words[0]+u<67108864?this.words[0]+=u:this._iaddn(u)}},n.prototype.copy=function(t){t.words=new Array(this.length);for(var e=0;e<this.length;e++)t.words[e]=this.words[e];t.length=this.length,t.negative=this.negative,t.red=this.red},n.prototype.clone=function(){var t=new n(null);return this.copy(t),t},n.prototype._expand=function(t){for(;this.length<t;)this.words[this.length++]=0;return this},n.prototype.strip=function(){for(;this.length>1&&0===this.words[this.length-1];)this.length--;return this._normSign()},n.prototype._normSign=function(){return 1===this.length&&0===this.words[0]&&(this.negative=0),this},n.prototype.inspect=function(){return(this.red?"<BN-R: ":"<BN: ")+this.toString(16)+">"};var h=["","0","00","000","0000","00000","000000","0000000","00000000","000000000","0000000000","00000000000","000000000000","0000000000000","00000000000000","000000000000000","0000000000000000","00000000000000000","000000000000000000","0000000000000000000","00000000000000000000","000000000000000000000","0000000000000000000000","00000000000000000000000","000000000000000000000000","0000000000000000000000000"],u=[0,0,25,16,12,11,10,9,8,8,7,7,7,7,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5],l=[0,0,33554432,43046721,16777216,48828125,60466176,40353607,16777216,43046721,1e7,19487171,35831808,62748517,7529536,11390625,16777216,24137569,34012224,47045881,64e6,4084101,5153632,6436343,7962624,9765625,11881376,14348907,17210368,20511149,243e5,28629151,33554432,39135393,45435424,52521875,60466176];function c(t,e,i){i.negative=e.negative^t.negative;var r=t.length+e.length|0;i.length=r,r=r-1|0;var n=0|t.words[0],s=0|e.words[0],o=n*s,a=o/67108864|0;i.words[0]=67108863&o;for(var h=1;h<r;h++){for(var u=a>>>26,l=67108863&a,c=Math.min(h,e.length-1),d=Math.max(0,h-t.length+1);d<=c;d++)u+=(o=(n=0|t.words[h-d|0])*(s=0|e.words[d])+l)/67108864|0,l=67108863&o;i.words[h]=0|l,a=0|u}return 0!==a?i.words[h]=0|a:i.length--,i.strip()}n.prototype.toString=function(t,e){var r;if(e=0|e||1,16===(t=t||10)||"hex"===t){r="";for(var n=0,s=0,o=0;o<this.length;o++){var a=this.words[o],c=(16777215&(a<<n|s)).toString(16);r=0!=(s=a>>>24-n&16777215)||o!==this.length-1?h[6-c.length]+c+r:c+r,(n+=2)>=26&&(n-=26,o--)}for(0!==s&&(r=s.toString(16)+r);r.length%e!=0;)r="0"+r;return 0!==this.negative&&(r="-"+r),r}if(t===(0|t)&&t>=2&&t<=36){var d=u[t],f=l[t];r="";var m=this.clone();for(m.negative=0;!m.isZero();){var p=m.modn(f).toString(t);r=(m=m.idivn(f)).isZero()?p+r:h[d-p.length]+p+r}for(this.isZero()&&(r="0"+r);r.length%e!=0;)r="0"+r;return 0!==this.negative&&(r="-"+r),r}i(!1,"Base should be between 2 and 36")},n.prototype.toNumber=function(){var t=this.words[0];return 2===this.length?t+=67108864*this.words[1]:3===this.length&&1===this.words[2]?t+=4503599627370496+67108864*this.words[1]:this.length>2&&i(!1,"Number can only safely store up to 53 bits"),0!==this.negative?-t:t},n.prototype.toJSON=function(){return this.toString(16)},n.prototype.toBuffer=function(t,e){return i(void 0!==s),this.toArrayLike(s,t,e)},n.prototype.toArray=function(t,e){return this.toArrayLike(Array,t,e)},n.prototype.toArrayLike=function(t,e,r){var n=this.byteLength(),s=r||Math.max(1,n);i(n<=s,"byte array longer than desired length"),i(s>0,"Requested array length <= 0"),this.strip();var o,a,h="le"===e,u=new t(s),l=this.clone();if(h){for(a=0;!l.isZero();a++)o=l.andln(255),l.iushrn(8),u[a]=o;for(;a<s;a++)u[a]=0}else{for(a=0;a<s-n;a++)u[a]=0;for(a=0;!l.isZero();a++)o=l.andln(255),l.iushrn(8),u[s-a-1]=o}return u},n.prototype._countBits=Math.clz32?function(t){return 32-Math.clz32(t)}:function(t){var e=t,i=0;return e>=4096&&(i+=13,e>>>=13),e>=64&&(i+=7,e>>>=7),e>=8&&(i+=4,e>>>=4),e>=2&&(i+=2,e>>>=2),i+e},n.prototype._zeroBits=function(t){if(0===t)return 26;var e=t,i=0;return 0==(8191&e)&&(i+=13,e>>>=13),0==(127&e)&&(i+=7,e>>>=7),0==(15&e)&&(i+=4,e>>>=4),0==(3&e)&&(i+=2,e>>>=2),0==(1&e)&&i++,i},n.prototype.bitLength=function(){var t=this._countBits(this.words[this.length-1]);return 26*(this.length-1)+t},n.prototype.zeroBits=function(){if(this.isZero())return 0;for(var t=0,e=0;e<this.length;e++){var i=this._zeroBits(this.words[e]);if(t+=i,26!==i)break}return t},n.prototype.byteLength=function(){return Math.ceil(this.bitLength()/8)},n.prototype.toTwos=function(t){return 0!==this.negative?this.abs().inotn(t).iaddn(1):this.clone()},n.prototype.fromTwos=function(t){return this.testn(t-1)?this.notn(t).iaddn(1).ineg():this.clone()},n.prototype.isNeg=function(){return 0!==this.negative},n.prototype.neg=function(){return this.clone().ineg()},n.prototype.ineg=function(){return this.isZero()||(this.negative^=1),this},n.prototype.iuor=function(t){for(;this.length<t.length;)this.words[this.length++]=0;for(var e=0;e<t.length;e++)this.words[e]=this.words[e]|t.words[e];return this.strip()},n.prototype.ior=function(t){return i(0==(this.negative|t.negative)),this.iuor(t)},n.prototype.or=function(t){return this.length>t.length?this.clone().ior(t):t.clone().ior(this)},n.prototype.uor=function(t){return this.length>t.length?this.clone().iuor(t):t.clone().iuor(this)},n.prototype.iuand=function(t){var e;e=this.length>t.length?t:this;for(var i=0;i<e.length;i++)this.words[i]=this.words[i]&t.words[i];return this.length=e.length,this.strip()},n.prototype.iand=function(t){return i(0==(this.negative|t.negative)),this.iuand(t)},n.prototype.and=function(t){return this.length>t.length?this.clone().iand(t):t.clone().iand(this)},n.prototype.uand=function(t){return this.length>t.length?this.clone().iuand(t):t.clone().iuand(this)},n.prototype.iuxor=function(t){var e,i;this.length>t.length?(e=this,i=t):(e=t,i=this);for(var r=0;r<i.length;r++)this.words[r]=e.words[r]^i.words[r];if(this!==e)for(;r<e.length;r++)this.words[r]=e.words[r];return this.length=e.length,this.strip()},n.prototype.ixor=function(t){return i(0==(this.negative|t.negative)),this.iuxor(t)},n.prototype.xor=function(t){return this.length>t.length?this.clone().ixor(t):t.clone().ixor(this)},n.prototype.uxor=function(t){return this.length>t.length?this.clone().iuxor(t):t.clone().iuxor(this)},n.prototype.inotn=function(t){i("number"==typeof t&&t>=0);var e=0|Math.ceil(t/26),r=t%26;this._expand(e),r>0&&e--;for(var n=0;n<e;n++)this.words[n]=67108863&~this.words[n];return r>0&&(this.words[n]=~this.words[n]&67108863>>26-r),this.strip()},n.prototype.notn=function(t){return this.clone().inotn(t)},n.prototype.setn=function(t,e){i("number"==typeof t&&t>=0);var r=t/26|0,n=t%26;return this._expand(r+1),this.words[r]=e?this.words[r]|1<<n:this.words[r]&~(1<<n),this.strip()},n.prototype.iadd=function(t){var e,i,r;if(0!==this.negative&&0===t.negative)return this.negative=0,e=this.isub(t),this.negative^=1,this._normSign();if(0===this.negative&&0!==t.negative)return t.negative=0,e=this.isub(t),t.negative=1,e._normSign();this.length>t.length?(i=this,r=t):(i=t,r=this);for(var n=0,s=0;s<r.length;s++)this.words[s]=67108863&(e=(0|i.words[s])+(0|r.words[s])+n),n=e>>>26;for(;0!==n&&s<i.length;s++)this.words[s]=67108863&(e=(0|i.words[s])+n),n=e>>>26;if(this.length=i.length,0!==n)this.words[this.length]=n,this.length++;else if(i!==this)for(;s<i.length;s++)this.words[s]=i.words[s];return this},n.prototype.add=function(t){var e;return 0!==t.negative&&0===this.negative?(t.negative=0,e=this.sub(t),t.negative^=1,e):0===t.negative&&0!==this.negative?(this.negative=0,e=t.sub(this),this.negative=1,e):this.length>t.length?this.clone().iadd(t):t.clone().iadd(this)},n.prototype.isub=function(t){if(0!==t.negative){t.negative=0;var e=this.iadd(t);return t.negative=1,e._normSign()}if(0!==this.negative)return this.negative=0,this.iadd(t),this.negative=1,this._normSign();var i,r,n=this.cmp(t);if(0===n)return this.negative=0,this.length=1,this.words[0]=0,this;n>0?(i=this,r=t):(i=t,r=this);for(var s=0,o=0;o<r.length;o++)s=(e=(0|i.words[o])-(0|r.words[o])+s)>>26,this.words[o]=67108863&e;for(;0!==s&&o<i.length;o++)s=(e=(0|i.words[o])+s)>>26,this.words[o]=67108863&e;if(0===s&&o<i.length&&i!==this)for(;o<i.length;o++)this.words[o]=i.words[o];return this.length=Math.max(this.length,o),i!==this&&(this.negative=1),this.strip()},n.prototype.sub=function(t){return this.clone().isub(t)};var d=function(t,e,i){var r,n,s,o=t.words,a=e.words,h=i.words,u=0,l=0|o[0],c=8191&l,d=l>>>13,f=0|o[1],m=8191&f,p=f>>>13,g=0|o[2],w=8191&g,v=g>>>13,y=0|o[3],M=8191&y,b=y>>>13,A=0|o[4],x=8191&A,E=A>>>13,R=0|o[5],S=8191&R,k=R>>>13,I=0|o[6],O=8191&I,T=I>>>13,B=0|o[7],C=8191&B,_=B>>>13,P=0|o[8],D=8191&P,L=P>>>13,N=0|o[9],W=8191&N,F=N>>>13,U=0|a[0],q=8191&U,$=U>>>13,j=0|a[1],G=8191&j,z=j>>>13,H=0|a[2],Z=8191&H,V=H>>>13,J=0|a[3],K=8191&J,X=J>>>13,Q=0|a[4],Y=8191&Q,tt=Q>>>13,et=0|a[5],it=8191&et,rt=et>>>13,nt=0|a[6],st=8191&nt,ot=nt>>>13,at=0|a[7],ht=8191&at,ut=at>>>13,lt=0|a[8],ct=8191<,dt=lt>>>13,ft=0|a[9],mt=8191&ft,pt=ft>>>13;i.negative=t.negative^e.negative,i.length=19;var gt=(u+(r=Math.imul(c,q))|0)+((8191&(n=(n=Math.imul(c,$))+Math.imul(d,q)|0))<<13)|0;u=((s=Math.imul(d,$))+(n>>>13)|0)+(gt>>>26)|0,gt&=67108863,r=Math.imul(m,q),n=(n=Math.imul(m,$))+Math.imul(p,q)|0,s=Math.imul(p,$);var wt=(u+(r=r+Math.imul(c,G)|0)|0)+((8191&(n=(n=n+Math.imul(c,z)|0)+Math.imul(d,G)|0))<<13)|0;u=((s=s+Math.imul(d,z)|0)+(n>>>13)|0)+(wt>>>26)|0,wt&=67108863,r=Math.imul(w,q),n=(n=Math.imul(w,$))+Math.imul(v,q)|0,s=Math.imul(v,$),r=r+Math.imul(m,G)|0,n=(n=n+Math.imul(m,z)|0)+Math.imul(p,G)|0,s=s+Math.imul(p,z)|0;var vt=(u+(r=r+Math.imul(c,Z)|0)|0)+((8191&(n=(n=n+Math.imul(c,V)|0)+Math.imul(d,Z)|0))<<13)|0;u=((s=s+Math.imul(d,V)|0)+(n>>>13)|0)+(vt>>>26)|0,vt&=67108863,r=Math.imul(M,q),n=(n=Math.imul(M,$))+Math.imul(b,q)|0,s=Math.imul(b,$),r=r+Math.imul(w,G)|0,n=(n=n+Math.imul(w,z)|0)+Math.imul(v,G)|0,s=s+Math.imul(v,z)|0,r=r+Math.imul(m,Z)|0,n=(n=n+Math.imul(m,V)|0)+Math.imul(p,Z)|0,s=s+Math.imul(p,V)|0;var yt=(u+(r=r+Math.imul(c,K)|0)|0)+((8191&(n=(n=n+Math.imul(c,X)|0)+Math.imul(d,K)|0))<<13)|0;u=((s=s+Math.imul(d,X)|0)+(n>>>13)|0)+(yt>>>26)|0,yt&=67108863,r=Math.imul(x,q),n=(n=Math.imul(x,$))+Math.imul(E,q)|0,s=Math.imul(E,$),r=r+Math.imul(M,G)|0,n=(n=n+Math.imul(M,z)|0)+Math.imul(b,G)|0,s=s+Math.imul(b,z)|0,r=r+Math.imul(w,Z)|0,n=(n=n+Math.imul(w,V)|0)+Math.imul(v,Z)|0,s=s+Math.imul(v,V)|0,r=r+Math.imul(m,K)|0,n=(n=n+Math.imul(m,X)|0)+Math.imul(p,K)|0,s=s+Math.imul(p,X)|0;var Mt=(u+(r=r+Math.imul(c,Y)|0)|0)+((8191&(n=(n=n+Math.imul(c,tt)|0)+Math.imul(d,Y)|0))<<13)|0;u=((s=s+Math.imul(d,tt)|0)+(n>>>13)|0)+(Mt>>>26)|0,Mt&=67108863,r=Math.imul(S,q),n=(n=Math.imul(S,$))+Math.imul(k,q)|0,s=Math.imul(k,$),r=r+Math.imul(x,G)|0,n=(n=n+Math.imul(x,z)|0)+Math.imul(E,G)|0,s=s+Math.imul(E,z)|0,r=r+Math.imul(M,Z)|0,n=(n=n+Math.imul(M,V)|0)+Math.imul(b,Z)|0,s=s+Math.imul(b,V)|0,r=r+Math.imul(w,K)|0,n=(n=n+Math.imul(w,X)|0)+Math.imul(v,K)|0,s=s+Math.imul(v,X)|0,r=r+Math.imul(m,Y)|0,n=(n=n+Math.imul(m,tt)|0)+Math.imul(p,Y)|0,s=s+Math.imul(p,tt)|0;var bt=(u+(r=r+Math.imul(c,it)|0)|0)+((8191&(n=(n=n+Math.imul(c,rt)|0)+Math.imul(d,it)|0))<<13)|0;u=((s=s+Math.imul(d,rt)|0)+(n>>>13)|0)+(bt>>>26)|0,bt&=67108863,r=Math.imul(O,q),n=(n=Math.imul(O,$))+Math.imul(T,q)|0,s=Math.imul(T,$),r=r+Math.imul(S,G)|0,n=(n=n+Math.imul(S,z)|0)+Math.imul(k,G)|0,s=s+Math.imul(k,z)|0,r=r+Math.imul(x,Z)|0,n=(n=n+Math.imul(x,V)|0)+Math.imul(E,Z)|0,s=s+Math.imul(E,V)|0,r=r+Math.imul(M,K)|0,n=(n=n+Math.imul(M,X)|0)+Math.imul(b,K)|0,s=s+Math.imul(b,X)|0,r=r+Math.imul(w,Y)|0,n=(n=n+Math.imul(w,tt)|0)+Math.imul(v,Y)|0,s=s+Math.imul(v,tt)|0,r=r+Math.imul(m,it)|0,n=(n=n+Math.imul(m,rt)|0)+Math.imul(p,it)|0,s=s+Math.imul(p,rt)|0;var At=(u+(r=r+Math.imul(c,st)|0)|0)+((8191&(n=(n=n+Math.imul(c,ot)|0)+Math.imul(d,st)|0))<<13)|0;u=((s=s+Math.imul(d,ot)|0)+(n>>>13)|0)+(At>>>26)|0,At&=67108863,r=Math.imul(C,q),n=(n=Math.imul(C,$))+Math.imul(_,q)|0,s=Math.imul(_,$),r=r+Math.imul(O,G)|0,n=(n=n+Math.imul(O,z)|0)+Math.imul(T,G)|0,s=s+Math.imul(T,z)|0,r=r+Math.imul(S,Z)|0,n=(n=n+Math.imul(S,V)|0)+Math.imul(k,Z)|0,s=s+Math.imul(k,V)|0,r=r+Math.imul(x,K)|0,n=(n=n+Math.imul(x,X)|0)+Math.imul(E,K)|0,s=s+Math.imul(E,X)|0,r=r+Math.imul(M,Y)|0,n=(n=n+Math.imul(M,tt)|0)+Math.imul(b,Y)|0,s=s+Math.imul(b,tt)|0,r=r+Math.imul(w,it)|0,n=(n=n+Math.imul(w,rt)|0)+Math.imul(v,it)|0,s=s+Math.imul(v,rt)|0,r=r+Math.imul(m,st)|0,n=(n=n+Math.imul(m,ot)|0)+Math.imul(p,st)|0,s=s+Math.imul(p,ot)|0;var xt=(u+(r=r+Math.imul(c,ht)|0)|0)+((8191&(n=(n=n+Math.imul(c,ut)|0)+Math.imul(d,ht)|0))<<13)|0;u=((s=s+Math.imul(d,ut)|0)+(n>>>13)|0)+(xt>>>26)|0,xt&=67108863,r=Math.imul(D,q),n=(n=Math.imul(D,$))+Math.imul(L,q)|0,s=Math.imul(L,$),r=r+Math.imul(C,G)|0,n=(n=n+Math.imul(C,z)|0)+Math.imul(_,G)|0,s=s+Math.imul(_,z)|0,r=r+Math.imul(O,Z)|0,n=(n=n+Math.imul(O,V)|0)+Math.imul(T,Z)|0,s=s+Math.imul(T,V)|0,r=r+Math.imul(S,K)|0,n=(n=n+Math.imul(S,X)|0)+Math.imul(k,K)|0,s=s+Math.imul(k,X)|0,r=r+Math.imul(x,Y)|0,n=(n=n+Math.imul(x,tt)|0)+Math.imul(E,Y)|0,s=s+Math.imul(E,tt)|0,r=r+Math.imul(M,it)|0,n=(n=n+Math.imul(M,rt)|0)+Math.imul(b,it)|0,s=s+Math.imul(b,rt)|0,r=r+Math.imul(w,st)|0,n=(n=n+Math.imul(w,ot)|0)+Math.imul(v,st)|0,s=s+Math.imul(v,ot)|0,r=r+Math.imul(m,ht)|0,n=(n=n+Math.imul(m,ut)|0)+Math.imul(p,ht)|0,s=s+Math.imul(p,ut)|0;var Et=(u+(r=r+Math.imul(c,ct)|0)|0)+((8191&(n=(n=n+Math.imul(c,dt)|0)+Math.imul(d,ct)|0))<<13)|0;u=((s=s+Math.imul(d,dt)|0)+(n>>>13)|0)+(Et>>>26)|0,Et&=67108863,r=Math.imul(W,q),n=(n=Math.imul(W,$))+Math.imul(F,q)|0,s=Math.imul(F,$),r=r+Math.imul(D,G)|0,n=(n=n+Math.imul(D,z)|0)+Math.imul(L,G)|0,s=s+Math.imul(L,z)|0,r=r+Math.imul(C,Z)|0,n=(n=n+Math.imul(C,V)|0)+Math.imul(_,Z)|0,s=s+Math.imul(_,V)|0,r=r+Math.imul(O,K)|0,n=(n=n+Math.imul(O,X)|0)+Math.imul(T,K)|0,s=s+Math.imul(T,X)|0,r=r+Math.imul(S,Y)|0,n=(n=n+Math.imul(S,tt)|0)+Math.imul(k,Y)|0,s=s+Math.imul(k,tt)|0,r=r+Math.imul(x,it)|0,n=(n=n+Math.imul(x,rt)|0)+Math.imul(E,it)|0,s=s+Math.imul(E,rt)|0,r=r+Math.imul(M,st)|0,n=(n=n+Math.imul(M,ot)|0)+Math.imul(b,st)|0,s=s+Math.imul(b,ot)|0,r=r+Math.imul(w,ht)|0,n=(n=n+Math.imul(w,ut)|0)+Math.imul(v,ht)|0,s=s+Math.imul(v,ut)|0,r=r+Math.imul(m,ct)|0,n=(n=n+Math.imul(m,dt)|0)+Math.imul(p,ct)|0,s=s+Math.imul(p,dt)|0;var Rt=(u+(r=r+Math.imul(c,mt)|0)|0)+((8191&(n=(n=n+Math.imul(c,pt)|0)+Math.imul(d,mt)|0))<<13)|0;u=((s=s+Math.imul(d,pt)|0)+(n>>>13)|0)+(Rt>>>26)|0,Rt&=67108863,r=Math.imul(W,G),n=(n=Math.imul(W,z))+Math.imul(F,G)|0,s=Math.imul(F,z),r=r+Math.imul(D,Z)|0,n=(n=n+Math.imul(D,V)|0)+Math.imul(L,Z)|0,s=s+Math.imul(L,V)|0,r=r+Math.imul(C,K)|0,n=(n=n+Math.imul(C,X)|0)+Math.imul(_,K)|0,s=s+Math.imul(_,X)|0,r=r+Math.imul(O,Y)|0,n=(n=n+Math.imul(O,tt)|0)+Math.imul(T,Y)|0,s=s+Math.imul(T,tt)|0,r=r+Math.imul(S,it)|0,n=(n=n+Math.imul(S,rt)|0)+Math.imul(k,it)|0,s=s+Math.imul(k,rt)|0,r=r+Math.imul(x,st)|0,n=(n=n+Math.imul(x,ot)|0)+Math.imul(E,st)|0,s=s+Math.imul(E,ot)|0,r=r+Math.imul(M,ht)|0,n=(n=n+Math.imul(M,ut)|0)+Math.imul(b,ht)|0,s=s+Math.imul(b,ut)|0,r=r+Math.imul(w,ct)|0,n=(n=n+Math.imul(w,dt)|0)+Math.imul(v,ct)|0,s=s+Math.imul(v,dt)|0;var St=(u+(r=r+Math.imul(m,mt)|0)|0)+((8191&(n=(n=n+Math.imul(m,pt)|0)+Math.imul(p,mt)|0))<<13)|0;u=((s=s+Math.imul(p,pt)|0)+(n>>>13)|0)+(St>>>26)|0,St&=67108863,r=Math.imul(W,Z),n=(n=Math.imul(W,V))+Math.imul(F,Z)|0,s=Math.imul(F,V),r=r+Math.imul(D,K)|0,n=(n=n+Math.imul(D,X)|0)+Math.imul(L,K)|0,s=s+Math.imul(L,X)|0,r=r+Math.imul(C,Y)|0,n=(n=n+Math.imul(C,tt)|0)+Math.imul(_,Y)|0,s=s+Math.imul(_,tt)|0,r=r+Math.imul(O,it)|0,n=(n=n+Math.imul(O,rt)|0)+Math.imul(T,it)|0,s=s+Math.imul(T,rt)|0,r=r+Math.imul(S,st)|0,n=(n=n+Math.imul(S,ot)|0)+Math.imul(k,st)|0,s=s+Math.imul(k,ot)|0,r=r+Math.imul(x,ht)|0,n=(n=n+Math.imul(x,ut)|0)+Math.imul(E,ht)|0,s=s+Math.imul(E,ut)|0,r=r+Math.imul(M,ct)|0,n=(n=n+Math.imul(M,dt)|0)+Math.imul(b,ct)|0,s=s+Math.imul(b,dt)|0;var kt=(u+(r=r+Math.imul(w,mt)|0)|0)+((8191&(n=(n=n+Math.imul(w,pt)|0)+Math.imul(v,mt)|0))<<13)|0;u=((s=s+Math.imul(v,pt)|0)+(n>>>13)|0)+(kt>>>26)|0,kt&=67108863,r=Math.imul(W,K),n=(n=Math.imul(W,X))+Math.imul(F,K)|0,s=Math.imul(F,X),r=r+Math.imul(D,Y)|0,n=(n=n+Math.imul(D,tt)|0)+Math.imul(L,Y)|0,s=s+Math.imul(L,tt)|0,r=r+Math.imul(C,it)|0,n=(n=n+Math.imul(C,rt)|0)+Math.imul(_,it)|0,s=s+Math.imul(_,rt)|0,r=r+Math.imul(O,st)|0,n=(n=n+Math.imul(O,ot)|0)+Math.imul(T,st)|0,s=s+Math.imul(T,ot)|0,r=r+Math.imul(S,ht)|0,n=(n=n+Math.imul(S,ut)|0)+Math.imul(k,ht)|0,s=s+Math.imul(k,ut)|0,r=r+Math.imul(x,ct)|0,n=(n=n+Math.imul(x,dt)|0)+Math.imul(E,ct)|0,s=s+Math.imul(E,dt)|0;var It=(u+(r=r+Math.imul(M,mt)|0)|0)+((8191&(n=(n=n+Math.imul(M,pt)|0)+Math.imul(b,mt)|0))<<13)|0;u=((s=s+Math.imul(b,pt)|0)+(n>>>13)|0)+(It>>>26)|0,It&=67108863,r=Math.imul(W,Y),n=(n=Math.imul(W,tt))+Math.imul(F,Y)|0,s=Math.imul(F,tt),r=r+Math.imul(D,it)|0,n=(n=n+Math.imul(D,rt)|0)+Math.imul(L,it)|0,s=s+Math.imul(L,rt)|0,r=r+Math.imul(C,st)|0,n=(n=n+Math.imul(C,ot)|0)+Math.imul(_,st)|0,s=s+Math.imul(_,ot)|0,r=r+Math.imul(O,ht)|0,n=(n=n+Math.imul(O,ut)|0)+Math.imul(T,ht)|0,s=s+Math.imul(T,ut)|0,r=r+Math.imul(S,ct)|0,n=(n=n+Math.imul(S,dt)|0)+Math.imul(k,ct)|0,s=s+Math.imul(k,dt)|0;var Ot=(u+(r=r+Math.imul(x,mt)|0)|0)+((8191&(n=(n=n+Math.imul(x,pt)|0)+Math.imul(E,mt)|0))<<13)|0;u=((s=s+Math.imul(E,pt)|0)+(n>>>13)|0)+(Ot>>>26)|0,Ot&=67108863,r=Math.imul(W,it),n=(n=Math.imul(W,rt))+Math.imul(F,it)|0,s=Math.imul(F,rt),r=r+Math.imul(D,st)|0,n=(n=n+Math.imul(D,ot)|0)+Math.imul(L,st)|0,s=s+Math.imul(L,ot)|0,r=r+Math.imul(C,ht)|0,n=(n=n+Math.imul(C,ut)|0)+Math.imul(_,ht)|0,s=s+Math.imul(_,ut)|0,r=r+Math.imul(O,ct)|0,n=(n=n+Math.imul(O,dt)|0)+Math.imul(T,ct)|0,s=s+Math.imul(T,dt)|0;var Tt=(u+(r=r+Math.imul(S,mt)|0)|0)+((8191&(n=(n=n+Math.imul(S,pt)|0)+Math.imul(k,mt)|0))<<13)|0;u=((s=s+Math.imul(k,pt)|0)+(n>>>13)|0)+(Tt>>>26)|0,Tt&=67108863,r=Math.imul(W,st),n=(n=Math.imul(W,ot))+Math.imul(F,st)|0,s=Math.imul(F,ot),r=r+Math.imul(D,ht)|0,n=(n=n+Math.imul(D,ut)|0)+Math.imul(L,ht)|0,s=s+Math.imul(L,ut)|0,r=r+Math.imul(C,ct)|0,n=(n=n+Math.imul(C,dt)|0)+Math.imul(_,ct)|0,s=s+Math.imul(_,dt)|0;var Bt=(u+(r=r+Math.imul(O,mt)|0)|0)+((8191&(n=(n=n+Math.imul(O,pt)|0)+Math.imul(T,mt)|0))<<13)|0;u=((s=s+Math.imul(T,pt)|0)+(n>>>13)|0)+(Bt>>>26)|0,Bt&=67108863,r=Math.imul(W,ht),n=(n=Math.imul(W,ut))+Math.imul(F,ht)|0,s=Math.imul(F,ut),r=r+Math.imul(D,ct)|0,n=(n=n+Math.imul(D,dt)|0)+Math.imul(L,ct)|0,s=s+Math.imul(L,dt)|0;var Ct=(u+(r=r+Math.imul(C,mt)|0)|0)+((8191&(n=(n=n+Math.imul(C,pt)|0)+Math.imul(_,mt)|0))<<13)|0;u=((s=s+Math.imul(_,pt)|0)+(n>>>13)|0)+(Ct>>>26)|0,Ct&=67108863,r=Math.imul(W,ct),n=(n=Math.imul(W,dt))+Math.imul(F,ct)|0,s=Math.imul(F,dt);var _t=(u+(r=r+Math.imul(D,mt)|0)|0)+((8191&(n=(n=n+Math.imul(D,pt)|0)+Math.imul(L,mt)|0))<<13)|0;u=((s=s+Math.imul(L,pt)|0)+(n>>>13)|0)+(_t>>>26)|0,_t&=67108863;var Pt=(u+(r=Math.imul(W,mt))|0)+((8191&(n=(n=Math.imul(W,pt))+Math.imul(F,mt)|0))<<13)|0;return u=((s=Math.imul(F,pt))+(n>>>13)|0)+(Pt>>>26)|0,Pt&=67108863,h[0]=gt,h[1]=wt,h[2]=vt,h[3]=yt,h[4]=Mt,h[5]=bt,h[6]=At,h[7]=xt,h[8]=Et,h[9]=Rt,h[10]=St,h[11]=kt,h[12]=It,h[13]=Ot,h[14]=Tt,h[15]=Bt,h[16]=Ct,h[17]=_t,h[18]=Pt,0!==u&&(h[19]=u,i.length++),i};function f(t,e,i){return(new m).mulp(t,e,i)}function m(t,e){this.x=t,this.y=e}Math.imul||(d=c),n.prototype.mulTo=function(t,e){var i=this.length+t.length;return 10===this.length&&10===t.length?d(this,t,e):i<63?c(this,t,e):i<1024?function(t,e,i){i.negative=e.negative^t.negative,i.length=t.length+e.length;for(var r=0,n=0,s=0;s<i.length-1;s++){var o=n;n=0;for(var a=67108863&r,h=Math.min(s,e.length-1),u=Math.max(0,s-t.length+1);u<=h;u++){var l=(0|t.words[s-u])*(0|e.words[u]),c=67108863&l;a=67108863&(c=c+a|0),n+=(o=(o=o+(l/67108864|0)|0)+(c>>>26)|0)>>>26,o&=67108863}i.words[s]=a,r=o,o=n}return 0!==r?i.words[s]=r:i.length--,i.strip()}(this,t,e):f(this,t,e)},m.prototype.makeRBT=function(t){for(var e=new Array(t),i=n.prototype._countBits(t)-1,r=0;r<t;r++)e[r]=this.revBin(r,i,t);return e},m.prototype.revBin=function(t,e,i){if(0===t||t===i-1)return t;for(var r=0,n=0;n<e;n++)r|=(1&t)<<e-n-1,t>>=1;return r},m.prototype.permute=function(t,e,i,r,n,s){for(var o=0;o<s;o++)r[o]=e[t[o]],n[o]=i[t[o]]},m.prototype.transform=function(t,e,i,r,n,s){this.permute(s,t,e,i,r,n);for(var o=1;o<n;o<<=1)for(var a=o<<1,h=Math.cos(2*Math.PI/a),u=Math.sin(2*Math.PI/a),l=0;l<n;l+=a)for(var c=h,d=u,f=0;f<o;f++){var m=i[l+f],p=r[l+f],g=i[l+f+o],w=r[l+f+o],v=c*g-d*w;w=c*w+d*g,i[l+f]=m+(g=v),r[l+f]=p+w,i[l+f+o]=m-g,r[l+f+o]=p-w,f!==a&&(v=h*c-u*d,d=h*d+u*c,c=v)}},m.prototype.guessLen13b=function(t,e){var i=1|Math.max(e,t),r=1&i,n=0;for(i=i/2|0;i;i>>>=1)n++;return 1<<n+1+r},m.prototype.conjugate=function(t,e,i){if(!(i<=1))for(var r=0;r<i/2;r++){var n=t[r];t[r]=t[i-r-1],t[i-r-1]=n,n=e[r],e[r]=-e[i-r-1],e[i-r-1]=-n}},m.prototype.normalize13b=function(t,e){for(var i=0,r=0;r<e/2;r++){var n=8192*Math.round(t[2*r+1]/e)+Math.round(t[2*r]/e)+i;t[r]=67108863&n,i=n<67108864?0:n/67108864|0}return t},m.prototype.convert13b=function(t,e,r,n){for(var s=0,o=0;o<e;o++)r[2*o]=8191&(s+=0|t[o]),r[2*o+1]=8191&(s>>>=13),s>>>=13;for(o=2*e;o<n;++o)r[o]=0;i(0===s),i(0==(-8192&s))},m.prototype.stub=function(t){for(var e=new Array(t),i=0;i<t;i++)e[i]=0;return e},m.prototype.mulp=function(t,e,i){var r=2*this.guessLen13b(t.length,e.length),n=this.makeRBT(r),s=this.stub(r),o=new Array(r),a=new Array(r),h=new Array(r),u=new Array(r),l=new Array(r),c=new Array(r),d=i.words;d.length=r,this.convert13b(t.words,t.length,o,r),this.convert13b(e.words,e.length,u,r),this.transform(o,s,a,h,r,n),this.transform(u,s,l,c,r,n);for(var f=0;f<r;f++){var m=a[f]*l[f]-h[f]*c[f];h[f]=a[f]*c[f]+h[f]*l[f],a[f]=m}return this.conjugate(a,h,r),this.transform(a,h,d,s,r,n),this.conjugate(d,s,r),this.normalize13b(d,r),i.negative=t.negative^e.negative,i.length=t.length+e.length,i.strip()},n.prototype.mul=function(t){var e=new n(null);return e.words=new Array(this.length+t.length),this.mulTo(t,e)},n.prototype.mulf=function(t){var e=new n(null);return e.words=new Array(this.length+t.length),f(this,t,e)},n.prototype.imul=function(t){return this.clone().mulTo(t,this)},n.prototype.imuln=function(t){i("number"==typeof t),i(t<67108864);for(var e=0,r=0;r<this.length;r++){var n=(0|this.words[r])*t,s=(67108863&n)+(67108863&e);e>>=26,e+=n/67108864|0,e+=s>>>26,this.words[r]=67108863&s}return 0!==e&&(this.words[r]=e,this.length++),this},n.prototype.muln=function(t){return this.clone().imuln(t)},n.prototype.sqr=function(){return this.mul(this)},n.prototype.isqr=function(){return this.imul(this.clone())},n.prototype.pow=function(t){var e=function(t){for(var e=new Array(t.bitLength()),i=0;i<e.length;i++){var r=i%26;e[i]=(t.words[i/26|0]&1<<r)>>>r}return e}(t);if(0===e.length)return new n(1);for(var i=this,r=0;r<e.length&&0===e[r];r++,i=i.sqr());if(++r<e.length)for(var s=i.sqr();r<e.length;r++,s=s.sqr())0!==e[r]&&(i=i.mul(s));return i},n.prototype.iushln=function(t){i("number"==typeof t&&t>=0);var e,r=t%26,n=(t-r)/26,s=67108863>>>26-r<<26-r;if(0!==r){var o=0;for(e=0;e<this.length;e++){var a=this.words[e]&s;this.words[e]=(0|this.words[e])-a<<r|o,o=a>>>26-r}o&&(this.words[e]=o,this.length++)}if(0!==n){for(e=this.length-1;e>=0;e--)this.words[e+n]=this.words[e];for(e=0;e<n;e++)this.words[e]=0;this.length+=n}return this.strip()},n.prototype.ishln=function(t){return i(0===this.negative),this.iushln(t)},n.prototype.iushrn=function(t,e,r){var n;i("number"==typeof t&&t>=0),n=e?(e-e%26)/26:0;var s=t%26,o=Math.min((t-s)/26,this.length),a=67108863^67108863>>>s<<s,h=r;if(n-=o,n=Math.max(0,n),h){for(var u=0;u<o;u++)h.words[u]=this.words[u];h.length=o}if(0===o);else if(this.length>o)for(this.length-=o,u=0;u<this.length;u++)this.words[u]=this.words[u+o];else this.words[0]=0,this.length=1;var l=0;for(u=this.length-1;u>=0&&(0!==l||u>=n);u--){var c=0|this.words[u];this.words[u]=l<<26-s|c>>>s,l=c&a}return h&&0!==l&&(h.words[h.length++]=l),0===this.length&&(this.words[0]=0,this.length=1),this.strip()},n.prototype.ishrn=function(t,e,r){return i(0===this.negative),this.iushrn(t,e,r)},n.prototype.shln=function(t){return this.clone().ishln(t)},n.prototype.ushln=function(t){return this.clone().iushln(t)},n.prototype.shrn=function(t){return this.clone().ishrn(t)},n.prototype.ushrn=function(t){return this.clone().iushrn(t)},n.prototype.testn=function(t){i("number"==typeof t&&t>=0);var e=t%26,r=(t-e)/26;return!(this.length<=r||!(this.words[r]&1<<e))},n.prototype.imaskn=function(t){i("number"==typeof t&&t>=0);var e=t%26,r=(t-e)/26;return i(0===this.negative,"imaskn works only with positive numbers"),this.length<=r?this:(0!==e&&r++,this.length=Math.min(r,this.length),0!==e&&(this.words[this.length-1]&=67108863^67108863>>>e<<e),this.strip())},n.prototype.maskn=function(t){return this.clone().imaskn(t)},n.prototype.iaddn=function(t){return i("number"==typeof t),i(t<67108864),t<0?this.isubn(-t):0!==this.negative?1===this.length&&(0|this.words[0])<t?(this.words[0]=t-(0|this.words[0]),this.negative=0,this):(this.negative=0,this.isubn(t),this.negative=1,this):this._iaddn(t)},n.prototype._iaddn=function(t){this.words[0]+=t;for(var e=0;e<this.length&&this.words[e]>=67108864;e++)this.words[e]-=67108864,e===this.length-1?this.words[e+1]=1:this.words[e+1]++;return this.length=Math.max(this.length,e+1),this},n.prototype.isubn=function(t){if(i("number"==typeof t),i(t<67108864),t<0)return this.iaddn(-t);if(0!==this.negative)return this.negative=0,this.iaddn(t),this.negative=1,this;if(this.words[0]-=t,1===this.length&&this.words[0]<0)this.words[0]=-this.words[0],this.negative=1;else for(var e=0;e<this.length&&this.words[e]<0;e++)this.words[e]+=67108864,this.words[e+1]-=1;return this.strip()},n.prototype.addn=function(t){return this.clone().iaddn(t)},n.prototype.subn=function(t){return this.clone().isubn(t)},n.prototype.iabs=function(){return this.negative=0,this},n.prototype.abs=function(){return this.clone().iabs()},n.prototype._ishlnsubmul=function(t,e,r){var n,s;this._expand(t.length+r);var o=0;for(n=0;n<t.length;n++){s=(0|this.words[n+r])+o;var a=(0|t.words[n])*e;o=((s-=67108863&a)>>26)-(a/67108864|0),this.words[n+r]=67108863&s}for(;n<this.length-r;n++)o=(s=(0|this.words[n+r])+o)>>26,this.words[n+r]=67108863&s;if(0===o)return this.strip();for(i(-1===o),o=0,n=0;n<this.length;n++)o=(s=-(0|this.words[n])+o)>>26,this.words[n]=67108863&s;return this.negative=1,this.strip()},n.prototype._wordDiv=function(t,e){var i,r=this.clone(),s=t,o=0|s.words[s.length-1];0!=(i=26-this._countBits(o))&&(s=s.ushln(i),r.iushln(i),o=0|s.words[s.length-1]);var a,h=r.length-s.length;if("mod"!==e){(a=new n(null)).length=h+1,a.words=new Array(a.length);for(var u=0;u<a.length;u++)a.words[u]=0}var l=r.clone()._ishlnsubmul(s,1,h);0===l.negative&&(r=l,a&&(a.words[h]=1));for(var c=h-1;c>=0;c--){var d=67108864*(0|r.words[s.length+c])+(0|r.words[s.length+c-1]);for(d=Math.min(d/o|0,67108863),r._ishlnsubmul(s,d,c);0!==r.negative;)d--,r.negative=0,r._ishlnsubmul(s,1,c),r.isZero()||(r.negative^=1);a&&(a.words[c]=d)}return a&&a.strip(),r.strip(),"div"!==e&&0!==i&&r.iushrn(i),{div:a||null,mod:r}},n.prototype.divmod=function(t,e,r){return i(!t.isZero()),this.isZero()?{div:new n(0),mod:new n(0)}:0!==this.negative&&0===t.negative?(a=this.neg().divmod(t,e),"mod"!==e&&(s=a.div.neg()),"div"!==e&&(o=a.mod.neg(),r&&0!==o.negative&&o.iadd(t)),{div:s,mod:o}):0===this.negative&&0!==t.negative?(a=this.divmod(t.neg(),e),"mod"!==e&&(s=a.div.neg()),{div:s,mod:a.mod}):0!=(this.negative&t.negative)?(a=this.neg().divmod(t.neg(),e),"div"!==e&&(o=a.mod.neg(),r&&0!==o.negative&&o.isub(t)),{div:a.div,mod:o}):t.length>this.length||this.cmp(t)<0?{div:new n(0),mod:this}:1===t.length?"div"===e?{div:this.divn(t.words[0]),mod:null}:"mod"===e?{div:null,mod:new n(this.modn(t.words[0]))}:{div:this.divn(t.words[0]),mod:new n(this.modn(t.words[0]))}:this._wordDiv(t,e);var s,o,a},n.prototype.div=function(t){return this.divmod(t,"div",!1).div},n.prototype.mod=function(t){return this.divmod(t,"mod",!1).mod},n.prototype.umod=function(t){return this.divmod(t,"mod",!0).mod},n.prototype.divRound=function(t){var e=this.divmod(t);if(e.mod.isZero())return e.div;var i=0!==e.div.negative?e.mod.isub(t):e.mod,r=t.ushrn(1),n=t.andln(1),s=i.cmp(r);return s<0||1===n&&0===s?e.div:0!==e.div.negative?e.div.isubn(1):e.div.iaddn(1)},n.prototype.modn=function(t){i(t<=67108863);for(var e=(1<<26)%t,r=0,n=this.length-1;n>=0;n--)r=(e*r+(0|this.words[n]))%t;return r},n.prototype.idivn=function(t){i(t<=67108863);for(var e=0,r=this.length-1;r>=0;r--){var n=(0|this.words[r])+67108864*e;this.words[r]=n/t|0,e=n%t}return this.strip()},n.prototype.divn=function(t){return this.clone().idivn(t)},n.prototype.egcd=function(t){i(0===t.negative),i(!t.isZero());var e=this,r=t.clone();e=0!==e.negative?e.umod(t):e.clone();for(var s=new n(1),o=new n(0),a=new n(0),h=new n(1),u=0;e.isEven()&&r.isEven();)e.iushrn(1),r.iushrn(1),++u;for(var l=r.clone(),c=e.clone();!e.isZero();){for(var d=0,f=1;0==(e.words[0]&f)&&d<26;++d,f<<=1);if(d>0)for(e.iushrn(d);d-- >0;)(s.isOdd()||o.isOdd())&&(s.iadd(l),o.isub(c)),s.iushrn(1),o.iushrn(1);for(var m=0,p=1;0==(r.words[0]&p)&&m<26;++m,p<<=1);if(m>0)for(r.iushrn(m);m-- >0;)(a.isOdd()||h.isOdd())&&(a.iadd(l),h.isub(c)),a.iushrn(1),h.iushrn(1);e.cmp(r)>=0?(e.isub(r),s.isub(a),o.isub(h)):(r.isub(e),a.isub(s),h.isub(o))}return{a:a,b:h,gcd:r.iushln(u)}},n.prototype._invmp=function(t){i(0===t.negative),i(!t.isZero());var e=this,r=t.clone();e=0!==e.negative?e.umod(t):e.clone();for(var s,o=new n(1),a=new n(0),h=r.clone();e.cmpn(1)>0&&r.cmpn(1)>0;){for(var u=0,l=1;0==(e.words[0]&l)&&u<26;++u,l<<=1);if(u>0)for(e.iushrn(u);u-- >0;)o.isOdd()&&o.iadd(h),o.iushrn(1);for(var c=0,d=1;0==(r.words[0]&d)&&c<26;++c,d<<=1);if(c>0)for(r.iushrn(c);c-- >0;)a.isOdd()&&a.iadd(h),a.iushrn(1);e.cmp(r)>=0?(e.isub(r),o.isub(a)):(r.isub(e),a.isub(o))}return(s=0===e.cmpn(1)?o:a).cmpn(0)<0&&s.iadd(t),s},n.prototype.gcd=function(t){if(this.isZero())return t.abs();if(t.isZero())return this.abs();var e=this.clone(),i=t.clone();e.negative=0,i.negative=0;for(var r=0;e.isEven()&&i.isEven();r++)e.iushrn(1),i.iushrn(1);for(;;){for(;e.isEven();)e.iushrn(1);for(;i.isEven();)i.iushrn(1);var n=e.cmp(i);if(n<0){var s=e;e=i,i=s}else if(0===n||0===i.cmpn(1))break;e.isub(i)}return i.iushln(r)},n.prototype.invm=function(t){return this.egcd(t).a.umod(t)},n.prototype.isEven=function(){return 0==(1&this.words[0])},n.prototype.isOdd=function(){return 1==(1&this.words[0])},n.prototype.andln=function(t){return this.words[0]&t},n.prototype.bincn=function(t){i("number"==typeof t);var e=t%26,r=(t-e)/26,n=1<<e;if(this.length<=r)return this._expand(r+1),this.words[r]|=n,this;for(var s=n,o=r;0!==s&&o<this.length;o++){var a=0|this.words[o];s=(a+=s)>>>26,this.words[o]=a&=67108863}return 0!==s&&(this.words[o]=s,this.length++),this},n.prototype.isZero=function(){return 1===this.length&&0===this.words[0]},n.prototype.cmpn=function(t){var e,r=t<0;if(0!==this.negative&&!r)return-1;if(0===this.negative&&r)return 1;if(this.strip(),this.length>1)e=1;else{r&&(t=-t),i(t<=67108863,"Number is too big");var n=0|this.words[0];e=n===t?0:n<t?-1:1}return 0!==this.negative?0|-e:e},n.prototype.cmp=function(t){if(0!==this.negative&&0===t.negative)return-1;if(0===this.negative&&0!==t.negative)return 1;var e=this.ucmp(t);return 0!==this.negative?0|-e:e},n.prototype.ucmp=function(t){if(this.length>t.length)return 1;if(this.length<t.length)return-1;for(var e=0,i=this.length-1;i>=0;i--){var r=0|this.words[i],n=0|t.words[i];if(r!==n){r<n?e=-1:r>n&&(e=1);break}}return e},n.prototype.gtn=function(t){return 1===this.cmpn(t)},n.prototype.gt=function(t){return 1===this.cmp(t)},n.prototype.gten=function(t){return this.cmpn(t)>=0},n.prototype.gte=function(t){return this.cmp(t)>=0},n.prototype.ltn=function(t){return-1===this.cmpn(t)},n.prototype.lt=function(t){return-1===this.cmp(t)},n.prototype.lten=function(t){return this.cmpn(t)<=0},n.prototype.lte=function(t){return this.cmp(t)<=0},n.prototype.eqn=function(t){return 0===this.cmpn(t)},n.prototype.eq=function(t){return 0===this.cmp(t)},n.red=function(t){return new b(t)},n.prototype.toRed=function(t){return i(!this.red,"Already a number in reduction context"),i(0===this.negative,"red works only with positives"),t.convertTo(this)._forceRed(t)},n.prototype.fromRed=function(){return i(this.red,"fromRed works only with numbers in reduction context"),this.red.convertFrom(this)},n.prototype._forceRed=function(t){return this.red=t,this},n.prototype.forceRed=function(t){return i(!this.red,"Already a number in reduction context"),this._forceRed(t)},n.prototype.redAdd=function(t){return i(this.red,"redAdd works only with red numbers"),this.red.add(this,t)},n.prototype.redIAdd=function(t){return i(this.red,"redIAdd works only with red numbers"),this.red.iadd(this,t)},n.prototype.redSub=function(t){return i(this.red,"redSub works only with red numbers"),this.red.sub(this,t)},n.prototype.redISub=function(t){return i(this.red,"redISub works only with red numbers"),this.red.isub(this,t)},n.prototype.redShl=function(t){return i(this.red,"redShl works only with red numbers"),this.red.shl(this,t)},n.prototype.redMul=function(t){return i(this.red,"redMul works only with red numbers"),this.red._verify2(this,t),this.red.mul(this,t)},n.prototype.redIMul=function(t){return i(this.red,"redMul works only with red numbers"),this.red._verify2(this,t),this.red.imul(this,t)},n.prototype.redSqr=function(){return i(this.red,"redSqr works only with red numbers"),this.red._verify1(this),this.red.sqr(this)},n.prototype.redISqr=function(){return i(this.red,"redISqr works only with red numbers"),this.red._verify1(this),this.red.isqr(this)},n.prototype.redSqrt=function(){return i(this.red,"redSqrt works only with red numbers"),this.red._verify1(this),this.red.sqrt(this)},n.prototype.redInvm=function(){return i(this.red,"redInvm works only with red numbers"),this.red._verify1(this),this.red.invm(this)},n.prototype.redNeg=function(){return i(this.red,"redNeg works only with red numbers"),this.red._verify1(this),this.red.neg(this)},n.prototype.redPow=function(t){return i(this.red&&!t.red,"redPow(normalNum)"),this.red._verify1(this),this.red.pow(this,t)};var p={k256:null,p224:null,p192:null,p25519:null};function g(t,e){this.name=t,this.p=new n(e,16),this.n=this.p.bitLength(),this.k=new n(1).iushln(this.n).isub(this.p),this.tmp=this._tmp()}function w(){g.call(this,"k256","ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f")}function v(){g.call(this,"p224","ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001")}function y(){g.call(this,"p192","ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff")}function M(){g.call(this,"25519","7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed")}function b(t){if("string"==typeof t){var e=n._prime(t);this.m=e.p,this.prime=e}else i(t.gtn(1),"modulus must be greater than 1"),this.m=t,this.prime=null}function A(t){b.call(this,t),this.shift=this.m.bitLength(),this.shift%26!=0&&(this.shift+=26-this.shift%26),this.r=new n(1).iushln(this.shift),this.r2=this.imod(this.r.sqr()),this.rinv=this.r._invmp(this.m),this.minv=this.rinv.mul(this.r).isubn(1).div(this.m),this.minv=this.minv.umod(this.r),this.minv=this.r.sub(this.minv)}g.prototype._tmp=function(){var t=new n(null);return t.words=new Array(Math.ceil(this.n/13)),t},g.prototype.ireduce=function(t){var e,i=t;do{this.split(i,this.tmp),e=(i=(i=this.imulK(i)).iadd(this.tmp)).bitLength()}while(e>this.n);var r=e<this.n?-1:i.ucmp(this.p);return 0===r?(i.words[0]=0,i.length=1):r>0?i.isub(this.p):void 0!==i.strip?i.strip():i._strip(),i},g.prototype.split=function(t,e){t.iushrn(this.n,0,e)},g.prototype.imulK=function(t){return t.imul(this.k)},r(w,g),w.prototype.split=function(t,e){for(var i=4194303,r=Math.min(t.length,9),n=0;n<r;n++)e.words[n]=t.words[n];if(e.length=r,t.length<=9)return t.words[0]=0,void(t.length=1);var s=t.words[9];for(e.words[e.length++]=s&i,n=10;n<t.length;n++){var o=0|t.words[n];t.words[n-10]=(o&i)<<4|s>>>22,s=o}t.words[n-10]=s>>>=22,t.length-=0===s&&t.length>10?10:9},w.prototype.imulK=function(t){t.words[t.length]=0,t.words[t.length+1]=0,t.length+=2;for(var e=0,i=0;i<t.length;i++){var r=0|t.words[i];t.words[i]=67108863&(e+=977*r),e=64*r+(e/67108864|0)}return 0===t.words[t.length-1]&&(t.length--,0===t.words[t.length-1]&&t.length--),t},r(v,g),r(y,g),r(M,g),M.prototype.imulK=function(t){for(var e=0,i=0;i<t.length;i++){var r=19*(0|t.words[i])+e,n=67108863&r;r>>>=26,t.words[i]=n,e=r}return 0!==e&&(t.words[t.length++]=e),t},n._prime=function(t){if(p[t])return p[t];var e;if("k256"===t)e=new w;else if("p224"===t)e=new v;else if("p192"===t)e=new y;else{if("p25519"!==t)throw new Error("Unknown prime "+t);e=new M}return p[t]=e,e},b.prototype._verify1=function(t){i(0===t.negative,"red works only with positives"),i(t.red,"red works only with red numbers")},b.prototype._verify2=function(t,e){i(0==(t.negative|e.negative),"red works only with positives"),i(t.red&&t.red===e.red,"red works only with red numbers")},b.prototype.imod=function(t){return this.prime?this.prime.ireduce(t)._forceRed(this):t.umod(this.m)._forceRed(this)},b.prototype.neg=function(t){return t.isZero()?t.clone():this.m.sub(t)._forceRed(this)},b.prototype.add=function(t,e){this._verify2(t,e);var i=t.add(e);return i.cmp(this.m)>=0&&i.isub(this.m),i._forceRed(this)},b.prototype.iadd=function(t,e){this._verify2(t,e);var i=t.iadd(e);return i.cmp(this.m)>=0&&i.isub(this.m),i},b.prototype.sub=function(t,e){this._verify2(t,e);var i=t.sub(e);return i.cmpn(0)<0&&i.iadd(this.m),i._forceRed(this)},b.prototype.isub=function(t,e){this._verify2(t,e);var i=t.isub(e);return i.cmpn(0)<0&&i.iadd(this.m),i},b.prototype.shl=function(t,e){return this._verify1(t),this.imod(t.ushln(e))},b.prototype.imul=function(t,e){return this._verify2(t,e),this.imod(t.imul(e))},b.prototype.mul=function(t,e){return this._verify2(t,e),this.imod(t.mul(e))},b.prototype.isqr=function(t){return this.imul(t,t.clone())},b.prototype.sqr=function(t){return this.mul(t,t)},b.prototype.sqrt=function(t){if(t.isZero())return t.clone();var e=this.m.andln(3);if(i(e%2==1),3===e){var r=this.m.add(new n(1)).iushrn(2);return this.pow(t,r)}for(var s=this.m.subn(1),o=0;!s.isZero()&&0===s.andln(1);)o++,s.iushrn(1);i(!s.isZero());var a=new n(1).toRed(this),h=a.redNeg(),u=this.m.subn(1).iushrn(1),l=this.m.bitLength();for(l=new n(2*l*l).toRed(this);0!==this.pow(l,u).cmp(h);)l.redIAdd(h);for(var c=this.pow(l,s),d=this.pow(t,s.addn(1).iushrn(1)),f=this.pow(t,s),m=o;0!==f.cmp(a);){for(var p=f,g=0;0!==p.cmp(a);g++)p=p.redSqr();i(g<m);var w=this.pow(c,new n(1).iushln(m-g-1));d=d.redMul(w),c=w.redSqr(),f=f.redMul(c),m=g}return d},b.prototype.invm=function(t){var e=t._invmp(this.m);return 0!==e.negative?(e.negative=0,this.imod(e).redNeg()):this.imod(e)},b.prototype.pow=function(t,e){if(e.isZero())return new n(1).toRed(this);if(0===e.cmpn(1))return t.clone();var i=new Array(16);i[0]=new n(1).toRed(this),i[1]=t;for(var r=2;r<i.length;r++)i[r]=this.mul(i[r-1],t);var s=i[0],o=0,a=0,h=e.bitLength()%26;for(0===h&&(h=26),r=e.length-1;r>=0;r--){for(var u=e.words[r],l=h-1;l>=0;l--){var c=u>>l&1;s!==i[0]&&(s=this.sqr(s)),0!==c||0!==o?(o<<=1,o|=c,(4==++a||0===r&&0===l)&&(s=this.mul(s,i[o]),a=0,o=0)):a=0}h=26}return s},b.prototype.convertTo=function(t){var e=t.umod(this.m);return e===t?e.clone():e},b.prototype.convertFrom=function(t){var e=t.clone();return e.red=null,e},n.mont=function(t){return new A(t)},r(A,b),A.prototype.convertTo=function(t){return this.imod(t.ushln(this.shift))},A.prototype.convertFrom=function(t){var e=this.imod(t.mul(this.rinv));return e.red=null,e},A.prototype.imul=function(t,e){if(t.isZero()||e.isZero())return t.words[0]=0,t.length=1,t;var i=t.imul(e),r=i.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),n=i.isub(r).iushrn(this.shift),s=n;return n.cmp(this.m)>=0?s=n.isub(this.m):n.cmpn(0)<0&&(s=n.iadd(this.m)),s._forceRed(this)},A.prototype.mul=function(t,e){if(t.isZero()||e.isZero())return new n(0)._forceRed(this);var i=t.mul(e),r=i.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),s=i.isub(r).iushrn(this.shift),o=s;return s.cmp(this.m)>=0?o=s.isub(this.m):s.cmpn(0)<0&&(o=s.iadd(this.m)),o._forceRed(this)},A.prototype.invm=function(t){return this.imod(t._invmp(this.m).mul(this.r2))._forceRed(this)}}(t,Ot)}),jt=Tt(function(t,e){!function(t){var e,i,r,n=String.fromCharCode;function s(t){for(var e,i,r=[],n=0,s=t.length;n<s;)(e=t.charCodeAt(n++))>=55296&&e<=56319&&n<s?56320==(64512&(i=t.charCodeAt(n++)))?r.push(((1023&e)<<10)+(1023&i)+65536):(r.push(e),n--):r.push(e);return r}function o(t){if(t>=55296&&t<=57343)throw Error("Lone surrogate U+"+t.toString(16).toUpperCase()+" is not a scalar value")}function a(t,e){return n(t>>e&63|128)}function h(t){if(0==(4294967168&t))return n(t);var e="";return 0==(4294965248&t)?e=n(t>>6&31|192):0==(4294901760&t)?(o(t),e=n(t>>12&15|224),e+=a(t,6)):0==(4292870144&t)&&(e=n(t>>18&7|240),e+=a(t,12),e+=a(t,6)),e+n(63&t|128)}function u(){if(r>=i)throw Error("Invalid byte index");var t=255&e[r];if(r++,128==(192&t))return 63&t;throw Error("Invalid continuation byte")}function l(){var t,n;if(r>i)throw Error("Invalid byte index");if(r==i)return!1;if(t=255&e[r],r++,0==(128&t))return t;if(192==(224&t)){if((n=(31&t)<<6|u())>=128)return n;throw Error("Invalid continuation byte")}if(224==(240&t)){if((n=(15&t)<<12|u()<<6|u())>=2048)return o(n),n;throw Error("Invalid continuation byte")}if(240==(248&t)&&(n=(7&t)<<18|u()<<12|u()<<6|u())>=65536&&n<=1114111)return n;throw Error("Invalid UTF-8 detected")}t.version="3.0.0",t.encode=function(t){for(var e=s(t),i=e.length,r=-1,n="";++r<i;)n+=h(e[r]);return n},t.decode=function(t){e=s(t),i=e.length,r=0;for(var o,a=[];!1!==(o=l());)a.push(o);return function(t){for(var e,i=t.length,r=-1,s="";++r<i;)(e=t[r])>65535&&(s+=n((e-=65536)>>>10&1023|55296),e=56320|1023&e),s+=n(e);return s}(a)}}(e)});const Gt="0123456789abcdef".split(""),zt=[1,256,65536,16777216],Ht=[0,8,16,24],Zt=[1,0,32898,0,32906,2147483648,2147516416,2147483648,32907,0,2147483649,0,2147516545,2147483648,32777,2147483648,138,0,136,0,2147516425,0,2147483658,0,2147516555,0,139,2147483648,32905,2147483648,32771,2147483648,32770,2147483648,128,2147483648,32778,0,2147483658,2147483648,2147516545,2147483648,32896,2147483648,2147483649,0,2147516424,2147483648],Vt=t=>{var e,i,r,n,s,o,a,h,u,l,c,d,f,m,p,g,w,v,y,M,b,A,x,E,R,S,k,I,O,T,B,C,_,P,D,L,N,W,F,U,q,$,j,G,z,H,Z,V,J,K,X,Q,Y,tt,et,it,rt,nt,st,ot,at,ht,ut;for(r=0;r<48;r+=2)n=t[0]^t[10]^t[20]^t[30]^t[40],s=t[1]^t[11]^t[21]^t[31]^t[41],h=t[4]^t[14]^t[24]^t[34]^t[44],u=t[5]^t[15]^t[25]^t[35]^t[45],l=t[6]^t[16]^t[26]^t[36]^t[46],c=t[7]^t[17]^t[27]^t[37]^t[47],i=(f=t[9]^t[19]^t[29]^t[39]^t[49])^((a=t[3]^t[13]^t[23]^t[33]^t[43])<<1|(o=t[2]^t[12]^t[22]^t[32]^t[42])>>>31),t[0]^=e=(d=t[8]^t[18]^t[28]^t[38]^t[48])^(o<<1|a>>>31),t[1]^=i,t[10]^=e,t[11]^=i,t[20]^=e,t[21]^=i,t[30]^=e,t[31]^=i,t[40]^=e,t[41]^=i,i=s^(u<<1|h>>>31),t[2]^=e=n^(h<<1|u>>>31),t[3]^=i,t[12]^=e,t[13]^=i,t[22]^=e,t[23]^=i,t[32]^=e,t[33]^=i,t[42]^=e,t[43]^=i,i=a^(c<<1|l>>>31),t[4]^=e=o^(l<<1|c>>>31),t[5]^=i,t[14]^=e,t[15]^=i,t[24]^=e,t[25]^=i,t[34]^=e,t[35]^=i,t[44]^=e,t[45]^=i,i=u^(f<<1|d>>>31),t[6]^=e=h^(d<<1|f>>>31),t[7]^=i,t[16]^=e,t[17]^=i,t[26]^=e,t[27]^=i,t[36]^=e,t[37]^=i,t[46]^=e,t[47]^=i,i=c^(s<<1|n>>>31),t[8]^=e=l^(n<<1|s>>>31),t[9]^=i,t[18]^=e,t[19]^=i,t[28]^=e,t[29]^=i,t[38]^=e,t[39]^=i,t[48]^=e,t[49]^=i,p=t[1],H=t[11]<<4|t[10]>>>28,Z=t[10]<<4|t[11]>>>28,I=t[20]<<3|t[21]>>>29,O=t[21]<<3|t[20]>>>29,ot=t[31]<<9|t[30]>>>23,at=t[30]<<9|t[31]>>>23,$=t[40]<<18|t[41]>>>14,j=t[41]<<18|t[40]>>>14,P=t[2]<<1|t[3]>>>31,D=t[3]<<1|t[2]>>>31,w=t[12]<<12|t[13]>>>20,V=t[22]<<10|t[23]>>>22,J=t[23]<<10|t[22]>>>22,T=t[33]<<13|t[32]>>>19,B=t[32]<<13|t[33]>>>19,ht=t[42]<<2|t[43]>>>30,ut=t[43]<<2|t[42]>>>30,tt=t[5]<<30|t[4]>>>2,et=t[4]<<30|t[5]>>>2,L=t[14]<<6|t[15]>>>26,N=t[15]<<6|t[14]>>>26,y=t[24]<<11|t[25]>>>21,K=t[34]<<15|t[35]>>>17,X=t[35]<<15|t[34]>>>17,C=t[45]<<29|t[44]>>>3,_=t[44]<<29|t[45]>>>3,E=t[6]<<28|t[7]>>>4,R=t[7]<<28|t[6]>>>4,it=t[17]<<23|t[16]>>>9,rt=t[16]<<23|t[17]>>>9,W=t[26]<<25|t[27]>>>7,F=t[27]<<25|t[26]>>>7,M=t[36]<<21|t[37]>>>11,b=t[37]<<21|t[36]>>>11,Q=t[47]<<24|t[46]>>>8,Y=t[46]<<24|t[47]>>>8,G=t[8]<<27|t[9]>>>5,z=t[9]<<27|t[8]>>>5,S=t[18]<<20|t[19]>>>12,k=t[19]<<20|t[18]>>>12,nt=t[29]<<7|t[28]>>>25,st=t[28]<<7|t[29]>>>25,U=t[38]<<8|t[39]>>>24,q=t[39]<<8|t[38]>>>24,A=t[48]<<14|t[49]>>>18,x=t[49]<<14|t[48]>>>18,t[0]=(m=t[0])^~(g=t[13]<<12|t[12]>>>20)&(v=t[25]<<11|t[24]>>>21),t[1]=p^~w&y,t[10]=E^~S&I,t[11]=R^~k&O,t[20]=P^~L&W,t[21]=D^~N&F,t[30]=G^~H&V,t[31]=z^~Z&J,t[40]=tt^~it&nt,t[41]=et^~rt&st,t[2]=g^~v&M,t[3]=w^~y&b,t[12]=S^~I&T,t[13]=k^~O&B,t[22]=L^~W&U,t[23]=N^~F&q,t[32]=H^~V&K,t[33]=Z^~J&X,t[42]=it^~nt&ot,t[43]=rt^~st&at,t[4]=v^~M&A,t[5]=y^~b&x,t[14]=I^~T&C,t[15]=O^~B&_,t[24]=W^~U&$,t[25]=F^~q&j,t[34]=V^~K&Q,t[35]=J^~X&Y,t[44]=nt^~ot&ht,t[45]=st^~at&ut,t[6]=M^~A&m,t[7]=b^~x&p,t[16]=T^~C&E,t[17]=B^~_&R,t[26]=U^~$&P,t[27]=q^~j&D,t[36]=K^~Q&G,t[37]=X^~Y&z,t[46]=ot^~ht&tt,t[47]=at^~ut&et,t[8]=A^~m&g,t[9]=x^~p&w,t[18]=C^~E&S,t[19]=_^~R&k,t[28]=$^~P&L,t[29]=j^~D&N,t[38]=Q^~G&H,t[39]=Y^~z&Z,t[48]=ht^~tt&it,t[49]=ut^~et&rt,t[0]^=Zt[r],t[1]^=Zt[r+1]},Jt=t=>e=>{var i;if("0x"===e.slice(0,2)){i=[];for(var r=2,n=e.length;r<n;r+=2)i.push(parseInt(e.slice(r,r+2),16))}else i=e;return((t,e)=>{for(var i,r=e.length,n=t.blocks,s=t.blockCount<<2,o=t.blockCount,a=t.outputBlocks,h=t.s,u=0;u<r;){if(t.reset)for(t.reset=!1,n[0]=t.block,d=1;d<o+1;++d)n[d]=0;if("string"!=typeof e)for(d=t.start;u<r&&d<s;++u)n[d>>2]|=e[u]<<Ht[3&d++];else for(d=t.start;u<r&&d<s;++u)(i=e.charCodeAt(u))<128?n[d>>2]|=i<<Ht[3&d++]:i<2048?(n[d>>2]|=(192|i>>6)<<Ht[3&d++],n[d>>2]|=(128|63&i)<<Ht[3&d++]):i<55296||i>=57344?(n[d>>2]|=(224|i>>12)<<Ht[3&d++],n[d>>2]|=(128|i>>6&63)<<Ht[3&d++],n[d>>2]|=(128|63&i)<<Ht[3&d++]):(i=65536+((1023&i)<<10|1023&e.charCodeAt(++u)),n[d>>2]|=(240|i>>18)<<Ht[3&d++],n[d>>2]|=(128|i>>12&63)<<Ht[3&d++],n[d>>2]|=(128|i>>6&63)<<Ht[3&d++],n[d>>2]|=(128|63&i)<<Ht[3&d++]);if(t.lastByteIndex=d,d>=s){for(t.start=d-s,t.block=n[o],d=0;d<o;++d)h[d]^=n[d];Vt(h),t.reset=!0}else t.start=d}if(n[(d=t.lastByteIndex)>>2]|=zt[3&d],t.lastByteIndex===s)for(n[0]=n[o],d=1;d<o+1;++d)n[d]=0;for(n[o-1]|=2147483648,d=0;d<o;++d)h[d]^=n[d];Vt(h);for(var l,c="",d=0,f=0;f<a;){for(d=0;d<o&&f<a;++d,++f)c+=Gt[(l=h[d])>>4&15]+Gt[15&l]+Gt[l>>12&15]+Gt[l>>8&15]+Gt[l>>20&15]+Gt[l>>16&15]+Gt[l>>28&15]+Gt[l>>24&15];f%o==0&&(Vt(h),d=0)}return"0x"+c})((t=>{return{blocks:[],reset:!0,block:0,start:0,blockCount:1600-(t<<1)>>5,outputBlocks:t>>5,s:(e=[0,0,0,0,0,0,0,0,0,0],[].concat(e,e,e,e,e))};var e})(t),i)};var Kt={keccak256:Jt(256),keccak512:Jt(512),keccak256s:Jt(256),keccak512s:Jt(512)},Xt=Tt(function(t){!function(){var e="input is invalid type",i="object"==typeof window,r=i?window:{};r.JS_SHA3_NO_WINDOW&&(i=!1);var n=!i&&"object"==typeof self;!r.JS_SHA3_NO_NODE_JS&&"object"==typeof process&&process.versions&&process.versions.node?r=Ot:n&&(r=self);var s=!r.JS_SHA3_NO_COMMON_JS&&t.exports,o=!r.JS_SHA3_NO_ARRAY_BUFFER&&"undefined"!=typeof ArrayBuffer,a="0123456789abcdef".split(""),h=[4,1024,262144,67108864],u=[0,8,16,24],l=[1,0,32898,0,32906,2147483648,2147516416,2147483648,32907,0,2147483649,0,2147516545,2147483648,32777,2147483648,138,0,136,0,2147516425,0,2147483658,0,2147516555,0,139,2147483648,32905,2147483648,32771,2147483648,32770,2147483648,128,2147483648,32778,0,2147483658,2147483648,2147516545,2147483648,32896,2147483648,2147483649,0,2147516424,2147483648],c=[224,256,384,512],d=[128,256],f=["hex","buffer","arrayBuffer","array","digest"],m={128:168,256:136};!r.JS_SHA3_NO_NODE_JS&&Array.isArray||(Array.isArray=function(t){return"[object Array]"===Object.prototype.toString.call(t)}),!o||!r.JS_SHA3_NO_ARRAY_BUFFER_IS_VIEW&&ArrayBuffer.isView||(ArrayBuffer.isView=function(t){return"object"==typeof t&&t.buffer&&t.buffer.constructor===ArrayBuffer});for(var p=function(t,e,i){return function(r){return new T(t,e,t).update(r)[i]()}},g=function(t,e,i){return function(r,n){return new T(t,e,n).update(r)[i]()}},w=function(t,e,i){return function(e,r,n,s){return A["cshake"+t].update(e,r,n,s)[i]()}},v=function(t,e,i){return function(e,r,n,s){return A["kmac"+t].update(e,r,n,s)[i]()}},y=function(t,e,i,r){for(var n=0;n<f.length;++n){var s=f[n];t[s]=e(i,r,s)}return t},M=function(t,e){var i=p(t,e,"hex");return i.create=function(){return new T(t,e,t)},i.update=function(t){return i.create().update(t)},y(i,p,t,e)},b=[{name:"keccak",padding:[1,256,65536,16777216],bits:c,createMethod:M},{name:"sha3",padding:[6,1536,393216,100663296],bits:c,createMethod:M},{name:"shake",padding:[31,7936,2031616,520093696],bits:d,createMethod:function(t,e){var i=g(t,e,"hex");return i.create=function(i){return new T(t,e,i)},i.update=function(t,e){return i.create(e).update(t)},y(i,g,t,e)}},{name:"cshake",padding:h,bits:d,createMethod:function(t,e){var i=m[t],r=w(t,0,"hex");return r.create=function(r,n,s){return n||s?new T(t,e,r).bytepad([n,s],i):A["shake"+t].create(r)},r.update=function(t,e,i,n){return r.create(e,i,n).update(t)},y(r,w,t,e)}},{name:"kmac",padding:h,bits:d,createMethod:function(t,e){var i=m[t],r=v(t,0,"hex");return r.create=function(r,n,s){return new B(t,e,n).bytepad(["KMAC",s],i).bytepad([r],i)},r.update=function(t,e,i,n){return r.create(t,i,n).update(e)},y(r,v,t,e)}}],A={},x=[],E=0;E<b.length;++E)for(var R=b[E],S=R.bits,k=0;k<S.length;++k){var I=R.name+"_"+S[k];if(x.push(I),A[I]=R.createMethod(S[k],R.padding),"sha3"!==R.name){var O=R.name+S[k];x.push(O),A[O]=A[I]}}function T(t,e,i){this.blocks=[],this.s=[],this.padding=e,this.outputBits=i,this.reset=!0,this.finalized=!1,this.block=0,this.start=0,this.blockCount=1600-(t<<1)>>5,this.byteCount=this.blockCount<<2,this.outputBlocks=i>>5,this.extraBytes=(31&i)>>3;for(var r=0;r<50;++r)this.s[r]=0}function B(t,e,i){T.call(this,t,e,i)}T.prototype.update=function(t){if(this.finalized)throw new Error("finalize already called");var i,r=typeof t;if("string"!==r){if("object"!==r)throw new Error(e);if(null===t)throw new Error(e);if(o&&t.constructor===ArrayBuffer)t=new Uint8Array(t);else if(!(Array.isArray(t)||o&&ArrayBuffer.isView(t)))throw new Error(e);i=!0}for(var n,s,a=this.blocks,h=this.byteCount,l=t.length,c=this.blockCount,d=0,f=this.s;d<l;){if(this.reset)for(this.reset=!1,a[0]=this.block,n=1;n<c+1;++n)a[n]=0;if(i)for(n=this.start;d<l&&n<h;++d)a[n>>2]|=t[d]<<u[3&n++];else for(n=this.start;d<l&&n<h;++d)(s=t.charCodeAt(d))<128?a[n>>2]|=s<<u[3&n++]:s<2048?(a[n>>2]|=(192|s>>6)<<u[3&n++],a[n>>2]|=(128|63&s)<<u[3&n++]):s<55296||s>=57344?(a[n>>2]|=(224|s>>12)<<u[3&n++],a[n>>2]|=(128|s>>6&63)<<u[3&n++],a[n>>2]|=(128|63&s)<<u[3&n++]):(s=65536+((1023&s)<<10|1023&t.charCodeAt(++d)),a[n>>2]|=(240|s>>18)<<u[3&n++],a[n>>2]|=(128|s>>12&63)<<u[3&n++],a[n>>2]|=(128|s>>6&63)<<u[3&n++],a[n>>2]|=(128|63&s)<<u[3&n++]);if(this.lastByteIndex=n,n>=h){for(this.start=n-h,this.block=a[c],n=0;n<c;++n)f[n]^=a[n];C(f),this.reset=!0}else this.start=n}return this},T.prototype.encode=function(t,e){var i=255&t,r=1,n=[i];for(i=255&(t>>=8);i>0;)n.unshift(i),i=255&(t>>=8),++r;return e?n.push(r):n.unshift(r),this.update(n),n.length},T.prototype.encodeString=function(t){var i,r=typeof t;if("string"!==r){if("object"!==r)throw new Error(e);if(null===t)throw new Error(e);if(o&&t.constructor===ArrayBuffer)t=new Uint8Array(t);else if(!(Array.isArray(t)||o&&ArrayBuffer.isView(t)))throw new Error(e);i=!0}var n=0;if(i)n=t.length;else for(var s=0;s<t.length;++s){var a=t.charCodeAt(s);a<128?n+=1:a<2048?n+=2:a<55296||a>=57344?n+=3:(a=65536+((1023&a)<<10|1023&t.charCodeAt(++s)),n+=4)}return n+=this.encode(8*n),this.update(t),n},T.prototype.bytepad=function(t,e){for(var i=this.encode(e),r=0;r<t.length;++r)i+=this.encodeString(t[r]);var n=[];return n.length=e-i%e,this.update(n),this},T.prototype.finalize=function(){if(!this.finalized){this.finalized=!0;var t=this.blocks,e=this.lastByteIndex,i=this.blockCount,r=this.s;if(t[e>>2]|=this.padding[3&e],this.lastByteIndex===this.byteCount)for(t[0]=t[i],e=1;e<i+1;++e)t[e]=0;for(t[i-1]|=2147483648,e=0;e<i;++e)r[e]^=t[e];C(r)}},T.prototype.toString=T.prototype.hex=function(){this.finalize();for(var t,e=this.blockCount,i=this.s,r=this.outputBlocks,n=this.extraBytes,s=0,o=0,h="";o<r;){for(s=0;s<e&&o<r;++s,++o)h+=a[(t=i[s])>>4&15]+a[15&t]+a[t>>12&15]+a[t>>8&15]+a[t>>20&15]+a[t>>16&15]+a[t>>28&15]+a[t>>24&15];o%e==0&&(C(i),s=0)}return n&&(h+=a[(t=i[s])>>4&15]+a[15&t],n>1&&(h+=a[t>>12&15]+a[t>>8&15]),n>2&&(h+=a[t>>20&15]+a[t>>16&15])),h},T.prototype.buffer=T.prototype.arrayBuffer=function(){this.finalize();var t,e=this.blockCount,i=this.s,r=this.outputBlocks,n=this.extraBytes,s=0,o=0,a=this.outputBits>>3;t=n?new ArrayBuffer(r+1<<2):new ArrayBuffer(a);for(var h=new Uint32Array(t);o<r;){for(s=0;s<e&&o<r;++s,++o)h[o]=i[s];o%e==0&&C(i)}return n&&(h[s]=i[s],t=t.slice(0,a)),t},T.prototype.digest=T.prototype.array=function(){this.finalize();for(var t,e,i=this.blockCount,r=this.s,n=this.outputBlocks,s=this.extraBytes,o=0,a=0,h=[];a<n;){for(o=0;o<i&&a<n;++o,++a)h[t=a<<2]=255&(e=r[o]),h[t+1]=e>>8&255,h[t+2]=e>>16&255,h[t+3]=e>>24&255;a%i==0&&C(r)}return s&&(h[t=a<<2]=255&(e=r[o]),s>1&&(h[t+1]=e>>8&255),s>2&&(h[t+2]=e>>16&255)),h},(B.prototype=new T).finalize=function(){return this.encode(this.outputBits,!0),T.prototype.finalize.call(this)};var C=function(t){var e,i,r,n,s,o,a,h,u,c,d,f,m,p,g,w,v,y,M,b,A,x,E,R,S,k,I,O,T,B,C,_,P,D,L,N,W,F,U,q,$,j,G,z,H,Z,V,J,K,X,Q,Y,tt,et,it,rt,nt,st,ot,at,ht,ut,lt;for(r=0;r<48;r+=2)n=t[0]^t[10]^t[20]^t[30]^t[40],s=t[1]^t[11]^t[21]^t[31]^t[41],h=t[4]^t[14]^t[24]^t[34]^t[44],u=t[5]^t[15]^t[25]^t[35]^t[45],c=t[6]^t[16]^t[26]^t[36]^t[46],d=t[7]^t[17]^t[27]^t[37]^t[47],i=(m=t[9]^t[19]^t[29]^t[39]^t[49])^((a=t[3]^t[13]^t[23]^t[33]^t[43])<<1|(o=t[2]^t[12]^t[22]^t[32]^t[42])>>>31),t[0]^=e=(f=t[8]^t[18]^t[28]^t[38]^t[48])^(o<<1|a>>>31),t[1]^=i,t[10]^=e,t[11]^=i,t[20]^=e,t[21]^=i,t[30]^=e,t[31]^=i,t[40]^=e,t[41]^=i,i=s^(u<<1|h>>>31),t[2]^=e=n^(h<<1|u>>>31),t[3]^=i,t[12]^=e,t[13]^=i,t[22]^=e,t[23]^=i,t[32]^=e,t[33]^=i,t[42]^=e,t[43]^=i,i=a^(d<<1|c>>>31),t[4]^=e=o^(c<<1|d>>>31),t[5]^=i,t[14]^=e,t[15]^=i,t[24]^=e,t[25]^=i,t[34]^=e,t[35]^=i,t[44]^=e,t[45]^=i,i=u^(m<<1|f>>>31),t[6]^=e=h^(f<<1|m>>>31),t[7]^=i,t[16]^=e,t[17]^=i,t[26]^=e,t[27]^=i,t[36]^=e,t[37]^=i,t[46]^=e,t[47]^=i,i=d^(s<<1|n>>>31),t[8]^=e=c^(n<<1|s>>>31),t[9]^=i,t[18]^=e,t[19]^=i,t[28]^=e,t[29]^=i,t[38]^=e,t[39]^=i,t[48]^=e,t[49]^=i,g=t[1],Z=t[11]<<4|t[10]>>>28,V=t[10]<<4|t[11]>>>28,O=t[20]<<3|t[21]>>>29,T=t[21]<<3|t[20]>>>29,at=t[31]<<9|t[30]>>>23,ht=t[30]<<9|t[31]>>>23,j=t[40]<<18|t[41]>>>14,G=t[41]<<18|t[40]>>>14,D=t[2]<<1|t[3]>>>31,L=t[3]<<1|t[2]>>>31,v=t[12]<<12|t[13]>>>20,J=t[22]<<10|t[23]>>>22,K=t[23]<<10|t[22]>>>22,B=t[33]<<13|t[32]>>>19,C=t[32]<<13|t[33]>>>19,ut=t[42]<<2|t[43]>>>30,lt=t[43]<<2|t[42]>>>30,et=t[5]<<30|t[4]>>>2,it=t[4]<<30|t[5]>>>2,N=t[14]<<6|t[15]>>>26,W=t[15]<<6|t[14]>>>26,M=t[24]<<11|t[25]>>>21,X=t[34]<<15|t[35]>>>17,Q=t[35]<<15|t[34]>>>17,_=t[45]<<29|t[44]>>>3,P=t[44]<<29|t[45]>>>3,R=t[6]<<28|t[7]>>>4,S=t[7]<<28|t[6]>>>4,rt=t[17]<<23|t[16]>>>9,nt=t[16]<<23|t[17]>>>9,F=t[26]<<25|t[27]>>>7,U=t[27]<<25|t[26]>>>7,b=t[36]<<21|t[37]>>>11,A=t[37]<<21|t[36]>>>11,Y=t[47]<<24|t[46]>>>8,tt=t[46]<<24|t[47]>>>8,z=t[8]<<27|t[9]>>>5,H=t[9]<<27|t[8]>>>5,k=t[18]<<20|t[19]>>>12,I=t[19]<<20|t[18]>>>12,st=t[29]<<7|t[28]>>>25,ot=t[28]<<7|t[29]>>>25,q=t[38]<<8|t[39]>>>24,$=t[39]<<8|t[38]>>>24,x=t[48]<<14|t[49]>>>18,E=t[49]<<14|t[48]>>>18,t[0]=(p=t[0])^~(w=t[13]<<12|t[12]>>>20)&(y=t[25]<<11|t[24]>>>21),t[1]=g^~v&M,t[10]=R^~k&O,t[11]=S^~I&T,t[20]=D^~N&F,t[21]=L^~W&U,t[30]=z^~Z&J,t[31]=H^~V&K,t[40]=et^~rt&st,t[41]=it^~nt&ot,t[2]=w^~y&b,t[3]=v^~M&A,t[12]=k^~O&B,t[13]=I^~T&C,t[22]=N^~F&q,t[23]=W^~U&$,t[32]=Z^~J&X,t[33]=V^~K&Q,t[42]=rt^~st&at,t[43]=nt^~ot&ht,t[4]=y^~b&x,t[5]=M^~A&E,t[14]=O^~B&_,t[15]=T^~C&P,t[24]=F^~q&j,t[25]=U^~$&G,t[34]=J^~X&Y,t[35]=K^~Q&tt,t[44]=st^~at&ut,t[45]=ot^~ht<,t[6]=b^~x&p,t[7]=A^~E&g,t[16]=B^~_&R,t[17]=C^~P&S,t[26]=q^~j&D,t[27]=$^~G&L,t[36]=X^~Y&z,t[37]=Q^~tt&H,t[46]=at^~ut&et,t[47]=ht^~lt&it,t[8]=x^~p&w,t[9]=E^~g&v,t[18]=_^~R&k,t[19]=P^~S&I,t[28]=j^~D&N,t[29]=G^~L&W,t[38]=Y^~z&Z,t[39]=tt^~H&V,t[48]=ut^~et&rt,t[49]=lt^~it&nt,t[0]^=l[r],t[1]^=l[r+1]};if(s)t.exports=A;else for(E=0;E<x.length;++E)r[x[E]]=A[x[E]]}()});function Qt(t){if(null==t)throw new Error("cannot convert null value to array");if("string"==typeof t){const e=t.match(/^(0x)?[0-9a-fA-F]*$/);if(!e)throw new Error("invalid hexidecimal string");if("0x"!==e[1])throw new Error("hex string must have 0x prefix");(t=t.substring(2)).length%2&&(t="0"+t);const i=[];for(let e=0;e<t.length;e+=2)i.push(parseInt(t.substr(e,2),16));return Yt(new Uint8Array(i))}if(function(t){if(!t||parseInt(String(t.length))!=t.length||"string"==typeof t)return!1;for(let e=0;e<t.length;e++){const i=t[e];if(i<0||i>=256||parseInt(String(i))!=i)return!1}return!0}(t))return Yt(new Uint8Array(t));throw new Error("invalid arrayify value")}function Yt(t){return void 0!==t.slice||(t.slice=()=>{const e=Array.prototype.slice.call(arguments);return Yt(new Uint8Array(Array.prototype.slice.apply(t,e)))}),t}var te=/*#__PURE__*/Object.defineProperty({keccak256:function(t){return"0x"+Xt.keccak_256(Qt(t))},padLeft:(t,e)=>{const i=/^0x/i.test(t)||"number"==typeof t;return t=t.toString().replace(/^0x/i,""),(i?"0x":"")+new Array(e-t.length+1>=0?e-t.length+1:0).join("0")+t},bytesToHex:function(t){const e=[];for(let i=0;i<t.length;i++)e.push((t[i]>>>4).toString(16)),e.push((15&t[i]).toString(16));return`0x${e.join("").replace(/^0+/,"")}`},toByteArray:Qt},"__esModule",{value:!0});function ee(t){return!("string"!=typeof t||!/^(0x)?[0-9a-f]{512}$/i.test(t)||!/^(0x)?[0-9a-f]{512}$/.test(t)&&!/^(0x)?[0-9A-F]{512}$/.test(t))}function ie(t,e){"object"==typeof e&&e.constructor===Uint8Array&&(e=te.bytesToHex(e));const i=te.keccak256(e).replace("0x","");for(let e=0;e<12;e+=4){const r=(parseInt(i.substr(e,2),16)<<8)+parseInt(i.substr(e+2,2),16)&2047,n=1<<r%4;if((re(t.charCodeAt(t.length-1-Math.floor(r/4)))&n)!==n)return!1}return!0}function re(t){if(t>=48&&t<=57)return t-48;if(t>=65&&t<=70)return t-55;if(t>=97&&t<=102)return t-87;throw new Error("invalid bloom")}function ne(t){return!("string"!=typeof t||!/^(0x)?[0-9a-f]{64}$/i.test(t)||!/^(0x)?[0-9a-f]{64}$/.test(t)&&!/^(0x)?[0-9A-F]{64}$/.test(t))}function se(t){return!("string"!=typeof t||!t.match(/^(0x)?[0-9a-fA-F]{40}$/)&&!t.match(/^XE[0-9]{2}[0-9A-Za-z]{30,31}$/))}var oe=/*#__PURE__*/Object.defineProperty({isBloom:ee,isInBloom:ie,isUserEthereumAddressInBloom:function(t,e){if(!ee(t))throw new Error("Invalid bloom given");if(!se(e))throw new Error(`Invalid ethereum address given: "${e}"`);return ie(t,te.padLeft(e,64))},isContractAddressInBloom:function(t,e){if(!ee(t))throw new Error("Invalid bloom given");if(!se(e))throw new Error(`Invalid contract address given: "${e}"`);return ie(t,e)},isTopicInBloom:function(t,e){if(!ee(t))throw new Error("Invalid bloom given");if(!ne(e))throw new Error("Invalid topic");return ie(t,e)},isTopic:ne,isAddress:se},"__esModule",{value:!0}),ae=function(t){return $t.isBN(t)},he=function(t){return t&&t.constructor&&"BigNumber"===t.constructor.name},ue=function(t){try{return Dt.apply(null,arguments)}catch(e){throw new Error(e+' Given value: "'+t+'"')}},le=function(t){return!!/^(0x)?[0-9a-f]{40}$/i.test(t)&&(!(!/^(0x|0X)?[0-9a-f]{40}$/.test(t)&&!/^(0x|0X)?[0-9A-F]{40}$/.test(t))||ce(t))},ce=function(t){t=t.replace(/^0x/i,"");for(var e=Me(t.toLowerCase()).replace(/^0x/i,""),i=0;i<40;i++)if(parseInt(e[i],16)>7&&t[i].toUpperCase()!==t[i]||parseInt(e[i],16)<=7&&t[i].toLowerCase()!==t[i])return!1;return!0},de=function(t){var e="";t=(t=(t=(t=(t=jt.encode(t)).replace(/^(?:\u0000)*/,"")).split("").reverse().join("")).replace(/^(?:\u0000)*/,"")).split("").reverse().join("");for(var i=0;i<t.length;i++){var r=t.charCodeAt(i).toString(16);e+=r.length<2?"0"+r:r}return"0x"+e},fe=function(t){if(!t)return t;if("string"==typeof t&&!we(t))throw new Error('Given value "'+t+'" is not a valid hex string.');return ue(t).toNumber()},me=function(t){if(null==t)return t;if(!isFinite(t)&&!we(t))throw new Error('Given input "'+t+'" is not a number.');var e=ue(t),i=e.toString(16);return e.lt(new $t(0))?"-0x"+i.substr(1):"0x"+i},pe=function(t){if(t=t.toString(16),!we(t))throw new Error('Given value "'+t+'" is not a valid hex string.');t=t.replace(/^0x/i,"");for(var e=[],i=0;i<t.length;i+=2)e.push(parseInt(t.substr(i,2),16));return e},ge=function(t,e){if(le(t))return e?"address":"0x"+t.toLowerCase().replace(/^0x/i,"");if("boolean"==typeof t)return e?"bool":t?"0x01":"0x00";if(Buffer.isBuffer(t))return"0x"+t.toString("hex");if("object"==typeof t&&t&&!he(t)&&!ae(t))return e?"string":de(JSON.stringify(t));if("string"==typeof t){if(0===t.indexOf("-0x")||0===t.indexOf("-0X"))return e?"int256":me(t);if(0===t.indexOf("0x")||0===t.indexOf("0X"))return e?"bytes":t;if(!isFinite(t))return e?"string":de(t)}return e?t<0?"int256":"uint256":me(t)},we=function(t){return("string"==typeof t||"number"==typeof t)&&/^(-)?0x[0-9a-f]*$/i.test(t)},ve=function(t){return("string"==typeof t||"number"==typeof t)&&/^(-0x|0x)?[0-9a-f]*$/i.test(t)},ye="0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",Me=function(t){ae(t)&&(t=t.toString()),we(t)&&/^0x/i.test(t.toString())&&(t=pe(t));var e=Kt.keccak256(t);return e===ye?null:e};Me._Hash=Kt;var be,Ae,xe={BN:$t,isBN:ae,isBigNumber:he,toBN:ue,isAddress:le,isBloom:function(t){return oe.isBloom(t)},isUserEthereumAddressInBloom:function(t,e){return oe.isUserEthereumAddressInBloom(t,e)},isContractAddressInBloom:function(t,e){return oe.isContractAddressInBloom(t,e)},isTopic:function(t){return oe.isTopic(t)},isTopicInBloom:function(t,e){return oe.isTopicInBloom(t,e)},isInBloom:function(t,e){return oe.isInBloom(t,e)},checkAddressChecksum:ce,utf8ToHex:de,hexToUtf8:function(t){if(!we(t))throw new Error('The parameter "'+t+'" must be a valid HEX string.');for(var e="",i=0,r=(t=(t=(t=(t=(t=t.replace(/^0x/i,"")).replace(/^(?:00)*/,"")).split("").reverse().join("")).replace(/^(?:00)*/,"")).split("").reverse().join("")).length,n=0;n<r;n+=2)i=parseInt(t.substr(n,2),16),e+=String.fromCharCode(i);return jt.decode(e)},hexToNumber:fe,hexToNumberString:function(t){if(!t)return t;if("string"==typeof t&&!we(t))throw new Error('Given value "'+t+'" is not a valid hex string.');return ue(t).toString(10)},numberToHex:me,toHex:ge,hexToBytes:pe,bytesToHex:function(t){for(var e=[],i=0;i<t.length;i++)e.push((t[i]>>>4).toString(16)),e.push((15&t[i]).toString(16));return"0x"+e.join("")},isHex:ve,isHexStrict:we,stripHexPrefix:function(t){return 0!==t&&ve(t)?t.replace(/^(-)?0x/i,"$1"):t},leftPad:function(t,e,i){var r=/^0x/i.test(t)||"number"==typeof t;return t=t.toString(16).replace(/^0x/i,""),(r?"0x":"")+new Array(e-t.length+1>=0?e-t.length+1:0).join(i||"0")+t},rightPad:function(t,e,i){return(/^0x/i.test(t)||"number"==typeof t?"0x":"")+(t=t.toString(16).replace(/^0x/i,""))+new Array(e-t.length+1>=0?e-t.length+1:0).join(i||"0")},toTwosComplement:function(t){return"0x"+ue(t).toTwos(256).toString(16,64)},sha3:Me,sha3Raw:function(t){return null===(t=Me(t))?ye:t},toNumber:function(t){return"number"==typeof t?t:fe(ge(t))}},Ee=function(t){var e=typeof t;if("string"===e)return xe.isHexStrict(t)?new $t(t.replace(/0x/i,""),16):new $t(t,10);if("number"===e)return new $t(t);if(xe.isBigNumber(t))return new $t(t.toString(10));if(xe.isBN(t))return t;throw new Error(t+" is not a number")},Re=function(t,e,i){var r,n,s;if("bytes"===(t=(s=t).startsWith("int[")?"int256"+s.slice(3):"int"===s?"int256":s.startsWith("uint[")?"uint256"+s.slice(4):"uint"===s?"uint256":s.startsWith("fixed[")?"fixed128x128"+s.slice(5):"fixed"===s?"fixed128x128":s.startsWith("ufixed[")?"ufixed128x128"+s.slice(6):"ufixed"===s?"ufixed128x128":s)){if(e.replace(/^0x/i,"").length%2!=0)throw new Error("Invalid bytes characters "+e.length);return e}if("string"===t)return xe.utf8ToHex(e);if("bool"===t)return e?"01":"00";if(t.startsWith("address")){if(r=i?64:40,!xe.isAddress(e))throw new Error(e+" is not a valid address, or the checksum is invalid.");return xe.leftPad(e.toLowerCase(),r)}if(r=function(t){var e=/^\D+(\d+).*$/.exec(t);return e?parseInt(e[1],10):null}(t),t.startsWith("bytes")){if(!r)throw new Error("bytes[] not yet supported in solidity");if(i&&(r=32),r<1||r>32||r<e.replace(/^0x/i,"").length/2)throw new Error("Invalid bytes"+r+" for "+e);return xe.rightPad(e,2*r)}if(t.startsWith("uint")){if(r%8||r<8||r>256)throw new Error("Invalid uint"+r+" size");if((n=Ee(e)).bitLength()>r)throw new Error("Supplied uint exceeds width: "+r+" vs "+n.bitLength());if(n.lt(new $t(0)))throw new Error("Supplied uint "+n.toString()+" is negative");return r?xe.leftPad(n.toString("hex"),r/8*2):n}if(t.startsWith("int")){if(r%8||r<8||r>256)throw new Error("Invalid int"+r+" size");if((n=Ee(e)).bitLength()>r)throw new Error("Supplied int exceeds width: "+r+" vs "+n.bitLength());return n.lt(new $t(0))?n.toTwos(r).toString("hex"):r?xe.leftPad(n.toString("hex"),r/8*2):n}throw new Error("Unsupported or invalid type: "+t)},Se=function(t){if(Array.isArray(t))throw new Error("Autodetection of array types is not supported.");var e,i,r="";if(t&&"object"==typeof t&&(t.hasOwnProperty("v")||t.hasOwnProperty("t")||t.hasOwnProperty("value")||t.hasOwnProperty("type"))?(e=t.hasOwnProperty("t")?t.t:t.type,r=t.hasOwnProperty("v")?t.v:t.value):(e=xe.toHex(t,!0),r=xe.toHex(t),e.startsWith("int")||e.startsWith("uint")||(e="bytes")),!e.startsWith("int")&&!e.startsWith("uint")||"string"!=typeof r||/^(-)?0x/i.test(r)||(r=new $t(r)),Array.isArray(r)){if((i=function(t){var e=/^\D+\d*\[(\d+)\]$/.exec(t);return e?parseInt(e[1],10):null}(e))&&r.length!==i)throw new Error(e+" is not matching the given array "+JSON.stringify(r));i=r.length}return Array.isArray(r)?r.map(function(t){return Re(e,t,i).toString("hex").replace("0x","")}).join(""):Re(e,r,i).toString("hex").replace("0x","")},ke={soliditySha3:function(){var t=Array.prototype.slice.call(arguments),e=t.map(Se);return xe.sha3("0x"+e.join(""))},soliditySha3Raw:function(){return xe.sha3Raw("0x"+Array.prototype.slice.call(arguments).map(Se).join(""))},encodePacked:function(){var t=Array.prototype.slice.call(arguments),e=t.map(Se);return"0x"+e.join("").toLowerCase()}},Ie=O.default.randomBytes,Oe=function(t,e){var i=[];return e.forEach(function(e){if("object"==typeof e.components){if("tuple"!==e.type.substring(0,5))throw new Error("components found but type is not tuple; report on GitHub");var r="",n=e.type.indexOf("[");n>=0&&(r=e.type.substring(n));var s=Oe(t,e.components);Array.isArray(s)&&t?i.push("tuple("+s.join(",")+")"+r):i.push(t?"("+s+")":"("+s.join(",")+")"+r)}else i.push(e.type)}),i},Te=function(t){if(!xe.isHexStrict(t))throw new Error("The parameter must be a valid HEX string.");var e="",i=0,r=t.length;for("0x"===t.substring(0,2)&&(i=2);i<r;i+=2){var n=parseInt(t.substr(i,2),16);e+=String.fromCharCode(n)}return e},Be=function(t){if(!t)return"0x00";for(var e="",i=0;i<t.length;i++){var r=t.charCodeAt(i).toString(16);e+=r.length<2?"0"+r:r}return"0x"+e},Ce=function(t){if(t=t?t.toLowerCase():"ether",!qt.unitMap[t])throw new Error('This unit "'+t+"\" doesn't exist, please use the one of the following units"+JSON.stringify(qt.unitMap,null,2));return t},_e={_fireError:function(t,e,i,r,n){return!t||"object"!=typeof t||t instanceof Error||!t.data||((t.data&&"object"==typeof t.data||Array.isArray(t.data))&&(t.data=JSON.stringify(t.data,null,2)),t=t.message+"\n"+t.data),"string"==typeof t&&(t=new Error(t)),"function"==typeof r&&r(t,n),"function"==typeof i&&((e&&"function"==typeof e.listeners&&e.listeners("error").length||"function"==typeof r)&&e.catch(function(){}),setTimeout(function(){i(t)},1)),e&&"function"==typeof e.emit&&setTimeout(function(){e.emit("error",t,n),e.removeAllListeners()},1),e},_jsonInterfaceMethodToString:function(t){return t&&"object"==typeof t&&t.name&&-1!==t.name.indexOf("(")?t.name:t.name+"("+Oe(!1,t.inputs).join(",")+")"},_flattenTypes:Oe,randomHex:function(t){return"0x"+Ie(t).toString("hex")},BN:xe.BN,isBN:xe.isBN,isBigNumber:xe.isBigNumber,isHex:xe.isHex,isHexStrict:xe.isHexStrict,sha3:xe.sha3,sha3Raw:xe.sha3Raw,keccak256:xe.sha3,soliditySha3:ke.soliditySha3,soliditySha3Raw:ke.soliditySha3Raw,encodePacked:ke.encodePacked,isAddress:xe.isAddress,checkAddressChecksum:xe.checkAddressChecksum,toChecksumAddress:function(t){if(void 0===t)return"";if(!/^(0x)?[0-9a-f]{40}$/i.test(t))throw new Error('Given address "'+t+'" is not a valid Ethereum address.');t=t.toLowerCase().replace(/^0x/i,"");for(var e=xe.sha3(t).replace(/^0x/i,""),i="0x",r=0;r<t.length;r++)parseInt(e[r],16)>7?i+=t[r].toUpperCase():i+=t[r];return i},toHex:xe.toHex,toBN:xe.toBN,bytesToHex:xe.bytesToHex,hexToBytes:xe.hexToBytes,hexToNumberString:xe.hexToNumberString,hexToNumber:xe.hexToNumber,toDecimal:xe.hexToNumber,numberToHex:xe.numberToHex,fromDecimal:xe.numberToHex,hexToUtf8:xe.hexToUtf8,hexToString:xe.hexToUtf8,toUtf8:xe.hexToUtf8,stripHexPrefix:xe.stripHexPrefix,utf8ToHex:xe.utf8ToHex,stringToHex:xe.utf8ToHex,fromUtf8:xe.utf8ToHex,hexToAscii:Te,toAscii:Te,asciiToHex:Be,fromAscii:Be,unitMap:qt.unitMap,toWei:function(t,e){if(e=Ce(e),!xe.isBN(t)&&"string"!=typeof t)throw new Error("Please pass numbers as strings or BN objects to avoid precision errors.");return xe.isBN(t)?qt.toWei(t,e):qt.toWei(t,e).toString(10)},fromWei:function(t,e){if(e=Ce(e),!xe.isBN(t)&&"string"!=typeof t)throw new Error("Please pass numbers as strings or BN objects to avoid precision errors.");return xe.isBN(t)?qt.fromWei(t,e):qt.fromWei(t,e).toString(10)},padLeft:xe.leftPad,leftPad:xe.leftPad,padRight:xe.rightPad,rightPad:xe.rightPad,toTwosComplement:xe.toTwosComplement,isBloom:xe.isBloom,isUserEthereumAddressInBloom:xe.isUserEthereumAddressInBloom,isContractAddressInBloom:xe.isContractAddressInBloom,isTopic:xe.isTopic,isTopicInBloom:xe.isTopicInBloom,isInBloom:xe.isInBloom,compareBlockNumbers:function(t,e){if(t==e)return 0;if("genesis"!=t&&"earliest"!=t&&0!=t||"genesis"!=e&&"earliest"!=e&&0!=e){if("genesis"==t||"earliest"==t)return-1;if("genesis"==e||"earliest"==e)return 1;if("latest"==t)return"pending"==e?-1:1;if("latest"===e)return"pending"==t?1:-1;if("pending"==t)return 1;if("pending"==e)return-1;{let i=new $t(t),r=new $t(e);return i.lt(r)?-1:i.eq(r)?0:1}}return 0},toNumber:xe.toNumber};function Pe(t,e,i){let r=!1;if("allow"===i){if(t&&t.allow){const i=t.allow.find(t=>t.type===e);r=i&&i.values.length>0}return r}if(t&&t.deny){const i=t.deny.find(t=>t.type===e);r=i&&i.values.length>0}return r}function De(t,e,i){const r=Pe(t.credentials,e,i);return"allow"===i?(r&&(t.credentials.allow=t.credentials.allow.filter(t=>t.type!==e)),t.credentials&&!t.credentials.allow&&(t.credentials={deny:t.credentials&&t.credentials.deny})):(r&&(t.credentials.deny=t.credentials.deny.filter(t=>t.type!==e)),t.credentials&&!t.credentials.deny&&(t.credentials={allow:t.credentials&&t.credentials.allow})),t}function Le(t,e,i,r){const n=Pe(t.credentials,e,r);return"allow"===r?n?t.credentials.allow.find(t=>{t.type===e&&(t.values=i)}):t=Ne(t,e,i,r):n?t.credentials.deny.find(t=>{t.type===e&&(t.values=i)}):t=Ne(t,e,i,r),t}function Ne(t,e,i,r){const n={type:e,values:i};return"allow"===r?t.credentials&&t.credentials.allow?t.credentials.allow.push(n):t.credentials={allow:[n],deny:t.credentials&&t.credentials.deny}:t.credentials&&t.credentials.deny?t.credentials.deny.push(n):t.credentials={allow:t.credentials&&t.credentials.allow,deny:[n]},t}class We extends yt{constructor(...t){super(...t),this.baseUrl=void 0}static async getInstance(t){var e;const i=new We;return i.setInstanceConfig(t),await i.setBaseUrl(null==(e=t.config)?void 0:e.rbacUri),i}async setBaseUrl(t){this.baseUrl=t}get url(){return this.baseUrl}getIsPermitArgs(t,e,i,r,n,s){return"consume"===e?{component:t,eventType:e,authService:i,did:s,credentials:{type:n,value:r}}:{component:t,eventType:e,authService:i,credentials:{type:n,value:r}}}async isPermit(t,e,i,r,n,s){if(!this.url)return!0;const o=this.getIsPermitArgs(t,e,i,r,n,s);try{const t=await this.ocean.utils.fetch.post(this.url,JSON.stringify(o));let e=await t.json();return e=JSON.stringify(e),"true"===e}catch(t){throw this.logger.error(t),new Error("ERROR: Asset URL not found or not available.")}}}exports.CreateProgressStep=void 0,(be=exports.CreateProgressStep||(exports.CreateProgressStep={}))[be.CreatingDataToken=0]="CreatingDataToken",be[be.DataTokenCreated=1]="DataTokenCreated",be[be.EncryptingFiles=2]="EncryptingFiles",be[be.FilesEncrypted=3]="FilesEncrypted",be[be.StoringDdo=4]="StoringDdo",be[be.DdoStored=5]="DdoStored",exports.OrderProgressStep=void 0,function(t){t[t.TransferDataToken=0]="TransferDataToken"}(exports.OrderProgressStep||(exports.OrderProgressStep={}));class Fe extends yt{static async getInstance(t){const e=new Fe;return e.setInstanceConfig(t),e}create(t,e,i=[],r,n,s,o,a){return r&&!_e.isAddress(r)?(this.logger.error(`Passed Data Token address ${r} is not valid. Aborting publishing.`),null):(this.logger.log("Creating asset"),new K(async h=>{0===i.length&&this.logger.log("You have no services. Are you sure about this?");const{datatokens:u}=this.ocean;if(!r){if(this.logger.log("Creating datatoken"),h.next(exports.CreateProgressStep.CreatingDataToken),r=await u.create("",e.getId(),n,s,o),!_e.isAddress(r))return this.logger.error(`Created Data Token address ${r} is not valid. Aborting publishing.`),null;this.logger.log(`DataToken ${r} created`),h.next(exports.CreateProgressStep.DataTokenCreated)}const l=bt.generate(r);let c;this.logger.log("Encrypting files"),h.next(exports.CreateProgressStep.EncryptingFiles),a?(c=await It.getInstance(this.instanceConfig),await c.setBaseUrl(a)):c=this.ocean.provider;const d=await c.encrypt(l.getDid(),t.main.files,e);this.logger.log("Files encrypted"),h.next(exports.CreateProgressStep.FilesEncrypted);let f=0;const m=new Et({id:l.getDid(),dataToken:r,authentication:[{type:"RsaSignatureAuthentication2018",publicKey:l.getDid()}],publicKey:[{id:l.getDid(),type:"EthereumECDSAKey",owner:e.getId()}],service:[{type:"metadata",attributes:W({status:{isListed:!0,isRetired:!1,isOrderDisabled:!1}},t,{encryptedFiles:d,main:W({},t.main,{files:t.main.files.map((t,e)=>W({},t,{index:e,url:void 0}))})})},...i].reverse().filter(({type:t},e,i)=>i.findIndex(({type:e})=>e===t)===e).reverse().map(t=>W({},t,{index:f++}))});return await m.addProof(this.ocean,e.getId()),m.dataTokenInfo={name:await u.getName(r),symbol:await u.getSymbol(r),address:r,cap:parseFloat(await u.getCap(r))},m}))}async resolve(t){return this.ocean.metadataCache.retrieveDDO(t)}async editMetadata(t,e){if(!t)return null;for(let r=0;r<t.service.length;r++){var i;"metadata"===t.service[r].type&&(e.title&&(t.service[r].attributes.main.name=e.title),e.author&&(t.service[r].attributes.main.author=e.author),t.service[r].attributes.additionalInformation||(t.service[r].attributes.additionalInformation=Object()),e.description&&(t.service[r].attributes.additionalInformation.description=e.description),t.service[r].attributes.additionalInformation.links=e.links?e.links:[],void 0!==(null==(i=e.status)?void 0:i.isOrderDisabled)&&(t.service[r].attributes.status?t.service[r].attributes.status.isOrderDisabled=e.status.isOrderDisabled:t.service[r].attributes.status={isOrderDisabled:e.status.isOrderDisabled}))}return t}async updateCredentials(t,e,i,r){let n;return n=i&&i.length>0?Le(t,e,i,"allow"):De(t,e,"allow"),n=r&&r.length>0?Le(t,e,r,"deny"):De(t,e,"deny"),n}checkCredential(t,e,i){let r=0,n="All good",s=!0;if(t.credentials){if(t.credentials.allow&&t.credentials.allow.length>0){const o=t.credentials.allow.find(t=>t.type===e);o&&!o.values.includes(i)&&(r=2,n="Access is denied, your wallet address is not found on allow list",s=!1)}if(t.credentials.deny&&t.credentials.deny.length>0){const o=t.credentials.deny.find(t=>t.type===e);o&&o.values.includes(i)&&(r=3,n="Access is denied, your wallet address is found on deny list",s=!1)}}return{status:r,message:n,result:s}}async publishDdo(t,e,i=!1){return await this.ocean.onChainMetadata.publish(t.id,t,e,i)}async updateMetadata(t,e){return await this.ocean.onChainMetadata.update(t.id,t,e)}async editServiceTimeout(t,e,i){return t?void 0===t.service[e]||i<0?null:(t.service[e].attributes.main.timeout=parseInt(i.toFixed()),t):null}async creator(t){const{did:e,ddo:i}=await pt(t,this.ocean),r=i.getChecksum(),{creator:n,signatureValue:s}=i.proof,o=await this.ocean.utils.signature.verifyText(r,s);return o.toLowerCase()!==n.toLowerCase()&&this.logger.warn(`Owner of ${e} doesn't match. Expected ${n} instead of ${o}.`),n}async getServiceByType(t,e){const{ddo:i}=await pt(t,this.ocean);let r;return i.service.forEach(t=>{t.type.toString()===e&&(r=t)}),r}async getServiceByIndex(t,e){const{ddo:i}=await pt(t,this.ocean);let r;return i.service.forEach(t=>{t.index===e&&(r=t)}),r}async query(t){return this.ocean.metadataCache.queryMetadata(t)}async createAccessServiceAttributes(t,e,i,r=0,n,s){const o={type:"access",index:2,serviceEndpoint:n||this.ocean.provider.url,attributes:{main:{creator:t.getId(),datePublished:i,cost:e,timeout:r,name:"dataAssetAccess"}}};return null!=s&&s.userCustomParameters&&(o.attributes.userCustomParameters=s.userCustomParameters),null!=s&&s.algoCustomParameters&&(o.attributes.algoCustomParameters=s.algoCustomParameters),o}async initialize(t,e,i,r=-1,n,s){const o=await It.getInstance(this.instanceConfig);await o.setBaseUrl(n);const a=await o.initialize(t,r,e,i,s);return null===a?null:JSON.parse(a)}async order(t,e,i,r=-1,n,s,o,a="json",h=!0){let u;const{ddo:l}=await pt(t,this.ocean),c=await this.isConsumable(l,i,"address",a);if(!c.result)throw new Error("Order asset failed, "+c.message);if(s||(s=i),-1===r?(u=await this.getServiceByType(l,e),r=u.index):(u=await this.getServiceByIndex(l,r),e=u.type),!await this.isUserCustomParametersValid(u.attributes.userCustomParameters,o))throw new Error("Order asset failed, Missing required fiels in userCustomParameters");try{const t=await this.initialize(l,e,i,r,u.serviceEndpoint,o);if(!t)throw new Error("Order asset failed, Failed to initialize service to compute totalCost for ordering");if(h){const e=await this.ocean.datatokens.getPreviousValidOrders(t.dataToken,t.numTokens,r,u.attributes.main.timeout,s);if(e)return e}const a=new dt(await this.ocean.datatokens.balance(t.dataToken,i)),c=new dt(String(t.numTokens));if(a.isLessThan(c))throw this.logger.error("ERROR: Not enough funds Needed "+c.toString()+" but balance is "+a.toString()),new Error("ERROR: Not enough funds Needed "+c.toString()+" but balance is "+a.toString());const d=await this.ocean.datatokens.startOrder(t.dataToken,s,String(t.numTokens),r,n,i);if(d)return d.transactionHash}catch(t){throw this.logger.error(`ERROR: Failed to order a service : ${t.message}`),new Error(`${t.message}`)}}async download(t,e,i,r,n){const{did:s,ddo:o}=await pt(t,this.ocean),{attributes:a}=o.findServiceByType("metadata"),h=o.findServiceByType("access"),{files:u}=a.main,{serviceEndpoint:l}=h;if(!l)throw new Error("Consume asset failed, service definition is missing the `serviceEndpoint`.");this.logger.log("Consuming files"),n=n?`${n}/datafile.${o.shortId()}.${h.index}/`:void 0;const c=await It.getInstance(this.instanceConfig);return await c.setBaseUrl(l),await c.download(s,e,i,h.type,h.index.toString(),n,r,u),!0}async simpleDownload(t,e,i,r){let n=e;n+=`?consumerAddress=${r}`,n+=`&tokenAddress=${t}`,n+=`&transferTxId=${i}`;const s=new kt(this.logger);try{await s.downloadFile(n)}catch(t){throw this.logger.error("Error consuming assets"),this.logger.error(t),t}return e}async getOrderHistory(t,e,i){const r=[],n=t.getId().toLowerCase(),{datatokens:s}=this.ocean,o="0x000000000000000000000000"+n.substring(2),a=s.getStartOrderEventSignature(),h=await this.web3.eth.getPastLogs({topics:[a,null,o],fromBlock:i||0,toBlock:"latest"});for(let t=0;t<h.length;t++){const i={dtAddress:h[t].address,timestamp:0,transactionHash:h[t].transactionHash,amount:null,consumer:"0x"+h[t].topics[1].substring(h[t].topics[1].length-40),payer:"0x"+h[t].topics[2].substring(h[t].topics[2].length-40)};try{const n=this.web3.eth.abi.decodeParameters(["uint256","uint256","uint256","uint256"],h[t].data);i.serviceId=parseInt(n[1]),i.timestamp=parseInt(n[2]),i.amount=this.web3.utils.fromWei(n[0]),i.did=G(Z(i.dtAddress));const s=await this.getServiceByIndex(i.did,i.serviceId);i.serviceType=s.type,(!e||e&&e===s.type)&&r.push(i)}catch(t){}}return r}async isConsumable(t,e,i,r){var n,s;if(!t)throw new Error("ERROR: DDO does not exist");const o={status:2,message:"Consume access is denied.",result:!1};if(null!=(n=t.findServiceByType("metadata").attributes.status)&&n.isOrderDisabled)return{status:1,message:"Ordering this asset has been temporarily disabled by the publisher.",result:!1};const a=this.instanceConfig;if(e&&null!=a&&null!=(s=a.config)&&s.rbacUri){const n=await We.getInstance(this.instanceConfig);if(!await n.isPermit("market","consume",r,e,i,t.id))return o}return{status:0,message:"All good",result:!0}}async isUserCustomParametersValid(t,e){if(t)for(const i of t){const t=i.name;if(!e||!e[t])return this.logger.error("Missing key: "+t+" from customData"),!1}return!0}}exports.OceanPlatformTechStatus=void 0,(Ae=exports.OceanPlatformTechStatus||(exports.OceanPlatformTechStatus={})).Loading="Loading",Ae.Unknown="Unknown",Ae.Stopped="Stopped",Ae.Working="Working";class Ue extends yt{static async getInstance(t){const e=new Ue;return e.setInstanceConfig(t),e}async get(){const t={};t.lib={name:"Lib",version:"0.19.3",commit:"ca9abf8f7f58d58f5731f7b53c294c4a471336e8",status:exports.OceanPlatformTechStatus.Working};try{const{software:e,version:i}=await this.ocean.metadataCache.getVersionInfo();t.metadataCache={name:e,status:exports.OceanPlatformTechStatus.Working,version:i}}catch(e){t.metadataCache={name:"MetadataCache",status:exports.OceanPlatformTechStatus.Stopped}}const e=Object.values(t);return t.status={ok:!e.find(({status:t})=>t!==exports.OceanPlatformTechStatus.Working)},t}}class qe{constructor(t,e){this.web3=void 0,this.logger=void 0,this.web3=t,this.logger=e}async signText(t,e,i){const r=this.web3&&this.web3.currentProvider&&this.web3.currentProvider.isMetaMask;try{return await this.web3.eth.personal.sign(t,e,i)}catch(i){if(r)throw i;this.logger.warn("Error on personal sign."),this.logger.warn(i);try{return await this.web3.eth.sign(t,e)}catch(t){throw this.logger.error("Error on sign."),this.logger.error(t),new Error("Error executing personal sign")}}}async signWithHash(t,e,i){const r=this.web3.utils.utf8ToHex(t),n=this.web3&&this.web3.currentProvider&&this.web3.currentProvider.isMetaMask;try{return await this.web3.eth.personal.sign(r,e,i)}catch(t){if(n)throw t;this.logger.warn("Error on personal sign."),this.logger.warn(t);try{return await this.web3.eth.sign(r,e)}catch(t){throw this.logger.error("Error on sign."),this.logger.error(t),new Error("Error executing personal sign")}}}async verifyText(t,e){return this.web3.eth.personal.ecRecover(t,e)}async getHash(t){let e="";for(let i=0;i<t.length;i++)e+=""+t.charCodeAt(i).toString(16);return"0x"+e}async signForAquarius(t,e){const i=await this.getHash(t),r=this.web3&&this.web3.currentProvider&&this.web3.currentProvider.isMetaMask;try{return this.web3.eth.personal.sign(i,e.getId(),e.getPassword())}catch(t){if(r)throw t;return this.logger.warn("Error on personal sign."),this.logger.warn(t),null}}}class $e extends yt{constructor(...t){super(...t),this.signature=void 0,this.fetch=void 0}static async getInstance(t){const e=new $e;return e.setInstanceConfig(t),e.signature=new qe(t.web3,t.logger),e.fetch=new kt(t.logger),e}}const je="/api/v1/aquarius/assets/ddo";class Ge{get url(){return this.metadataCacheUri}constructor(t,e){this.fetch=void 0,this.logger=void 0,this.metadataCacheUri=void 0,this.fetch=new kt(e),this.logger=e,this.metadataCacheUri=t}async getVersionInfo(){return(await this.fetch.get(this.url)).json()}async getAccessUrl(t,e){return await this.fetch.post(`${t.service_endpoint}/${t.resource_id}`,e).then(t=>t.ok?t.text():(this.logger.error("Failed: ",t.status,t.statusText),null)).then(t=>(this.logger.error("Success accessing consume endpoint: ",t),t)).catch(t=>(this.logger.error("Error fetching the data asset consumption url: ",t),null))}async queryMetadata(t){return await this.fetch.post(`${this.url}/api/v1/aquarius/assets/query`,JSON.stringify(t)).then(t=>t.ok?t.json():(this.logger.error("queryMetadata failed:",t.status,t.statusText),null)).then(t=>t).catch(t=>(this.logger.error("Error fetching querying metadata: ",t),null))}async encryptDDO(t){const e=`${this.url}/api/v1/aquarius/assets/ddo/encryptashex `;return await this.fetch.postWithOctet(e,t).then(e=>e.ok?e.text():(this.logger.error("encryptDDO failed:",e.status,e.statusText,t),null)).catch(t=>(this.logger.error("Error encryptDDO: ",t),null))}async validateMetadata(t){const e={valid:!1},i=mt(t)?"/validate-remote":"/validate";try{const r=await this.fetch.post(`${this.url}${je}${i}`,JSON.stringify(t));if(r.ok){const t=await r.json();!0===t?e.valid=!0:e.errors=t}else this.logger.error("validate Metadata failed:",r.status,r.statusText)}catch(t){this.logger.error("Error validating metadata: ",t)}return e}async retrieveDDO(t,e){t=t&&bt.parse(t);const i=e||`${this.url}${je}/${t.getDid()}`;return await this.fetch.get(i).then(e=>e.ok?e.json():(this.logger.log("retrieveDDO failed:",e.status,e.statusText,t),null)).then(t=>new Et(t)).catch(t=>(this.logger.error("Error fetching querying metadata: ",t),null))}async retrieveDDOByUrl(t){return this.retrieveDDO(void 0,t)}getServiceEndpoint(t){return`${this.url}/api/v1/aquarius/assets/ddo/did:op:${t.getId()}`}getURI(){return`${this.url}`}sleep(t){return new Promise(e=>{setTimeout(e,t)})}async waitForAqua(t,e){let i=0;do{try{const i=await h.fetch(this.getURI()+"/api/v1/aquarius/assets/ddo/"+t);if(i.ok){if(!e)break;{const t=await i.json();if(t.event&&t.event.txid===e)break}}}catch(t){}await this.sleep(1500),i++}while(i<100)}}class ze{constructor(t,e,i=null,r=null,n){this.GASLIMIT_DEFAULT=1e6,this.DDOContractAddress=void 0,this.DDOContractABI=void 0,this.web3=void 0,this.DDOContract=null,this.logger=void 0,this.metadataCache=void 0,this.web3=t,this.DDOContractAddress=i,this.DDOContractABI=r||T.default.abi,t&&(this.DDOContract=new this.web3.eth.Contract(this.DDOContractABI,this.DDOContractAddress)),this.logger=e,this.metadataCache=n}async compressDDO(t){return l.LZMA.disableEndMark=!0,l.LZMA.compress(t,9)}async publish(t,e,i,r=!1,n=!0){if(n&&!(await this.metadataCache.validateMetadata(e)).valid)throw new Error("DDO has failed validation");const s=await this.prepareRawData(e,r);if(s)return this.publishRaw(H(t),s.flags,s.data,i);throw new Error("Could not prepare raw data for publish")}async update(t,e,i,r=!1,n=!0){if(n&&!(await this.metadataCache.validateMetadata(e)).valid)throw new Error("DDO has failed validation");const s=await this.prepareRawData(e,r);if(s)return this.updateRaw(H(t),s.flags,s.data,i);throw new Error("Could not prepare raw data for udate")}async prepareRawData(t,e=!1){let i=0,r=Et.serialize(t);if(!1===e)r=await this.compressDDO(r),i|=1,r=this.getHex(r);else{if(r=await this.metadataCache.encryptDDO(r),!r)return null;i|=2}return{flags:i,data:r}}async publishRaw(t,e,i,r){if(!this.DDOContract)return this.logger.error("ERROR: Missing DDOContract"),null;const n=this.GASLIMIT_DEFAULT;let s;try{s=await this.DDOContract.methods.create(H(t),e,i).estimateGas({from:r},(t,e)=>t?n:e)}catch(t){s=n}try{return await this.DDOContract.methods.create(H(t),e,i).send({from:r,gas:s+1,gasPrice:await ft(this.web3)})}catch(t){return this.logger.error(`ERROR: Failed to publish raw DDO : ${t.message}`),null}}async updateRaw(t,e,i,r){if(!this.DDOContract)return this.logger.error("ERROR: Missing DDOContract"),null;const n=this.GASLIMIT_DEFAULT;let s;try{s=await this.DDOContract.methods.update(H(t),e,i).estimateGas({from:r},(t,e)=>t?n:e)}catch(t){s=n}try{return await this.DDOContract.methods.update(H(t),e,i).send({from:r,gas:s+1,gasPrice:await ft(this.web3)})}catch(t){return this.logger.error(`ERROR: Failed to update raw DDO : ${t.message}`),null}}async transferOwnership(t,e,i){if(!this.DDOContract)return null;try{return await this.DDOContract.methods.transferOwnership(H(t),e).send({from:i})}catch(t){return this.logger.error(`ERROR: Failed to transfer DDO ownership : ${t.message}`),null}}getHex(t){const e=["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"];let i="";try{for(let r=0;r<t.length;r++)i+=""+e[t[r]>>4&15]+e[15&t[r]]}catch(t){this.logger.error(`ERROR: Failed to get hex message value : ${t.message}`)}return"0x"+i}}class He{constructor(t,e,i,r,n,s){this.GASLIMIT_DEFAULT=1e6,this.factoryAddress=void 0,this.factoryABI=void 0,this.datatokensABI=void 0,this.web3=void 0,this.logger=void 0,this.startBlock=void 0,this.factoryAddress=t,this.factoryABI=e||B.default.abi,this.datatokensABI=i||C.default.abi,this.web3=r,this.logger=n,this.startBlock=s||0}generateDtName(t){const{name:e,symbol:i}=wt(t);return{name:e,symbol:i}}async create(t,e,i,r,n){i||(i="1000"),r&&n||({name:r,symbol:n}=this.generateDtName());const s=new this.web3.eth.Contract(this.factoryABI,this.factoryAddress,{from:e}),o=this.GASLIMIT_DEFAULT;let a;try{a=await s.methods.createToken(t,r,n,this.web3.utils.toWei(i)).estimateGas({from:e},(t,e)=>t?o:e)}catch(t){a=o}const h=await s.methods.createToken(t,r,n,this.web3.utils.toWei(i)).send({from:e,gas:a+1,gasPrice:await ft(this.web3)});let u=null;try{u=h.events.TokenCreated.returnValues[0]}catch(t){this.logger.error(`ERROR: Failed to create datatoken : ${t.message}`)}return u}async approve(t,e,i,r){const n=new this.web3.eth.Contract(this.datatokensABI,t,{from:r}),s=this.GASLIMIT_DEFAULT;let o;try{o=await n.methods.approve(e,this.web3.utils.toWei(i)).estimateGas({from:r},(t,e)=>t?s:e)}catch(t){o=s}return await n.methods.approve(e,this.web3.utils.toWei(i)).send({from:r,gas:o+1,gasPrice:await ft(this.web3)})}async mint(t,e,i,r){const n=new this.web3.eth.Contract(this.datatokensABI,t,{from:e}),s=await this.getCap(t);if(new x.default(s).gte(i)){const t=this.GASLIMIT_DEFAULT;let s;try{s=await n.methods.mint(r||e,this.web3.utils.toWei(i)).estimateGas({from:e},(e,i)=>e?t:i)}catch(e){s=t}return await n.methods.mint(r||e,this.web3.utils.toWei(i)).send({from:e,gas:s+1,gasPrice:await ft(this.web3)})}throw new Error("Mint amount exceeds cap available")}async transfer(t,e,i,r){return this.transferToken(t,e,i,r)}async transferToken(t,e,i,r){const n=this.web3.utils.toWei(i);return this.transferWei(t,e,n,r)}async transferWei(t,e,i,r){const n=new this.web3.eth.Contract(this.datatokensABI,t,{from:r}),s=this.GASLIMIT_DEFAULT;let o;try{o=await n.methods.transfer(e,i).estimateGas({from:r},(t,e)=>t?s:e)}catch(t){o=s}return await n.methods.transfer(e,i).send({from:r,gas:o+1,gasPrice:await ft(this.web3)})}async transferFrom(t,e,i,r){const n=new this.web3.eth.Contract(this.datatokensABI,t,{from:r}),s=this.GASLIMIT_DEFAULT;let o;try{o=await n.methods.transferFrom(e,r,this.web3.utils.toWei(i)).estimateGas({from:r},(t,e)=>t?s:e)}catch(t){o=s}return await n.methods.transferFrom(e,r,this.web3.utils.toWei(i)).send({from:r,gas:o+1,gasPrice:await ft(this.web3)})}async balance(t,e){const i=new this.web3.eth.Contract(this.datatokensABI,t,{from:e}),r=await i.methods.balanceOf(e).call();return this.web3.utils.fromWei(r)}async allowance(t,e,i){const r=new this.web3.eth.Contract(this.datatokensABI,t,{from:i}),n=await r.methods.allowance(e,i).call();return this.web3.utils.fromWei(n)}async getBlob(t){const e=new this.web3.eth.Contract(this.datatokensABI,t);return await e.methods.blob().call()}async getName(t){const e=new this.web3.eth.Contract(this.datatokensABI,t);return await e.methods.name().call()}async getSymbol(t){const e=new this.web3.eth.Contract(this.datatokensABI,t);return await e.methods.symbol().call()}async getCap(t){const e=new this.web3.eth.Contract(this.datatokensABI,t),i=await e.methods.cap().call();return this.web3.utils.fromWei(i)}toWei(t){return this.web3.utils.toWei(t)}fromWei(t){return this.web3.utils.fromWei(t)}async startOrder(t,e,i,r,n,s){const o=new this.web3.eth.Contract(this.datatokensABI,t,{from:s});n||(n="0x0000000000000000000000000000000000000000");try{const t=this.GASLIMIT_DEFAULT;let a;try{a=await o.methods.startOrder(e,this.web3.utils.toWei(i),String(r),n).estimateGas({from:s},(e,i)=>e?t:i)}catch(e){a=t}return await o.methods.startOrder(e,this.web3.utils.toWei(i),String(r),n).send({from:s,gas:a+1,gasPrice:await ft(this.web3)})}catch(t){throw this.logger.error(`ERROR: Failed to start order : ${t.message}`),new Error(`Failed to start order: ${t.message}`)}}async getPreviousValidOrders(t,e,i,r,n){const s=new this.web3.eth.Contract(this.datatokensABI,t,{from:n});let o;r>0?(o=await this.web3.eth.getBlockNumber()-r,o<this.startBlock&&(o=this.startBlock)):o=this.startBlock;const a=await s.getPastEvents("OrderStarted",{filter:{consumer:n},fromBlock:o,toBlock:"latest"});for(let t=0;t<a.length;t++)if(String(a[t].returnValues.amount)===this.web3.utils.toWei(String(e))&&String(a[t].returnValues.serviceId)===String(i)&&a[t].returnValues.consumer.toLowerCase()===n.toLowerCase()){if(0===r)return a[t].transactionHash;const e=await this.web3.eth.getBlock(a[t].blockHash),i=new dt(e.timestamp).plus(r);if(new dt(Math.floor(Date.now()/1e3)).isLessThan(i))return a[t].transactionHash}return null}getStartOrderEventSignature(){const t=this.datatokensABI.find(function(t){if("OrderStarted"===t.name&&"event"===t.type)return t});return this.web3.eth.abi.encodeEventSignature(t)}async proposeMinter(t,e,i){const r=new this.web3.eth.Contract(this.datatokensABI,t,{from:i}),n=this.GASLIMIT_DEFAULT;let s;try{s=await r.methods.proposeMinter(e).estimateGas({from:i},(t,e)=>t?n:e)}catch(t){s=n}try{return await r.methods.proposeMinter(e).send({from:i,gas:s+1,gasPrice:await ft(this.web3)})}catch(t){return this.logger.error("ERROR: Propose minter failed"),null}}async approveMinter(t,e){const i=new this.web3.eth.Contract(this.datatokensABI,t,{from:e}),r=this.GASLIMIT_DEFAULT;let n;try{n=await i.methods.approveMinter().estimateGas({from:e},(t,e)=>t?r:e)}catch(t){n=r}try{return await i.methods.approveMinter().send({from:e,gas:n+1,gasPrice:await ft(this.web3)})}catch(t){return null}}async isMinter(t,e){const i=new this.web3.eth.Contract(this.datatokensABI,t);return await i.methods.isMinter(e).call()}}class Ze extends yt{getNetworkId(){return this.web3.eth.net.getId()}async getNetworkName(){return this.web3.eth.net.getId().then(t=>{const e=f.lookup(t);return e&&e.name?e.name:"Development"})}}var Ve;!function(t){t[t.TransferDataToken=0]="TransferDataToken"}(Ve||(Ve={})),Object.freeze({WarmingUp:1,Started:10,ConfiguringVolumes:20,ProvisioningSuccess:30,DataProvisioningFailed:31,AlgorithmProvisioningFailed:32,RunningAlgorithm:40,FilteringResults:50,PublishingResult:60,Completed:70,Stopped:80,Deleted:90});class Je extends yt{static async getInstance(t){const e=new Je;return e.setInstanceConfig(t),e}async getComputeAddress(t,e=-1){let i,r="compute";-1===e?(i=await this.ocean.assets.getServiceByType(t,r),e=i.index):(i=await this.ocean.assets.getServiceByIndex(t,e),r=i.type);const{serviceEndpoint:n}=i,s=await It.getInstance(this.instanceConfig);return await s.setBaseUrl(n),s.computeAddress}async start(t,e,i,r,n,s,o,a,h){s=this.checkOutput(r,s);const{did:u,ddo:l}=await pt(t,this.ocean),c=l.findServiceByType("compute"),{serviceEndpoint:d}=c;if(n.serviceIndex){const{ddo:t}=await pt(n.did,this.ocean),e=t.findServiceById(n.serviceIndex);if(!await this.ocean.assets.isUserCustomParametersValid(e.attributes.algoCustomParameters,n.algoCustomParameters))return null}if(u&&e){const t=await It.getInstance(this.instanceConfig);await t.setBaseUrl(d);const l=await t.computeStart(u,r,n,s,e,o,a,i,h);return l?l[0]:null}return null}async stop(t,e,i){const{did:r,ddo:n}=await pt(e,this.ocean),s=n.findServiceByType("compute"),{serviceEndpoint:o}=s,a=await It.getInstance(this.instanceConfig);await a.setBaseUrl(o);const h=await a.computeStop(r,t,i);return h?h[0]:null}async delete(t,e,i){const{did:r,ddo:n}=await pt(e,this.ocean),s=n.findServiceByType("compute"),{serviceEndpoint:o}=s,a=await It.getInstance(this.instanceConfig);await a.setBaseUrl(o);const h=await a.computeDelete(r,t,i);return h?h[0]:null}async status(t,e,i,r,n,s,o=!0){let a;if(e||r||i){if(!r){if(!i&&!(i=await this.ocean.assets.resolve(e)))throw new Error(`Couldn't resolve the did ${e}`);if(!(r=i.findServiceByType("compute")))throw new Error(`Couldn't find a compute service on the asset with did ${e}`)}const{serviceEndpoint:t}=r;a=await It.getInstance(this.instanceConfig),await a.setBaseUrl(t)}else a=this.ocean.provider;return await a.computeStatus(e,t,n,s,o)}async result(t,e,i){const{did:r,ddo:n}=await pt(e,this.ocean),s=n.findServiceByType("compute"),{serviceEndpoint:o}=s,a=await It.getInstance(this.instanceConfig);return await a.setBaseUrl(o),(await a.computeStatus(r,t,i,void 0,!0))[0]}createServerAttributes(t,e,i,r,n,s,o,a){return{serverId:t,serverType:e,cost:i,cpu:r,gpu:n,memory:s,disk:o,maxExecutionTime:a}}createContainerAttributes(t,e,i){return{image:t,tag:e,checksum:i}}createClusterAttributes(t,e){return{type:t,url:e}}createProviderAttributes(t,e,i,r,n){return{type:t,description:e,environment:{cluster:i,supportedServers:n,supportedContainers:r}}}createComputeService(t,e,i,r,n,s,o,a){s||(s=3600);const h={type:"compute",index:3,serviceEndpoint:o||this.ocean.provider.url,attributes:{main:{name:"dataAssetComputingService",creator:t.getId(),datePublished:i,cost:e,timeout:s,provider:r,privacy:{}}}};return n&&(h.attributes.main.privacy=n),null!=a&&a.userCustomParameters&&(h.attributes.userCustomParameters=a.userCustomParameters),null!=a&&a.algoCustomParameters&&(h.attributes.algoCustomParameters=a.algoCustomParameters),h}checkOutput(t,e){return e&&(e.publishAlgorithmLog||e.publishOutput)?{publishAlgorithmLog:e.publishAlgorithmLog,publishOutput:e.publishOutput,providerAddress:e.providerAddress||this.config.providerAddress,providerUri:e.providerUri||this.config.providerUri,metadataUri:e.metadataUri||this.config.metadataCacheUri,nodeUri:e.nodeUri||this.config.nodeUri,owner:e.owner||t.getId()}:{publishAlgorithmLog:!1,publishOutput:!1}}async isOrderable(t,e,i,r){const n=await pt(t,this.ocean),s=n.ddo.findServiceById(e);if(!s)return!1;if("compute"===s.type){if(i.meta)return!(!s.attributes.main.privacy||!s.attributes.main.privacy.allowRawAlgorithm)||(this.logger.error("ERROR: This service does not allow raw algorithm"),!1);if(i.did){if(i.serviceIndex){if(!r&&!(r=await this.ocean.assets.resolve(i.did)))throw new Error(`Couldn't resolve the did ${i.did}`);const t=r.findServiceById(i.serviceIndex);if(t&&"compute"===t.type){const e=await It.getInstance(this.instanceConfig);await e.setBaseUrl(t.serviceEndpoint);const i=await It.getInstance(this.instanceConfig);if(await i.setBaseUrl(s.serviceEndpoint),e.providerAddress!==i.providerAddress)return this.logger.error("ERROR: Both assets with compute service are not served by the same provider"),!1}}if(s.attributes.main.privacy){if(s.attributes.main.privacy.allowAllPublishedAlgorithms)return!0;if(!s.attributes.main.privacy.publisherTrustedAlgorithms)return!1;let t;for(t of s.attributes.main.privacy.publisherTrustedAlgorithms)if(t.did===i.did){const e=await this.createPublisherTrustedAlgorithmfromDID(i.did);return t.containerSectionChecksum&&t.containerSectionChecksum!==e.containerSectionChecksum?(this.logger.error("ERROR: Algorithm container section was altered since it was added as trusted by "+n.did),!1):!t.filesChecksum||t.filesChecksum===e.filesChecksum||(this.logger.error("ERROR: Algorithm files section was altered since it was added as trusted by "+n.ddo),!1)}return this.logger.error("ERROR: Algorithm "+i.did+" is not allowed by "+n.did),!1}console.error("Algo Index:"+i.serviceIndex)}}return!0}orderAsset(t,e,i,r,n,s,o,a="json",h=!0){return new K(async u=>{const{ddo:l}=await pt(e,this.ocean);if(!await this.isOrderable(l,i,r))throw new Error("Dataset order failed, dataset is not orderable with the specified algorithm");const c=l.findServiceById(i);if(!c)throw new Error("Dataset order failed, Could not find service for the DDO");try{return await this.ocean.assets.order(l,c.type,t,-1,n,s,o,a,h)}catch(t){throw this.logger.error(`ERROR: Failed to order: ${t.message}`),new Error(`Failed to order dataset: ${t.message}`)}})}async orderAlgorithm(t,e,i,r=-1,n,s,o,a="json",h=!0){try{return await this.ocean.assets.order(t,e,i,r,n,s,o,a,h)}catch(t){throw this.logger.error(`ERROR: Failed to orderAlgorithm: ${t.message}`),new Error(`Failed to order algorithm: ${t.message}`)}}async editComputePrivacy(t,e,i){if(!t)return null;if(-1===e){const i=t.findServiceByType("compute");if(!i)return null;e=i.index}return void 0===t.service[e]||"compute"!==t.service[e].type?null:(t.service[e].attributes.main.privacy.allowRawAlgorithm=i.allowRawAlgorithm,t.service[e].attributes.main.privacy.allowAllPublishedAlgorithms=i.allowAllPublishedAlgorithms,t.service[e].attributes.main.privacy.allowNetworkAccess=i.allowNetworkAccess,t.service[e].attributes.main.privacy.publisherTrustedAlgorithms=i.publisherTrustedAlgorithms,t)}async toggleAllowAllPublishedAlgorithms(t,e,i){if(!t)return null;if(-1===e){const i=t.findServiceByType("compute");if(!i)return null;e=i.index}return void 0===t.service[e]||"compute"!==t.service[e].type?null:(t.service[e].attributes.main.privacy.allowAllPublishedAlgorithms=i,t)}async createPublisherTrustedAlgorithmfromDID(t,e){if(!e&&!(e=await this.ocean.assets.resolve(t)))return null;const i=e.findServiceByType("metadata");return i&&i.attributes.main.algorithm&&i.attributes.encryptedFiles&&i.attributes.main.files?{did:t,containerSectionChecksum:m.SHA256(JSON.stringify(i.attributes.main.algorithm.container)).toString(),filesChecksum:m.SHA256(i.attributes.encryptedFiles+JSON.stringify(i.attributes.main.files)).toString()}:null}async addTrustedAlgorithmtoAsset(t,e,i){if(!t)return null;if(-1===e){const i=t.findServiceByType("compute");if(!i)return null;e=i.index}if(void 0===t.service[e])return null;if("compute"!==t.service[e].type)return null;t.service[e].attributes.main.privacy.publisherTrustedAlgorithms||(t.service[e].attributes.main.privacy.publisherTrustedAlgorithms=[]);const r=await this.createPublisherTrustedAlgorithmfromDID(i);return r&&t.service[e].attributes.main.privacy.publisherTrustedAlgorithms.push(r),t}async isAlgorithmTrusted(t,e,i){if(!t)return!1;if(-1===e){const i=t.findServiceByType("compute");if(!i)return!1;e=i.index}if(void 0===t.service[e])return!1;if("compute"!==t.service[e].type)return!1;if(t.service[e].attributes.main.privacy.allowAllPublishedAlgorithms)return!0;let r;for(r of t.service[e].attributes.main.privacy.publisherTrustedAlgorithms)if(r.did===i)return!0;return!1}async removeTrustedAlgorithmFromAsset(t,e,i){if(!t)return null;if(-1===e){const i=t.findServiceByType("compute");if(!i)return t;e=i.index}return void 0===t.service[e]||"compute"!==t.service[e].type?t:t.service[e].attributes.main.privacy.publisherTrustedAlgorithms?(t.service[e].attributes.main.privacy.publisherTrustedAlgorithms=t.service[e].attributes.main.privacy.publisherTrustedAlgorithms.filter(function(t){return t.did!==i}),t):t}}const Ke="115792089237316195423570985008687907853269984665640564039457584007913129639934";var Xe,Qe,Ye,ti;!function(t){t[t.CreatingPool=0]="CreatingPool",t[t.ApprovingDatatoken=1]="ApprovingDatatoken",t[t.ApprovingOcean=2]="ApprovingOcean",t[t.SetupPool=3]="SetupPool"}(Xe||(Xe={}));class ei extends class extends class{constructor(t,e,i=null,r=null){this.GASLIMIT_DEFAULT=1e6,this.web3=null,this.factoryABI=void 0,this.factoryAddress=void 0,this.logger=void 0,this.web3=t,this.factoryABI=i||P.default.abi,r&&(this.factoryAddress=r),this.logger=e}async createPool(t){if(null===this.web3)return this.logger.error("ERROR: Web3 object is null"),null;if(null===this.factoryAddress)return this.logger.error("ERROR: bfactoryAddress is null"),null;const e=new this.web3.eth.Contract(this.factoryABI,this.factoryAddress,{from:t});let i=null;const r=this.GASLIMIT_DEFAULT;let n;try{n=await e.methods.newBPool().estimateGas({from:t},(t,e)=>t?r:e)}catch(t){this.logger.log("Error estimate gas newBPool"),this.logger.log(t),n=r}try{i=await e.methods.newBPool().send({from:t,gas:n+1})}catch(t){this.logger.error(`ERROR: Failed to create new pool: ${t.message}`)}return i}}{constructor(t,e,i=null,r=null,n=null){super(t,e,i,n),this.poolABI=void 0,this.poolABI=r||_.default.abi}async createPool(t){return await super.createPool(t)}async setup(t,e,i,r,n,s,o,a,h){const u=new this.web3.eth.Contract(this.poolABI,e,{from:t});let l=null;const c=this.GASLIMIT_DEFAULT;let d;try{d=await u.methods.setup(i,r,n,s,o,a,h).estimateGas({from:t},(t,e)=>t?c:e)}catch(t){d=c}try{l=await u.methods.setup(i,r,n,s,o,a,h).send({from:t,gas:d,gasPrice:await ft(this.web3)})}catch(t){this.logger.error(`ERROR: Failed to setup a pool: ${t.message}`)}return l}async allowance(t,e,i){const r=new this.web3.eth.Contract(C.default.abi,t,{from:i}),n=await r.methods.allowance(e,i).call();return this.web3.utils.fromWei(n)}async approve(t,e,i,r,n=!1){const s=new this.web3.eth.Contract([{constant:!1,inputs:[{name:"_spender",type:"address"},{name:"_value",type:"uint256"}],name:"approve",outputs:[{name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"}],e,{from:t});if(!n){const n=await this.allowance(e,t,i);if(new x.default(this.web3.utils.toWei(n)).greaterThanOrEqualTo(r))return n}let o=null;const a=this.GASLIMIT_DEFAULT;let h;try{h=await s.methods.approve(i,r).estimateGas({from:t},(t,e)=>t?a:e)}catch(t){h=a}try{o=await s.methods.approve(i,r).send({from:t,gas:h+1,gasPrice:await ft(this.web3)})}catch(t){this.logger.error(`ERRPR: Failed to approve spender to spend tokens : ${t.message}`)}return o}async sharesBalance(t,e){let i=null;try{const r=new this.web3.eth.Contract(this.poolABI,e),n=await r.methods.balanceOf(t).call();i=this.web3.utils.fromWei(n)}catch(t){this.logger.error(`ERROR: Failed to get shares of pool : ${t.message}`)}return i}async addToPool(t,e,i){const r=new this.web3.eth.Contract(this.poolABI,e,{from:t});let n;for(n of i)try{await this.approve(t,n.address,e,this.web3.utils.toWei(`${n.amount}`)),await r.methods.bind(n.address,this.web3.utils.toWei(n.amount),this.web3.utils.toWei(n.weight)).send({from:t,gas:this.GASLIMIT_DEFAULT,gasPrice:await ft(this.web3)})}catch(t){this.logger.error(`ERROR: Failed to add tokens to pool: ${t.message}`)}}async setSwapFee(t,e,i){const r=new this.web3.eth.Contract(this.poolABI,e,{from:t});let n=null;try{n=await r.methods.setSwapFee(this.web3.utils.toWei(i)).send({from:t,gas:this.GASLIMIT_DEFAULT,gasPrice:await ft(this.web3)})}catch(t){this.logger.error(`ERROR: Failed to set pool swap fee: ${t.message}`)}return n}async finalize(t,e){const i=new this.web3.eth.Contract(this.poolABI,e,{from:t});let r=null;try{r=await i.methods.finalize().send({from:t,gas:this.GASLIMIT_DEFAULT,gasPrice:await ft(this.web3)})}catch(t){this.logger.error(`ERROR: Failed to finalize pool: ${t.message}`)}return r}async getNumTokens(t){const e=new this.web3.eth.Contract(this.poolABI,t);let i=null;try{i=await e.methods.getNumTokens().call()}catch(t){this.logger.error(`ERROR: Failed to get number of tokens: ${t.message}`)}return i}async getPoolSharesTotalSupply(t){const e=new this.web3.eth.Contract(this.poolABI,t);let i=null;try{const t=await e.methods.totalSupply().call();i=this.web3.utils.fromWei(t)}catch(t){this.logger.error(`ERROR: Failed to get total supply of pool shares: ${t.message}`)}return i}async getCurrentTokens(t){const e=new this.web3.eth.Contract(this.poolABI,t);let i=null;try{i=await e.methods.getCurrentTokens().call()}catch(t){this.logger.error(`ERROR: Failed to get tokens composing this pool: ${t.message}`)}return i}async getFinalTokens(t){const e=new this.web3.eth.Contract(this.poolABI,t);let i=null;try{i=await e.methods.getFinalTokens().call()}catch(t){this.logger.error("ERROR: Failed to get the final tokens composing this pool")}return i}async getController(t){const e=new this.web3.eth.Contract(this.poolABI,t);let i=null;try{i=await e.methods.getController().call()}catch(t){this.logger.error(`ERROR: Failed to get pool controller address: ${t.message}`)}return i}async setController(t,e,i){const r=new this.web3.eth.Contract(this.poolABI,e,{from:t});let n=null;try{n=await r.methods.setController(i).send({from:t,gas:this.GASLIMIT_DEFAULT})}catch(t){this.logger.error(`ERROR: Failed to set pool controller: ${t.message}`)}return n}async isBound(t,e){const i=new this.web3.eth.Contract(this.poolABI,t);let r=null;try{r=await i.methods.isBound(e).call()}catch(t){this.logger.error(`ERROR: Failed to check whether a token bounded to a pool. ${t.message}`)}return r}async getReserve(t,e){let i=null;try{const r=new this.web3.eth.Contract(this.poolABI,t),n=await r.methods.getBalance(e).call();i=this.web3.utils.fromWei(n)}catch(t){this.logger.error(`ERROR: Failed to get how many tokens are in the pool: ${t.message}`)}return i}async isFinalized(t){const e=new this.web3.eth.Contract(this.poolABI,t);let i=null;try{i=await e.methods.isFinalized().call()}catch(t){this.logger.error(`ERROR: Failed to check whether pool is finalized: ${t.message}`)}return i}async getSwapFee(t){const e=new this.web3.eth.Contract(this.poolABI,t);let i=null;try{const t=await e.methods.getSwapFee().call();i=this.web3.utils.fromWei(t)}catch(t){this.logger.error(`ERROR: Failed to get pool fee: ${t.message}`)}return i}async getNormalizedWeight(t,e){const i=new this.web3.eth.Contract(this.poolABI,t);let r=null;try{const t=await i.methods.getNormalizedWeight(e).call();r=this.web3.utils.fromWei(t)}catch(t){this.logger.error(`ERROR: Failed to get normalized weight of a token: ${t.message}`)}return r}async getDenormalizedWeight(t,e){const i=new this.web3.eth.Contract(this.poolABI,t);let r=null;try{const t=await i.methods.getDenormalizedWeight(e).call();r=this.web3.utils.fromWei(t)}catch(t){this.logger.error("ERROR: Failed to get denormalized weight of a token in pool")}return r}async getTotalDenormalizedWeight(t){const e=new this.web3.eth.Contract(this.poolABI,t);let i=null;try{const t=await e.methods.getTotalDenormalizedWeight().call();i=this.web3.utils.fromWei(t)}catch(t){this.logger.error("ERROR: Failed to get total denormalized weight in pool")}return i}async swapExactAmountIn(t,e,i,r,n,s,o){const a=new this.web3.eth.Contract(this.poolABI,e,{from:t});let h=null;const u=this.GASLIMIT_DEFAULT;let l;try{l=await a.methods.swapExactAmountIn(i,this.web3.utils.toWei(r),n,this.web3.utils.toWei(s),o?this.web3.utils.toWei(o):Ke).estimateGas({from:t},(t,e)=>t?u:e)}catch(t){this.logger.log("Error estimate gas swapExactAmountIn"),this.logger.log(t),l=u}try{h=await a.methods.swapExactAmountIn(i,this.web3.utils.toWei(r),n,this.web3.utils.toWei(s),o?this.web3.utils.toWei(o):Ke).send({from:t,gas:l+1,gasPrice:await ft(this.web3)})}catch(t){this.logger.error(`ERROR: Failed to swap exact amount in : ${t.message}`)}return h}async swapExactAmountOut(t,e,i,r,n,s,o){const a=new this.web3.eth.Contract(this.poolABI,e,{from:t});let h=null;const u=this.GASLIMIT_DEFAULT;let l;try{l=await a.methods.swapExactAmountOut(i,this.web3.utils.toWei(r),n,this.web3.utils.toWei(s),o?this.web3.utils.toWei(o):Ke).estimateGas({from:t},(t,e)=>t?u:e)}catch(t){l=u,this.logger.log("Error estimate gas swapExactAmountIn"),this.logger.log(t)}try{h=await a.methods.swapExactAmountOut(i,this.web3.utils.toWei(r),n,this.web3.utils.toWei(s),o?this.web3.utils.toWei(o):Ke).send({from:t,gas:l+1,gasPrice:await ft(this.web3)})}catch(t){this.logger.error(`ERROR: Failed to swap exact amount out: ${t.message}`)}return h}async joinPool(t,e,i,r){const n=new this.web3.eth.Contract(this.poolABI,e,{from:t}),s=[];let o;for(o of r)s.push(this.web3.utils.toWei(o));let a=null;const h=this.GASLIMIT_DEFAULT;let u;try{u=await n.methods.joinPool(this.web3.utils.toWei(i),s).estimateGas({from:t},(t,e)=>t?h:e)}catch(t){u=h}try{a=await n.methods.joinPool(this.web3.utils.toWei(i),s).send({from:t,gas:u+1,gasPrice:await ft(this.web3)})}catch(t){this.logger.error(`ERROR: Failed to join pool: ${t.message}`)}return a}async exitPool(t,e,i,r){const n=new this.web3.eth.Contract(this.poolABI,e,{from:t}),s=[];let o;for(o of r)s.push(this.web3.utils.toWei(o));let a=null;const h=this.GASLIMIT_DEFAULT;let u;try{u=await n.methods.exitPool(this.web3.utils.toWei(i),s).estimateGas({from:t},(t,e)=>t?h:e)}catch(t){u=h}try{a=await n.methods.exitPool(this.web3.utils.toWei(i),s).send({from:t,gas:u,gasPrice:await ft(this.web3)})}catch(t){this.logger.error(`ERROR: Failed to exit pool: ${t.message}`)}return a}async joinswapExternAmountIn(t,e,i,r,n){const s=new this.web3.eth.Contract(this.poolABI,e,{from:t});let o=null;const a=this.GASLIMIT_DEFAULT;let h;try{h=await s.methods.joinswapExternAmountIn(i,this.web3.utils.toWei(r),this.web3.utils.toWei(n)).estimateGas({from:t},(t,e)=>t?a:e)}catch(t){h=a}try{o=await s.methods.joinswapExternAmountIn(i,this.web3.utils.toWei(r),this.web3.utils.toWei(n)).send({from:t,gas:h+1,gasPrice:await ft(this.web3)})}catch(t){this.logger.error(`ERROR: Failed to pay tokens in order to join the pool: ${t.message}`)}return o}async joinswapPoolAmountOut(t,e,i,r,n){const s=new this.web3.eth.Contract(this.poolABI,e,{from:t});let o=null;const a=this.GASLIMIT_DEFAULT;let h;try{h=await s.methods.joinswapPoolAmountOut(i,this.web3.utils.toWei(r),this.web3.utils.toWei(n)).estimateGas({from:t},(t,e)=>t?a:e)}catch(t){h=a}try{o=await s.methods.joinswapPoolAmountOut(i,this.web3.utils.toWei(r),this.web3.utils.toWei(n)).send({from:t,gas:h+1,gasPrice:await ft(this.web3)})}catch(t){this.logger.error("ERROR: Failed to join swap pool amount out")}return o}async exitswapPoolAmountIn(t,e,i,r,n){const s=new this.web3.eth.Contract(this.poolABI,e,{from:t});let o=null;const a=this.GASLIMIT_DEFAULT;let h;try{h=await s.methods.exitswapPoolAmountIn(i,this.web3.utils.toWei(r),this.web3.utils.toWei(n)).estimateGas({from:t},(t,e)=>t?a:e)}catch(t){h=a}try{o=await s.methods.exitswapPoolAmountIn(i,this.web3.utils.toWei(r),this.web3.utils.toWei(n)).send({from:t,gas:h+1,gasPrice:await ft(this.web3)})}catch(t){this.logger.error(`ERROR: Failed to pay pool shares into the pool: ${t.message}`)}return o}async exitswapExternAmountOut(t,e,i,r,n){const s=this.GASLIMIT_DEFAULT,o=new this.web3.eth.Contract(this.poolABI,e,{from:t});let a,h=null;try{a=await o.methods.exitswapExternAmountOut(i,this.web3.utils.toWei(r),this.web3.utils.toWei(n)).estimateGas({from:t},(t,e)=>t?s:e)}catch(t){a=s}try{h=await o.methods.exitswapExternAmountOut(i,this.web3.utils.toWei(r),this.web3.utils.toWei(n)).send({from:t,gas:a+1,gasPrice:await ft(this.web3)})}catch(t){this.logger.error("ERROR: Failed to exitswapExternAmountOut")}return h}async getSpotPrice(t,e,i){const r=new this.web3.eth.Contract(this.poolABI,t);let n=null;try{const t=await r.methods.getSpotPrice(e,i).call();n=this.web3.utils.fromWei(t)}catch(t){this.logger.error("ERROR: Failed to get spot price of swapping tokenIn to tokenOut")}return n}async getSpotPriceSansFee(t,e,i){const r=new this.web3.eth.Contract(this.poolABI,t);let n=null;try{const t=await r.methods.getSpotPriceSansFee(e,i).call();n=this.web3.utils.fromWei(t)}catch(t){this.logger.error("ERROR: Failed to getSpotPriceSansFee")}return n}async calcSpotPrice(t,e,i,r,n,s){const o=new this.web3.eth.Contract(this.poolABI,t);let a="0";try{const t=await o.methods.calcSpotPrice(this.web3.utils.toWei(e),this.web3.utils.toWei(i),this.web3.utils.toWei(r),this.web3.utils.toWei(n),this.web3.utils.toWei(s)).call();a=this.web3.utils.fromWei(t)}catch(t){this.logger.error("ERROR: Failed to call calcSpotPrice")}return a}async calcInGivenOut(t,e,i,r,n,s,o){const a=new this.web3.eth.Contract(this.poolABI,t);let h=null;if(new x.default(s).gte(r))return null;try{const t=await a.methods.calcInGivenOut(this.web3.utils.toWei(e),this.web3.utils.toWei(i),this.web3.utils.toWei(r),this.web3.utils.toWei(n),this.web3.utils.toWei(s),this.web3.utils.toWei(o)).call();h=this.web3.utils.fromWei(t)}catch(t){this.logger.error("ERROR: Failed to calcInGivenOut")}return h}async calcOutGivenIn(t,e,i,r,n,s,o){const a=new this.web3.eth.Contract(this.poolABI,t);let h=null;try{const t=await a.methods.calcOutGivenIn(this.web3.utils.toWei(e),this.web3.utils.toWei(i),this.web3.utils.toWei(r),this.web3.utils.toWei(n),this.web3.utils.toWei(s),this.web3.utils.toWei(o)).call();h=this.web3.utils.fromWei(t)}catch(t){this.logger.error("ERROR: Failed to calcOutGivenIn")}return h}async calcPoolOutGivenSingleIn(t,e,i,r,n,s,o){const a=new this.web3.eth.Contract(this.poolABI,t);let h=null;try{const t=await a.methods.calcPoolOutGivenSingleIn(this.web3.utils.toWei(e),this.web3.utils.toWei(i),this.web3.utils.toWei(r),this.web3.utils.toWei(n),this.web3.utils.toWei(s),this.web3.utils.toWei(o)).call();h=this.web3.utils.fromWei(t)}catch(t){this.logger.error(`ERROR: Failed to calculate PoolOutGivenSingleIn : ${t.message}`)}return h}async calcSingleInGivenPoolOut(t,e,i,r,n,s,o){const a=new this.web3.eth.Contract(this.poolABI,t);let h=null;try{const t=await a.methods.calcSingleInGivenPoolOut(this.web3.utils.toWei(e),this.web3.utils.toWei(i),this.web3.utils.toWei(r),this.web3.utils.toWei(n),this.web3.utils.toWei(s),this.web3.utils.toWei(o)).call();h=this.web3.utils.fromWei(t)}catch(t){this.logger.error(`ERROR: Failed to calculate SingleInGivenPoolOut : ${t.message}`)}return h}async calcSingleOutGivenPoolIn(t,e,i,r,n,s,o){const a=new this.web3.eth.Contract(this.poolABI,t);let h=null;try{const t=await a.methods.calcSingleOutGivenPoolIn(this.web3.utils.toWei(e),this.web3.utils.toWei(i),this.web3.utils.toWei(r),this.web3.utils.toWei(n),this.web3.utils.toWei(s),this.web3.utils.toWei(o)).call();h=this.web3.utils.fromWei(t)}catch(t){this.logger.error(`ERROR: Failed to calculate SingleOutGivenPoolIn : ${t.message}`)}return h}async calcPoolInGivenSingleOut(t,e,i,r,n,s,o){const a=new this.web3.eth.Contract(this.poolABI,t);let h=null;try{const t=await a.methods.calcPoolInGivenSingleOut(this.web3.utils.toWei(e),this.web3.utils.toWei(i),this.web3.utils.toWei(r),this.web3.utils.toWei(n),this.web3.utils.toWei(s),this.web3.utils.toWei(o)).call();h=this.web3.utils.fromWei(t)}catch(t){this.logger.error(`ERROR: Failed to calculate PoolInGivenSingleOut : ${t.message}`)}return h}getSwapEventSignature(){const t=this.poolABI.find(function(t){if("LOG_SWAP"===t.name&&"event"===t.type)return t});return this.web3.eth.abi.encodeEventSignature(t)}getJoinEventSignature(){const t=this.poolABI.find(function(t){if("LOG_JOIN"===t.name&&"event"===t.type)return t});return this.web3.eth.abi.encodeEventSignature(t)}getExitEventSignature(){const t=this.poolABI.find(function(t){if("LOG_EXIT"===t.name&&"event"===t.type)return t});return this.web3.eth.abi.encodeEventSignature(t)}}{constructor(t,e,i=null,r=null,n=null,s=null,o){super(t,e,i,r,n),this.oceanAddress=null,this.dtAddress=null,this.startBlock=void 0,s&&(this.oceanAddress=s),this.startBlock=o||0}create(t,e,i,r,n,s){if(null==this.oceanAddress)throw this.logger.error("ERROR: oceanAddress is not defined"),new Error("ERROR: oceanAddress is not defined");if(parseFloat(s)>.1)throw this.logger.error("ERROR: Swap fee too high. The maximum allowed swapFee is 10%"),new Error("ERROR: Swap fee too high. The maximum allowed swapFee is 10%");if(parseFloat(i)<2)throw this.logger.error("ERROR: Amount of DT is too low"),new Error("ERROR: Amount of DT is too low");if(parseFloat(r)>9||parseFloat(r)<1)throw this.logger.error("ERROR: Weight out of bounds (min 1, max9)"),new Error("ERROR: Weight out of bounds (min 1, max9)");return new K(async o=>{o.next(Xe.CreatingPool);const a=await super.createPool(t);if(!a)throw this.logger.error("ERROR: Failed to call create pool"),new Error("ERROR: Failed to call create pool");const h=a.events.BPoolRegistered.returnValues[0],u=10-parseFloat(r);let l;if(this.dtAddress=e,o.next(Xe.ApprovingDatatoken),l=await this.approve(t,e,h,this.web3.utils.toWei(String(i))),!l)throw this.logger.error("ERROR: Failed to call approve DT token"),new Error("ERROR: Failed to call approve DT token");if(o.next(Xe.ApprovingOcean),l=await this.approve(t,this.oceanAddress,h,this.web3.utils.toWei(String(n))),!l)throw this.logger.error("ERROR: Failed to call approve OCEAN token"),new Error("ERROR: Failed to call approve OCEAN token");if(o.next(Xe.SetupPool),l=await super.setup(t,h,e,this.web3.utils.toWei(String(i)),this.web3.utils.toWei(String(r)),this.oceanAddress,this.web3.utils.toWei(String(n)),this.web3.utils.toWei(String(u)),this.web3.utils.toWei(s)),!l)throw this.logger.error("ERROR: Failed to create a new pool"),new Error("ERROR: Failed to create a new pool");return a})}async getDTAddress(t){this.dtAddress=null;const e=await this.getCurrentTokens(t);let i;if(null!=e)for(i of e)i.toLowerCase()!==this.oceanAddress.toLowerCase()&&(this.dtAddress=i);return this.dtAddress}async getOceanReserve(t){return null==this.oceanAddress?(this.logger.error("ERROR: oceanAddress is not defined"),null):super.getReserve(t,this.oceanAddress)}async getDTReserve(t){const e=await this.getDTAddress(t);return super.getReserve(t,e)}async getMaxBuyQuantity(t,e){const i=await super.getReserve(t,e);return new x.default(i).div(3).toString()}async getOceanMaxBuyQuantity(t){return this.getMaxBuyQuantity(t,this.oceanAddress)}async getDTMaxBuyQuantity(t){return this.getMaxBuyQuantity(t,await this.getDTAddress(t))}async calcInGivenOut(t,e,i,r){return await super.calcInGivenOut(t,await super.getReserve(t,e),await super.getDenormalizedWeight(t,e),await super.getReserve(t,i),await super.getDenormalizedWeight(t,i),r,await this.getSwapFee(t))}async calcOutGivenIn(t,e,i,r){return await super.calcOutGivenIn(t,await super.getReserve(t,e),await super.getDenormalizedWeight(t,e),await super.getReserve(t,i),await super.getDenormalizedWeight(t,i),r,await super.getSwapFee(t))}async calcPoolOutGivenSingleIn(t,e,i){return super.calcPoolOutGivenSingleIn(t,await super.getReserve(t,e),await super.getDenormalizedWeight(t,e),await super.getPoolSharesTotalSupply(t),await super.getTotalDenormalizedWeight(t),i,await super.getSwapFee(t))}async calcSingleInGivenPoolOut(t,e,i){return super.calcSingleInGivenPoolOut(t,await super.getReserve(t,e),await super.getDenormalizedWeight(t,e),await super.getPoolSharesTotalSupply(t),await super.getTotalDenormalizedWeight(t),i,await super.getSwapFee(t))}async calcSingleOutGivenPoolIn(t,e,i){return super.calcSingleOutGivenPoolIn(t,await super.getReserve(t,e),await super.getDenormalizedWeight(t,e),await super.getPoolSharesTotalSupply(t),await super.getTotalDenormalizedWeight(t),i,await super.getSwapFee(t))}async calcPoolInGivenSingleOut(t,e,i){return super.calcPoolInGivenSingleOut(t,await super.getReserve(t,e),await super.getDenormalizedWeight(t,e),await super.getPoolSharesTotalSupply(t),await super.getTotalDenormalizedWeight(t),i,await super.getSwapFee(t))}async getPoolSharesRequiredToRemoveDT(t,e){const i=await this.getDTAddress(t);return this.calcPoolInGivenSingleOut(t,i,e)}async getDTRemovedforPoolShares(t,e){const i=await this.getDTAddress(t);return this.calcSingleOutGivenPoolIn(t,i,e)}async getPoolSharesRequiredToRemoveOcean(t,e){return this.calcPoolInGivenSingleOut(t,this.oceanAddress,e)}async getOceanRemovedforPoolShares(t,e){return this.calcSingleOutGivenPoolIn(t,this.oceanAddress,e)}async getTokensRemovedforPoolShares(t,e){try{const i=await this.getPoolSharesTotalSupply(t),r=await this.getDTReserve(t),n=await this.getOceanReserve(t);return{dtAmount:new x.default(e).div(i).mul(r).toString(),oceanAmount:new x.default(e).div(i).mul(n).toString()}}catch(t){this.logger.error(`ERROR: Unable to get token info. ${t.message}`)}}async getDTMaxAddLiquidity(t){const e=await this.getDTAddress(t);return this.getMaxAddLiquidity(t,e)}async getOceanMaxAddLiquidity(t){return this.getMaxAddLiquidity(t,this.oceanAddress)}async getMaxAddLiquidity(t,e){const i=await super.getReserve(t,e);return parseFloat(i)>0?new x.default(i).mul(.25).toString():"0"}async getMaxRemoveLiquidity(t,e){const i=await super.getReserve(t,e);return parseFloat(i)>0?new x.default(i).mul(.25).toString():"0"}async getDTMaxRemoveLiquidity(t){const e=await this.getDTAddress(t);return this.getMaxRemoveLiquidity(t,e)}async getOceanMaxRemoveLiquidity(t){return this.getMaxRemoveLiquidity(t,this.oceanAddress)}async buyDT(t,e,i,r,n){if(null==this.oceanAddress)return this.logger.error("ERROR: undefined ocean token contract address"),null;const s=await this.getDTAddress(e);if(new x.default(i).greaterThan(await this.getDTMaxBuyQuantity(e)))return this.logger.error("ERROR: Buy quantity exceeds quantity allowed"),null;const o=await this.getOceanNeeded(e,i);if(new x.default(o).greaterThan(r))return this.logger.error("ERROR: Not enough Ocean Tokens"),null;if(!await super.approve(t,this.oceanAddress,e,this.web3.utils.toWei(r)))throw this.logger.error("ERROR: Failed to call approve OCEAN token"),new Error("ERROR: Failed to call approve OCEAN token");return await super.swapExactAmountOut(t,e,this.oceanAddress,r,s,i,n)}async buyDTWithExactOcean(t,e,i,r,n){if(null==this.oceanAddress)return this.logger.error("ERROR: undefined ocean token contract address"),null;const s=await this.getDTAddress(e);if(new x.default(i).greaterThan(await this.getDTMaxBuyQuantity(e)))return this.logger.error("ERROR: Buy quantity exceeds quantity allowed"),null;const o=await this.getOceanNeeded(e,i);if(new x.default(o).greaterThan(r))return this.logger.error("ERROR: Not enough Ocean Tokens"),null;if(!await super.approve(t,this.oceanAddress,e,this.web3.utils.toWei(r)))throw this.logger.error("ERROR: Failed to call approve OCEAN token"),new Error("ERROR: Failed to call approve OCEAN token");return await super.swapExactAmountIn(t,e,this.oceanAddress,r,s,i,n)}async sellDT(t,e,i,r,n){if(null==this.oceanAddress)return this.logger.error("ERROR: oceanAddress is not defined"),null;const s=await this.getDTAddress(e);if(new x.default(r).greaterThan(await this.getOceanMaxBuyQuantity(e)))return this.logger.error("ERROR: Buy quantity exceeds quantity allowed"),null;const o=await this.getOceanReceived(e,i);if(new x.default(o).lessThan(r))return this.logger.error("ERROR: Not enough datatokens"),null;if(!await super.approve(t,s,e,this.web3.utils.toWei(i)))throw this.logger.error("ERROR: Failed to call approve DT token"),new Error("ERROR: Failed to call approve DT token");return await super.swapExactAmountIn(t,e,s,i,this.oceanAddress,r,n)}async addDTLiquidity(t,e,i){const r=await this.getDTAddress(e),n=await this.getMaxAddLiquidity(e,r);if(new x.default(i).greaterThan(n))return this.logger.error("ERROR: Too much reserve to add"),null;if(!await super.approve(t,r,e,this.web3.utils.toWei(i)))throw this.logger.error("ERROR: Failed to call approve DT token"),new Error("ERROR: Failed to call approve DT token");return await super.joinswapExternAmountIn(t,e,r,i,"0")}async removeDTLiquidity(t,e,i,r){const n=await this.getDTAddress(e),s=await this.getDTMaxRemoveLiquidity(e);if(new x.default(i).greaterThan(s))return this.logger.error("ERROR: Too much reserve to remove"),null;const o=await this.sharesBalance(t,e);if(new x.default(o).lessThan(r))return this.logger.error("ERROR: Not enough poolShares"),null;const a=await this.getPoolSharesRequiredToRemoveDT(e,i);return new x.default(r).lessThan(a)?(this.logger.error("ERROR: Not enough poolShares"),null):(new x.default(r).lessThan(a)&&(r=new x.default(r).mul(.9999).toString()),this.exitswapExternAmountOut(t,e,n,i,r))}async addOceanLiquidity(t,e,i){if(null==this.oceanAddress)return this.logger.error("ERROR: oceanAddress is not defined"),null;const r=await this.getOceanMaxAddLiquidity(e);if(new x.default(i).greaterThan(r))return this.logger.error("ERROR: Too much reserve to add"),null;if(!await super.approve(t,this.oceanAddress,e,this.web3.utils.toWei(i)))throw this.logger.error("ERROR: Failed to call approve OCEAN token"),new Error("ERROR: Failed to call approve OCEAN token");return await super.joinswapExternAmountIn(t,e,this.oceanAddress,i,"0")}async removeOceanLiquidityWithMinimum(t,e,i,r){if(null==this.oceanAddress)return this.logger.error("ERROR: oceanAddress is not defined"),null;const n=await this.sharesBalance(t,e);return new x.default(n).lessThan(i)?(this.logger.error("ERROR: Not enough poolShares"),null):super.exitswapPoolAmountIn(t,e,this.oceanAddress,i,r)}async removeOceanLiquidity(t,e,i,r){if(null==this.oceanAddress)return this.logger.error("ERROR: oceanAddress is not defined"),null;const n=await this.getOceanMaxRemoveLiquidity(e);if(new x.default(i).greaterThan(n))return this.logger.error("ERROR: Too much reserve to remove"),null;const s=await this.sharesBalance(t,e);if(new x.default(s).lessThan(r))return this.logger.error("ERROR: Not enough poolShares"),null;const o=await this.getPoolSharesRequiredToRemoveOcean(e,i);return new x.default(r).lessThan(o)?(this.logger.error("ERROR: Not enough poolShares"),null):(new x.default(r).lessThan(o)&&(r=new x.default(r).mul(.9999).toString()),super.exitswapExternAmountOut(t,e,this.oceanAddress,i,r))}async removePoolLiquidity(t,e,i,r="0",n="0"){const s=await this.sharesBalance(t,e);return new x.default(s).lessThan(i)?(this.logger.error("ERROR: Not enough poolShares"),null):(new x.default(s).equals(i)&&(i=new x.default(i).mul(.9999).toString()),this.exitPool(t,e,i,[r,n]))}async getDTPrice(t){return null==this.oceanAddress?(this.logger.error("ERROR: oceanAddress is not defined"),"0"):this.getOceanNeeded(t,"1")}async searchPoolforDT(t){const e=[],i=new this.web3.eth.Contract(this.factoryABI,this.factoryAddress),r=await i.getPastEvents("BPoolRegistered",{filter:{},fromBlock:this.startBlock,toBlock:"latest"});r.sort((t,e)=>t.blockNumber>e.blockNumber?1:-1);for(let i=0;i<r.length;i++)(await super.getCurrentTokens(r[i].returnValues[0])).includes(t)&&e.push(r[i].returnValues[0]);return e}async getOceanNeeded(t,e){const i=await this.getDTAddress(t);return new x.default(e).greaterThan(await this.getDTMaxBuyQuantity(t))?"0":this.calcInGivenOut(t,this.oceanAddress,i,e)}async getOceanReceived(t,e){const i=await this.getDTAddress(t);return this.calcOutGivenIn(t,i,this.oceanAddress,e)}async getDTReceived(t,e){const i=await this.getDTAddress(t);return this.calcOutGivenIn(t,this.oceanAddress,i,e)}async getDTNeeded(t,e){const i=await this.getDTAddress(t);return new x.default(e).greaterThan(await this.getOceanMaxBuyQuantity(t))?"0":this.calcInGivenOut(t,i,this.oceanAddress,e)}async getPoolsbyCreator(t){const e=[],i=new this.web3.eth.Contract(this.factoryABI,this.factoryAddress),r=await i.getPastEvents("BPoolRegistered",{filter:t?{registeredBy:t}:{},fromBlock:this.startBlock,toBlock:"latest"});for(let i=0;i<r.length;i++)t&&r[i].returnValues[1].toLowerCase()!==t.toLowerCase()||e.push(await this.getPoolDetails(r[i].returnValues[0]));return e}async getResult(t,e){const i=await super.sharesBalance(t,e.returnValues[0]);if(parseFloat(i)>0){const t=await this.getDTAddress(e.returnValues[0]);if(t)return{shares:i,poolAddress:e.returnValues[0],did:G(Z(t))}}}async getPoolSharesByAddress(t){const e=[],i=new this.web3.eth.Contract(this.factoryABI,this.factoryAddress),r=await i.getPastEvents("BPoolRegistered",{filter:{},fromBlock:this.startBlock,toBlock:"latest"});let n=[];for(let i=0;i<r.length;i++)if(n.push(this.getResult(t,r[i])),n.length>10){const t=await Promise.all(n);for(let i=0;i<t.length;i++)e.push(t[i]);n=[]}if(n.length>0){const t=await Promise.all(n);for(let i=0;i<t.length;i++)e.push(t[i]);n=[]}return e.filter(t=>void 0!==t)}async getPoolDetails(t){return{poolAddress:t,tokens:await super.getFinalTokens(t)}}async getPoolLogs(t,e=0,i){const r=[],n=await this.getDTAddress(t);0===e&&(e=this.startBlock);const s=super.getSwapEventSignature(),o=super.getJoinEventSignature(),a=super.getExitEventSignature();let h;h=i?"0x000000000000000000000000"+i.substring(2).toLowerCase():null;const u=await this.web3.eth.getPastLogs({address:t,topics:[[s,o,a],h],fromBlock:e,toBlock:"latest"});let l=[];for(let e=0;e<u.length;e++)if(l.push(this.getEventData(t,n,u[e])),l.length>10){const t=await Promise.all(l);for(let e=0;e<t.length;e++)r.push(t[e]);l=[]}if(l.length>0){const t=await Promise.all(l);for(let e=0;e<t.length;e++)r.push(t[e]);l=[]}return r.filter(t=>void 0!==t)}async getAllPoolLogs(t){const e=[],i=new this.web3.eth.Contract(this.factoryABI,this.factoryAddress),r=await i.getPastEvents("BPoolRegistered",{filter:{},fromBlock:this.startBlock,toBlock:"latest"});let n=[];for(let i=0;i<r.length;i++)if(n.push(this.getPoolLogs(r[i].returnValues[0],r[i].blockNumber,t)),n.length>10){const t=await Promise.all(n);for(let i=0;i<t.length;i++)e.push(t[i]);n=[]}if(n.length>0){const t=await Promise.all(n);for(let i=0;i<t.length;i++)e.push(t[i]);n=[]}return e.reduce((t,e)=>t.concat(e))}async getEventData(t,e,i){const r=await this.web3.eth.getBlock(i.blockNumber),n=super.getSwapEventSignature(),s=super.getJoinEventSignature(),o=super.getExitEventSignature();let a;switch(i.topics[0]){case n:a="swap";break;case s:a="join";break;case o:a="exit"}let h,u={poolAddress:t,dtAddress:e,caller:i.topics[1],transactionHash:i.transactionHash,blockNumber:i.blockNumber,timestamp:parseInt(String(r.timestamp)),type:a};switch(a){case"swap":h=this.web3.eth.abi.decodeParameters(["uint256","uint256"],i.data),u=W({},u,{tokenIn:"0x"+i.topics[2].substring(i.topics[2].length-40),tokenOut:"0x"+i.topics[3].substring(i.topics[3].length-40),tokenAmountIn:this.web3.utils.fromWei(h[0]),tokenAmountOut:this.web3.utils.fromWei(h[1])});break;case"join":h=this.web3.eth.abi.decodeParameters(["uint256"],i.data),u=W({},u,{tokenIn:"0x"+i.topics[2].substring(i.topics[2].length-40),tokenAmountIn:this.web3.utils.fromWei(h[0])});break;case"exit":h=this.web3.eth.abi.decodeParameters(["uint256"],i.data),u=W({},u,{tokenOut:"0x"+i.topics[2].substring(i.topics[2].length-40),tokenAmountOut:this.web3.utils.fromWei(h[0])})}return u}async computeSlippage(t,e,i,r,n,s,o,a){const h=await super.calcSpotPrice(t,e,i,r,n,a),u=await super.calcSpotPrice(t,s,i,o,n,a);return new x.default(u).mul(100).div(h).minus(100).toString()}async computeBuySlippage(t,e){const i=await this.getDTAddress(t),r=await super.getDenormalizedWeight(t,i),n=await super.getDenormalizedWeight(t,this.oceanAddress),s=await super.getReserve(t,i),o=await super.getReserve(t,i),a=await super.getSwapFee(t),h=await super.calcOutGivenIn(t,o,n,s,r,e,a),u=new dt(this.web3.utils.toWei(s)).minus(this.web3.utils.toWei(h)),l=new dt(this.web3.utils.toWei(o)).plus(this.web3.utils.toWei(e));return await this.computeSlippage(t,o,n,s,r,this.web3.utils.fromWei(l.toString()),this.web3.utils.fromWei(u.toString()),a)}async computeSellSlippage(t,e){const i=await this.getDTAddress(t),r=await super.getDenormalizedWeight(t,i),n=await super.getDenormalizedWeight(t,this.oceanAddress),s=await super.getReserve(t,i),o=await super.getReserve(t,i),a=await super.getSwapFee(t),h=await super.calcOutGivenIn(t,s,r,o,n,e,a),u=new dt(this.web3.utils.toWei(s)).plus(this.web3.utils.toWei(e)),l=new dt(this.web3.utils.toWei(o)).minus(this.web3.utils.toWei(h));return await this.computeSlippage(t,s,r,o,n,this.web3.utils.fromWei(u.toString()),this.web3.utils.fromWei(l.toString()),a)}}!function(t){t[t.CreatingExchange=0]="CreatingExchange",t[t.ApprovingDatatoken=1]="ApprovingDatatoken"}(Qe||(Qe={}));class ii{constructor(t,e,i=null,r=null,n=null,s,o){this.GASLIMIT_DEFAULT=1e6,this.oceanAddress=null,this.fixedRateExchangeAddress=void 0,this.fixedRateExchangeABI=void 0,this.web3=void 0,this.contract=null,this.logger=void 0,this.datatokens=void 0,this.startBlock=void 0,this.web3=t,this.fixedRateExchangeAddress=i,this.startBlock=o||0,this.fixedRateExchangeABI=r||D.default.abi,this.oceanAddress=n,this.datatokens=s,t&&(this.contract=new this.web3.eth.Contract(this.fixedRateExchangeABI,this.fixedRateExchangeAddress)),this.logger=e}create(t,e,i,r){return this.createExchange(this.oceanAddress,t,e,i,r)}createExchange(t,e,i,r,n){return new K(async s=>{let o;s.next(Qe.CreatingExchange);const a=this.GASLIMIT_DEFAULT;try{o=await this.contract.methods.create(t,e,this.web3.utils.toWei(i)).estimateGas({from:r},(t,e)=>t?a:e)}catch(t){o=a}let h=null,u=null;try{u=await this.contract.methods.create(t,e,this.web3.utils.toWei(i)).send({from:r,gas:o+1,gasPrice:await ft(this.web3)}),h=u.events.ExchangeCreated.returnValues[0]}catch(t){this.logger.error(`ERROR: Failed to create new exchange: ${t.message}`)}return n&&h&&(s.next(Qe.ApprovingDatatoken),this.datatokens.approve(e,this.fixedRateExchangeAddress,n,r)),u})}async generateExchangeId(t,e){return await this.contract.methods.generateExchangeId(this.oceanAddress,t,e).call()}async buyDT(t,e,i){const r=this.GASLIMIT_DEFAULT;let n;try{n=await this.contract.methods.swap(t,this.web3.utils.toWei(String(e))).estimateGas({from:i},(t,e)=>t?r:e)}catch(t){n=r}try{return await this.contract.methods.swap(t,this.web3.utils.toWei(String(e))).send({from:i,gas:n+1,gasPrice:await ft(this.web3)})}catch(t){return this.logger.error(`ERROR: Failed to buy datatokens: ${t.message}`),null}}async getNumberOfExchanges(){return await this.contract.methods.getNumberOfExchanges().call()}async setRate(t,e,i){const r=this.GASLIMIT_DEFAULT;let n;try{n=await this.contract.methods.setRate(t,this.web3.utils.toWei(String(e))).estimateGas({from:i},(t,e)=>t?r:e)}catch(t){n=r}return await this.contract.methods.setRate(t,this.web3.utils.toWei(String(e))).send({from:i,gas:n+1,gasPrice:await ft(this.web3)})}async activate(t,e){const i=await this.getExchange(t);if(!i)return null;if(!0===i.active)return null;const r=this.GASLIMIT_DEFAULT;let n;try{n=await this.contract.methods.toggleExchangeState(t).estimateGas({from:e},(t,e)=>t?r:e)}catch(t){n=r}return await this.contract.methods.toggleExchangeState(t).send({from:e,gas:n+1,gasPrice:await ft(this.web3)})}async deactivate(t,e){const i=await this.getExchange(t);if(!i)return null;if(!1===i.active)return null;const r=this.GASLIMIT_DEFAULT;let n;try{n=await this.contract.methods.toggleExchangeState(t).estimateGas({from:e},(t,e)=>t?r:e)}catch(t){n=r}return await this.contract.methods.toggleExchangeState(t).send({from:e,gas:n+1,gasPrice:await ft(this.web3)})}async getRate(t){const e=await this.contract.methods.getRate(t).call();return this.web3.utils.fromWei(e)}async getSupply(t){const e=await this.contract.methods.getSupply(t).call();return this.web3.utils.fromWei(e)}async getOceanNeeded(t,e){const i=await this.contract.methods.CalcInGivenOut(t,this.web3.utils.toWei(e)).call();return this.web3.utils.fromWei(i)}async getExchange(t){const e=await this.contract.methods.getExchange(t).call();return e.fixedRate=this.web3.utils.fromWei(e.fixedRate),e.supply=this.web3.utils.fromWei(e.supply),e.exchangeID=t,e}async getExchanges(){return await this.contract.methods.getExchanges().call()}async isActive(t){return await this.contract.methods.isActive(t).call()}async CalcInGivenOut(t,e){const i=await this.contract.methods.CalcInGivenOut(t,this.web3.utils.toWei(e)).call();return this.web3.utils.fromWei(i)}async searchforDT(t,e){const i=[],r=await this.contract.getPastEvents("ExchangeCreated",{filter:{datatoken:t.toLowerCase()},fromBlock:this.startBlock,toBlock:"latest"});let n=[];for(let s=0;s<r.length;s++)if(n.push(this.getExchange(r[s].returnValues[0])),n.length>10||s===r.length-1){const r=await Promise.all(n);for(let n=0;n<r.length;n++){const s=r[n];if(!0===s.active&&s.dataToken.toLowerCase()===t.toLowerCase()){const t=new dt(s.supply),r=new dt(e);t.gte(r)&&i.push(s)}}n=[]}return i}async getExchangesbyCreator(t){const e=[],i=await this.contract.getPastEvents("ExchangeCreated",{filter:{},fromBlock:this.startBlock,toBlock:"latest"});for(let r=0;r<i.length;r++)t&&i[r].returnValues[3].toLowerCase()!==t.toLowerCase()||e.push(await this.getExchange(i[r].returnValues[0]));return e}async getExchangeSwaps(t,e){const i=[],r=await this.contract.getPastEvents("Swapped",{filter:{exchangeId:t},fromBlock:this.startBlock,toBlock:"latest"});for(let t=0;t<r.length;t++)e&&r[t].returnValues[1].toLowerCase()!==e.toLowerCase()||i.push(this.getEventData(r[t]));return i}async getAllExchangesSwaps(t){const e=[],i=await this.contract.getPastEvents("ExchangeCreated",{filter:{},fromBlock:this.startBlock,toBlock:"latest"});for(let r=0;r<i.length;r++)(await this.getExchangeSwaps(i[r].returnValues[0],t)).forEach(t=>{e.push(t)});return e}getEventData(t){return{exchangeID:t.returnValues[0],caller:t.returnValues[1],baseTokenAmount:this.web3.utils.fromWei(t.returnValues[2]),dataTokenAmount:this.web3.utils.fromWei(t.returnValues[3])}}}!function(t){t[t.MakeDispenserMinter=0]="MakeDispenserMinter",t[t.AcceptingNewMinter=1]="AcceptingNewMinter"}(Ye||(Ye={})),function(t){t[t.MakeOwnerMinter=0]="MakeOwnerMinter",t[t.AcceptingNewMinter=1]="AcceptingNewMinter"}(ti||(ti={}));class ri{constructor(t,e,i=null,r=null,n,s){this.GASLIMIT_DEFAULT=1e6,this.dispenserAddress=void 0,this.dispenserABI=void 0,this.web3=void 0,this.contract=null,this.logger=void 0,this.datatokens=void 0,this.startBlock=void 0,this.web3=t,this.dispenserAddress=i,this.startBlock=s||0,this.dispenserABI=r||L.default.abi,this.datatokens=n,t&&(this.contract=new this.web3.eth.Contract(this.dispenserABI,this.dispenserAddress)),this.logger=e}async status(t){try{const e=await this.contract.methods.status(t).call();return e.maxTokens=this.web3.utils.fromWei(e.maxTokens),e.maxBalance=this.web3.utils.fromWei(e.maxBalance),e.balance=this.web3.utils.fromWei(e.balance),e}catch(e){this.logger.warn(`No dispenser available for data token: ${t}`)}return null}async activate(t,e,i,r){let n;const s=this.GASLIMIT_DEFAULT;try{n=await this.contract.methods.activate(t,this.web3.utils.toWei(e),this.web3.utils.toWei(i)).estimateGas({from:r},(t,e)=>t?s:e)}catch(t){n=s}let o=null;try{o=await this.contract.methods.activate(t,this.web3.utils.toWei(e),this.web3.utils.toWei(i)).send({from:r,gas:n+1,gasPrice:await ft(this.web3)})}catch(t){this.logger.error(`ERROR: Failed to activate dispenser: ${t.message}`)}return o}async deactivate(t,e){let i;const r=this.GASLIMIT_DEFAULT;try{i=await this.contract.methods.deactivate(t).estimateGas({from:e},(t,e)=>t?r:e)}catch(t){i=r}let n=null;try{n=await this.contract.methods.deactivate(t).send({from:e,gas:i+1,gasPrice:await ft(this.web3)})}catch(t){this.logger.error(`ERROR: Failed to deactivate dispenser: ${t.message}`)}return n}makeMinter(t,e){return new K(async i=>{let r;i.next(Ye.MakeDispenserMinter);const n=this.GASLIMIT_DEFAULT;if(!await this.datatokens.proposeMinter(t,this.dispenserAddress,e))return null;i.next(Ye.AcceptingNewMinter);try{r=await this.contract.methods.acceptMinter(t).estimateGas({from:e},(t,e)=>t?n:e)}catch(t){r=n}let s=null;try{s=await this.contract.methods.acceptMinter(t).send({from:e,gas:r+1,gasPrice:await ft(this.web3)})}catch(t){this.logger.error(`ERROR: Failed to accept minter role: ${t.message}`)}return s})}cancelMinter(t,e){return new K(async i=>{let r;i.next(ti.MakeOwnerMinter);const n=this.GASLIMIT_DEFAULT;try{r=await this.contract.methods.removeMinter(t).estimateGas({from:e},(t,e)=>t?n:e)}catch(t){r=n}let s=null;try{s=await this.contract.methods.removeMinter(t).send({from:e,gas:r+1,gasPrice:await ft(this.web3)})}catch(t){this.logger.error(`ERROR: Failed to remove minter role: ${t.message}`)}return s?(i.next(ti.AcceptingNewMinter),await this.datatokens.approveMinter(t,e)):null})}async dispense(t,e,i="1"){let r;const n=this.GASLIMIT_DEFAULT;try{r=await this.contract.methods.dispense(t,this.web3.utils.toWei(i)).estimateGas({from:e},(t,e)=>t?n:e)}catch(t){r=n}let s=null;try{s=await this.contract.methods.dispense(t,this.web3.utils.toWei(i)).send({from:e,gas:r+1,gasPrice:await ft(this.web3)})}catch(t){this.logger.error(`ERROR: Failed to dispense tokens: ${t.message}`)}return s}async ownerWithdraw(t,e){let i;const r=this.GASLIMIT_DEFAULT;try{i=await this.contract.methods.ownerWithdraw(t).estimateGas({from:e},(t,e)=>t?r:e)}catch(t){i=r}let n=null;try{n=await this.contract.methods.ownerWithdraw(t).send({from:e,gas:i+1,gasPrice:await ft(this.web3)})}catch(t){this.logger.error(`ERROR: Failed to withdraw tokens: ${t.message}`)}return n}async isDispensable(t,e,i="1"){const r=await this.status(t);return!(!r||!1===r.active||new x.default(await this.datatokens.balance(t,e)).greaterThanOrEqualTo(r.maxBalance)||new x.default(String(i)).greaterThan(r.maxTokens)||!new x.default(r.balance).greaterThanOrEqualTo(i)&&!0!==r.isTrueMinter)}}class ni extends yt{constructor(...t){super(...t),this.network=void 0,this.provider=void 0,this.eventAccessControl=void 0,this.web3Provider=void 0,this.metadataCache=void 0,this.onChainMetadata=void 0,this.accounts=void 0,this.assets=void 0,this.compute=void 0,this.datatokens=void 0,this.pool=void 0,this.fixedRateExchange=void 0,this.OceanDispenser=void 0,this.versions=void 0,this.utils=void 0}static async getInstance(t){const e=new ni,i=W({},function(t){return{config:t,web3:t.web3Provider,logger:U}}(t),{ocean:e});return e.setInstanceConfig(i),e.utils=await $e.getInstance(i),e.provider=await It.getInstance(i),e.eventAccessControl=await We.getInstance(i),e.metadataCache=new Ge(i.config.metadataCacheUri,i.logger),e.accounts=await At.getInstance(i),e.assets=await Fe.getInstance(i),e.compute=await Je.getInstance(i),e.datatokens=new He(i.config.factoryAddress,i.config.factoryABI,i.config.datatokensABI,i.config.web3Provider,i.logger,i.config.startBlock),e.pool=new ei(i.config.web3Provider,i.logger,i.config.poolFactoryABI,i.config.poolABI,i.config.poolFactoryAddress,i.config.oceanTokenAddress,i.config.startBlock),e.fixedRateExchange=new ii(i.config.web3Provider,i.logger,i.config.fixedRateExchangeAddress,i.config.fixedRateExchangeAddressABI,i.config.oceanTokenAddress,e.datatokens,i.config.startBlock),e.OceanDispenser=new ri(i.config.web3Provider,i.logger,i.config.dispenserAddress,i.config.dispenserABI,e.datatokens,i.config.startBlock),e.onChainMetadata=new ze(i.config.web3Provider,i.logger,i.config.metadataContractAddress,i.config.metadataContractABI,e.metadataCache),e.versions=await Ue.getInstance(i),e.network=new Ze,e}}const si={networkId:null,network:"unknown",metadataCacheUri:"https://aquarius.oceanprotocol.com",nodeUri:"http://localhost:8545",providerUri:"http://127.0.0.1:8030",subgraphUri:null,explorerUri:null,oceanTokenAddress:null,oceanTokenSymbol:"OCEAN",factoryAddress:"0x1234",poolFactoryAddress:null,fixedRateExchangeAddress:null,dispenserAddress:null,metadataContractAddress:null,startBlock:0},oi=[W({},si),W({},si,{networkId:8996,network:"development",metadataCacheUri:"http://127.0.0.1:5000",rbacUri:"http://127.0.0.1:3000"}),W({},si,{networkId:3,network:"ropsten",nodeUri:"https://ropsten.infura.io/v3",providerUri:"https://provider.ropsten.oceanprotocol.com",subgraphUri:"https://subgraph.ropsten.oceanprotocol.com",explorerUri:"https://ropsten.etherscan.io",startBlock:9227563}),W({},si,{networkId:4,network:"rinkeby",nodeUri:"https://rinkeby.infura.io/v3",providerUri:"https://provider.rinkeby.oceanprotocol.com",subgraphUri:"https://subgraph.rinkeby.oceanprotocol.com",explorerUri:"https://rinkeby.etherscan.io",startBlock:7294090}),W({},si,{networkId:1,network:"mainnet",nodeUri:"https://mainnet.infura.io/v3",providerUri:"https://provider.mainnet.oceanprotocol.com",subgraphUri:"https://subgraph.mainnet.oceanprotocol.com",explorerUri:"https://etherscan.io",startBlock:11105459}),W({},si,{networkId:137,network:"polygon",nodeUri:"https://polygon-mainnet.infura.io/v3",providerUri:"https://provider.polygon.oceanprotocol.com",subgraphUri:"https://subgraph.polygon.oceanprotocol.com",explorerUri:"https://polygonscan.com",oceanTokenSymbol:"mOCEAN",startBlock:11005222}),W({},si,{networkId:1287,network:"moonbeamalpha",nodeUri:"https://rpc.testnet.moonbeam.network",providerUri:"https://provider.moonbeamalpha.oceanprotocol.com",subgraphUri:"https://subgraph.moonbeamalpha.oceanprotocol.com",explorerUri:"https://moonbase-blockscout.testnet.moonbeam.network/",startBlock:90707}),W({},si,{networkId:2021e3,network:"gaiaxtestnet",nodeUri:"https://rpc.gaiaxtestnet.oceanprotocol.com",providerUri:"https://provider.gaiaxtestnet.oceanprotocol.com",subgraphUri:"https://subgraph.gaiaxtestnet.oceanprotocol.com",explorerUri:"https://blockscout.gaiaxtestnet.oceanprotocol.com"}),W({},si,{networkId:2021001,network:"catenaxtestnet",nodeUri:"https://rpc.catenaxtestnet.oceanprotocol.com",providerUri:"https://provider.catenaxtestnet.oceanprotocol.com",subgraphUri:"https://subgraph.catenaxtestnet.oceanprotocol.com",explorerUri:"https://blockscout.catenaxtestnet.oceanprotocol.com",metadataCacheUri:"https://aquarius.catenaxtestnet.oceanprotocol.com"}),W({},si,{networkId:80001,network:"mumbai",nodeUri:"https://polygon-mumbai.infura.io/v3",providerUri:"https://provider.mumbai.oceanprotocol.com",subgraphUri:"https://subgraph.mumbai.oceanprotocol.com",explorerUri:"https://mumbai.polygonscan.com"}),W({},si,{networkId:56,network:"bsc",nodeUri:"https://bsc-dataseed.binance.org",providerUri:"https://provider.bsc.oceanprotocol.com",subgraphUri:"https://subgraph.bsc.oceanprotocol.com",explorerUri:"https://bscscan.com/"}),W({},si,{networkId:44787,network:"celoalfajores",nodeUri:"https://alfajores-forno.celo-testnet.org",providerUri:"https://provider.celoalfajores.oceanprotocol.com",subgraphUri:"https://subgraph.celoalfajores.oceanprotocol.com",explorerUri:"https://alfajores-blockscout.celo-testnet.org"}),W({},si,{networkId:246,network:"energyweb",nodeUri:"https://rpc.energyweb.org",providerUri:"https://provider.energyweb.oceanprotocol.com",subgraphUri:"https://subgraph.energyweb.oceanprotocol.com",explorerUri:"https://explorer.energyweb.org"}),W({},si,{networkId:1285,network:"moonriver",nodeUri:"https://moonriver.api.onfinality.io/public",providerUri:"https://provider.moonriver.oceanprotocol.com",subgraphUri:"https://subgraph.moonriver.oceanprotocol.com",explorerUri:"https://blockscout.moonriver.moonbeam.network"})];exports.Account=Mt,exports.Config=class{constructor(){this.nodeUri=void 0,this.providerAddress=void 0,this.metadataCacheUri=void 0,this.providerUri=void 0,this.rbacUri=void 0,this.web3Provider=void 0,this.oceanTokenAddress=void 0,this.factoryAddress=void 0,this.factoryABI=void 0,this.datatokensABI=void 0,this.poolFactoryAddress=void 0,this.poolFactoryABI=void 0,this.poolABI=void 0,this.fixedRateExchangeAddress=void 0,this.fixedRateExchangeAddressABI=void 0,this.dispenserAddress=void 0,this.dispenserABI=void 0,this.metadataContractAddress=void 0,this.metadataContractABI=void 0,this.startBlock=void 0,this.verbose=void 0,this.authMessage=void 0,this.authTokenExpiration=void 0,this.parityUri=void 0,this.threshold=void 0}},exports.ConfigHelper=class{getAddressesFromEnv(t){let e;if(N.default[t]){const{DTFactory:i,BFactory:r,FixedRateExchange:n,Dispenser:s,Metadata:o,Ocean:a,chainId:h,startBlock:u}=N.default[t];e=W({factoryAddress:i,poolFactoryAddress:r,fixedRateExchangeAddress:n,dispenserAddress:s,metadataContractAddress:o,oceanTokenAddress:a,networkId:h,startBlock:u},process.env.AQUARIUS_URI&&{metadataCacheUri:process.env.AQUARIUS_URI})}if(R.default&&process.env.ADDRESS_FILE)try{const i=JSON.parse(R.default.readFileSync(process.env.ADDRESS_FILE||`${y.homedir}/.ocean/ocean-contracts/artifacts/address.json`,"utf8")),{DTFactory:r,BFactory:n,FixedRateExchange:s,Dispenser:o,Metadata:a,Ocean:h,chainId:u,startBlock:l}=i[t];e=W({factoryAddress:r,poolFactoryAddress:n,fixedRateExchangeAddress:s,dispenserAddress:o,metadataContractAddress:a,oceanTokenAddress:h,networkId:u,startBlock:l},process.env.AQUARIUS_URI&&{metadataCacheUri:process.env.AQUARIUS_URI})}catch(t){}return e}getConfig(t,e){const i="string"==typeof t?"network":"networkId";let r=oi.find(e=>e[i]===t);return r?(r=W({},r,this.getAddressesFromEnv(r.network)),W({},r,{nodeUri:e?`${r.nodeUri}/${e}`:r.nodeUri})):(U.error(`No config found for given network '${t}'`),null)}},exports.DDO=Et,exports.DID=bt,exports.DataTokens=He,exports.Logger=U,exports.MetadataCache=Ge,exports.Ocean=ni,exports.Provider=It,exports.utils=vt;
|
|
1
|
+
var e=require("bignumber.js"),a=require("web3"),t=require("cross-fetch"),b=require("fs"),n=require("save-file"),d=require("os"),f=require("crypto-js/sha256"),s=require("decimal.js");function i(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var c,r=/*#__PURE__*/i(e),o=/*#__PURE__*/i(a),p=/*#__PURE__*/i(t),y=/*#__PURE__*/i(b),u=/*#__PURE__*/i(n),l=/*#__PURE__*/i(f),m=/*#__PURE__*/i(s);exports.LogLevel=void 0,(c=exports.LogLevel||(exports.LogLevel={}))[c.None=-1]="None",c[c.Error=0]="Error",c[c.Warn=1]="Warn",c[c.Log=2]="Log",c[c.Verbose=3]="Verbose";class h{constructor(e=exports.LogLevel.Error){this.logLevel=void 0,this.logLevel=e}setLevel(e){this.logLevel=e}bypass(...e){this.dispatch("log",-Infinity,...e)}debug(...e){this.dispatch("debug",exports.LogLevel.Verbose,...e)}log(...e){this.dispatch("log",exports.LogLevel.Log,...e)}warn(...e){this.dispatch("warn",exports.LogLevel.Warn,...e)}error(...e){this.dispatch("error",exports.LogLevel.Error,...e)}dispatch(e,a,...t){this.logLevel>=a&&console[e](...t)}}const T=new h;async function w(e){return new r.default(await e.eth.getGasPrice()).multipliedBy(1.05).integerValue(r.default.ROUND_DOWN).toString(10)}var g={nouns:["Crab","Fish","Seal","Octopus","Shark","Seahorse","Walrus","Starfish","Whale","Orca","Penguin","Jellyfish","Squid","Lobster","Pelican","Shrimp","Oyster","Clam","Seagull","Dolphin","Shell","Cormorant","Otter","Anemone","Turtle","Coral","Ray","Barracuda","Krill","Anchovy","Angelfish","Barnacle","Clownfish","Cod","Cuttlefish","Eel","Fugu","Herring","Haddock","Ling","Mackerel","Manatee","Narwhal","Nautilus","Plankton","Porpoise","Prawn","Pufferfish","Swordfish","Tuna"],adjectives:["adamant","adroit","amatory","ambitious","amused","animistic","antic","arcadian","artistic","astonishing","astounding","baleful","bellicose","bilious","blissful","boorish","brave","breathtaking","brilliant","calamitous","caustic","cerulean","clever","charming","comely","competent","concomitant","confident","contumacious","corpulent","crapulous","creative","dazzling","dedicated","defamatory","delighted","delightful","determined","didactic","dilatory","dowdy","efficacious","effulgent","egregious","empowered","endemic","enthusiastic","equanimous","exceptional","execrable","fabulous","fantastic","fastidious","feckless","fecund","friable","fulsome","garrulous","generous","gentle","guileless","gustatory","heuristic","histrionic","hubristic","incendiary","incredible","insidious","insolent","inspired","intransigent","inveterate","invidious","invigorated","irksome","jejune","juicy","jocular","joyful","judicious","kind","lachrymose","limpid","loquacious","lovely","luminous","mannered","marvelous","mendacious","meretricious","minatory","mordant","motivated","munificent","nefarious","noxious","obtuse","optimistic","parsimonious","pendulous","pernicious","pervasive","petulant","passionate","phenomenal","platitudinous","pleasant","powerful","precipitate","propitious","puckish","querulous","quiescent","rebarbative","recalcitant","redolent","rhadamanthine","risible","ruminative","sagacious","salubrious","sartorial","sclerotic","serpentine","smart","spasmodic","strident","stunning","stupendous","taciturn","tactful","tasty","tenacious","tremendous","tremulous","trenchant","turbulent","turgid","ubiquitous","uxorious","verdant","vibrant","voluble","voracious","wheedling","withering","wonderful","zealous"]};function A(e){const a=e||g,t=Math.floor(Math.random()*a.adjectives.length),b=Math.floor(Math.random()*a.nouns.length),n=Math.floor(100*Math.random()),d=a.adjectives[t].replace(/^\w/,e=>e.toUpperCase()),f=a.nouns[b].replace(/^\w/,e=>e.toUpperCase());return{name:`${d} ${f} Token`,symbol:`${(d.substring(0,3)+f.substring(0,3)).toUpperCase()}-${n}`}}function x(e){let a,t;return e.name&&e.symbol||({name:a,symbol:t}=A()),{templateIndex:e.templateIndex,strings:[e.name||a,e.symbol||t],addresses:[e.minter,e.feeManager,e.mpFeeAddress,e.feeToken],uints:[o.default.utils.toWei(e.cap),o.default.utils.toWei(e.feeAmount)],bytess:[]}}function v(e){return e.allowedConsumer||(e.allowedConsumer="0x0000000000000000000000000000000000000000"),{fixedPriceAddress:e.fixedRateAddress,addresses:[e.baseTokenAddress,e.owner,e.marketFeeCollector,e.allowedConsumer],uints:[e.baseTokenDecimals,e.dataTokenDecimals,e.fixedRate,e.marketFee,e.withMint?1:0]}}function M(e){return{addresses:[e.ssContract,e.basetokenAddress,e.basetokenSender,e.publisherAddress,e.marketFeeCollector,e.poolTemplateAddress],ssParams:[o.default.utils.toWei(e.rate),e.basetokenDecimals,o.default.utils.toWei(e.vestingAmount),e.vestedBlocks,o.default.utils.toWei(e.initialBasetokenLiquidity)],swapFees:[e.swapFeeLiquidityProvider,e.swapFeeMarketRunner]}}async function k(e){return p.default(e,{method:"GET",headers:{"Content-type":"application/json"}})}function E(){return E=Object.assign||function(e){for(var a=1;a<arguments.length;a++){var t=arguments[a];for(var b in t)Object.prototype.hasOwnProperty.call(t,b)&&(e[b]=t[b])}return e},E.apply(this,arguments)}var C={rinkeby:{chainId:4,Ocean:"0x8967bcf84170c91b0d24d4302c2376283b0b3a07",OPFCommunityFeeCollector:"0x600ED0935FDA70F2d0b7Cf740723a8b89FCD68A1",startBlock:9928186,poolTemplate:"0xdF0a5F729ad9aa090B1Bcf5F9188639DB0237101",Router:"0xBfe244735B6f578e471a0A70E86ffFE6c2E6f7a3",FixedPrice:"0xd7C8B30cd1d7e8364Cc4B4c2C58D1712551c1C79",Staking:"0x1EFd65ee89ab925b8189d728E56C44732b304E9B",ERC20Template:{1:"0x4b4771b7f4F274D58a5E1afe637bB0333129040A",2:"0x88E3285C839C3E84Ed94efd5CBB83428126ceb72"},ERC721Template:{1:"0xb853d0a5e34c6780349cDd66b1768Dd5772570A7"},Dispenser:"0x0867d17a99459291D399aD58bD4d436dD3F8B387",ERC721Factory:"0xeF6A78E22170817EB97E67e176d41358761F7dEd"}};const F={chainId:null,network:"unknown",metadataCacheUri:"https://aquarius.oceanprotocol.com",nodeUri:"http://localhost:8545",providerUri:"http://127.0.0.1:8030",subgraphUri:null,explorerUri:null,oceanTokenAddress:null,oceanTokenSymbol:"OCEAN",poolTemplateAddress:null,fixedRateExchangeAddress:null,dispenserAddress:null,startBlock:0},I=[E({},F),E({},F,{chainId:8996,network:"development",metadataCacheUri:"http://127.0.0.1:5000"}),E({},F,{chainId:3,network:"ropsten",nodeUri:"https://ropsten.infura.io/v3",providerUri:"https://provider.ropsten.oceanprotocol.com",subgraphUri:"https://subgraph.ropsten.oceanprotocol.com",explorerUri:"https://ropsten.etherscan.io",startBlock:9227563}),E({},F,{chainId:4,network:"rinkeby",nodeUri:"https://rinkeby.infura.io/v3",providerUri:"https://providerv4.rinkeby.oceanprotocol.com",subgraphUri:"https://subgraphv4.rinkeby.oceanprotocol.com",explorerUri:"https://rinkeby.etherscan.io",startBlock:7294090}),E({},F,{chainId:1,network:"mainnet",nodeUri:"https://mainnet.infura.io/v3",providerUri:"https://provider.mainnet.oceanprotocol.com",subgraphUri:"https://subgraph.mainnet.oceanprotocol.com",explorerUri:"https://etherscan.io",startBlock:11105459}),E({},F,{chainId:137,network:"polygon",nodeUri:"https://polygon-mainnet.infura.io/v3",providerUri:"https://provider.polygon.oceanprotocol.com",subgraphUri:"https://subgraph.polygon.oceanprotocol.com",explorerUri:"https://polygonscan.com",oceanTokenSymbol:"mOCEAN",startBlock:11005222}),E({},F,{chainId:1287,network:"moonbeamalpha",nodeUri:"https://rpc.testnet.moonbeam.network",providerUri:"https://provider.moonbeamalpha.oceanprotocol.com",subgraphUri:"https://subgraph.moonbeamalpha.oceanprotocol.com",explorerUri:"https://moonbase-blockscout.testnet.moonbeam.network/",startBlock:90707}),E({},F,{chainId:2021e3,network:"gaiaxtestnet",nodeUri:"https://rpc.gaiaxtestnet.oceanprotocol.com",providerUri:"https://provider.gaiaxtestnet.oceanprotocol.com",subgraphUri:"https://subgraph.gaiaxtestnet.oceanprotocol.com",explorerUri:"https://blockscout.gaiaxtestnet.oceanprotocol.com"}),E({},F,{chainId:2021001,network:"catenaxtestnet",nodeUri:"https://rpc.catenaxtestnet.oceanprotocol.com",providerUri:"https://provider.catenaxtestnet.oceanprotocol.com",subgraphUri:"https://subgraph.catenaxtestnet.oceanprotocol.com",explorerUri:"https://blockscout.catenaxtestnet.oceanprotocol.com",metadataCacheUri:"https://aquarius.catenaxtestnet.oceanprotocol.com"}),E({},F,{chainId:80001,network:"mumbai",nodeUri:"https://polygon-mumbai.infura.io/v3",providerUri:"https://provider.mumbai.oceanprotocol.com",subgraphUri:"https://subgraph.mumbai.oceanprotocol.com",explorerUri:"https://mumbai.polygonscan.com"}),E({},F,{chainId:56,network:"bsc",nodeUri:"https://bsc-dataseed.binance.org",providerUri:"https://provider.bsc.oceanprotocol.com",subgraphUri:"https://subgraph.bsc.oceanprotocol.com",explorerUri:"https://bscscan.com/"}),E({},F,{chainId:44787,network:"celoalfajores",nodeUri:"https://alfajores-forno.celo-testnet.org",providerUri:"https://provider.celoalfajores.oceanprotocol.com",subgraphUri:"https://subgraph.celoalfajores.oceanprotocol.com",explorerUri:"https://alfajores-blockscout.celo-testnet.org"}),E({},F,{chainId:246,network:"energyweb",nodeUri:"https://rpc.energyweb.org",providerUri:"https://provider.energyweb.oceanprotocol.com",subgraphUri:"https://subgraph.energyweb.oceanprotocol.com",explorerUri:"https://explorer.energyweb.org"}),E({},F,{chainId:1285,network:"moonriver",nodeUri:"https://moonriver.api.onfinality.io/public",providerUri:"https://provider.moonriver.oceanprotocol.com",subgraphUri:"https://subgraph.moonriver.oceanprotocol.com",explorerUri:"https://blockscout.moonriver.moonbeam.network"})];async function R(e,a,t,b){const n=e&&e.currentProvider&&e.currentProvider.isMetaMask;try{return await e.eth.personal.sign(a,t,b)}catch(b){if(n)throw b;T.warn("Error on personal sign."),T.warn(b);try{return await e.eth.sign(a,t)}catch(e){throw T.error("Error on sign."),T.error(e),new Error("Error executing personal sign")}}}async function S(e,a,t,b){const n=e.utils.utf8ToHex(a),d=e&&e.currentProvider&&e.currentProvider.isMetaMask;try{return await e.eth.personal.sign(n,t,b)}catch(a){if(d)throw a;T.warn("Error on personal sign."),T.warn(a);try{return await e.eth.sign(n,t)}catch(e){throw T.error("Error on sign."),T.error(e),new Error("Error executing personal sign")}}}var O=[{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"src",type:"address"},{indexed:!0,internalType:"address",name:"dst",type:"address"},{indexed:!1,internalType:"uint256",name:"amt",type:"uint256"}],name:"Approval",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"uint256",name:"bptAmount",type:"uint256"}],name:"LOG_BPT",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"uint256",name:"bptAmount",type:"uint256"}],name:"LOG_BPT_SS",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"bytes4",name:"sig",type:"bytes4"},{indexed:!0,internalType:"address",name:"caller",type:"address"},{indexed:!1,internalType:"uint256",name:"timestamp",type:"uint256"},{indexed:!1,internalType:"bytes",name:"data",type:"bytes"}],name:"LOG_CALL",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"caller",type:"address"},{indexed:!0,internalType:"address",name:"tokenOut",type:"address"},{indexed:!1,internalType:"uint256",name:"tokenAmountOut",type:"uint256"},{indexed:!1,internalType:"uint256",name:"timestamp",type:"uint256"}],name:"LOG_EXIT",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"caller",type:"address"},{indexed:!0,internalType:"address",name:"tokenIn",type:"address"},{indexed:!1,internalType:"uint256",name:"tokenAmountIn",type:"uint256"},{indexed:!1,internalType:"uint256",name:"timestamp",type:"uint256"}],name:"LOG_JOIN",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"caller",type:"address"},{indexed:!0,internalType:"address",name:"baseToken",type:"address"},{indexed:!1,internalType:"uint256",name:"baseTokenAmountIn",type:"uint256"},{indexed:!1,internalType:"uint256",name:"baseTokenWeight",type:"uint256"},{indexed:!0,internalType:"address",name:"dataToken",type:"address"},{indexed:!1,internalType:"uint256",name:"dataTokenAmountIn",type:"uint256"},{indexed:!1,internalType:"uint256",name:"dataTokenWeight",type:"uint256"}],name:"LOG_SETUP",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"caller",type:"address"},{indexed:!0,internalType:"address",name:"tokenIn",type:"address"},{indexed:!0,internalType:"address",name:"tokenOut",type:"address"},{indexed:!1,internalType:"uint256",name:"tokenAmountIn",type:"uint256"},{indexed:!1,internalType:"uint256",name:"tokenAmountOut",type:"uint256"},{indexed:!1,internalType:"uint256",name:"timestamp",type:"uint256"}],name:"LOG_SWAP",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"caller",type:"address"},{indexed:!1,internalType:"address",name:"newMarketCollector",type:"address"}],name:"MarketCollectorChanged",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"address",name:"token",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"MarketFees",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"caller",type:"address"},{indexed:!1,internalType:"address",name:"OPFWallet",type:"address"},{indexed:!1,internalType:"address",name:"token",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"OPFFee",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"caller",type:"address"},{indexed:!1,internalType:"address",name:"marketAddress",type:"address"},{indexed:!1,internalType:"address",name:"token",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"PublishMarketFee",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"uint256",name:"swapFeeAmount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"oceanFeeAmount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"marketFeeAmount",type:"uint256"},{indexed:!1,internalType:"address",name:"tokenFees",type:"address"}],name:"SWAP_FEES",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"caller",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"SwapFeeChanged",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"src",type:"address"},{indexed:!0,internalType:"address",name:"dst",type:"address"},{indexed:!1,internalType:"uint256",name:"amt",type:"uint256"}],name:"Transfer",type:"event"},{inputs:[],name:"BONE",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"BPOW_PRECISION",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"EXIT_FEE",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"INIT_POOL_SUPPLY",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"MAX_BOUND_TOKENS",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"MAX_BPOW_BASE",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"MAX_FEE",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"MAX_IN_RATIO",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"MAX_OUT_RATIO",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"MAX_TOTAL_WEIGHT",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"MAX_WEIGHT",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"MIN_BALANCE",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"MIN_BOUND_TOKENS",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"MIN_BPOW_BASE",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"MIN_FEE",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"MIN_WEIGHT",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"_opfCollector",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"_publishMarketCollector",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"_swapPublishMarketFee",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"src",type:"address"},{internalType:"address",name:"dst",type:"address"}],name:"allowance",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"dst",type:"address"},{internalType:"uint256",name:"amt",type:"uint256"}],name:"approve",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"whom",type:"address"}],name:"balanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"tokenOut",type:"address"},{internalType:"uint256",name:"tokenAmountOut",type:"uint256"}],name:"calcPoolInSingleOut",outputs:[{internalType:"uint256",name:"poolAmountIn",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"tokenIn",type:"address"},{internalType:"uint256",name:"tokenAmountIn",type:"uint256"}],name:"calcPoolOutSingleIn",outputs:[{internalType:"uint256",name:"poolAmountOut",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"tokenIn",type:"address"},{internalType:"uint256",name:"poolAmountOut",type:"uint256"}],name:"calcSingleInPoolOut",outputs:[{internalType:"uint256",name:"tokenAmountIn",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"tokenOut",type:"address"},{internalType:"uint256",name:"poolAmountIn",type:"uint256"}],name:"calcSingleOutPoolIn",outputs:[{internalType:"uint256",name:"tokenAmountOut",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"collectMarketFee",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"collectOPF",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"",type:"address"}],name:"communityFees",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"decimals",outputs:[{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"dst",type:"address"},{internalType:"uint256",name:"amt",type:"uint256"}],name:"decreaseApproval",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"poolAmountIn",type:"uint256"},{internalType:"uint256[]",name:"minAmountsOut",type:"uint256[]"}],name:"exitPool",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"tokenOut",type:"address"},{internalType:"uint256",name:"tokenAmountOut",type:"uint256"},{internalType:"uint256",name:"maxPoolAmountIn",type:"uint256"}],name:"exitswapExternAmountOut",outputs:[{internalType:"uint256",name:"poolAmountIn",type:"uint256"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"tokenOut",type:"address"},{internalType:"uint256",name:"poolAmountIn",type:"uint256"},{internalType:"uint256",name:"minAmountOut",type:"uint256"}],name:"exitswapPoolAmountIn",outputs:[{internalType:"uint256",name:"tokenAmountOut",type:"uint256"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"tokenIn",type:"address"},{internalType:"address",name:"tokenOut",type:"address"},{internalType:"uint256",name:"tokenAmountOut",type:"uint256"},{internalType:"uint256",name:"_swapMarketFee",type:"uint256"}],name:"getAmountInExactOut",outputs:[{internalType:"uint256",name:"tokenAmountIn",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"tokenIn",type:"address"},{internalType:"address",name:"tokenOut",type:"address"},{internalType:"uint256",name:"tokenAmountIn",type:"uint256"},{internalType:"uint256",name:"_swapMarketFee",type:"uint256"}],name:"getAmountOutExactIn",outputs:[{internalType:"uint256",name:"tokenAmountOut",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"token",type:"address"}],name:"getBalance",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"getBaseTokenAddress",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"getController",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"getCurrentMarketFees",outputs:[{internalType:"address[]",name:"",type:"address[]"},{internalType:"uint256[]",name:"",type:"uint256[]"}],stateMutability:"view",type:"function"},{inputs:[],name:"getCurrentOPFFees",outputs:[{internalType:"address[]",name:"",type:"address[]"},{internalType:"uint256[]",name:"",type:"uint256[]"}],stateMutability:"view",type:"function"},{inputs:[],name:"getCurrentTokens",outputs:[{internalType:"address[]",name:"tokens",type:"address[]"}],stateMutability:"view",type:"function"},{inputs:[],name:"getDataTokenAddress",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"token",type:"address"}],name:"getDenormalizedWeight",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"getFinalTokens",outputs:[{internalType:"address[]",name:"tokens",type:"address[]"}],stateMutability:"view",type:"function"},{inputs:[],name:"getMarketFee",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"token",type:"address"}],name:"getNormalizedWeight",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"getNumTokens",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"getOPFFee",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"tokenIn",type:"address"},{internalType:"address",name:"tokenOut",type:"address"},{internalType:"uint256",name:"_swapMarketFee",type:"uint256"}],name:"getSpotPrice",outputs:[{internalType:"uint256",name:"spotPrice",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"getSwapFee",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"getTotalDenormalizedWeight",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"dst",type:"address"},{internalType:"uint256",name:"amt",type:"uint256"}],name:"increaseApproval",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"controller",type:"address"},{internalType:"address",name:"factory",type:"address"},{internalType:"uint256[]",name:"swapFees",type:"uint256[]"},{internalType:"bool",name:"publicSwap",type:"bool"},{internalType:"bool",name:"finalized",type:"bool"},{internalType:"address[2]",name:"tokens",type:"address[2]"},{internalType:"address[2]",name:"feeCollectors",type:"address[2]"}],name:"initialize",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"t",type:"address"}],name:"isBound",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[],name:"isFinalized",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[],name:"isInitialized",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[],name:"isPublicSwap",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"poolAmountOut",type:"uint256"},{internalType:"uint256[]",name:"maxAmountsIn",type:"uint256[]"}],name:"joinPool",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"tokenIn",type:"address"},{internalType:"uint256",name:"tokenAmountIn",type:"uint256"},{internalType:"uint256",name:"minPoolAmountOut",type:"uint256"}],name:"joinswapExternAmountIn",outputs:[{internalType:"uint256",name:"poolAmountOut",type:"uint256"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"tokenIn",type:"address"},{internalType:"uint256",name:"poolAmountOut",type:"uint256"},{internalType:"uint256",name:"maxAmountIn",type:"uint256"}],name:"joinswapPoolAmountOut",outputs:[{internalType:"uint256",name:"tokenAmountIn",type:"uint256"}],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"name",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"",type:"address"}],name:"publishMarketFees",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"swapFee",type:"uint256"}],name:"setSwapFee",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"dataTokenAddress",type:"address"},{internalType:"uint256",name:"dataTokenAmount",type:"uint256"},{internalType:"uint256",name:"dataTokenWeight",type:"uint256"},{internalType:"address",name:"baseTokenAddress",type:"address"},{internalType:"uint256",name:"baseTokenAmount",type:"uint256"},{internalType:"uint256",name:"baseTokenWeight",type:"uint256"}],name:"setup",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address[3]",name:"tokenInOutMarket",type:"address[3]"},{internalType:"uint256[4]",name:"amountsInOutMaxFee",type:"uint256[4]"}],name:"swapExactAmountIn",outputs:[{internalType:"uint256",name:"tokenAmountOut",type:"uint256"},{internalType:"uint256",name:"spotPriceAfter",type:"uint256"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address[3]",name:"tokenInOutMarket",type:"address[3]"},{internalType:"uint256[4]",name:"amountsInOutMaxFee",type:"uint256[4]"}],name:"swapExactAmountOut",outputs:[{internalType:"uint256",name:"tokenAmountIn",type:"uint256"},{internalType:"uint256",name:"spotPriceAfter",type:"uint256"}],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"symbol",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[],name:"totalSupply",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"dst",type:"address"},{internalType:"uint256",name:"amt",type:"uint256"}],name:"transfer",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"src",type:"address"},{internalType:"address",name:"dst",type:"address"},{internalType:"uint256",name:"amt",type:"uint256"}],name:"transferFrom",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"_newCollector",type:"address"}],name:"updateMarketFeeCollector",outputs:[],stateMutability:"nonpayable",type:"function"}],P={_format:"hh-sol-artifact-1",contractName:"ERC20Template",sourceName:"contracts/templates/ERC20Template.sol",abi:[{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"signer",type:"address"},{indexed:!1,internalType:"uint256",name:"timestamp",type:"uint256"},{indexed:!1,internalType:"uint256",name:"blockNumber",type:"uint256"}],name:"AddedMinter",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"signer",type:"address"},{indexed:!1,internalType:"uint256",name:"timestamp",type:"uint256"},{indexed:!1,internalType:"uint256",name:"blockNumber",type:"uint256"}],name:"AddedPaymentManager",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"owner",type:"address"},{indexed:!0,internalType:"address",name:"spender",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Approval",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"signer",type:"address"},{indexed:!1,internalType:"uint256",name:"timestamp",type:"uint256"},{indexed:!1,internalType:"uint256",name:"blockNumber",type:"uint256"}],name:"CleanedPermissions",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"currentMinter",type:"address"},{indexed:!1,internalType:"address",name:"newMinter",type:"address"}],name:"MinterApproved",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"currentMinter",type:"address"},{indexed:!1,internalType:"address",name:"newMinter",type:"address"}],name:"MinterProposed",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"bytes32",name:"exchangeId",type:"bytes32"},{indexed:!1,internalType:"address",name:"owner",type:"address"}],name:"NewFixedRate",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"caller",type:"address"},{indexed:!0,internalType:"address",name:"_newPaymentCollector",type:"address"},{indexed:!1,internalType:"uint256",name:"timestamp",type:"uint256"},{indexed:!1,internalType:"uint256",name:"blockNumber",type:"uint256"}],name:"NewPaymentCollector",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"poolAddress",type:"address"},{indexed:!1,internalType:"address",name:"ssContract",type:"address"},{indexed:!1,internalType:"address",name:"basetokenAddress",type:"address"}],name:"NewPool",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"consumer",type:"address"},{indexed:!1,internalType:"address",name:"payer",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"serviceIndex",type:"uint256"},{indexed:!1,internalType:"uint256",name:"timestamp",type:"uint256"},{indexed:!0,internalType:"address",name:"publishMarketAddress",type:"address"},{indexed:!1,internalType:"uint256",name:"blockNumber",type:"uint256"}],name:"OrderStarted",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"providerFeeAddress",type:"address"},{indexed:!0,internalType:"address",name:"providerFeeToken",type:"address"},{indexed:!1,internalType:"uint256",name:"providerFeeAmount",type:"uint256"},{indexed:!1,internalType:"bytes",name:"providerData",type:"bytes"},{indexed:!1,internalType:"uint8",name:"v",type:"uint8"},{indexed:!1,internalType:"bytes32",name:"r",type:"bytes32"},{indexed:!1,internalType:"bytes32",name:"s",type:"bytes32"}],name:"ProviderFees",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"PublishMarketFeeAddress",type:"address"},{indexed:!0,internalType:"address",name:"PublishMarketFeeToken",type:"address"},{indexed:!1,internalType:"uint256",name:"PublishMarketFeeAmount",type:"uint256"}],name:"PublishMarketFees",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"caller",type:"address"},{indexed:!1,internalType:"address",name:"PublishMarketFeeAddress",type:"address"},{indexed:!1,internalType:"address",name:"PublishMarketFeeToken",type:"address"},{indexed:!1,internalType:"uint256",name:"PublishMarketFeeAmount",type:"uint256"}],name:"PublishMarketFeesChanged",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"signer",type:"address"},{indexed:!1,internalType:"uint256",name:"timestamp",type:"uint256"},{indexed:!1,internalType:"uint256",name:"blockNumber",type:"uint256"}],name:"RemovedMinter",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"signer",type:"address"},{indexed:!1,internalType:"uint256",name:"timestamp",type:"uint256"},{indexed:!1,internalType:"uint256",name:"blockNumber",type:"uint256"}],name:"RemovedPaymentManager",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Transfer",type:"event"},{stateMutability:"payable",type:"fallback"},{inputs:[],name:"BASE",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"BASE_COMMUNITY_FEE_PERCENTAGE",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"DOMAIN_SEPARATOR",outputs:[{internalType:"bytes32",name:"",type:"bytes32"}],stateMutability:"view",type:"function"},{inputs:[],name:"PERMIT_TYPEHASH",outputs:[{internalType:"bytes32",name:"",type:"bytes32"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"_minter",type:"address"}],name:"addMinter",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"_paymentManager",type:"address"}],name:"addPaymentManager",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"owner",type:"address"},{internalType:"address",name:"spender",type:"address"}],name:"allowance",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"approve",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"",type:"uint256"}],name:"authERC20",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"account",type:"address"}],name:"balanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"amount",type:"uint256"}],name:"burn",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"account",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"burnFrom",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"cap",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"cleanFrom721",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"cleanPermissions",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"_dispenser",type:"address"},{internalType:"uint256",name:"maxTokens",type:"uint256"},{internalType:"uint256",name:"maxBalance",type:"uint256"},{internalType:"bool",name:"withMint",type:"bool"},{internalType:"address",name:"allowedSwapper",type:"address"}],name:"createDispenser",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"fixedPriceAddress",type:"address"},{internalType:"address[]",name:"addresses",type:"address[]"},{internalType:"uint256[]",name:"uints",type:"uint256[]"}],name:"createFixedRate",outputs:[{internalType:"bytes32",name:"exchangeId",type:"bytes32"}],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"decimals",outputs:[{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"pure",type:"function"},{inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"subtractedValue",type:"uint256"}],name:"decreaseAllowance",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256[]",name:"ssParams",type:"uint256[]"},{internalType:"uint256[]",name:"swapFees",type:"uint256[]"},{internalType:"address[]",name:"addresses",type:"address[]"}],name:"deployPool",outputs:[{internalType:"address",name:"pool",type:"address"}],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"getERC721Address",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"getId",outputs:[{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"pure",type:"function"},{inputs:[],name:"getPaymentCollector",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"user",type:"address"}],name:"getPermissions",outputs:[{components:[{internalType:"bool",name:"minter",type:"bool"},{internalType:"bool",name:"paymentManager",type:"bool"}],internalType:"struct ERC20Roles.RolesERC20",name:"",type:"tuple"}],stateMutability:"view",type:"function"},{inputs:[],name:"getPublishingMarketFee",outputs:[{internalType:"address",name:"",type:"address"},{internalType:"address",name:"",type:"address"},{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"addedValue",type:"uint256"}],name:"increaseAllowance",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"string[]",name:"strings_",type:"string[]"},{internalType:"address[]",name:"addresses_",type:"address[]"},{internalType:"address[]",name:"factoryAddresses_",type:"address[]"},{internalType:"uint256[]",name:"uints_",type:"uint256[]"},{internalType:"bytes[]",name:"bytes_",type:"bytes[]"}],name:"initialize",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"user",type:"address"}],name:"isERC20Deployer",outputs:[{internalType:"bool",name:"deployer",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"isInitialized",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"account",type:"address"}],name:"isMinter",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"account",type:"address"},{internalType:"uint256",name:"value",type:"uint256"}],name:"mint",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"name",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"",type:"address"}],name:"nonces",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"",type:"address"}],name:"permissions",outputs:[{internalType:"bool",name:"minter",type:"bool"},{internalType:"bool",name:"paymentManager",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"owner",type:"address"},{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"value",type:"uint256"},{internalType:"uint256",name:"deadline",type:"uint256"},{internalType:"uint8",name:"v",type:"uint8"},{internalType:"bytes32",name:"r",type:"bytes32"},{internalType:"bytes32",name:"s",type:"bytes32"}],name:"permit",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"_minter",type:"address"}],name:"removeMinter",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"_paymentManager",type:"address"}],name:"removePaymentManager",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"router",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes",name:"_value",type:"bytes"}],name:"setData",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"_newPaymentCollector",type:"address"}],name:"setPaymentCollector",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"_publishMarketFeeAddress",type:"address"},{internalType:"address",name:"_publishMarketFeeToken",type:"address"},{internalType:"uint256",name:"_publishMarketFeeAmount",type:"uint256"}],name:"setPublishingMarketFee",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"consumer",type:"address"},{internalType:"uint256",name:"serviceIndex",type:"uint256"},{internalType:"address",name:"providerFeeAddress",type:"address"},{internalType:"address",name:"providerFeeToken",type:"address"},{internalType:"uint256",name:"providerFeeAmount",type:"uint256"},{internalType:"uint8",name:"v",type:"uint8"},{internalType:"bytes32",name:"r",type:"bytes32"},{internalType:"bytes32",name:"s",type:"bytes32"},{internalType:"bytes",name:"providerData",type:"bytes"}],name:"startOrder",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"symbol",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[],name:"totalSupply",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"recipient",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transfer",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"sender",type:"address"},{internalType:"address",name:"recipient",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transferFrom",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"withdrawETH",outputs:[],stateMutability:"payable",type:"function"}],bytecode:"0x6080604052600b805460ff60a01b191690553480156200001e57600080fd5b5060408051808201825260048152631d195cdd60e21b60208083019182528351808501909452600a8452691d195cdd14de5b589bdb60b21b9084015281519192916200006d9160039162000091565b5080516200008390600490602084019062000091565b505060016007555062000174565b8280546200009f9062000137565b90600052602060002090601f016020900481019282620000c357600085556200010e565b82601f10620000de57805160ff19168380011785556200010e565b828001600101855582156200010e579182015b828111156200010e578251825591602001919060010190620000f1565b506200011c92915062000120565b5090565b5b808211156200011c576000815560010162000121565b600181811c908216806200014c57607f821691505b602082108114156200016e57634e487b7160e01b600052602260045260246000fd5b50919050565b61428e80620001846000396000f3fe6080604052600436106102725760003560e01c80635d1ca6311161014e578063aa271e1a116100bb578063dd62ed3e11610077578063dd62ed3e14610878578063e086e5ec146108be578063e487c2e8146108c6578063ec342ad0146108db578063ef867ff4146108f7578063f887ea401461091757005b8063aa271e1a146107aa578063aa492ef9146107e3578063ab62f0e114610803578063b2263a5d14610823578063b3998be014610838578063d505accf1461085857005b806395d89b411161010a57806395d89b41146106f557806396fb3eaf1461070a578063983b2d561461072a5780639b4f44b61461074a578063a457c2d71461076a578063a9059cbb1461078a57005b80635d1ca6311461062957806370a082311461063d57806379cc6790146106735780637ecebe001461069357806382c03da5146106c05780638b96412b146106d557005b8063313ce567116101ec57806340c10f19116101a857806340c10f191461057457806342966c68146105945780634f189cb2146105b457806357a3a31b146105c957806357ad5ff6146105e95780635bfe4da01461060957005b8063313ce567146104ac578063355274ea146104ce5780633644e515146104e3578063392e53cd146104f95780633950935114610518578063397b37431461053857005b806318160ddd1161023b57806318160ddd146103d9578063191c918a146103f857806323b872dd1461041857806325b00243146104385780633092afd51461045857806330adf81f1461047857005b80627ffb781461027457806301e88208146102ab57806306fdde03146102fb578063095ea7b31461031d578063160a79251461034d575b005b34801561028057600080fd5b50600c546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102b757600080fd5b506102e46102c6366004613569565b60056020526000908152604090205460ff8082169161010090041682565b6040805192151583529015156020830152016102a2565b34801561030757600080fd5b50610310610937565b6040516102a291906135de565b34801561032957600080fd5b5061033d6103383660046135f1565b6109c9565b60405190151581526020016102a2565b34801561035957600080fd5b506103ba610368366004613569565b6040805180820190915260008082526020820152506001600160a01b031660009081526005602090815260409182902082518084019093525460ff808216151584526101009091041615159082015290565b60408051825115158152602092830151151592810192909252016102a2565b3480156103e557600080fd5b506002545b6040519081526020016102a2565b34801561040457600080fd5b5061027261041336600461362b565b6109df565b34801561042457600080fd5b5061033d61043336600461368a565b610b3a565b34801561044457600080fd5b50610272610453366004613569565b610be6565b34801561046457600080fd5b50610272610473366004613569565b610c80565b34801561048457600080fd5b506103ea7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b3480156104b857600080fd5b5060125b60405160ff90911681526020016102a2565b3480156104da57600080fd5b50600a546103ea565b3480156104ef57600080fd5b506103ea60115481565b34801561050557600080fd5b50600b54600160a01b900460ff1661033d565b34801561052457600080fd5b5061033d6105333660046135f1565b610d17565b34801561054457600080fd5b50600e54600f54601054604080516001600160a01b039485168152939092166020840152908201526060016102a2565b34801561058057600080fd5b5061027261058f3660046135f1565b610d53565b3480156105a057600080fd5b506102726105af3660046136cb565b610e24565b3480156105c057600080fd5b50610272610e2e565b3480156105d557600080fd5b506102726105e4366004613569565b610f15565b3480156105f557600080fd5b5061027261060436600461368a565b611057565b34801561061557600080fd5b5061028e61062436600461381e565b6111ab565b34801561063557600080fd5b5060016104bc565b34801561064957600080fd5b506103ea610658366004613569565b6001600160a01b031660009081526020819052604090205490565b34801561067f57600080fd5b5061027261068e3660046135f1565b611491565b34801561069f57600080fd5b506103ea6106ae366004613569565b60126020526000908152604090205481565b3480156106cc57600080fd5b50610272611517565b3480156106e157600080fd5b506103ea6106f03660046138a6565b611571565b34801561070157600080fd5b5061031061173e565b34801561071657600080fd5b5061033d610725366004613569565b61174d565b34801561073657600080fd5b50610272610745366004613569565b6117c8565b34801561075657600080fd5b506102726107653660046139a0565b61185f565b34801561077657600080fd5b5061033d6107853660046135f1565b611d10565b34801561079657600080fd5b5061033d6107a53660046135f1565b611da9565b3480156107b657600080fd5b5061033d6107c5366004613569565b6001600160a01b031660009081526005602052604090205460ff1690565b3480156107ef57600080fd5b506102726107fe366004613569565b611db6565b34801561080f57600080fd5b5061027261081e366004613a4d565b611e4d565b34801561082f57600080fd5b506103ea611f7e565b34801561084457600080fd5b5061033d610853366004613b0b565b611f94565b34801561086457600080fd5b50610272610873366004613bfc565b6120ce565b34801561088457600080fd5b506103ea610893366004613c6a565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6102726122e0565b3480156108d257600080fd5b5061028e612320565b3480156108e757600080fd5b506103ea670de0b6b3a764000081565b34801561090357600080fd5b5061028e6109123660046136cb565b6123b5565b34801561092357600080fd5b5060135461028e906001600160a01b031681565b60606008805461094690613ca3565b80601f016020809104026020016040519081016040528092919081815260200182805461097290613ca3565b80156109bf5780601f10610994576101008083540402835291602001916109bf565b820191906000526020600020905b8154815290600101906020018083116109a257829003601f168201915b5050505050905090565b60006109d63384846123df565b50600192915050565b600c5460405163160a792560e01b81523360048201526001600160a01b039091169063160a7925906024016080604051808303816000875af1158015610a29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4d9190613cde565b60200151610a765760405162461bcd60e51b8152600401610a6d90613d63565b60405180910390fd5b60026007541415610a995760405162461bcd60e51b8152600401610a6d90613d98565b6002600755601354604051636b14d00560e11b81526001600160a01b038781166004830152306024830152604482018790526064820186905233608483015283811660a48301529091169063d629a00a9060c401600060405180830381600087803b158015610b0757600080fd5b505af1158015610b1b573d6000803e3d6000fd5b505050508115610b2e57610b2e85612503565b50506001600755505050565b6000610b47848484612605565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610bcc5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610a6d565b610bd985338584036123df565b60019150505b9392505050565b600c5460405163160a792560e01b81523360048201526001600160a01b039091169063160a7925906024016080604051808303816000875af1158015610c30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c549190613cde565b60200151610c745760405162461bcd60e51b8152600401610a6d90613d63565b610c7d816127d5565b50565b600c5460405163160a792560e01b81523360048201526001600160a01b039091169063160a7925906024016080604051808303816000875af1158015610cca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cee9190613cde565b60200151610d0e5760405162461bcd60e51b8152600401610a6d90613d63565b610c7d81612836565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916109d6918590610d4e908690613de5565b6123df565b3360009081526005602052604090205460ff16610db25760405162461bcd60e51b815260206004820152601960248201527f455243323054656d706c6174653a204e4f54204d494e544552000000000000006044820152606401610a6d565b600a54610dc882610dc260025490565b90612896565b1115610e165760405162461bcd60e51b815260206004820152601f60248201527f44617461546f6b656e54656d706c6174653a20636170206578636565646564006044820152606401610a6d565b610e2082826128a2565b5050565b610c7d3382612981565b600c546040516331a9108f60e11b8152600160048201526001600160a01b0390911690636352211e90602401602060405180830381865afa158015610e77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9b9190613dfd565b6001600160a01b0316336001600160a01b031614610efb5760405162461bcd60e51b815260206004820152601b60248201527f455243323054656d706c6174653a206e6f74204e46544f776e657200000000006044820152606401610a6d565b610f03612acf565b600d80546001600160a01b0319169055565b33600090815260056020526040902054610100900460ff1680610fa65750600c5460405163160a792560e01b81523360048201526001600160a01b039091169063160a7925906024016080604051808303816000875af1158015610f7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa19190613cde565b602001515b6110065760405162461bcd60e51b815260206004820152602b60248201527f455243323054656d706c6174653a204e4f54205041594d454e54204d414e414760448201526a22a91037b91027aba722a960a91b6064820152608401610a6d565b61100f81612b7e565b604080514281524360208201526001600160a01b0383169133917f4d7694d695c57cc54947177c8e8a0e61aae664e9223492a798c32fadfc6419cc910160405180910390a350565b600e546001600160a01b031633146110c45760405162461bcd60e51b815260206004820152602a60248201527f455243323054656d706c6174653a206e6f74207075626c6973684d61726b65746044820152694665654164647265737360b01b6064820152608401610a6d565b6001600160a01b03831661112b5760405162461bcd60e51b815260206004820152602860248201527f496e76616c6964205f7075626c6973684d61726b657446656541646472657373604482015267206164647265737360c01b6064820152608401610a6d565b600e80546001600160a01b038581166001600160a01b03199283168117909355600f80549186169190921681179091556010839055604080513381526020810193909352820152606081018290527fe0b85b6f04fa914cf57f6401c5672a83a32b1c388d194c3d78e17f2897d46f439060800160405180910390a1505050565b600c5460405163160a792560e01b81523360048201526000916001600160a01b03169063160a7925906024016080604051808303816000875af11580156111f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061121a9190613cde565b6020015161123a5760405162461bcd60e51b8152600401610a6d90613d63565b600254156112965760405162461bcd60e51b8152602060048201526024808201527f455243323054656d706c6174653a20746f6b656e7320616c7265616479206d696044820152631b9d195960e21b6064820152608401610a6d565b6112b9826000815181106112ac576112ac613e1a565b6020026020010151612503565b62250490846003815181106112d0576112d0613e1a565b6020026020010151116113375760405162461bcd60e51b815260206004820152602960248201527f455243323054656d706c6174653a206d696e696d756d20626c6f636b73206e6f6044820152681d081c995858da195960ba1b6064820152608401610a6d565b60006040518060400160405280306001600160a01b03166001600160a01b031681526020018460018151811061136f5761136f613e1a565b60209081029190910101516001600160a01b0390811690915260135460405163ee3bc63560e01b8152929350169063ee3bc635906113b7908490899089908990600401613ea4565b6020604051808303816000875af11580156113d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113fa9190613dfd565b91507fd02da1bec30f7f750aa0a131745dfb9ce96767c45a192dc26409f5d690e0b967828460008151811061143157611431613e1a565b60200260200101518560018151811061144c5761144c613e1a565b6020026020010151604051611481939291906001600160a01b0393841681529183166020830152909116604082015260600190565b60405180910390a1509392505050565b600061149d8333610893565b9050818110156114fb5760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f77604482015263616e636560e01b6064820152608401610a6d565b61150883338484036123df565b6115128383612981565b505050565b600c546001600160a01b03163314610efb5760405162461bcd60e51b815260206004820152601f60248201527f455243323054656d706c6174653a204e4f542037323120436f6e7472616374006044820152606401610a6d565b600c5460405163160a792560e01b81523360048201526000916001600160a01b03169063160a7925906024016080604051808303816000875af11580156115bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e09190613cde565b602001516116005760405162461bcd60e51b8152600401610a6d90613d63565b600260075414156116235760405162461bcd60e51b8152600401610a6d90613d98565b6002600755601354604051638244937560e01b81526001600160a01b039091169063824493759061165c90879087908790600401613f0f565b6020604051808303816000875af115801561167b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061169f9190613f4f565b90506000826004815181106116b6576116b6613e1a565b602002602001015111156116cd576116cd84612503565b7f195d202f33578769e120c3041341554af3193e67ee004175095bc9c06e6e6165818460008151811061170257611702613e1a565b602002602001015160405161172a9291909182526001600160a01b0316602082015260400190565b60405180910390a160016007559392505050565b60606009805461094690613ca3565b600c5460405163160a792560e01b81526001600160a01b038381166004830152600092169063160a7925906024016080604051808303816000875af115801561179a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117be9190613cde565b6020015192915050565b600c5460405163160a792560e01b81523360048201526001600160a01b039091169063160a7925906024016080604051808303816000875af1158015611812573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118369190613cde565b602001516118565760405162461bcd60e51b8152600401610a6d90613d63565b610c7d81612503565b600260075414156118825760405162461bcd60e51b8152600401610a6d90613d98565b600260075533600090815260208190526040812054670de0b6b3a764000091908211156118ff5760405162461bcd60e51b815260206004820152602560248201527f4e6f7420656e6f756768204461746120546f6b656e7320746f2073746172742060448201526427b93232b960d91b6064820152608401610a6d565b600e5460408051338152602081018590529081018c90524260608201524360808201526001600160a01b03918216918d16907fe1c4fa794edfa8f619b8257a077398950357b9c6398528f94480307352f9afcc9060a00160405180910390a3600060105411801561197a5750600f546001600160a01b031615155b80156119905750600e546001600160a01b031615155b15611abb57601054600f546119b4916001600160a01b039091169033903090612ba0565b6010546119c2906064612c0b565b600e546010549192506119f8916001600160a01b03909116906119e59084612c17565b600f546001600160a01b03169190612c23565b600f54600e546010546001600160a01b0392831692909116907ff666b31c81334b6085802ba4149907fa724689d43bc31df6de1a51291ddc55b490611a3d9085612c17565b60405190815260200160405180910390a38015611abb57600b54600f54611a71916001600160a01b03918216911683612c23565b600f54600b546040518381526001600160a01b0392831692909116907ff666b31c81334b6085802ba4149907fa724689d43bc31df6de1a51291ddc55b49060200160405180910390a35b60006040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152509050600081858c8c8c604051602001611b0f9493929190613f68565b60405160208183030381529060405280519060200120604051602001611b36929190613fae565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff8c1692840192909252606083018a9052608083018990529092509060019060a0016020604051602081039080840390855afa158015611ba1573d6000803e3d6000fd5b5050506020604051035190508b6001600160a01b0316816001600160a01b031614611c055760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642070726f76696465722066656560601b6044820152606401610a6d565b8a6001600160a01b03168c6001600160a01b03167f144fc6ed7d0a617ba44a01131b1f724d0370297a3640b6201f343e081ada64468c898d8d8d604051611c50959493929190613fd0565b60405180910390a360008a118015611c7057506001600160a01b038b1615155b8015611c8457506001600160a01b038c1615155b15611c9e57611c9e6001600160a01b038c16338e8d612ba0565b611caf611ca9612320565b86611da9565b611cfb5760405162461bcd60e51b815260206004820152601e60248201527f4661696c656420746f2073656e6420445420746f207075626c697368657200006044820152606401610a6d565b50506001600755505050505050505050505050565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015611d925760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610a6d565b611d9f33858584036123df565b5060019392505050565b60006109d6338484612605565b600c5460405163160a792560e01b81523360048201526001600160a01b039091169063160a7925906024016080604051808303816000875af1158015611e00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e249190613cde565b60200151611e445760405162461bcd60e51b8152600401610a6d90613d63565b610c7d81612c53565b600c5460405163160a792560e01b81523360048201526001600160a01b039091169063160a7925906024016080604051808303816000875af1158015611e97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ebb9190613cde565b60200151611edb5760405162461bcd60e51b8152600401610a6d90613d63565b6040516bffffffffffffffffffffffff193060601b16602082015260009060340160408051601f19818403018152908290528051602090910120600c546301caf8fd60e31b83529092506001600160a01b031690630e57c7e890611f4790849087908790600401614009565b600060405180830381600087803b158015611f6157600080fd5b505af1158015611f75573d6000803e3d6000fd5b50505050505050565b611f916064670de0b6b3a764000061403f565b81565b600b54600090600160a01b900460ff161561200b5760405162461bcd60e51b815260206004820152603160248201527f455243323054656d706c6174653a20746f6b656e20696e7374616e636520616c6044820152701c9958591e481a5b9a5d1a585b1a5e9959607a1b6064820152608401610a6d565b6120bf6120188b8d614061565b8a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808e0282810182019093528d82529093508d92508c91829185019084908082843760009201919091525050604080516020808d0282810182019093528c82529093508c92508b9182918501908490808284376000920191909152506120ba92508991508a90506140e9565b612d61565b9b9a5050505050505050505050565b438410156121115760405162461bcd60e51b815260206004820152601060248201526f115490cc8c11150e881156141254915160821b6044820152606401610a6d565b6011546001600160a01b038816600090815260126020526040812080549192917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b91908761216483614151565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e001604051602081830303815290604052805190602001206040516020016121dd92919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015612248573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381161580159061227e5750886001600160a01b0316816001600160a01b0316145b6122ca5760405162461bcd60e51b815260206004820152601a60248201527f455243323044543a20494e56414c49445f5349474e41545552450000000000006044820152606401610a6d565b6122d58989896123df565b505050505050505050565b6122e8612320565b6001600160a01b03166108fc479081150290604051600060405180830381858888f19350505050158015610c7d573d6000803e3d6000fd5b600d546000906001600160a01b03166123a557600c546040516331a9108f60e11b8152600160048201526001600160a01b0390911690636352211e90602401602060405180830381865afa15801561237c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123a09190613dfd565b905090565b50600d546001600160a01b031690565b600681815481106123c557600080fd5b6000918252602090912001546001600160a01b0316905081565b6001600160a01b0383166124415760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a6d565b6001600160a01b0382166124a25760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a6d565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0381166000908152600560205260409020805460ff161561256d5760405162461bcd60e51b815260206004820152601d60248201527f4552433230526f6c65733a2020414c52454144592041204d494e5445520000006044820152606401610a6d565b8054600160ff19909116811782556006805491820181556000527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319166001600160a01b038416908117909155604080514281524360208201523392917f4f7e100eb1ee13e903798bd0d6aa854152e07eb05544f392b9409c12935c809591015b60405180910390a35050565b6001600160a01b0383166126695760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a6d565b6001600160a01b0382166126cb5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a6d565b6001600160a01b038316600090815260208190526040902054818110156127435760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610a6d565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061277a908490613de5565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516127c691815260200190565b60405180910390a35b50505050565b6001600160a01b03811660008181526005602052604090819020805461ff00191681559051909133917faee911eec8b2df8f3ae0464841541b1e5f339519bd5cf51889fe8b07fecff658906125f99042904390918252602082015260400190565b6001600160a01b03811660008181526005602052604090819020805460ff191681559051909133917fefa2735987005aaa89c050c0ff8cc9ae7d9079d19382081c429130f98c52d480906125f99042904390918252602082015260400190565b6000610bdf8284613de5565b6001600160a01b0382166128f85760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610a6d565b806002600082825461290a9190613de5565b90915550506001600160a01b03821660009081526020819052604081208054839290612937908490613de5565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b0382166129e15760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610a6d565b6001600160a01b03821660009081526020819052604090205481811015612a555760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610a6d565b6001600160a01b0383166000908152602081905260408120838303905560028054849290612a8490849061416c565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b60005b600654811015612b355760006005600060068481548110612af557612af5613e1a565b60009182526020808320909101546001600160a01b031683528201929092526040019020805461ffff191690555080612b2d81614151565b915050612ad2565b50612b426006600061349d565b6040805142815243602082015233917f712bc71db81927a76b8bf1ea346247bb0ad58f18e4e5c1bd4aa0ec6573e02a2b910160405180910390a2565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03808516602483015283166044820152606481018290526127cf9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613253565b6000610bdf828461403f565b6000610bdf828461416c565b6040516001600160a01b03831660248201526044810182905261151290849063a9059cbb60e01b90606401612bd4565b6001600160a01b03811660009081526005602052604090208054610100900460ff1615612ccd5760405162461bcd60e51b815260206004820152602260248201527f4552433230526f6c65733a2020414c5245414459204120464545204d414e414760448201526122a960f11b6064820152608401610a6d565b805461ff001916610100178155600680546001810182556000919091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0384166001600160a01b03199091168117909155604080514281524360208201523392917fb17da2e9910b4ba5754e8872385ba315a238bafb5ae221fc85093c33432c40a791016125f9565b60008084600081518110612d7757612d77613e1a565b60200260200101519050600085600181518110612d9657612d96613e1a565b6020026020010151905060006001600160a01b0316826001600160a01b03161415612e185760405162461bcd60e51b815260206004820152602c60248201527f455243323054656d706c6174653a20496e76616c6964206d696e7465722c202060448201526b7a65726f206164647265737360a01b6064820152608401610a6d565b6001600160a01b038116612e945760405162461bcd60e51b815260206004820152603c60248201527f455243323054656d706c6174653a20496e76616c696420636f6d6d756e69747960448201527f2066656520636f6c6c6563746f722c207a65726f2061646472657373000000006064820152608401610a6d565b84600081518110612ea757612ea7613e1a565b602002602001015160001415612f0b5760405162461bcd60e51b8152602060048201526024808201527f44617461546f6b656e54656d706c6174653a20496e76616c6964206361702076604482015263616c756560e01b6064820152608401610a6d565b84600081518110612f1e57612f1e613e1a565b6020026020010151600a8190555087600081518110612f3f57612f3f613e1a565b602002602001015160089080519060200190612f5c9291906134bb565b5087600181518110612f7057612f70613e1a565b602002602001015160099080519060200190612f8d9291906134bb565b50600c80546001600160a01b0319166001600160a01b038416179055855186906002908110612fbe57612fbe613e1a565b6020908102919091010151601380546001600160a01b039283166001600160a01b0319909116179055600b80546001600160a81b03191691831691909117600160a01b179055865161301b9088906000906112ac576112ac613e1a565b60006001600160a01b03168760018151811061303957613039613e1a565b60200260200101516001600160a01b0316146130e3576130728760018151811061306557613065613e1a565b6020026020010151612b7e565b8660018151811061308557613085613e1a565b60200260200101516001600160a01b0316336001600160a01b03167f4d7694d695c57cc54947177c8e8a0e61aae664e9223492a798c32fadfc6419cc42436040516130da929190918252602082015260400190565b60405180910390a35b866002815181106130f6576130f6613e1a565b6020026020010151600e60006101000a8154816001600160a01b0302191690836001600160a01b031602179055508660038151811061313757613137613e1a565b6020026020010151600f60006101000a8154816001600160a01b0302191690836001600160a01b031602179055508460018151811061317857613178613e1a565b602002602001015160108190555060004690507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60086040516131bb9190614183565b60408051918290038220828201825260018352603160f81b6020938401528151928301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018290523060a082015260c00160408051808303601f1901815291905280516020909101206011555050600b54600160a01b900460ff16979650505050505050565b60006132a8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166133259092919063ffffffff16565b80519091501561151257808060200190518101906132c6919061421f565b6115125760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610a6d565b6060613334848460008561333c565b949350505050565b60608247101561339d5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610a6d565b843b6133eb5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a6d565b600080866001600160a01b03168587604051613407919061423c565b60006040518083038185875af1925050503d8060008114613444576040519150601f19603f3d011682016040523d82523d6000602084013e613449565b606091505b5091509150613459828286613464565b979650505050505050565b60608315613473575081610bdf565b8251156134835782518084602001fd5b8160405162461bcd60e51b8152600401610a6d91906135de565b5080546000825590600052602060002090810190610c7d919061353f565b8280546134c790613ca3565b90600052602060002090601f0160209004810192826134e9576000855561352f565b82601f1061350257805160ff191683800117855561352f565b8280016001018555821561352f579182015b8281111561352f578251825591602001919060010190613514565b5061353b92915061353f565b5090565b5b8082111561353b5760008155600101613540565b6001600160a01b0381168114610c7d57600080fd5b60006020828403121561357b57600080fd5b8135610bdf81613554565b60005b838110156135a1578181015183820152602001613589565b838111156127cf5750506000910152565b600081518084526135ca816020860160208601613586565b601f01601f19169290920160200192915050565b602081526000610bdf60208301846135b2565b6000806040838503121561360457600080fd5b823561360f81613554565b946020939093013593505050565b8015158114610c7d57600080fd5b600080600080600060a0868803121561364357600080fd5b853561364e81613554565b94506020860135935060408601359250606086013561366c8161361d565b9150608086013561367c81613554565b809150509295509295909350565b60008060006060848603121561369f57600080fd5b83356136aa81613554565b925060208401356136ba81613554565b929592945050506040919091013590565b6000602082840312156136dd57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613723576137236136e4565b604052919050565b600067ffffffffffffffff821115613745576137456136e4565b5060051b60200190565b600082601f83011261376057600080fd5b813560206137756137708361372b565b6136fa565b82815260059290921b8401810191818101908684111561379457600080fd5b8286015b848110156137af5780358352918301918301613798565b509695505050505050565b600082601f8301126137cb57600080fd5b813560206137db6137708361372b565b82815260059290921b840181019181810190868411156137fa57600080fd5b8286015b848110156137af57803561381181613554565b83529183019183016137fe565b60008060006060848603121561383357600080fd5b833567ffffffffffffffff8082111561384b57600080fd5b6138578783880161374f565b9450602086013591508082111561386d57600080fd5b6138798783880161374f565b9350604086013591508082111561388f57600080fd5b5061389c868287016137ba565b9150509250925092565b6000806000606084860312156138bb57600080fd5b83356138c681613554565b9250602084013567ffffffffffffffff808211156138e357600080fd5b6138ef878388016137ba565b9350604086013591508082111561390557600080fd5b5061389c8682870161374f565b803560ff8116811461392357600080fd5b919050565b600067ffffffffffffffff831115613942576139426136e4565b613955601f8401601f19166020016136fa565b905082815283838301111561396957600080fd5b828260208301376000602084830101529392505050565b600082601f83011261399157600080fd5b610bdf83833560208501613928565b60008060008060008060008060006101208a8c0312156139bf57600080fd5b89356139ca81613554565b985060208a0135975060408a01356139e181613554565b965060608a01356139f181613554565b955060808a01359450613a0660a08b01613912565b935060c08a0135925060e08a013591506101008a013567ffffffffffffffff811115613a3157600080fd5b613a3d8c828d01613980565b9150509295985092959850929598565b60008060208385031215613a6057600080fd5b823567ffffffffffffffff80821115613a7857600080fd5b818501915085601f830112613a8c57600080fd5b813581811115613a9b57600080fd5b866020828501011115613aad57600080fd5b60209290920196919550909350505050565b60008083601f840112613ad157600080fd5b50813567ffffffffffffffff811115613ae957600080fd5b6020830191508360208260051b8501011115613b0457600080fd5b9250929050565b60008060008060008060008060008060a08b8d031215613b2a57600080fd5b8a3567ffffffffffffffff80821115613b4257600080fd5b613b4e8e838f01613abf565b909c509a5060208d0135915080821115613b6757600080fd5b613b738e838f01613abf565b909a50985060408d0135915080821115613b8c57600080fd5b613b988e838f01613abf565b909850965060608d0135915080821115613bb157600080fd5b613bbd8e838f01613abf565b909650945060808d0135915080821115613bd657600080fd5b50613be38d828e01613abf565b915080935050809150509295989b9194979a5092959850565b600080600080600080600060e0888a031215613c1757600080fd5b8735613c2281613554565b96506020880135613c3281613554565b95506040880135945060608801359350613c4e60808901613912565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215613c7d57600080fd5b8235613c8881613554565b91506020830135613c9881613554565b809150509250929050565b600181811c90821680613cb757607f821691505b60208210811415613cd857634e487b7160e01b600052602260045260246000fd5b50919050565b600060808284031215613cf057600080fd5b6040516080810181811067ffffffffffffffff82111715613d1357613d136136e4565b6040528251613d218161361d565b81526020830151613d318161361d565b60208201526040830151613d448161361d565b60408201526060830151613d578161361d565b60608201529392505050565b6020808252818101527f455243323054656d706c6174653a204e4f54204445504c4f59455220524f4c45604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115613df857613df8613dcf565b500190565b600060208284031215613e0f57600080fd5b8151610bdf81613554565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b83811015613e6057815187529582019590820190600101613e44565b509495945050505050565b600081518084526020808501945080840160005b83811015613e605781516001600160a01b031687529582019590820190600101613e7f565b60008186825b6002811015613ed25781516001600160a01b0316835260209283019290910190600101613eaa565b50505060a06040830152613ee960a0830186613e30565b8281036060840152613efb8186613e30565b905082810360808401526134598185613e6b565b6001600160a01b0384168152606060208201819052600090613f3390830185613e6b565b8281036040840152613f458185613e30565b9695505050505050565b600060208284031215613f6157600080fd5b5051919050565b60008551613f7a818460208a01613586565b6bffffffffffffffffffffffff19606096871b8116919093019081529390941b166014830152602882015260480192915050565b60008351613fc0818460208801613586565b9190910191825250602001919050565b85815260a060208201526000613fe960a08301876135b2565b60ff95909516604083015250606081019290925260809091015292915050565b83815260406020820152816040820152818360608301376000818301606090810191909152601f909201601f1916010192915050565b60008261405c57634e487b7160e01b600052601260045260246000fd5b500490565b600061406f6137708461372b565b80848252602080830192508560051b85013681111561408d57600080fd5b855b818110156140dd57803567ffffffffffffffff8111156140af5760008081fd5b870136601f8201126140c15760008081fd5b6140cf368235868401613928565b86525093820193820161408f565b50919695505050505050565b60006140f76137708461372b565b80848252602080830192508560051b85013681111561411557600080fd5b855b818110156140dd57803567ffffffffffffffff8111156141375760008081fd5b61414336828a01613980565b865250938201938201614117565b600060001982141561416557614165613dcf565b5060010190565b60008282101561417e5761417e613dcf565b500390565b600080835481600182811c91508083168061419f57607f831692505b60208084108214156141bf57634e487b7160e01b86526022600452602486fd5b8180156141d357600181146141e457614211565b60ff19861689528489019650614211565b60008a81526020902060005b868110156142095781548b8201529085019083016141f0565b505084890196505b509498975050505050505050565b60006020828403121561423157600080fd5b8151610bdf8161361d565b6000825161424e818460208701613586565b919091019291505056fea2646970667358221220d238578f5cc11933648d20be9ee5e6703e39313ad340c2b000bb26ac3b3e034564736f6c634300080a0033",deployedBytecode:"0x6080604052600436106102725760003560e01c80635d1ca6311161014e578063aa271e1a116100bb578063dd62ed3e11610077578063dd62ed3e14610878578063e086e5ec146108be578063e487c2e8146108c6578063ec342ad0146108db578063ef867ff4146108f7578063f887ea401461091757005b8063aa271e1a146107aa578063aa492ef9146107e3578063ab62f0e114610803578063b2263a5d14610823578063b3998be014610838578063d505accf1461085857005b806395d89b411161010a57806395d89b41146106f557806396fb3eaf1461070a578063983b2d561461072a5780639b4f44b61461074a578063a457c2d71461076a578063a9059cbb1461078a57005b80635d1ca6311461062957806370a082311461063d57806379cc6790146106735780637ecebe001461069357806382c03da5146106c05780638b96412b146106d557005b8063313ce567116101ec57806340c10f19116101a857806340c10f191461057457806342966c68146105945780634f189cb2146105b457806357a3a31b146105c957806357ad5ff6146105e95780635bfe4da01461060957005b8063313ce567146104ac578063355274ea146104ce5780633644e515146104e3578063392e53cd146104f95780633950935114610518578063397b37431461053857005b806318160ddd1161023b57806318160ddd146103d9578063191c918a146103f857806323b872dd1461041857806325b00243146104385780633092afd51461045857806330adf81f1461047857005b80627ffb781461027457806301e88208146102ab57806306fdde03146102fb578063095ea7b31461031d578063160a79251461034d575b005b34801561028057600080fd5b50600c546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102b757600080fd5b506102e46102c6366004613569565b60056020526000908152604090205460ff8082169161010090041682565b6040805192151583529015156020830152016102a2565b34801561030757600080fd5b50610310610937565b6040516102a291906135de565b34801561032957600080fd5b5061033d6103383660046135f1565b6109c9565b60405190151581526020016102a2565b34801561035957600080fd5b506103ba610368366004613569565b6040805180820190915260008082526020820152506001600160a01b031660009081526005602090815260409182902082518084019093525460ff808216151584526101009091041615159082015290565b60408051825115158152602092830151151592810192909252016102a2565b3480156103e557600080fd5b506002545b6040519081526020016102a2565b34801561040457600080fd5b5061027261041336600461362b565b6109df565b34801561042457600080fd5b5061033d61043336600461368a565b610b3a565b34801561044457600080fd5b50610272610453366004613569565b610be6565b34801561046457600080fd5b50610272610473366004613569565b610c80565b34801561048457600080fd5b506103ea7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b3480156104b857600080fd5b5060125b60405160ff90911681526020016102a2565b3480156104da57600080fd5b50600a546103ea565b3480156104ef57600080fd5b506103ea60115481565b34801561050557600080fd5b50600b54600160a01b900460ff1661033d565b34801561052457600080fd5b5061033d6105333660046135f1565b610d17565b34801561054457600080fd5b50600e54600f54601054604080516001600160a01b039485168152939092166020840152908201526060016102a2565b34801561058057600080fd5b5061027261058f3660046135f1565b610d53565b3480156105a057600080fd5b506102726105af3660046136cb565b610e24565b3480156105c057600080fd5b50610272610e2e565b3480156105d557600080fd5b506102726105e4366004613569565b610f15565b3480156105f557600080fd5b5061027261060436600461368a565b611057565b34801561061557600080fd5b5061028e61062436600461381e565b6111ab565b34801561063557600080fd5b5060016104bc565b34801561064957600080fd5b506103ea610658366004613569565b6001600160a01b031660009081526020819052604090205490565b34801561067f57600080fd5b5061027261068e3660046135f1565b611491565b34801561069f57600080fd5b506103ea6106ae366004613569565b60126020526000908152604090205481565b3480156106cc57600080fd5b50610272611517565b3480156106e157600080fd5b506103ea6106f03660046138a6565b611571565b34801561070157600080fd5b5061031061173e565b34801561071657600080fd5b5061033d610725366004613569565b61174d565b34801561073657600080fd5b50610272610745366004613569565b6117c8565b34801561075657600080fd5b506102726107653660046139a0565b61185f565b34801561077657600080fd5b5061033d6107853660046135f1565b611d10565b34801561079657600080fd5b5061033d6107a53660046135f1565b611da9565b3480156107b657600080fd5b5061033d6107c5366004613569565b6001600160a01b031660009081526005602052604090205460ff1690565b3480156107ef57600080fd5b506102726107fe366004613569565b611db6565b34801561080f57600080fd5b5061027261081e366004613a4d565b611e4d565b34801561082f57600080fd5b506103ea611f7e565b34801561084457600080fd5b5061033d610853366004613b0b565b611f94565b34801561086457600080fd5b50610272610873366004613bfc565b6120ce565b34801561088457600080fd5b506103ea610893366004613c6a565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6102726122e0565b3480156108d257600080fd5b5061028e612320565b3480156108e757600080fd5b506103ea670de0b6b3a764000081565b34801561090357600080fd5b5061028e6109123660046136cb565b6123b5565b34801561092357600080fd5b5060135461028e906001600160a01b031681565b60606008805461094690613ca3565b80601f016020809104026020016040519081016040528092919081815260200182805461097290613ca3565b80156109bf5780601f10610994576101008083540402835291602001916109bf565b820191906000526020600020905b8154815290600101906020018083116109a257829003601f168201915b5050505050905090565b60006109d63384846123df565b50600192915050565b600c5460405163160a792560e01b81523360048201526001600160a01b039091169063160a7925906024016080604051808303816000875af1158015610a29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4d9190613cde565b60200151610a765760405162461bcd60e51b8152600401610a6d90613d63565b60405180910390fd5b60026007541415610a995760405162461bcd60e51b8152600401610a6d90613d98565b6002600755601354604051636b14d00560e11b81526001600160a01b038781166004830152306024830152604482018790526064820186905233608483015283811660a48301529091169063d629a00a9060c401600060405180830381600087803b158015610b0757600080fd5b505af1158015610b1b573d6000803e3d6000fd5b505050508115610b2e57610b2e85612503565b50506001600755505050565b6000610b47848484612605565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610bcc5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610a6d565b610bd985338584036123df565b60019150505b9392505050565b600c5460405163160a792560e01b81523360048201526001600160a01b039091169063160a7925906024016080604051808303816000875af1158015610c30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c549190613cde565b60200151610c745760405162461bcd60e51b8152600401610a6d90613d63565b610c7d816127d5565b50565b600c5460405163160a792560e01b81523360048201526001600160a01b039091169063160a7925906024016080604051808303816000875af1158015610cca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cee9190613cde565b60200151610d0e5760405162461bcd60e51b8152600401610a6d90613d63565b610c7d81612836565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916109d6918590610d4e908690613de5565b6123df565b3360009081526005602052604090205460ff16610db25760405162461bcd60e51b815260206004820152601960248201527f455243323054656d706c6174653a204e4f54204d494e544552000000000000006044820152606401610a6d565b600a54610dc882610dc260025490565b90612896565b1115610e165760405162461bcd60e51b815260206004820152601f60248201527f44617461546f6b656e54656d706c6174653a20636170206578636565646564006044820152606401610a6d565b610e2082826128a2565b5050565b610c7d3382612981565b600c546040516331a9108f60e11b8152600160048201526001600160a01b0390911690636352211e90602401602060405180830381865afa158015610e77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9b9190613dfd565b6001600160a01b0316336001600160a01b031614610efb5760405162461bcd60e51b815260206004820152601b60248201527f455243323054656d706c6174653a206e6f74204e46544f776e657200000000006044820152606401610a6d565b610f03612acf565b600d80546001600160a01b0319169055565b33600090815260056020526040902054610100900460ff1680610fa65750600c5460405163160a792560e01b81523360048201526001600160a01b039091169063160a7925906024016080604051808303816000875af1158015610f7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa19190613cde565b602001515b6110065760405162461bcd60e51b815260206004820152602b60248201527f455243323054656d706c6174653a204e4f54205041594d454e54204d414e414760448201526a22a91037b91027aba722a960a91b6064820152608401610a6d565b61100f81612b7e565b604080514281524360208201526001600160a01b0383169133917f4d7694d695c57cc54947177c8e8a0e61aae664e9223492a798c32fadfc6419cc910160405180910390a350565b600e546001600160a01b031633146110c45760405162461bcd60e51b815260206004820152602a60248201527f455243323054656d706c6174653a206e6f74207075626c6973684d61726b65746044820152694665654164647265737360b01b6064820152608401610a6d565b6001600160a01b03831661112b5760405162461bcd60e51b815260206004820152602860248201527f496e76616c6964205f7075626c6973684d61726b657446656541646472657373604482015267206164647265737360c01b6064820152608401610a6d565b600e80546001600160a01b038581166001600160a01b03199283168117909355600f80549186169190921681179091556010839055604080513381526020810193909352820152606081018290527fe0b85b6f04fa914cf57f6401c5672a83a32b1c388d194c3d78e17f2897d46f439060800160405180910390a1505050565b600c5460405163160a792560e01b81523360048201526000916001600160a01b03169063160a7925906024016080604051808303816000875af11580156111f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061121a9190613cde565b6020015161123a5760405162461bcd60e51b8152600401610a6d90613d63565b600254156112965760405162461bcd60e51b8152602060048201526024808201527f455243323054656d706c6174653a20746f6b656e7320616c7265616479206d696044820152631b9d195960e21b6064820152608401610a6d565b6112b9826000815181106112ac576112ac613e1a565b6020026020010151612503565b62250490846003815181106112d0576112d0613e1a565b6020026020010151116113375760405162461bcd60e51b815260206004820152602960248201527f455243323054656d706c6174653a206d696e696d756d20626c6f636b73206e6f6044820152681d081c995858da195960ba1b6064820152608401610a6d565b60006040518060400160405280306001600160a01b03166001600160a01b031681526020018460018151811061136f5761136f613e1a565b60209081029190910101516001600160a01b0390811690915260135460405163ee3bc63560e01b8152929350169063ee3bc635906113b7908490899089908990600401613ea4565b6020604051808303816000875af11580156113d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113fa9190613dfd565b91507fd02da1bec30f7f750aa0a131745dfb9ce96767c45a192dc26409f5d690e0b967828460008151811061143157611431613e1a565b60200260200101518560018151811061144c5761144c613e1a565b6020026020010151604051611481939291906001600160a01b0393841681529183166020830152909116604082015260600190565b60405180910390a1509392505050565b600061149d8333610893565b9050818110156114fb5760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f77604482015263616e636560e01b6064820152608401610a6d565b61150883338484036123df565b6115128383612981565b505050565b600c546001600160a01b03163314610efb5760405162461bcd60e51b815260206004820152601f60248201527f455243323054656d706c6174653a204e4f542037323120436f6e7472616374006044820152606401610a6d565b600c5460405163160a792560e01b81523360048201526000916001600160a01b03169063160a7925906024016080604051808303816000875af11580156115bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e09190613cde565b602001516116005760405162461bcd60e51b8152600401610a6d90613d63565b600260075414156116235760405162461bcd60e51b8152600401610a6d90613d98565b6002600755601354604051638244937560e01b81526001600160a01b039091169063824493759061165c90879087908790600401613f0f565b6020604051808303816000875af115801561167b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061169f9190613f4f565b90506000826004815181106116b6576116b6613e1a565b602002602001015111156116cd576116cd84612503565b7f195d202f33578769e120c3041341554af3193e67ee004175095bc9c06e6e6165818460008151811061170257611702613e1a565b602002602001015160405161172a9291909182526001600160a01b0316602082015260400190565b60405180910390a160016007559392505050565b60606009805461094690613ca3565b600c5460405163160a792560e01b81526001600160a01b038381166004830152600092169063160a7925906024016080604051808303816000875af115801561179a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117be9190613cde565b6020015192915050565b600c5460405163160a792560e01b81523360048201526001600160a01b039091169063160a7925906024016080604051808303816000875af1158015611812573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118369190613cde565b602001516118565760405162461bcd60e51b8152600401610a6d90613d63565b610c7d81612503565b600260075414156118825760405162461bcd60e51b8152600401610a6d90613d98565b600260075533600090815260208190526040812054670de0b6b3a764000091908211156118ff5760405162461bcd60e51b815260206004820152602560248201527f4e6f7420656e6f756768204461746120546f6b656e7320746f2073746172742060448201526427b93232b960d91b6064820152608401610a6d565b600e5460408051338152602081018590529081018c90524260608201524360808201526001600160a01b03918216918d16907fe1c4fa794edfa8f619b8257a077398950357b9c6398528f94480307352f9afcc9060a00160405180910390a3600060105411801561197a5750600f546001600160a01b031615155b80156119905750600e546001600160a01b031615155b15611abb57601054600f546119b4916001600160a01b039091169033903090612ba0565b6010546119c2906064612c0b565b600e546010549192506119f8916001600160a01b03909116906119e59084612c17565b600f546001600160a01b03169190612c23565b600f54600e546010546001600160a01b0392831692909116907ff666b31c81334b6085802ba4149907fa724689d43bc31df6de1a51291ddc55b490611a3d9085612c17565b60405190815260200160405180910390a38015611abb57600b54600f54611a71916001600160a01b03918216911683612c23565b600f54600b546040518381526001600160a01b0392831692909116907ff666b31c81334b6085802ba4149907fa724689d43bc31df6de1a51291ddc55b49060200160405180910390a35b60006040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152509050600081858c8c8c604051602001611b0f9493929190613f68565b60405160208183030381529060405280519060200120604051602001611b36929190613fae565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff8c1692840192909252606083018a9052608083018990529092509060019060a0016020604051602081039080840390855afa158015611ba1573d6000803e3d6000fd5b5050506020604051035190508b6001600160a01b0316816001600160a01b031614611c055760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642070726f76696465722066656560601b6044820152606401610a6d565b8a6001600160a01b03168c6001600160a01b03167f144fc6ed7d0a617ba44a01131b1f724d0370297a3640b6201f343e081ada64468c898d8d8d604051611c50959493929190613fd0565b60405180910390a360008a118015611c7057506001600160a01b038b1615155b8015611c8457506001600160a01b038c1615155b15611c9e57611c9e6001600160a01b038c16338e8d612ba0565b611caf611ca9612320565b86611da9565b611cfb5760405162461bcd60e51b815260206004820152601e60248201527f4661696c656420746f2073656e6420445420746f207075626c697368657200006044820152606401610a6d565b50506001600755505050505050505050505050565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015611d925760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610a6d565b611d9f33858584036123df565b5060019392505050565b60006109d6338484612605565b600c5460405163160a792560e01b81523360048201526001600160a01b039091169063160a7925906024016080604051808303816000875af1158015611e00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e249190613cde565b60200151611e445760405162461bcd60e51b8152600401610a6d90613d63565b610c7d81612c53565b600c5460405163160a792560e01b81523360048201526001600160a01b039091169063160a7925906024016080604051808303816000875af1158015611e97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ebb9190613cde565b60200151611edb5760405162461bcd60e51b8152600401610a6d90613d63565b6040516bffffffffffffffffffffffff193060601b16602082015260009060340160408051601f19818403018152908290528051602090910120600c546301caf8fd60e31b83529092506001600160a01b031690630e57c7e890611f4790849087908790600401614009565b600060405180830381600087803b158015611f6157600080fd5b505af1158015611f75573d6000803e3d6000fd5b50505050505050565b611f916064670de0b6b3a764000061403f565b81565b600b54600090600160a01b900460ff161561200b5760405162461bcd60e51b815260206004820152603160248201527f455243323054656d706c6174653a20746f6b656e20696e7374616e636520616c6044820152701c9958591e481a5b9a5d1a585b1a5e9959607a1b6064820152608401610a6d565b6120bf6120188b8d614061565b8a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808e0282810182019093528d82529093508d92508c91829185019084908082843760009201919091525050604080516020808d0282810182019093528c82529093508c92508b9182918501908490808284376000920191909152506120ba92508991508a90506140e9565b612d61565b9b9a5050505050505050505050565b438410156121115760405162461bcd60e51b815260206004820152601060248201526f115490cc8c11150e881156141254915160821b6044820152606401610a6d565b6011546001600160a01b038816600090815260126020526040812080549192917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b91908761216483614151565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e001604051602081830303815290604052805190602001206040516020016121dd92919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015612248573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381161580159061227e5750886001600160a01b0316816001600160a01b0316145b6122ca5760405162461bcd60e51b815260206004820152601a60248201527f455243323044543a20494e56414c49445f5349474e41545552450000000000006044820152606401610a6d565b6122d58989896123df565b505050505050505050565b6122e8612320565b6001600160a01b03166108fc479081150290604051600060405180830381858888f19350505050158015610c7d573d6000803e3d6000fd5b600d546000906001600160a01b03166123a557600c546040516331a9108f60e11b8152600160048201526001600160a01b0390911690636352211e90602401602060405180830381865afa15801561237c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123a09190613dfd565b905090565b50600d546001600160a01b031690565b600681815481106123c557600080fd5b6000918252602090912001546001600160a01b0316905081565b6001600160a01b0383166124415760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a6d565b6001600160a01b0382166124a25760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a6d565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0381166000908152600560205260409020805460ff161561256d5760405162461bcd60e51b815260206004820152601d60248201527f4552433230526f6c65733a2020414c52454144592041204d494e5445520000006044820152606401610a6d565b8054600160ff19909116811782556006805491820181556000527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319166001600160a01b038416908117909155604080514281524360208201523392917f4f7e100eb1ee13e903798bd0d6aa854152e07eb05544f392b9409c12935c809591015b60405180910390a35050565b6001600160a01b0383166126695760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a6d565b6001600160a01b0382166126cb5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a6d565b6001600160a01b038316600090815260208190526040902054818110156127435760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610a6d565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061277a908490613de5565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516127c691815260200190565b60405180910390a35b50505050565b6001600160a01b03811660008181526005602052604090819020805461ff00191681559051909133917faee911eec8b2df8f3ae0464841541b1e5f339519bd5cf51889fe8b07fecff658906125f99042904390918252602082015260400190565b6001600160a01b03811660008181526005602052604090819020805460ff191681559051909133917fefa2735987005aaa89c050c0ff8cc9ae7d9079d19382081c429130f98c52d480906125f99042904390918252602082015260400190565b6000610bdf8284613de5565b6001600160a01b0382166128f85760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610a6d565b806002600082825461290a9190613de5565b90915550506001600160a01b03821660009081526020819052604081208054839290612937908490613de5565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b0382166129e15760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610a6d565b6001600160a01b03821660009081526020819052604090205481811015612a555760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610a6d565b6001600160a01b0383166000908152602081905260408120838303905560028054849290612a8490849061416c565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b60005b600654811015612b355760006005600060068481548110612af557612af5613e1a565b60009182526020808320909101546001600160a01b031683528201929092526040019020805461ffff191690555080612b2d81614151565b915050612ad2565b50612b426006600061349d565b6040805142815243602082015233917f712bc71db81927a76b8bf1ea346247bb0ad58f18e4e5c1bd4aa0ec6573e02a2b910160405180910390a2565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03808516602483015283166044820152606481018290526127cf9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613253565b6000610bdf828461403f565b6000610bdf828461416c565b6040516001600160a01b03831660248201526044810182905261151290849063a9059cbb60e01b90606401612bd4565b6001600160a01b03811660009081526005602052604090208054610100900460ff1615612ccd5760405162461bcd60e51b815260206004820152602260248201527f4552433230526f6c65733a2020414c5245414459204120464545204d414e414760448201526122a960f11b6064820152608401610a6d565b805461ff001916610100178155600680546001810182556000919091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0384166001600160a01b03199091168117909155604080514281524360208201523392917fb17da2e9910b4ba5754e8872385ba315a238bafb5ae221fc85093c33432c40a791016125f9565b60008084600081518110612d7757612d77613e1a565b60200260200101519050600085600181518110612d9657612d96613e1a565b6020026020010151905060006001600160a01b0316826001600160a01b03161415612e185760405162461bcd60e51b815260206004820152602c60248201527f455243323054656d706c6174653a20496e76616c6964206d696e7465722c202060448201526b7a65726f206164647265737360a01b6064820152608401610a6d565b6001600160a01b038116612e945760405162461bcd60e51b815260206004820152603c60248201527f455243323054656d706c6174653a20496e76616c696420636f6d6d756e69747960448201527f2066656520636f6c6c6563746f722c207a65726f2061646472657373000000006064820152608401610a6d565b84600081518110612ea757612ea7613e1a565b602002602001015160001415612f0b5760405162461bcd60e51b8152602060048201526024808201527f44617461546f6b656e54656d706c6174653a20496e76616c6964206361702076604482015263616c756560e01b6064820152608401610a6d565b84600081518110612f1e57612f1e613e1a565b6020026020010151600a8190555087600081518110612f3f57612f3f613e1a565b602002602001015160089080519060200190612f5c9291906134bb565b5087600181518110612f7057612f70613e1a565b602002602001015160099080519060200190612f8d9291906134bb565b50600c80546001600160a01b0319166001600160a01b038416179055855186906002908110612fbe57612fbe613e1a565b6020908102919091010151601380546001600160a01b039283166001600160a01b0319909116179055600b80546001600160a81b03191691831691909117600160a01b179055865161301b9088906000906112ac576112ac613e1a565b60006001600160a01b03168760018151811061303957613039613e1a565b60200260200101516001600160a01b0316146130e3576130728760018151811061306557613065613e1a565b6020026020010151612b7e565b8660018151811061308557613085613e1a565b60200260200101516001600160a01b0316336001600160a01b03167f4d7694d695c57cc54947177c8e8a0e61aae664e9223492a798c32fadfc6419cc42436040516130da929190918252602082015260400190565b60405180910390a35b866002815181106130f6576130f6613e1a565b6020026020010151600e60006101000a8154816001600160a01b0302191690836001600160a01b031602179055508660038151811061313757613137613e1a565b6020026020010151600f60006101000a8154816001600160a01b0302191690836001600160a01b031602179055508460018151811061317857613178613e1a565b602002602001015160108190555060004690507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60086040516131bb9190614183565b60408051918290038220828201825260018352603160f81b6020938401528151928301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018290523060a082015260c00160408051808303601f1901815291905280516020909101206011555050600b54600160a01b900460ff16979650505050505050565b60006132a8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166133259092919063ffffffff16565b80519091501561151257808060200190518101906132c6919061421f565b6115125760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610a6d565b6060613334848460008561333c565b949350505050565b60608247101561339d5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610a6d565b843b6133eb5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a6d565b600080866001600160a01b03168587604051613407919061423c565b60006040518083038185875af1925050503d8060008114613444576040519150601f19603f3d011682016040523d82523d6000602084013e613449565b606091505b5091509150613459828286613464565b979650505050505050565b60608315613473575081610bdf565b8251156134835782518084602001fd5b8160405162461bcd60e51b8152600401610a6d91906135de565b5080546000825590600052602060002090810190610c7d919061353f565b8280546134c790613ca3565b90600052602060002090601f0160209004810192826134e9576000855561352f565b82601f1061350257805160ff191683800117855561352f565b8280016001018555821561352f579182015b8281111561352f578251825591602001919060010190613514565b5061353b92915061353f565b5090565b5b8082111561353b5760008155600101613540565b6001600160a01b0381168114610c7d57600080fd5b60006020828403121561357b57600080fd5b8135610bdf81613554565b60005b838110156135a1578181015183820152602001613589565b838111156127cf5750506000910152565b600081518084526135ca816020860160208601613586565b601f01601f19169290920160200192915050565b602081526000610bdf60208301846135b2565b6000806040838503121561360457600080fd5b823561360f81613554565b946020939093013593505050565b8015158114610c7d57600080fd5b600080600080600060a0868803121561364357600080fd5b853561364e81613554565b94506020860135935060408601359250606086013561366c8161361d565b9150608086013561367c81613554565b809150509295509295909350565b60008060006060848603121561369f57600080fd5b83356136aa81613554565b925060208401356136ba81613554565b929592945050506040919091013590565b6000602082840312156136dd57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613723576137236136e4565b604052919050565b600067ffffffffffffffff821115613745576137456136e4565b5060051b60200190565b600082601f83011261376057600080fd5b813560206137756137708361372b565b6136fa565b82815260059290921b8401810191818101908684111561379457600080fd5b8286015b848110156137af5780358352918301918301613798565b509695505050505050565b600082601f8301126137cb57600080fd5b813560206137db6137708361372b565b82815260059290921b840181019181810190868411156137fa57600080fd5b8286015b848110156137af57803561381181613554565b83529183019183016137fe565b60008060006060848603121561383357600080fd5b833567ffffffffffffffff8082111561384b57600080fd5b6138578783880161374f565b9450602086013591508082111561386d57600080fd5b6138798783880161374f565b9350604086013591508082111561388f57600080fd5b5061389c868287016137ba565b9150509250925092565b6000806000606084860312156138bb57600080fd5b83356138c681613554565b9250602084013567ffffffffffffffff808211156138e357600080fd5b6138ef878388016137ba565b9350604086013591508082111561390557600080fd5b5061389c8682870161374f565b803560ff8116811461392357600080fd5b919050565b600067ffffffffffffffff831115613942576139426136e4565b613955601f8401601f19166020016136fa565b905082815283838301111561396957600080fd5b828260208301376000602084830101529392505050565b600082601f83011261399157600080fd5b610bdf83833560208501613928565b60008060008060008060008060006101208a8c0312156139bf57600080fd5b89356139ca81613554565b985060208a0135975060408a01356139e181613554565b965060608a01356139f181613554565b955060808a01359450613a0660a08b01613912565b935060c08a0135925060e08a013591506101008a013567ffffffffffffffff811115613a3157600080fd5b613a3d8c828d01613980565b9150509295985092959850929598565b60008060208385031215613a6057600080fd5b823567ffffffffffffffff80821115613a7857600080fd5b818501915085601f830112613a8c57600080fd5b813581811115613a9b57600080fd5b866020828501011115613aad57600080fd5b60209290920196919550909350505050565b60008083601f840112613ad157600080fd5b50813567ffffffffffffffff811115613ae957600080fd5b6020830191508360208260051b8501011115613b0457600080fd5b9250929050565b60008060008060008060008060008060a08b8d031215613b2a57600080fd5b8a3567ffffffffffffffff80821115613b4257600080fd5b613b4e8e838f01613abf565b909c509a5060208d0135915080821115613b6757600080fd5b613b738e838f01613abf565b909a50985060408d0135915080821115613b8c57600080fd5b613b988e838f01613abf565b909850965060608d0135915080821115613bb157600080fd5b613bbd8e838f01613abf565b909650945060808d0135915080821115613bd657600080fd5b50613be38d828e01613abf565b915080935050809150509295989b9194979a5092959850565b600080600080600080600060e0888a031215613c1757600080fd5b8735613c2281613554565b96506020880135613c3281613554565b95506040880135945060608801359350613c4e60808901613912565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215613c7d57600080fd5b8235613c8881613554565b91506020830135613c9881613554565b809150509250929050565b600181811c90821680613cb757607f821691505b60208210811415613cd857634e487b7160e01b600052602260045260246000fd5b50919050565b600060808284031215613cf057600080fd5b6040516080810181811067ffffffffffffffff82111715613d1357613d136136e4565b6040528251613d218161361d565b81526020830151613d318161361d565b60208201526040830151613d448161361d565b60408201526060830151613d578161361d565b60608201529392505050565b6020808252818101527f455243323054656d706c6174653a204e4f54204445504c4f59455220524f4c45604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115613df857613df8613dcf565b500190565b600060208284031215613e0f57600080fd5b8151610bdf81613554565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b83811015613e6057815187529582019590820190600101613e44565b509495945050505050565b600081518084526020808501945080840160005b83811015613e605781516001600160a01b031687529582019590820190600101613e7f565b60008186825b6002811015613ed25781516001600160a01b0316835260209283019290910190600101613eaa565b50505060a06040830152613ee960a0830186613e30565b8281036060840152613efb8186613e30565b905082810360808401526134598185613e6b565b6001600160a01b0384168152606060208201819052600090613f3390830185613e6b565b8281036040840152613f458185613e30565b9695505050505050565b600060208284031215613f6157600080fd5b5051919050565b60008551613f7a818460208a01613586565b6bffffffffffffffffffffffff19606096871b8116919093019081529390941b166014830152602882015260480192915050565b60008351613fc0818460208801613586565b9190910191825250602001919050565b85815260a060208201526000613fe960a08301876135b2565b60ff95909516604083015250606081019290925260809091015292915050565b83815260406020820152816040820152818360608301376000818301606090810191909152601f909201601f1916010192915050565b60008261405c57634e487b7160e01b600052601260045260246000fd5b500490565b600061406f6137708461372b565b80848252602080830192508560051b85013681111561408d57600080fd5b855b818110156140dd57803567ffffffffffffffff8111156140af5760008081fd5b870136601f8201126140c15760008081fd5b6140cf368235868401613928565b86525093820193820161408f565b50919695505050505050565b60006140f76137708461372b565b80848252602080830192508560051b85013681111561411557600080fd5b855b818110156140dd57803567ffffffffffffffff8111156141375760008081fd5b61414336828a01613980565b865250938201938201614117565b600060001982141561416557614165613dcf565b5060010190565b60008282101561417e5761417e613dcf565b500390565b600080835481600182811c91508083168061419f57607f831692505b60208084108214156141bf57634e487b7160e01b86526022600452602486fd5b8180156141d357600181146141e457614211565b60ff19861689528489019650614211565b60008a81526020902060005b868110156142095781548b8201529085019083016141f0565b505084890196505b509498975050505050505050565b60006020828403121561423157600080fd5b8151610bdf8161361d565b6000825161424e818460208701613586565b919091019291505056fea2646970667358221220d238578f5cc11933648d20be9ee5e6703e39313ad340c2b000bb26ac3b3e034564736f6c634300080a0033",linkReferences:{},deployedLinkReferences:{}};const D="115792089237316195423570985008687907853269984665640564039457584007913129639934";var L,G={_format:"hh-sol-artifact-1",contractName:"Dispenser",sourceName:"contracts/pools/dispenser/Dispenser.sol",abi:[{inputs:[{internalType:"address",name:"_router",type:"address"}],stateMutability:"nonpayable",type:"constructor"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"datatokenAddress",type:"address"}],name:"DispenserActivated",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"datatoken",type:"address"},{indexed:!0,internalType:"address",name:"newAllowedSwapper",type:"address"}],name:"DispenserAllowedSwapperChanged",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"datatokenAddress",type:"address"},{indexed:!0,internalType:"address",name:"owner",type:"address"},{indexed:!1,internalType:"uint256",name:"maxTokens",type:"uint256"},{indexed:!1,internalType:"uint256",name:"maxBalance",type:"uint256"},{indexed:!1,internalType:"address",name:"allowedSwapper",type:"address"}],name:"DispenserCreated",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"datatokenAddress",type:"address"}],name:"DispenserDeactivated",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"datatoken",type:"address"},{indexed:!0,internalType:"address",name:"owner",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"OwnerWithdrawed",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"datatokenAddress",type:"address"},{indexed:!0,internalType:"address",name:"userAddress",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"TokensDispensed",type:"event"},{inputs:[{internalType:"address",name:"datatoken",type:"address"},{internalType:"uint256",name:"maxTokens",type:"uint256"},{internalType:"uint256",name:"maxBalance",type:"uint256"}],name:"activate",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"datatoken",type:"address"},{internalType:"uint256",name:"maxTokens",type:"uint256"},{internalType:"uint256",name:"maxBalance",type:"uint256"},{internalType:"address",name:"owner",type:"address"},{internalType:"address",name:"allowedSwapper",type:"address"}],name:"create",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"",type:"uint256"}],name:"datatokensList",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"datatoken",type:"address"}],name:"deactivate",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"datatoken",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"address",name:"destination",type:"address"}],name:"dispense",outputs:[],stateMutability:"payable",type:"function"},{inputs:[{internalType:"address",name:"datatoken",type:"address"}],name:"ownerWithdraw",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"router",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"datatoken",type:"address"},{internalType:"address",name:"newAllowedSwapper",type:"address"}],name:"setAllowedSwapper",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"datatoken",type:"address"}],name:"status",outputs:[{internalType:"bool",name:"active",type:"bool"},{internalType:"address",name:"owner",type:"address"},{internalType:"bool",name:"isMinter",type:"bool"},{internalType:"uint256",name:"maxTokens",type:"uint256"},{internalType:"uint256",name:"maxBalance",type:"uint256"},{internalType:"uint256",name:"balance",type:"uint256"},{internalType:"address",name:"allowedSwapper",type:"address"}],stateMutability:"view",type:"function"}],bytecode:"0x608060405234801561001057600080fd5b5060405161160938038061160983398101604081905261002f916100b3565b60016000556001600160a01b03811661008e5760405162461bcd60e51b815260206004820152601f60248201527f44697370656e7365723a2057726f6e6720526f75746572206164647265737300604482015260640160405180910390fd5b600180546001600160a01b0319166001600160a01b03929092169190911790556100e3565b6000602082840312156100c557600080fd5b81516001600160a01b03811681146100dc57600080fd5b9392505050565b611517806100f26000396000f3fe6080604052600436106100865760003560e01c806345d6646b1161005957806345d6646b1461011d578063645b8b1b1461013d578063938d71d0146101a0578063f887ea40146101c0578063f9bfaa7d146101e057600080fd5b80631d746d831461008b57806324ce2917146100a05780633398086a146100c05780633ea053eb146100fd575b600080fd5b61009e61009936600461129e565b610200565b005b3480156100ac57600080fd5b5061009e6100bb3660046112da565b61077e565b3480156100cc57600080fd5b506100e06100db366004611331565b6109b1565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561010957600080fd5b5061009e61011836600461134a565b6109db565b34801561012957600080fd5b5061009e610138366004611365565b610ab8565b34801561014957600080fd5b5061015d61015836600461134a565b610ba6565b6040805197151588526001600160a01b039687166020890152941515948701949094526060860192909252608085015260a08401521660c082015260e0016100f4565b3480156101ac57600080fd5b5061009e6101bb366004611398565b610d0f565b3480156101cc57600080fd5b506001546100e0906001600160a01b031681565b3480156101ec57600080fd5b5061009e6101fb36600461134a565b610e2f565b600260005414156102585760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b60026000556001600160a01b0383166102835760405162461bcd60e51b815260040161024f906113cb565b6001600160a01b03831660009081526002602052604090205460ff166102e25760405162461bcd60e51b815260206004820152601460248201527344697370656e736572206e6f742061637469766560601b604482015260640161024f565b600082116103285760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a59081e995c9bc8185b5bdd5b9d606a1b604482015260640161024f565b6001600160a01b0383166000908152600260205260409020600101548211156103855760405162461bcd60e51b815260206004820152600f60248201526e082dadeeadce840e8dede40d0d2ced608b1b604482015260640161024f565b6001600160a01b038381166000908152600260205260409020600301541615610426576001600160a01b038381166000908152600260205260409020600301541633146104265760405162461bcd60e51b815260206004820152602960248201527f546869732061646472657373206973206e6f7420616c6c6f77656420746f2072604482015268195c5d595cdd08111560ba1b606482015260840161024f565b6040516370a0823160e01b81526001600160a01b03828116600483015284916000918316906370a0823190602401602060405180830381865afa158015610471573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104959190611402565b6001600160a01b0386166000908152600260208190526040909120015490915081106105035760405162461bcd60e51b815260206004820152601760248201527f43616c6c65722062616c616e636520746f6f2068696768000000000000000000604482015260640161024f565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa15801561054a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061056e9190611402565b905084811080156105e257506040516355138f0d60e11b81523060048201526001600160a01b0384169063aa271e1a90602401602060405180830381865afa1580156105be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105e2919061141b565b156106ca576001600160a01b0383166340c10f1930610601848961143d565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561064757600080fd5b505af115801561065b573d6000803e3d6000fd5b50506040516370a0823160e01b81523060048201526001600160a01b03861692506370a082319150602401602060405180830381865afa1580156106a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c79190611402565b90505b848110156107105760405162461bcd60e51b81526020600482015260136024820152724e6f7420656e6f75676820726573657276657360681b604482015260640161024f565b6107246001600160a01b0387168587610fdf565b836001600160a01b0316866001600160a01b03167f63e223ff524bd93d4cbff98ef34405b39f63ded87f5a8d85e39ccda966f135438760405161076991815260200190565b60405180910390a35050600160005550505050565b6001546001600160a01b031633146107d15760405162461bcd60e51b81526020600482015260166024820152752234b9b832b739b2b91d1037b7363c903937baba32b960511b604482015260640161024f565b6001600160a01b0385166107f75760405162461bcd60e51b815260040161024f906113cb565b6001600160a01b03858116600090815260026020526040902054610100900416158061084457506001600160a01b0385811660009081526002602052604090205461010090048116908316145b6108905760405162461bcd60e51b815260206004820152601960248201527f44617461546f6b656e20616c7265616479206372656174656400000000000000604482015260640161024f565b6001600160a01b038581166000818152600260208181526040808420805489881661010081026001600160a81b031990921691909117600190811783558083018d90559482018b905560039182018054988a166001600160a01b0319998a16811790915582549586018355919095527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b90930180549096168517909555845189815290810188905293840152917f7d0aa581e6eb87e15f58588ff20c39ff6622fc796ec9bb664df6ed3eb02442c99060600160405180910390a3806001600160a01b0316856001600160a01b03167fac5c7317d52e88de62aff4ba6869a4882a4556557b761158934d2fd32a8b2ca560405160405180910390a35050505050565b600381815481106109c157600080fd5b6000918252602090912001546001600160a01b0316905081565b6001600160a01b038116610a015760405162461bcd60e51b815260040161024f906113cb565b6001600160a01b038181166000908152600260205260409020546101009004163314610a6f5760405162461bcd60e51b815260206004820152601b60248201527f44617461546f6b656e20616c7265616479206163746976617465640000000000604482015260640161024f565b6001600160a01b038116600081815260026020526040808220805460ff19169055517f393f01061139648745ea000bb047bbe1785bd3a19d3a9c90f6747e1d2357d2b89190a250565b6001600160a01b038216610ade5760405162461bcd60e51b815260040161024f906113cb565b6001600160a01b038281166000908152600260205260409020546101009004163314610b4c5760405162461bcd60e51b815260206004820152601b60248201527f44617461546f6b656e20616c7265616479206163746976617465640000000000604482015260640161024f565b6001600160a01b0382811660008181526002602052604080822060030180546001600160a01b0319169486169485179055517fac5c7317d52e88de62aff4ba6869a4882a4556557b761158934d2fd32a8b2ca59190a35050565b60008080808080806001600160a01b038816610bd45760405162461bcd60e51b815260040161024f906113cb565b6001600160a01b0388811660008181526002602081905260409182902080546001820154919092015492516370a0823160e01b815230600482015260ff83169c506101009092049094169950929650945089916370a0823190602401602060405180830381865afa158015610c4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c719190611402565b6040516355138f0d60e11b81523060048201529093506001600160a01b0382169063aa271e1a90602401602060405180830381865afa158015610cb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cdc919061141b565b6001600160a01b03998a16600090815260026020526040902060030154989a979990989597949650929490921692915050565b6001600160a01b038316610d355760405162461bcd60e51b815260040161024f906113cb565b6001600160a01b038381166000908152600260205260409020546101009004163314610d935760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b21037bbb732b960991b604482015260640161024f565b6001600160a01b0383166000818152600260208190526040808320805460ff191660019081178255818101889055920185905560038054928301815583527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b90910180546001600160a01b03191684179055517fe9372084cb52c5392afee4b9d79d131e04b1e65676088d50a8f39fffb16a87459190a2505050565b60026000541415610e825760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161024f565b60026000556001600160a01b038116610ead5760405162461bcd60e51b815260040161024f906113cb565b6001600160a01b038181166000908152600260205260409020546101009004163314610f0b5760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b21037bbb732b960991b604482015260640161024f565b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610f54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f789190611402565b90508015610fd557610f946001600160a01b0384163383610fdf565b60405181815233906001600160a01b038516907f03185212530fcdce6b38fbf62ed27ab29b1b047f59b76b17401388a70a95f41b9060200160405180910390a35b5050600160005550565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611031908490611036565b505050565b600061108b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166111089092919063ffffffff16565b80519091501561103157808060200190518101906110a9919061141b565b6110315760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161024f565b60606111178484600085611121565b90505b9392505050565b6060824710156111825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161024f565b843b6111d05760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161024f565b600080866001600160a01b031685876040516111ec9190611492565b60006040518083038185875af1925050503d8060008114611229576040519150601f19603f3d011682016040523d82523d6000602084013e61122e565b606091505b509150915061123e828286611249565b979650505050505050565b6060831561125857508161111a565b8251156112685782518084602001fd5b8160405162461bcd60e51b815260040161024f91906114ae565b80356001600160a01b038116811461129957600080fd5b919050565b6000806000606084860312156112b357600080fd5b6112bc84611282565b9250602084013591506112d160408501611282565b90509250925092565b600080600080600060a086880312156112f257600080fd5b6112fb86611282565b9450602086013593506040860135925061131760608701611282565b915061132560808701611282565b90509295509295909350565b60006020828403121561134357600080fd5b5035919050565b60006020828403121561135c57600080fd5b61111a82611282565b6000806040838503121561137857600080fd5b61138183611282565b915061138f60208401611282565b90509250929050565b6000806000606084860312156113ad57600080fd5b6113b684611282565b95602085013595506040909401359392505050565b6020808252601e908201527f496e76616c696420746f6b656e20636f6e747261637420616464726573730000604082015260600190565b60006020828403121561141457600080fd5b5051919050565b60006020828403121561142d57600080fd5b8151801515811461111a57600080fd5b60008282101561145d57634e487b7160e01b600052601160045260246000fd5b500390565b60005b8381101561147d578181015183820152602001611465565b8381111561148c576000848401525b50505050565b600082516114a4818460208701611462565b9190910192915050565b60208152600082518060208401526114cd816040850160208701611462565b601f01601f1916919091016040019291505056fea2646970667358221220fb4b6a3a8a2f8ea9e99a8ff393a1aacd46b89c5c97ff6c190118e2b1d031179664736f6c634300080a0033",deployedBytecode:"0x6080604052600436106100865760003560e01c806345d6646b1161005957806345d6646b1461011d578063645b8b1b1461013d578063938d71d0146101a0578063f887ea40146101c0578063f9bfaa7d146101e057600080fd5b80631d746d831461008b57806324ce2917146100a05780633398086a146100c05780633ea053eb146100fd575b600080fd5b61009e61009936600461129e565b610200565b005b3480156100ac57600080fd5b5061009e6100bb3660046112da565b61077e565b3480156100cc57600080fd5b506100e06100db366004611331565b6109b1565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561010957600080fd5b5061009e61011836600461134a565b6109db565b34801561012957600080fd5b5061009e610138366004611365565b610ab8565b34801561014957600080fd5b5061015d61015836600461134a565b610ba6565b6040805197151588526001600160a01b039687166020890152941515948701949094526060860192909252608085015260a08401521660c082015260e0016100f4565b3480156101ac57600080fd5b5061009e6101bb366004611398565b610d0f565b3480156101cc57600080fd5b506001546100e0906001600160a01b031681565b3480156101ec57600080fd5b5061009e6101fb36600461134a565b610e2f565b600260005414156102585760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b60026000556001600160a01b0383166102835760405162461bcd60e51b815260040161024f906113cb565b6001600160a01b03831660009081526002602052604090205460ff166102e25760405162461bcd60e51b815260206004820152601460248201527344697370656e736572206e6f742061637469766560601b604482015260640161024f565b600082116103285760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a59081e995c9bc8185b5bdd5b9d606a1b604482015260640161024f565b6001600160a01b0383166000908152600260205260409020600101548211156103855760405162461bcd60e51b815260206004820152600f60248201526e082dadeeadce840e8dede40d0d2ced608b1b604482015260640161024f565b6001600160a01b038381166000908152600260205260409020600301541615610426576001600160a01b038381166000908152600260205260409020600301541633146104265760405162461bcd60e51b815260206004820152602960248201527f546869732061646472657373206973206e6f7420616c6c6f77656420746f2072604482015268195c5d595cdd08111560ba1b606482015260840161024f565b6040516370a0823160e01b81526001600160a01b03828116600483015284916000918316906370a0823190602401602060405180830381865afa158015610471573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104959190611402565b6001600160a01b0386166000908152600260208190526040909120015490915081106105035760405162461bcd60e51b815260206004820152601760248201527f43616c6c65722062616c616e636520746f6f2068696768000000000000000000604482015260640161024f565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa15801561054a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061056e9190611402565b905084811080156105e257506040516355138f0d60e11b81523060048201526001600160a01b0384169063aa271e1a90602401602060405180830381865afa1580156105be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105e2919061141b565b156106ca576001600160a01b0383166340c10f1930610601848961143d565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561064757600080fd5b505af115801561065b573d6000803e3d6000fd5b50506040516370a0823160e01b81523060048201526001600160a01b03861692506370a082319150602401602060405180830381865afa1580156106a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c79190611402565b90505b848110156107105760405162461bcd60e51b81526020600482015260136024820152724e6f7420656e6f75676820726573657276657360681b604482015260640161024f565b6107246001600160a01b0387168587610fdf565b836001600160a01b0316866001600160a01b03167f63e223ff524bd93d4cbff98ef34405b39f63ded87f5a8d85e39ccda966f135438760405161076991815260200190565b60405180910390a35050600160005550505050565b6001546001600160a01b031633146107d15760405162461bcd60e51b81526020600482015260166024820152752234b9b832b739b2b91d1037b7363c903937baba32b960511b604482015260640161024f565b6001600160a01b0385166107f75760405162461bcd60e51b815260040161024f906113cb565b6001600160a01b03858116600090815260026020526040902054610100900416158061084457506001600160a01b0385811660009081526002602052604090205461010090048116908316145b6108905760405162461bcd60e51b815260206004820152601960248201527f44617461546f6b656e20616c7265616479206372656174656400000000000000604482015260640161024f565b6001600160a01b038581166000818152600260208181526040808420805489881661010081026001600160a81b031990921691909117600190811783558083018d90559482018b905560039182018054988a166001600160a01b0319998a16811790915582549586018355919095527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b90930180549096168517909555845189815290810188905293840152917f7d0aa581e6eb87e15f58588ff20c39ff6622fc796ec9bb664df6ed3eb02442c99060600160405180910390a3806001600160a01b0316856001600160a01b03167fac5c7317d52e88de62aff4ba6869a4882a4556557b761158934d2fd32a8b2ca560405160405180910390a35050505050565b600381815481106109c157600080fd5b6000918252602090912001546001600160a01b0316905081565b6001600160a01b038116610a015760405162461bcd60e51b815260040161024f906113cb565b6001600160a01b038181166000908152600260205260409020546101009004163314610a6f5760405162461bcd60e51b815260206004820152601b60248201527f44617461546f6b656e20616c7265616479206163746976617465640000000000604482015260640161024f565b6001600160a01b038116600081815260026020526040808220805460ff19169055517f393f01061139648745ea000bb047bbe1785bd3a19d3a9c90f6747e1d2357d2b89190a250565b6001600160a01b038216610ade5760405162461bcd60e51b815260040161024f906113cb565b6001600160a01b038281166000908152600260205260409020546101009004163314610b4c5760405162461bcd60e51b815260206004820152601b60248201527f44617461546f6b656e20616c7265616479206163746976617465640000000000604482015260640161024f565b6001600160a01b0382811660008181526002602052604080822060030180546001600160a01b0319169486169485179055517fac5c7317d52e88de62aff4ba6869a4882a4556557b761158934d2fd32a8b2ca59190a35050565b60008080808080806001600160a01b038816610bd45760405162461bcd60e51b815260040161024f906113cb565b6001600160a01b0388811660008181526002602081905260409182902080546001820154919092015492516370a0823160e01b815230600482015260ff83169c506101009092049094169950929650945089916370a0823190602401602060405180830381865afa158015610c4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c719190611402565b6040516355138f0d60e11b81523060048201529093506001600160a01b0382169063aa271e1a90602401602060405180830381865afa158015610cb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cdc919061141b565b6001600160a01b03998a16600090815260026020526040902060030154989a979990989597949650929490921692915050565b6001600160a01b038316610d355760405162461bcd60e51b815260040161024f906113cb565b6001600160a01b038381166000908152600260205260409020546101009004163314610d935760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b21037bbb732b960991b604482015260640161024f565b6001600160a01b0383166000818152600260208190526040808320805460ff191660019081178255818101889055920185905560038054928301815583527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b90910180546001600160a01b03191684179055517fe9372084cb52c5392afee4b9d79d131e04b1e65676088d50a8f39fffb16a87459190a2505050565b60026000541415610e825760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161024f565b60026000556001600160a01b038116610ead5760405162461bcd60e51b815260040161024f906113cb565b6001600160a01b038181166000908152600260205260409020546101009004163314610f0b5760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b21037bbb732b960991b604482015260640161024f565b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610f54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f789190611402565b90508015610fd557610f946001600160a01b0384163383610fdf565b60405181815233906001600160a01b038516907f03185212530fcdce6b38fbf62ed27ab29b1b047f59b76b17401388a70a95f41b9060200160405180910390a35b5050600160005550565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611031908490611036565b505050565b600061108b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166111089092919063ffffffff16565b80519091501561103157808060200190518101906110a9919061141b565b6110315760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161024f565b60606111178484600085611121565b90505b9392505050565b6060824710156111825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161024f565b843b6111d05760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161024f565b600080866001600160a01b031685876040516111ec9190611492565b60006040518083038185875af1925050503d8060008114611229576040519150601f19603f3d011682016040523d82523d6000602084013e61122e565b606091505b509150915061123e828286611249565b979650505050505050565b6060831561125857508161111a565b8251156112685782518084602001fd5b8160405162461bcd60e51b815260040161024f91906114ae565b80356001600160a01b038116811461129957600080fd5b919050565b6000806000606084860312156112b357600080fd5b6112bc84611282565b9250602084013591506112d160408501611282565b90509250925092565b600080600080600060a086880312156112f257600080fd5b6112fb86611282565b9450602086013593506040860135925061131760608701611282565b915061132560808701611282565b90509295509295909350565b60006020828403121561134357600080fd5b5035919050565b60006020828403121561135c57600080fd5b61111a82611282565b6000806040838503121561137857600080fd5b61138183611282565b915061138f60208401611282565b90509250929050565b6000806000606084860312156113ad57600080fd5b6113b684611282565b95602085013595506040909401359392505050565b6020808252601e908201527f496e76616c696420746f6b656e20636f6e747261637420616464726573730000604082015260600190565b60006020828403121561141457600080fd5b5051919050565b60006020828403121561142d57600080fd5b8151801515811461111a57600080fd5b60008282101561145d57634e487b7160e01b600052601160045260246000fd5b500390565b60005b8381101561147d578181015183820152602001611465565b8381111561148c576000848401525b50505050565b600082516114a4818460208701611462565b9190910192915050565b60208152600082518060208401526114cd816040850160208701611462565b601f01601f1916919091016040019291505056fea2646970667358221220fb4b6a3a8a2f8ea9e99a8ff393a1aacd46b89c5c97ff6c190118e2b1d031179664736f6c634300080a0033",linkReferences:{},deployedLinkReferences:{}},U={_format:"hh-sol-artifact-1",contractName:"FixedRateExchange",sourceName:"contracts/pools/fixedRate/FixedRateExchange.sol",abi:[{inputs:[{internalType:"address",name:"_router",type:"address"},{internalType:"address",name:"_opfCollector",type:"address"}],stateMutability:"nonpayable",type:"constructor"},{anonymous:!1,inputs:[{indexed:!0,internalType:"bytes32",name:"exchangeId",type:"bytes32"},{indexed:!0,internalType:"address",name:"exchangeOwner",type:"address"}],name:"ExchangeActivated",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"bytes32",name:"exchangeId",type:"bytes32"},{indexed:!0,internalType:"address",name:"allowedSwapper",type:"address"}],name:"ExchangeAllowedSwapperChanged",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"bytes32",name:"exchangeId",type:"bytes32"},{indexed:!0,internalType:"address",name:"baseToken",type:"address"},{indexed:!0,internalType:"address",name:"dataToken",type:"address"},{indexed:!1,internalType:"address",name:"exchangeOwner",type:"address"},{indexed:!1,internalType:"uint256",name:"fixedRate",type:"uint256"}],name:"ExchangeCreated",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"bytes32",name:"exchangeId",type:"bytes32"},{indexed:!0,internalType:"address",name:"exchangeOwner",type:"address"}],name:"ExchangeDeactivated",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"bytes32",name:"exchangeId",type:"bytes32"},{indexed:!0,internalType:"address",name:"exchangeOwner",type:"address"},{indexed:!1,internalType:"bool",name:"withMint",type:"bool"}],name:"ExchangeMintStateChanged",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"bytes32",name:"exchangeId",type:"bytes32"},{indexed:!0,internalType:"address",name:"exchangeOwner",type:"address"},{indexed:!1,internalType:"uint256",name:"newRate",type:"uint256"}],name:"ExchangeRateChanged",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"bytes32",name:"exchangeId",type:"bytes32"},{indexed:!0,internalType:"address",name:"feeToken",type:"address"},{indexed:!1,internalType:"uint256",name:"feeAmount",type:"uint256"}],name:"MarketFeeCollected",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"bytes32",name:"exchangeId",type:"bytes32"},{indexed:!0,internalType:"address",name:"feeToken",type:"address"},{indexed:!1,internalType:"uint256",name:"feeAmount",type:"uint256"}],name:"OceanFeeCollected",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"bytes32",name:"exchangeId",type:"bytes32"},{indexed:!0,internalType:"address",name:"by",type:"address"},{indexed:!1,internalType:"uint256",name:"baseTokenSwappedAmount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"dataTokenSwappedAmount",type:"uint256"},{indexed:!1,internalType:"address",name:"tokenOutAddress",type:"address"},{indexed:!1,internalType:"uint256",name:"marketFeeAmount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"oceanFeeAmount",type:"uint256"}],name:"Swapped",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"bytes32",name:"exchangeId",type:"bytes32"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!0,internalType:"address",name:"token",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"TokenCollected",type:"event"},{inputs:[{internalType:"bytes32",name:"exchangeId",type:"bytes32"},{internalType:"uint256",name:"dataTokenAmount",type:"uint256"},{internalType:"uint256",name:"maxBaseTokenAmount",type:"uint256"}],name:"buyDT",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes32",name:"exchangeId",type:"bytes32"},{internalType:"uint256",name:"dataTokenAmount",type:"uint256"}],name:"calcBaseInGivenOutDT",outputs:[{internalType:"uint256",name:"baseTokenAmount",type:"uint256"},{internalType:"uint256",name:"baseTokenAmountBeforeFee",type:"uint256"},{internalType:"uint256",name:"oceanFeeAmount",type:"uint256"},{internalType:"uint256",name:"marketFeeAmount",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"exchangeId",type:"bytes32"},{internalType:"uint256",name:"dataTokenAmount",type:"uint256"}],name:"calcBaseOutGivenInDT",outputs:[{internalType:"uint256",name:"baseTokenAmount",type:"uint256"},{internalType:"uint256",name:"baseTokenAmountBeforeFee",type:"uint256"},{internalType:"uint256",name:"oceanFeeAmount",type:"uint256"},{internalType:"uint256",name:"marketFeeAmount",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"exchangeId",type:"bytes32"}],name:"collectBT",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes32",name:"exchangeId",type:"bytes32"}],name:"collectDT",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes32",name:"exchangeId",type:"bytes32"}],name:"collectMarketFee",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes32",name:"exchangeId",type:"bytes32"}],name:"collectOceanFee",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"dataToken",type:"address"},{internalType:"address[]",name:"addresses",type:"address[]"},{internalType:"uint256[]",name:"uints",type:"uint256[]"}],name:"createWithDecimals",outputs:[{internalType:"bytes32",name:"exchangeId",type:"bytes32"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"baseToken",type:"address"},{internalType:"address",name:"dataToken",type:"address"},{internalType:"address",name:"exchangeOwner",type:"address"}],name:"generateExchangeId",outputs:[{internalType:"bytes32",name:"",type:"bytes32"}],stateMutability:"pure",type:"function"},{inputs:[{internalType:"bytes32",name:"exchangeId",type:"bytes32"}],name:"getAllowedSwapper",outputs:[{internalType:"address",name:"allowedSwapper",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"exchangeId",type:"bytes32"}],name:"getBTSupply",outputs:[{internalType:"uint256",name:"supply",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"exchangeId",type:"bytes32"}],name:"getDTSupply",outputs:[{internalType:"uint256",name:"supply",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"exchangeId",type:"bytes32"}],name:"getExchange",outputs:[{internalType:"address",name:"exchangeOwner",type:"address"},{internalType:"address",name:"dataToken",type:"address"},{internalType:"uint256",name:"dtDecimals",type:"uint256"},{internalType:"address",name:"baseToken",type:"address"},{internalType:"uint256",name:"btDecimals",type:"uint256"},{internalType:"uint256",name:"fixedRate",type:"uint256"},{internalType:"bool",name:"active",type:"bool"},{internalType:"uint256",name:"dtSupply",type:"uint256"},{internalType:"uint256",name:"btSupply",type:"uint256"},{internalType:"uint256",name:"dtBalance",type:"uint256"},{internalType:"uint256",name:"btBalance",type:"uint256"},{internalType:"bool",name:"withMint",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[],name:"getExchanges",outputs:[{internalType:"bytes32[]",name:"",type:"bytes32[]"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"exchangeId",type:"bytes32"}],name:"getFeesInfo",outputs:[{internalType:"uint256",name:"marketFee",type:"uint256"},{internalType:"address",name:"marketFeeCollector",type:"address"},{internalType:"uint256",name:"opfFee",type:"uint256"},{internalType:"uint256",name:"marketFeeAvailable",type:"uint256"},{internalType:"uint256",name:"oceanFeeAvailable",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"getNumberOfExchanges",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"basetokenAddress",type:"address"}],name:"getOPFFee",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"exchangeId",type:"bytes32"}],name:"getRate",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"exchangeId",type:"bytes32"}],name:"isActive",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[],name:"opfCollector",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"router",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"exchangeId",type:"bytes32"},{internalType:"uint256",name:"dataTokenAmount",type:"uint256"},{internalType:"uint256",name:"minBaseTokenAmount",type:"uint256"}],name:"sellDT",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes32",name:"exchangeId",type:"bytes32"},{internalType:"address",name:"newAllowedSwapper",type:"address"}],name:"setAllowedSwapper",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes32",name:"exchangeId",type:"bytes32"},{internalType:"uint256",name:"newRate",type:"uint256"}],name:"setRate",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes32",name:"exchangeId",type:"bytes32"}],name:"toggleExchangeState",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes32",name:"exchangeId",type:"bytes32"},{internalType:"bool",name:"withMint",type:"bool"}],name:"toggleMintState",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes32",name:"exchangeId",type:"bytes32"},{internalType:"uint256",name:"_newMarketFee",type:"uint256"}],name:"updateMarketFee",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes32",name:"exchangeId",type:"bytes32"},{internalType:"address",name:"_newMarketCollector",type:"address"}],name:"updateMarketFeeCollector",outputs:[],stateMutability:"nonpayable",type:"function"}],bytecode:"0x60806040523480156200001157600080fd5b50604051620031de380380620031de833981016040819052620000349162000158565b60016000556001600160a01b038216620000a55760405162461bcd60e51b815260206004820152602760248201527f46697865645261746545786368616e67653a2057726f6e6720526f75746572206044820152666164647265737360c81b60648201526084015b60405180910390fd5b6001600160a01b038116620001095760405162461bcd60e51b8152602060048201526024808201527f46697865645261746545786368616e67653a2057726f6e67204f5046206164646044820152637265737360e01b60648201526084016200009c565b600180546001600160a01b039384166001600160a01b0319918216179091556002805492909316911617905562000190565b80516001600160a01b03811681146200015357600080fd5b919050565b600080604083850312156200016c57600080fd5b62000177836200013b565b915062000187602084016200013b565b90509250929050565b61303e80620001a06000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c8063825b5cd6116100f9578063b686bcaf11610097578063c99733a711610071578063c99733a714610576578063f532129e14610589578063f8154aee1461059c578063f887ea40146105af57600080fd5b8063b686bcaf1461053d578063c1f6572e14610550578063c66274ea1461056357600080fd5b806388823872116100d357806388823872146104eb578063a28f78f1146104fe578063b32b56f914610511578063b42414291461053557600080fd5b8063825b5cd6146103c5578063855058dd146103d857806385fcbc2f146104d857600080fd5b80635c36901c116101665780636e4c6269116101405780636e4c62691461035957806371dc14b21461036c57806379dd28361461039f5780637c82ebe9146103b257600080fd5b80635c36901c1461030057806360311e9514610333578063680819eb1461034657600080fd5b806324cb477e116101a257806324cb477e14610247578063450dccc31461025c5780634c87087d1461026f5780635acfedc7146102ed57600080fd5b8063012c3275146101c95780630b3b430d146101ef5780631e2e3a6b14610232575b600080fd5b6101dc6101d7366004612a19565b6105c2565b6040519081526020015b60405180910390f35b6102026101fd366004612aeb565b610d37565b604080519586526001600160a01b039094166020860152928401919091526060830152608082015260a0016101e6565b61023a610e41565b6040516101e69190612b04565b61025a610255366004612aeb565b610e99565b005b61025a61026a366004612aeb565b610f78565b61028261027d366004612aeb565b611084565b604080516001600160a01b039d8e1681529b8d1660208d01528b0199909952999096166060890152608088019490945260a0870192909252151560c086015260e0850152610100840152610120830152610140820192909252901515610160820152610180016101e6565b61025a6102fb366004612aeb565b6111ab565b61032361030e366004612aeb565b60009081526003602052604090205460ff1690565b60405190151581526020016101e6565b61025a610341366004612b48565b611266565b61025a610354366004612b74565b611308565b61025a610367366004612b96565b6113f5565b61037f61037a366004612b74565b6116f3565b6040805194855260208501939093529183015260608201526080016101e6565b61025a6103ad366004612bd3565b61185c565b61025a6103c0366004612b48565b6118ee565b61025a6103d3366004612b96565b611981565b6104c06103e6366004612aeb565b60009081526003602081815260409283902083516101e081018552815460ff808216151583526001600160a01b03610100928390048116958401959095526001840154851696830196909652600283015484166060830152938201546080820152600482015460a0820152600582015460c0820152600682015460e0820152600782015484820152600882015461012082015260098201548316610140820152600a820154610160820152600b820154610180820152600c9091015493841615156101a0820152919092049091166101c090910181905290565b6040516001600160a01b0390911681526020016101e6565b6101dc6104e6366004612aeb565b611d83565b61025a6104f9366004612b74565b611f0a565b6002546104c0906001600160a01b031681565b6101dc61051f366004612aeb565b6000908152600360208190526040909120015490565b6004546101dc565b61025a61054b366004612aeb565b611f81565b6101dc61055e366004612c03565b612032565b6101dc610571366004612aeb565b61207e565b61037f610584366004612b74565b612396565b61025a610597366004612aeb565b6124a1565b6101dc6105aa366004612c46565b61259d565b6001546104c0906001600160a01b031681565b6001546000906001600160a01b031633146106245760405162461bcd60e51b815260206004820152601e60248201527f46697865645261746545786368616e67653a206f6e6c7920726f75746572000060448201526064015b60405180910390fd5b60006001600160a01b03168360008151811061064257610642612c61565b60200260200101516001600160a01b031614156106bd5760405162461bcd60e51b815260206004820152603360248201527f46697865645261746545786368616e67653a20496e76616c69642062617365746044820152726f6b656e2c20207a65726f206164647265737360681b606482015260840161061b565b6001600160a01b03841661072f5760405162461bcd60e51b815260206004820152603360248201527f46697865645261746545786368616e67653a20496e76616c69642064617461746044820152726f6b656e2c20207a65726f206164647265737360681b606482015260840161061b565b836001600160a01b03168360008151811061074c5761074c612c61565b60200260200101516001600160a01b031614156107d15760405162461bcd60e51b815260206004820152603760248201527f46697865645261746545786368616e67653a20496e76616c696420646174617460448201527f6f6b656e2c2020657175616c732062617365746f6b656e000000000000000000606482015260840161061b565b816002815181106107e4576107e4612c61565b6020026020010151600014156108535760405162461bcd60e51b815260206004820152602e60248201527f46697865645261746545786368616e67653a20496e76616c696420657863686160448201526d6e676520726174652076616c756560901b606482015260840161061b565b6108928360008151811061086957610869612c61565b6020026020010151858560018151811061088557610885612c61565b6020026020010151612032565b60008181526003602081905260409091200154909150156109095760405162461bcd60e51b815260206004820152602b60248201527f46697865645261746545786368616e67653a2045786368616e676520616c726560448201526a616479206578697374732160a81b606482015260840161061b565b6000600190508260048151811061092257610922612c61565b602002602001015160001415610936575060005b604051806101e001604052806001151581526020018560018151811061095e5761095e612c61565b60200260200101516001600160a01b03168152602001866001600160a01b031681526020018560008151811061099657610996612c61565b60200260200101516001600160a01b03168152602001846002815181106109bf576109bf612c61565b60200260200101518152602001846001815181106109df576109df612c61565b60200260200101518152602001846000815181106109ff576109ff612c61565b60200260200101518152602001600081526020016000815260200184600381518110610a2d57610a2d612c61565b6020026020010151815260200185600281518110610a4d57610a4d612c61565b60200260200101516001600160a01b031681526020016000815260200160008152602001821515815260200185600381518110610a8c57610a8c612c61565b6020908102919091018101516001600160a01b0390811690925260008581526003808352604080832086518154958801518716610100908102610100600160a81b031992151583166001600160a81b0319988916171783559288015160018084018054928a166001600160a01b031993841617905560608a0151600285018054918b1691841691909117905560808a01519584019590955560a089015160048085019190915560c08a0151600585015560e08a01516006850155848a015160078501556101208a015160088501556101408a0151600985018054918b169190931617909155610160890151600a840155610180890151600b8401556101a0890151600c90930180546101c0909a01518916909402921515909116979095169690961795909517909455815493840182559081527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b9092018490558551908716918691610bfa57610bfa612c61565b60200260200101516001600160a01b0316837feb7a353641f7d3cc54b497ef1553fdc292b64d9cc3be8587c23dfba01f310b1987600181518110610c4057610c40612c61565b602002602001015187600281518110610c5b57610c5b612c61565b6020026020010151604051610c859291906001600160a01b03929092168252602082015260400190565b60405180910390a483600181518110610ca057610ca0612c61565b60200260200101516001600160a01b0316827fc7344c45124818d1d3a4c24ccb9b86d8b88d3bd05209b2a42b494cb32a50352960405160405180910390a383600381518110610cf157610cf1612c61565b60200260200101516001600160a01b0316827fcc1b4af8292e6b938f6743c78a62317c9a2d60e0d46b77776a027e53ce617c0c60405160405180910390a3509392505050565b600081815260036020818152604080842081516101e081018352815460ff808216151583526001600160a01b036101009283900481168488015260018501548116958401959095526002840154851660608401819052848801546080850152600485015460a0850152600585015460c0850152600685015460e085015260078501548385015260088501546101208501819052600986015487166101408601819052600a870154610160870152600b870154610180870152600c9096015492831615156101a0860152929091049094166101c0830152878752949093529293918291829190610e259061259d565b9350806101600151925080610180015191505091939590929450565b60606004805480602002602001604051908101604052809291908181526020018280548015610e8f57602002820191906000526020600020905b815481526020019060010190808311610e7b575b5050505050905090565b600081815260036020526040902054819061010090046001600160a01b03163314610ed65760405162461bcd60e51b815260040161061b90612c77565b60008281526003602052604090205460ff1615610f3157600082815260036020526040808220805460ff1916905551339184917f03da9148e1de78fba22de63c573465562ebf6ef878a1d3ea83790a560229984c9190a35050565b600082815260036020526040808220805460ff1916600117905551339184917fc7344c45124818d1d3a4c24ccb9b86d8b88d3bd05209b2a42b494cb32a5035299190a35050565b600081815260036020526040902054819061010090046001600160a01b03163314610fb55760405162461bcd60e51b815260040161061b90612c77565b60026000541415610fd85760405162461bcd60e51b815260040161061b90612cc0565b600260009081558281526003602052604081206006810180549290558054600190910154611019916001600160a01b0391821691610100909104168361260c565b6000838152600360209081526040918290206001810154905492518481526001600160a01b039182169361010090049091169186917fecc75f4464886bee0a1c5eae61c0cb4b99c64c5e9cdebe3696217d266f8b163691015b60405180910390a45050600160005550565b600081815260036020818152604080842081516101e081018352815460ff80821615158084526001600160a01b036101009384900481169785018890526001860154811696850187905260028601548116606086018190529886015460808601819052600487015460a08701819052600588015460c08801819052600689015460e0890152600789015487890152600889015461012089015260098901548416610140890152600a890154610160890152600b890154610180890152600c9098015494851615156101a088015294909304166101c08501529597949691959194909281908190819081906111778e61207e565b95506111828e611d83565b94508060e0015193508061010001519250806101a0015191505091939597999b5091939597999b565b600260005414156111ce5760405162461bcd60e51b815260040161061b90612cc0565b60026000818155828152600360205260408120600b8101805492905582549201549091611208916001600160a01b0390811691168361260c565b6000828152600360209081526040918290206002015491518381526001600160a01b039092169184917f457b44fd47c33fc65bfbd58d0202ad97fbed1bbc9881f56441d05fe9ebd58acf91015b60405180910390a350506001600055565b600082815260036020526040902054829061010090046001600160a01b031633146112a35760405162461bcd60e51b815260040161061b90612c77565b600083815260036020526040808220600c018054610100600160a81b0319166101006001600160a01b038716908102919091179091559051909185917fcc1b4af8292e6b938f6743c78a62317c9a2d60e0d46b77776a027e53ce617c0c9190a3505050565b600082815260036020526040902054829061010090046001600160a01b031633146113455760405162461bcd60e51b815260040161061b90612c77565b8161139e5760405162461bcd60e51b815260206004820152602360248201527f46697865645261746545786368616e67653a20526174696f206d7573742062656044820152620203e360ec1b606482015260840161061b565b6000838152600360208190526040918290200183905551339084907fe50f9919fdc524004a4ee0cb934f4734f144bec0713a52e5483b753f5de0f08c906113e89086815260200190565b60405180910390a3505050565b600083815260036020526040902054839060ff166114255760405162461bcd60e51b815260040161061b90612cf7565b600260005414156114485760405162461bcd60e51b815260040161061b90612cc0565b60026000558261146a5760405162461bcd60e51b815260040161061b90612d42565b6000848152600360205260409020600c015461010090046001600160a01b0316156114cd576000848152600360205260409020600c015461010090046001600160a01b031633146114cd5760405162461bcd60e51b815260040161061b90612d8b565b6000806000806114dd88886116f3565b9350935093509350858410156115445760405162461bcd60e51b815260206004820152602660248201527f46697865645261746545786368616e67653a20546f6f20666577206261736520604482015265746f6b656e7360d01b606482015260840161061b565b6000888152600360205260409020600b01546115609083612674565b6000898152600360205260409020600b810191909155600a01546115849082612674565b6000898152600360205260409020600a810191909155600101546115b3906001600160a01b031633308a612680565b6000888152600360205260409020600601546115cf9088612674565b60008981526003602052604090206006810191909155600701548411156116295760008881526003602052604090208054600290910154611624916001600160a01b0391821691610100909104163387612680565b611673565b60008881526003602052604090206007015461164590846126be565b6000898152600360205260409020600781019190915560020154611673906001600160a01b0316338661260c565b6000888152600360209081526040918290206002015482518781529182018a90526001600160a01b0316918101919091526060810182905260808101839052339089907f71999bcde73cf4958b3a13dcbc60ff31366318eb6e67b45c93725aa07f89cbd29060a0015b60405180910390a350506001600055505050505050565b600082815260036020526040812054819081908190869060ff166117295760405162461bcd60e51b815260040161061b90612cf7565b6000878152600360205260409020600401546117a390670de0b6b3a76400009061179d9061175890600a612edb565b60008b81526003602052604090206005015461179d9061177990600a612edb565b60008d81526003602081905260409091200154611797908d906126ca565b906126ca565b906126d6565b6000888152600360205260409020600201549094506117ca906001600160a01b031661259d565b1561180f5760008781526003602052604090206002015461180c90670de0b6b3a76400009061179d90611805906001600160a01b031661259d565b87906126ca565b92505b60008781526003602052604090206008015461183a90670de0b6b3a76400009061179d9087906126ca565b91506118508361184a86856126be565b906126be565b94505092959194509250565b600082815260036020526040902054829061010090046001600160a01b031633146118995760405162461bcd60e51b815260040161061b90612c77565b600083815260036020908152604091829020600c01805460ff19168515159081179091559151918252339185917fe28e899e0f5d6fba0c8d73d1888083bcc62d4d9806d2e26fcf1f607c3ed52f5391016113e8565b6000828152600360205260409020600901546001600160a01b031633146119505760405162461bcd60e51b81526020600482015260166024820152753737ba1036b0b935b2ba2332b2a1b7b63632b1ba37b960511b604482015260640161061b565b60009182526003602052604090912060090180546001600160a01b0319166001600160a01b03909216919091179055565b600083815260036020526040902054839060ff166119b15760405162461bcd60e51b815260040161061b90612cf7565b600260005414156119d45760405162461bcd60e51b815260040161061b90612cc0565b6002600055826119f65760405162461bcd60e51b815260040161061b90612d42565b6000848152600360205260409020600c015461010090046001600160a01b031615611a59576000848152600360205260409020600c015461010090046001600160a01b03163314611a595760405162461bcd60e51b815260040161061b90612d8b565b600080600080611a698888612396565b935093509350935085841115611ad15760405162461bcd60e51b815260206004820152602760248201527f46697865645261746545786368616e67653a20546f6f206d616e79206261736560448201526620746f6b656e7360c81b606482015260840161061b565b6000888152600360205260409020600b0154611aed9083612674565b6000898152600360205260409020600b810191909155600a0154611b119082612674565b6000898152600360205260409020600a81019190915560020154611b40906001600160a01b0316333087612680565b600088815260036020526040902060070154611b5c9084612674565b6000898152600360205260409020600781019190915560060154871115611ccc576000888152600360205260409020600c015460ff168015611c155750600088815260036020526040908190206001015490516355138f0d60e11b81523060048201526001600160a01b039091169063aa271e1a90602401602060405180830381865afa158015611bf1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c159190612ee7565b15611c9357600088815260036020526040908190206001015490516340c10f1960e01b8152336004820152602481018990526001600160a01b03909116906340c10f1990604401600060405180830381600087803b158015611c7657600080fd5b505af1158015611c8a573d6000803e3d6000fd5b50505050611d16565b60008881526003602052604090208054600190910154611cc7916001600160a01b039182169161010090910416338a612680565b611d16565b600088815260036020526040902060060154611ce890886126be565b6000898152600360205260409020600681019190915560010154611d16906001600160a01b0316338961260c565b6000888152600360209081526040918290206001015482518781529182018a90526001600160a01b0316918101919091526060810182905260808101839052339089907f71999bcde73cf4958b3a13dcbc60ff31366318eb6e67b45c93725aa07f89cbd29060a0016116dc565b60008181526003602052604081205460ff16611da157506000919050565b6000828152600360205260408082206002810154905491516370a0823160e01b81526101009092046001600160a01b03908116600484015216906370a0823190602401602060405180830381865afa158015611e01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e259190612f04565b600084815260036020526040808220600281015490549151636eb1769f60e11b81526001600160a01b0361010090930483166004820152306024820152939450919291169063dd62ed3e90604401602060405180830381865afa158015611e90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eb49190612f04565b905080821015611ee257600084815260036020526040902060070154611edb908390612674565b9250611f02565b600084815260036020526040902060070154611eff908290612674565b92505b50505b919050565b6000828152600360205260409020600901546001600160a01b03163314611f6c5760405162461bcd60e51b81526020600482015260166024820152753737ba1036b0b935b2ba2332b2a1b7b63632b1ba37b960511b604482015260640161061b565b60009182526003602052604090912060080155565b60026000541415611fa45760405162461bcd60e51b815260040161061b90612cc0565b60026000818155828152600360205260408120600a8101805492905560098101549201549091611fe1916001600160a01b0390811691168361260c565b6000828152600360209081526040918290206002015491518381526001600160a01b039092169184917f192a3cd95e40313e0e12c28b398e31633936e38d134419161f883c8d640790559101611255565b604080516001600160a01b0380861660208301528085169282019290925290821660608201526000906080016040516020818303038152906040528051906020012090505b9392505050565b60008181526003602052604081205460ff1661209c57506000919050565b6000828152600360205260409020600c015460ff1680156121345750600082815260036020526040908190206001015490516355138f0d60e11b81523060048201526001600160a01b039091169063aa271e1a90602401602060405180830381865afa158015612110573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121349190612ee7565b1561223f576000828152600360209081526040918290206001015482516318160ddd60e01b815292516001600160a01b03909116926318160ddd9260048083019391928290030181865afa158015612190573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121b49190612f04565b600083815260036020908152604091829020600101548251631aa93a7560e11b815292516001600160a01b039091169263355274ea9260048083019391928290030181865afa15801561220b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061222f9190612f04565b6122399190612f1d565b92915050565b6000828152600360205260408082206001810154905491516370a0823160e01b81526101009092046001600160a01b03908116600484015216906370a0823190602401602060405180830381865afa15801561229f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122c39190612f04565b600084815260036020526040808220600181015490549151636eb1769f60e11b81526001600160a01b0361010090930483166004820152306024820152939450919291169063dd62ed3e90604401602060405180830381865afa15801561232e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123529190612f04565b90508082101561237957600084815260036020526040902060060154611edb908390612674565b600084815260036020526040902060060154611eff908290612674565b600082815260036020526040812054819081908190869060ff166123cc5760405162461bcd60e51b815260040161061b90612cf7565b6000878152600360205260409020600401546123fb90670de0b6b3a76400009061179d9061175890600a612edb565b600088815260036020526040902060020154909450612422906001600160a01b031661259d565b156124605760008781526003602052604090206002015461245d90670de0b6b3a76400009061179d90611805906001600160a01b031661259d565b92505b60008781526003602052604090206008015461248b90670de0b6b3a76400009061179d9087906126ca565b91506118508361249b8685612674565b90612674565b600081815260036020526040902054819061010090046001600160a01b031633146124de5760405162461bcd60e51b815260040161061b90612c77565b600260005414156125015760405162461bcd60e51b815260040161061b90612cc0565b6002600081815583815260036020526040812060078101805492905580549201549091612540916001600160a01b03908116916101009004168361260c565b6000838152600360209081526040918290206002810154905492518481526001600160a01b039182169361010090049091169186917fecc75f4464886bee0a1c5eae61c0cb4b99c64c5e9cdebe3696217d266f8b16369101611072565b600154604051637c0aa57760e11b81526001600160a01b038381166004830152600092169063f8154aee90602401602060405180830381865afa1580156125e8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122399190612f04565b6040516001600160a01b03831660248201526044810182905261266f90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526126e2565b505050565b60006120778284612f34565b6040516001600160a01b03808516602483015283166044820152606481018290526126b89085906323b872dd60e01b90608401612638565b50505050565b60006120778284612f1d565b60006120778284612f4c565b60006120778284612f6b565b6000612737826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166127b49092919063ffffffff16565b80519091501561266f57808060200190518101906127559190612ee7565b61266f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161061b565b60606127c384846000856127cb565b949350505050565b60608247101561282c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161061b565b843b61287a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161061b565b600080866001600160a01b031685876040516128969190612fb9565b60006040518083038185875af1925050503d80600081146128d3576040519150601f19603f3d011682016040523d82523d6000602084013e6128d8565b606091505b50915091506128e88282866128f3565b979650505050505050565b60608315612902575081612077565b8251156129125782518084602001fd5b8160405162461bcd60e51b815260040161061b9190612fd5565b80356001600160a01b0381168114611f0557600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561298257612982612943565b604052919050565b600067ffffffffffffffff8211156129a4576129a4612943565b5060051b60200190565b600082601f8301126129bf57600080fd5b813560206129d46129cf8361298a565b612959565b82815260059290921b840181019181810190868411156129f357600080fd5b8286015b84811015612a0e57803583529183019183016129f7565b509695505050505050565b600080600060608486031215612a2e57600080fd5b612a378461292c565b925060208085013567ffffffffffffffff80821115612a5557600080fd5b818701915087601f830112612a6957600080fd5b8135612a776129cf8261298a565b81815260059190911b8301840190848101908a831115612a9657600080fd5b938501935b82851015612abb57612aac8561292c565b82529385019390850190612a9b565b965050506040870135925080831115612ad357600080fd5b5050612ae1868287016129ae565b9150509250925092565b600060208284031215612afd57600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b81811015612b3c57835183529284019291840191600101612b20565b50909695505050505050565b60008060408385031215612b5b57600080fd5b82359150612b6b6020840161292c565b90509250929050565b60008060408385031215612b8757600080fd5b50508035926020909101359150565b600080600060608486031215612bab57600080fd5b505081359360208301359350604090920135919050565b8015158114612bd057600080fd5b50565b60008060408385031215612be657600080fd5b823591506020830135612bf881612bc2565b809150509250929050565b600080600060608486031215612c1857600080fd5b612c218461292c565b9250612c2f6020850161292c565b9150612c3d6040850161292c565b90509250925092565b600060208284031215612c5857600080fd5b6120778261292c565b634e487b7160e01b600052603260045260246000fd5b60208082526029908201527f46697865645261746545786368616e67653a20696e76616c69642065786368616040820152683733b29037bbb732b960b91b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252602b908201527f46697865645261746545786368616e67653a2045786368616e676520646f657360408201526a206e6f742065786973742160a81b606082015260800190565b60208082526029908201527f46697865645261746545786368616e67653a207a65726f206461746120746f6b604082015268195b88185b5bdd5b9d60ba1b606082015260800190565b60208082526036908201527f46697865645261746545786368616e67653a205468697320616464726573732060408201527506973206e6f7420616c6c6f77656420746f20737761760541b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115612e32578160001904821115612e1857612e18612de1565b80851615612e2557918102915b93841c9390800290612dfc565b509250929050565b600082612e4957506001612239565b81612e5657506000612239565b8160018114612e6c5760028114612e7657612e92565b6001915050612239565b60ff841115612e8757612e87612de1565b50506001821b612239565b5060208310610133831016604e8410600b8410161715612eb5575081810a612239565b612ebf8383612df7565b8060001904821115612ed357612ed3612de1565b029392505050565b60006120778383612e3a565b600060208284031215612ef957600080fd5b815161207781612bc2565b600060208284031215612f1657600080fd5b5051919050565b600082821015612f2f57612f2f612de1565b500390565b60008219821115612f4757612f47612de1565b500190565b6000816000190483118215151615612f6657612f66612de1565b500290565b600082612f8857634e487b7160e01b600052601260045260246000fd5b500490565b60005b83811015612fa8578181015183820152602001612f90565b838111156126b85750506000910152565b60008251612fcb818460208701612f8d565b9190910192915050565b6020815260008251806020840152612ff4816040850160208701612f8d565b601f01601f1916919091016040019291505056fea2646970667358221220ae3733c86a7fbdeda1e535bdcf4c655711beee316c6fde6e837493eeb818cb9764736f6c634300080a0033",deployedBytecode:"0x608060405234801561001057600080fd5b50600436106101c45760003560e01c8063825b5cd6116100f9578063b686bcaf11610097578063c99733a711610071578063c99733a714610576578063f532129e14610589578063f8154aee1461059c578063f887ea40146105af57600080fd5b8063b686bcaf1461053d578063c1f6572e14610550578063c66274ea1461056357600080fd5b806388823872116100d357806388823872146104eb578063a28f78f1146104fe578063b32b56f914610511578063b42414291461053557600080fd5b8063825b5cd6146103c5578063855058dd146103d857806385fcbc2f146104d857600080fd5b80635c36901c116101665780636e4c6269116101405780636e4c62691461035957806371dc14b21461036c57806379dd28361461039f5780637c82ebe9146103b257600080fd5b80635c36901c1461030057806360311e9514610333578063680819eb1461034657600080fd5b806324cb477e116101a257806324cb477e14610247578063450dccc31461025c5780634c87087d1461026f5780635acfedc7146102ed57600080fd5b8063012c3275146101c95780630b3b430d146101ef5780631e2e3a6b14610232575b600080fd5b6101dc6101d7366004612a19565b6105c2565b6040519081526020015b60405180910390f35b6102026101fd366004612aeb565b610d37565b604080519586526001600160a01b039094166020860152928401919091526060830152608082015260a0016101e6565b61023a610e41565b6040516101e69190612b04565b61025a610255366004612aeb565b610e99565b005b61025a61026a366004612aeb565b610f78565b61028261027d366004612aeb565b611084565b604080516001600160a01b039d8e1681529b8d1660208d01528b0199909952999096166060890152608088019490945260a0870192909252151560c086015260e0850152610100840152610120830152610140820192909252901515610160820152610180016101e6565b61025a6102fb366004612aeb565b6111ab565b61032361030e366004612aeb565b60009081526003602052604090205460ff1690565b60405190151581526020016101e6565b61025a610341366004612b48565b611266565b61025a610354366004612b74565b611308565b61025a610367366004612b96565b6113f5565b61037f61037a366004612b74565b6116f3565b6040805194855260208501939093529183015260608201526080016101e6565b61025a6103ad366004612bd3565b61185c565b61025a6103c0366004612b48565b6118ee565b61025a6103d3366004612b96565b611981565b6104c06103e6366004612aeb565b60009081526003602081815260409283902083516101e081018552815460ff808216151583526001600160a01b03610100928390048116958401959095526001840154851696830196909652600283015484166060830152938201546080820152600482015460a0820152600582015460c0820152600682015460e0820152600782015484820152600882015461012082015260098201548316610140820152600a820154610160820152600b820154610180820152600c9091015493841615156101a0820152919092049091166101c090910181905290565b6040516001600160a01b0390911681526020016101e6565b6101dc6104e6366004612aeb565b611d83565b61025a6104f9366004612b74565b611f0a565b6002546104c0906001600160a01b031681565b6101dc61051f366004612aeb565b6000908152600360208190526040909120015490565b6004546101dc565b61025a61054b366004612aeb565b611f81565b6101dc61055e366004612c03565b612032565b6101dc610571366004612aeb565b61207e565b61037f610584366004612b74565b612396565b61025a610597366004612aeb565b6124a1565b6101dc6105aa366004612c46565b61259d565b6001546104c0906001600160a01b031681565b6001546000906001600160a01b031633146106245760405162461bcd60e51b815260206004820152601e60248201527f46697865645261746545786368616e67653a206f6e6c7920726f75746572000060448201526064015b60405180910390fd5b60006001600160a01b03168360008151811061064257610642612c61565b60200260200101516001600160a01b031614156106bd5760405162461bcd60e51b815260206004820152603360248201527f46697865645261746545786368616e67653a20496e76616c69642062617365746044820152726f6b656e2c20207a65726f206164647265737360681b606482015260840161061b565b6001600160a01b03841661072f5760405162461bcd60e51b815260206004820152603360248201527f46697865645261746545786368616e67653a20496e76616c69642064617461746044820152726f6b656e2c20207a65726f206164647265737360681b606482015260840161061b565b836001600160a01b03168360008151811061074c5761074c612c61565b60200260200101516001600160a01b031614156107d15760405162461bcd60e51b815260206004820152603760248201527f46697865645261746545786368616e67653a20496e76616c696420646174617460448201527f6f6b656e2c2020657175616c732062617365746f6b656e000000000000000000606482015260840161061b565b816002815181106107e4576107e4612c61565b6020026020010151600014156108535760405162461bcd60e51b815260206004820152602e60248201527f46697865645261746545786368616e67653a20496e76616c696420657863686160448201526d6e676520726174652076616c756560901b606482015260840161061b565b6108928360008151811061086957610869612c61565b6020026020010151858560018151811061088557610885612c61565b6020026020010151612032565b60008181526003602081905260409091200154909150156109095760405162461bcd60e51b815260206004820152602b60248201527f46697865645261746545786368616e67653a2045786368616e676520616c726560448201526a616479206578697374732160a81b606482015260840161061b565b6000600190508260048151811061092257610922612c61565b602002602001015160001415610936575060005b604051806101e001604052806001151581526020018560018151811061095e5761095e612c61565b60200260200101516001600160a01b03168152602001866001600160a01b031681526020018560008151811061099657610996612c61565b60200260200101516001600160a01b03168152602001846002815181106109bf576109bf612c61565b60200260200101518152602001846001815181106109df576109df612c61565b60200260200101518152602001846000815181106109ff576109ff612c61565b60200260200101518152602001600081526020016000815260200184600381518110610a2d57610a2d612c61565b6020026020010151815260200185600281518110610a4d57610a4d612c61565b60200260200101516001600160a01b031681526020016000815260200160008152602001821515815260200185600381518110610a8c57610a8c612c61565b6020908102919091018101516001600160a01b0390811690925260008581526003808352604080832086518154958801518716610100908102610100600160a81b031992151583166001600160a81b0319988916171783559288015160018084018054928a166001600160a01b031993841617905560608a0151600285018054918b1691841691909117905560808a01519584019590955560a089015160048085019190915560c08a0151600585015560e08a01516006850155848a015160078501556101208a015160088501556101408a0151600985018054918b169190931617909155610160890151600a840155610180890151600b8401556101a0890151600c90930180546101c0909a01518916909402921515909116979095169690961795909517909455815493840182559081527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b9092018490558551908716918691610bfa57610bfa612c61565b60200260200101516001600160a01b0316837feb7a353641f7d3cc54b497ef1553fdc292b64d9cc3be8587c23dfba01f310b1987600181518110610c4057610c40612c61565b602002602001015187600281518110610c5b57610c5b612c61565b6020026020010151604051610c859291906001600160a01b03929092168252602082015260400190565b60405180910390a483600181518110610ca057610ca0612c61565b60200260200101516001600160a01b0316827fc7344c45124818d1d3a4c24ccb9b86d8b88d3bd05209b2a42b494cb32a50352960405160405180910390a383600381518110610cf157610cf1612c61565b60200260200101516001600160a01b0316827fcc1b4af8292e6b938f6743c78a62317c9a2d60e0d46b77776a027e53ce617c0c60405160405180910390a3509392505050565b600081815260036020818152604080842081516101e081018352815460ff808216151583526001600160a01b036101009283900481168488015260018501548116958401959095526002840154851660608401819052848801546080850152600485015460a0850152600585015460c0850152600685015460e085015260078501548385015260088501546101208501819052600986015487166101408601819052600a870154610160870152600b870154610180870152600c9096015492831615156101a0860152929091049094166101c0830152878752949093529293918291829190610e259061259d565b9350806101600151925080610180015191505091939590929450565b60606004805480602002602001604051908101604052809291908181526020018280548015610e8f57602002820191906000526020600020905b815481526020019060010190808311610e7b575b5050505050905090565b600081815260036020526040902054819061010090046001600160a01b03163314610ed65760405162461bcd60e51b815260040161061b90612c77565b60008281526003602052604090205460ff1615610f3157600082815260036020526040808220805460ff1916905551339184917f03da9148e1de78fba22de63c573465562ebf6ef878a1d3ea83790a560229984c9190a35050565b600082815260036020526040808220805460ff1916600117905551339184917fc7344c45124818d1d3a4c24ccb9b86d8b88d3bd05209b2a42b494cb32a5035299190a35050565b600081815260036020526040902054819061010090046001600160a01b03163314610fb55760405162461bcd60e51b815260040161061b90612c77565b60026000541415610fd85760405162461bcd60e51b815260040161061b90612cc0565b600260009081558281526003602052604081206006810180549290558054600190910154611019916001600160a01b0391821691610100909104168361260c565b6000838152600360209081526040918290206001810154905492518481526001600160a01b039182169361010090049091169186917fecc75f4464886bee0a1c5eae61c0cb4b99c64c5e9cdebe3696217d266f8b163691015b60405180910390a45050600160005550565b600081815260036020818152604080842081516101e081018352815460ff80821615158084526001600160a01b036101009384900481169785018890526001860154811696850187905260028601548116606086018190529886015460808601819052600487015460a08701819052600588015460c08801819052600689015460e0890152600789015487890152600889015461012089015260098901548416610140890152600a890154610160890152600b890154610180890152600c9098015494851615156101a088015294909304166101c08501529597949691959194909281908190819081906111778e61207e565b95506111828e611d83565b94508060e0015193508061010001519250806101a0015191505091939597999b5091939597999b565b600260005414156111ce5760405162461bcd60e51b815260040161061b90612cc0565b60026000818155828152600360205260408120600b8101805492905582549201549091611208916001600160a01b0390811691168361260c565b6000828152600360209081526040918290206002015491518381526001600160a01b039092169184917f457b44fd47c33fc65bfbd58d0202ad97fbed1bbc9881f56441d05fe9ebd58acf91015b60405180910390a350506001600055565b600082815260036020526040902054829061010090046001600160a01b031633146112a35760405162461bcd60e51b815260040161061b90612c77565b600083815260036020526040808220600c018054610100600160a81b0319166101006001600160a01b038716908102919091179091559051909185917fcc1b4af8292e6b938f6743c78a62317c9a2d60e0d46b77776a027e53ce617c0c9190a3505050565b600082815260036020526040902054829061010090046001600160a01b031633146113455760405162461bcd60e51b815260040161061b90612c77565b8161139e5760405162461bcd60e51b815260206004820152602360248201527f46697865645261746545786368616e67653a20526174696f206d7573742062656044820152620203e360ec1b606482015260840161061b565b6000838152600360208190526040918290200183905551339084907fe50f9919fdc524004a4ee0cb934f4734f144bec0713a52e5483b753f5de0f08c906113e89086815260200190565b60405180910390a3505050565b600083815260036020526040902054839060ff166114255760405162461bcd60e51b815260040161061b90612cf7565b600260005414156114485760405162461bcd60e51b815260040161061b90612cc0565b60026000558261146a5760405162461bcd60e51b815260040161061b90612d42565b6000848152600360205260409020600c015461010090046001600160a01b0316156114cd576000848152600360205260409020600c015461010090046001600160a01b031633146114cd5760405162461bcd60e51b815260040161061b90612d8b565b6000806000806114dd88886116f3565b9350935093509350858410156115445760405162461bcd60e51b815260206004820152602660248201527f46697865645261746545786368616e67653a20546f6f20666577206261736520604482015265746f6b656e7360d01b606482015260840161061b565b6000888152600360205260409020600b01546115609083612674565b6000898152600360205260409020600b810191909155600a01546115849082612674565b6000898152600360205260409020600a810191909155600101546115b3906001600160a01b031633308a612680565b6000888152600360205260409020600601546115cf9088612674565b60008981526003602052604090206006810191909155600701548411156116295760008881526003602052604090208054600290910154611624916001600160a01b0391821691610100909104163387612680565b611673565b60008881526003602052604090206007015461164590846126be565b6000898152600360205260409020600781019190915560020154611673906001600160a01b0316338661260c565b6000888152600360209081526040918290206002015482518781529182018a90526001600160a01b0316918101919091526060810182905260808101839052339089907f71999bcde73cf4958b3a13dcbc60ff31366318eb6e67b45c93725aa07f89cbd29060a0015b60405180910390a350506001600055505050505050565b600082815260036020526040812054819081908190869060ff166117295760405162461bcd60e51b815260040161061b90612cf7565b6000878152600360205260409020600401546117a390670de0b6b3a76400009061179d9061175890600a612edb565b60008b81526003602052604090206005015461179d9061177990600a612edb565b60008d81526003602081905260409091200154611797908d906126ca565b906126ca565b906126d6565b6000888152600360205260409020600201549094506117ca906001600160a01b031661259d565b1561180f5760008781526003602052604090206002015461180c90670de0b6b3a76400009061179d90611805906001600160a01b031661259d565b87906126ca565b92505b60008781526003602052604090206008015461183a90670de0b6b3a76400009061179d9087906126ca565b91506118508361184a86856126be565b906126be565b94505092959194509250565b600082815260036020526040902054829061010090046001600160a01b031633146118995760405162461bcd60e51b815260040161061b90612c77565b600083815260036020908152604091829020600c01805460ff19168515159081179091559151918252339185917fe28e899e0f5d6fba0c8d73d1888083bcc62d4d9806d2e26fcf1f607c3ed52f5391016113e8565b6000828152600360205260409020600901546001600160a01b031633146119505760405162461bcd60e51b81526020600482015260166024820152753737ba1036b0b935b2ba2332b2a1b7b63632b1ba37b960511b604482015260640161061b565b60009182526003602052604090912060090180546001600160a01b0319166001600160a01b03909216919091179055565b600083815260036020526040902054839060ff166119b15760405162461bcd60e51b815260040161061b90612cf7565b600260005414156119d45760405162461bcd60e51b815260040161061b90612cc0565b6002600055826119f65760405162461bcd60e51b815260040161061b90612d42565b6000848152600360205260409020600c015461010090046001600160a01b031615611a59576000848152600360205260409020600c015461010090046001600160a01b03163314611a595760405162461bcd60e51b815260040161061b90612d8b565b600080600080611a698888612396565b935093509350935085841115611ad15760405162461bcd60e51b815260206004820152602760248201527f46697865645261746545786368616e67653a20546f6f206d616e79206261736560448201526620746f6b656e7360c81b606482015260840161061b565b6000888152600360205260409020600b0154611aed9083612674565b6000898152600360205260409020600b810191909155600a0154611b119082612674565b6000898152600360205260409020600a81019190915560020154611b40906001600160a01b0316333087612680565b600088815260036020526040902060070154611b5c9084612674565b6000898152600360205260409020600781019190915560060154871115611ccc576000888152600360205260409020600c015460ff168015611c155750600088815260036020526040908190206001015490516355138f0d60e11b81523060048201526001600160a01b039091169063aa271e1a90602401602060405180830381865afa158015611bf1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c159190612ee7565b15611c9357600088815260036020526040908190206001015490516340c10f1960e01b8152336004820152602481018990526001600160a01b03909116906340c10f1990604401600060405180830381600087803b158015611c7657600080fd5b505af1158015611c8a573d6000803e3d6000fd5b50505050611d16565b60008881526003602052604090208054600190910154611cc7916001600160a01b039182169161010090910416338a612680565b611d16565b600088815260036020526040902060060154611ce890886126be565b6000898152600360205260409020600681019190915560010154611d16906001600160a01b0316338961260c565b6000888152600360209081526040918290206001015482518781529182018a90526001600160a01b0316918101919091526060810182905260808101839052339089907f71999bcde73cf4958b3a13dcbc60ff31366318eb6e67b45c93725aa07f89cbd29060a0016116dc565b60008181526003602052604081205460ff16611da157506000919050565b6000828152600360205260408082206002810154905491516370a0823160e01b81526101009092046001600160a01b03908116600484015216906370a0823190602401602060405180830381865afa158015611e01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e259190612f04565b600084815260036020526040808220600281015490549151636eb1769f60e11b81526001600160a01b0361010090930483166004820152306024820152939450919291169063dd62ed3e90604401602060405180830381865afa158015611e90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eb49190612f04565b905080821015611ee257600084815260036020526040902060070154611edb908390612674565b9250611f02565b600084815260036020526040902060070154611eff908290612674565b92505b50505b919050565b6000828152600360205260409020600901546001600160a01b03163314611f6c5760405162461bcd60e51b81526020600482015260166024820152753737ba1036b0b935b2ba2332b2a1b7b63632b1ba37b960511b604482015260640161061b565b60009182526003602052604090912060080155565b60026000541415611fa45760405162461bcd60e51b815260040161061b90612cc0565b60026000818155828152600360205260408120600a8101805492905560098101549201549091611fe1916001600160a01b0390811691168361260c565b6000828152600360209081526040918290206002015491518381526001600160a01b039092169184917f192a3cd95e40313e0e12c28b398e31633936e38d134419161f883c8d640790559101611255565b604080516001600160a01b0380861660208301528085169282019290925290821660608201526000906080016040516020818303038152906040528051906020012090505b9392505050565b60008181526003602052604081205460ff1661209c57506000919050565b6000828152600360205260409020600c015460ff1680156121345750600082815260036020526040908190206001015490516355138f0d60e11b81523060048201526001600160a01b039091169063aa271e1a90602401602060405180830381865afa158015612110573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121349190612ee7565b1561223f576000828152600360209081526040918290206001015482516318160ddd60e01b815292516001600160a01b03909116926318160ddd9260048083019391928290030181865afa158015612190573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121b49190612f04565b600083815260036020908152604091829020600101548251631aa93a7560e11b815292516001600160a01b039091169263355274ea9260048083019391928290030181865afa15801561220b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061222f9190612f04565b6122399190612f1d565b92915050565b6000828152600360205260408082206001810154905491516370a0823160e01b81526101009092046001600160a01b03908116600484015216906370a0823190602401602060405180830381865afa15801561229f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122c39190612f04565b600084815260036020526040808220600181015490549151636eb1769f60e11b81526001600160a01b0361010090930483166004820152306024820152939450919291169063dd62ed3e90604401602060405180830381865afa15801561232e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123529190612f04565b90508082101561237957600084815260036020526040902060060154611edb908390612674565b600084815260036020526040902060060154611eff908290612674565b600082815260036020526040812054819081908190869060ff166123cc5760405162461bcd60e51b815260040161061b90612cf7565b6000878152600360205260409020600401546123fb90670de0b6b3a76400009061179d9061175890600a612edb565b600088815260036020526040902060020154909450612422906001600160a01b031661259d565b156124605760008781526003602052604090206002015461245d90670de0b6b3a76400009061179d90611805906001600160a01b031661259d565b92505b60008781526003602052604090206008015461248b90670de0b6b3a76400009061179d9087906126ca565b91506118508361249b8685612674565b90612674565b600081815260036020526040902054819061010090046001600160a01b031633146124de5760405162461bcd60e51b815260040161061b90612c77565b600260005414156125015760405162461bcd60e51b815260040161061b90612cc0565b6002600081815583815260036020526040812060078101805492905580549201549091612540916001600160a01b03908116916101009004168361260c565b6000838152600360209081526040918290206002810154905492518481526001600160a01b039182169361010090049091169186917fecc75f4464886bee0a1c5eae61c0cb4b99c64c5e9cdebe3696217d266f8b16369101611072565b600154604051637c0aa57760e11b81526001600160a01b038381166004830152600092169063f8154aee90602401602060405180830381865afa1580156125e8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122399190612f04565b6040516001600160a01b03831660248201526044810182905261266f90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526126e2565b505050565b60006120778284612f34565b6040516001600160a01b03808516602483015283166044820152606481018290526126b89085906323b872dd60e01b90608401612638565b50505050565b60006120778284612f1d565b60006120778284612f4c565b60006120778284612f6b565b6000612737826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166127b49092919063ffffffff16565b80519091501561266f57808060200190518101906127559190612ee7565b61266f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161061b565b60606127c384846000856127cb565b949350505050565b60608247101561282c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161061b565b843b61287a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161061b565b600080866001600160a01b031685876040516128969190612fb9565b60006040518083038185875af1925050503d80600081146128d3576040519150601f19603f3d011682016040523d82523d6000602084013e6128d8565b606091505b50915091506128e88282866128f3565b979650505050505050565b60608315612902575081612077565b8251156129125782518084602001fd5b8160405162461bcd60e51b815260040161061b9190612fd5565b80356001600160a01b0381168114611f0557600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561298257612982612943565b604052919050565b600067ffffffffffffffff8211156129a4576129a4612943565b5060051b60200190565b600082601f8301126129bf57600080fd5b813560206129d46129cf8361298a565b612959565b82815260059290921b840181019181810190868411156129f357600080fd5b8286015b84811015612a0e57803583529183019183016129f7565b509695505050505050565b600080600060608486031215612a2e57600080fd5b612a378461292c565b925060208085013567ffffffffffffffff80821115612a5557600080fd5b818701915087601f830112612a6957600080fd5b8135612a776129cf8261298a565b81815260059190911b8301840190848101908a831115612a9657600080fd5b938501935b82851015612abb57612aac8561292c565b82529385019390850190612a9b565b965050506040870135925080831115612ad357600080fd5b5050612ae1868287016129ae565b9150509250925092565b600060208284031215612afd57600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b81811015612b3c57835183529284019291840191600101612b20565b50909695505050505050565b60008060408385031215612b5b57600080fd5b82359150612b6b6020840161292c565b90509250929050565b60008060408385031215612b8757600080fd5b50508035926020909101359150565b600080600060608486031215612bab57600080fd5b505081359360208301359350604090920135919050565b8015158114612bd057600080fd5b50565b60008060408385031215612be657600080fd5b823591506020830135612bf881612bc2565b809150509250929050565b600080600060608486031215612c1857600080fd5b612c218461292c565b9250612c2f6020850161292c565b9150612c3d6040850161292c565b90509250925092565b600060208284031215612c5857600080fd5b6120778261292c565b634e487b7160e01b600052603260045260246000fd5b60208082526029908201527f46697865645261746545786368616e67653a20696e76616c69642065786368616040820152683733b29037bbb732b960b91b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252602b908201527f46697865645261746545786368616e67653a2045786368616e676520646f657360408201526a206e6f742065786973742160a81b606082015260800190565b60208082526029908201527f46697865645261746545786368616e67653a207a65726f206461746120746f6b604082015268195b88185b5bdd5b9d60ba1b606082015260800190565b60208082526036908201527f46697865645261746545786368616e67653a205468697320616464726573732060408201527506973206e6f7420616c6c6f77656420746f20737761760541b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115612e32578160001904821115612e1857612e18612de1565b80851615612e2557918102915b93841c9390800290612dfc565b509250929050565b600082612e4957506001612239565b81612e5657506000612239565b8160018114612e6c5760028114612e7657612e92565b6001915050612239565b60ff841115612e8757612e87612de1565b50506001821b612239565b5060208310610133831016604e8410600b8410161715612eb5575081810a612239565b612ebf8383612df7565b8060001904821115612ed357612ed3612de1565b029392505050565b60006120778383612e3a565b600060208284031215612ef957600080fd5b815161207781612bc2565b600060208284031215612f1657600080fd5b5051919050565b600082821015612f2f57612f2f612de1565b500390565b60008219821115612f4757612f47612de1565b500190565b6000816000190483118215151615612f6657612f66612de1565b500290565b600082612f8857634e487b7160e01b600052601260045260246000fd5b500490565b60005b83811015612fa8578181015183820152602001612f90565b838111156126b85750506000910152565b60008251612fcb818460208701612f8d565b9190910192915050565b6020815260008251806020840152612ff4816040850160208701612f8d565b601f01601f1916919091016040019291505056fea2646970667358221220ae3733c86a7fbdeda1e535bdcf4c655711beee316c6fde6e837493eeb818cb9764736f6c634300080a0033",linkReferences:{},deployedLinkReferences:{}};exports.FixedRateCreateProgressStep=void 0,(L=exports.FixedRateCreateProgressStep||(exports.FixedRateCreateProgressStep={}))[L.CreatingExchange=0]="CreatingExchange",L[L.ApprovingDatatoken=1]="ApprovingDatatoken";var _={_format:"hh-sol-artifact-1",contractName:"ERC20TemplateEnterprise",sourceName:"contracts/templates/ERC20TemplateEnterprise.sol",abi:[{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"signer",type:"address"},{indexed:!1,internalType:"uint256",name:"timestamp",type:"uint256"},{indexed:!1,internalType:"uint256",name:"blockNumber",type:"uint256"}],name:"AddedMinter",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"signer",type:"address"},{indexed:!1,internalType:"uint256",name:"timestamp",type:"uint256"},{indexed:!1,internalType:"uint256",name:"blockNumber",type:"uint256"}],name:"AddedPaymentManager",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"owner",type:"address"},{indexed:!0,internalType:"address",name:"spender",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Approval",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"buyer",type:"address"},{indexed:!1,internalType:"uint256",name:"baseTokenAmount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"marketFeeAmount",type:"uint256"}],name:"BuyAndOrder",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"signer",type:"address"},{indexed:!1,internalType:"uint256",name:"timestamp",type:"uint256"},{indexed:!1,internalType:"uint256",name:"blockNumber",type:"uint256"}],name:"CleanedPermissions",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"currentMinter",type:"address"},{indexed:!1,internalType:"address",name:"newMinter",type:"address"}],name:"MinterApproved",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"currentMinter",type:"address"},{indexed:!1,internalType:"address",name:"newMinter",type:"address"}],name:"MinterProposed",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"bytes32",name:"exchangeId",type:"bytes32"},{indexed:!1,internalType:"address",name:"owner",type:"address"}],name:"NewFixedRate",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"caller",type:"address"},{indexed:!0,internalType:"address",name:"_newPaymentCollector",type:"address"},{indexed:!1,internalType:"uint256",name:"timestamp",type:"uint256"},{indexed:!1,internalType:"uint256",name:"blockNumber",type:"uint256"}],name:"NewPaymentCollector",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"poolAddress",type:"address"},{indexed:!1,internalType:"address",name:"ssContract",type:"address"},{indexed:!1,internalType:"address",name:"basetokenAddress",type:"address"}],name:"NewPool",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"consumer",type:"address"},{indexed:!1,internalType:"address",name:"payer",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"serviceIndex",type:"uint256"},{indexed:!1,internalType:"uint256",name:"timestamp",type:"uint256"},{indexed:!0,internalType:"address",name:"publishMarketAddress",type:"address"},{indexed:!1,internalType:"uint256",name:"blockNumber",type:"uint256"}],name:"OrderStarted",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"providerFeeAddress",type:"address"},{indexed:!0,internalType:"address",name:"providerFeeToken",type:"address"},{indexed:!1,internalType:"uint256",name:"providerFeeAmount",type:"uint256"},{indexed:!1,internalType:"bytes",name:"providerData",type:"bytes"},{indexed:!1,internalType:"uint8",name:"v",type:"uint8"},{indexed:!1,internalType:"bytes32",name:"r",type:"bytes32"},{indexed:!1,internalType:"bytes32",name:"s",type:"bytes32"}],name:"ProviderFees",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"PublishMarketFeeAddress",type:"address"},{indexed:!0,internalType:"address",name:"PublishMarketFeeToken",type:"address"},{indexed:!1,internalType:"uint256",name:"PublishMarketFeeAmount",type:"uint256"}],name:"PublishMarketFees",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"caller",type:"address"},{indexed:!1,internalType:"address",name:"PublishMarketFeeAddress",type:"address"},{indexed:!1,internalType:"address",name:"PublishMarketFeeToken",type:"address"},{indexed:!1,internalType:"uint256",name:"PublishMarketFeeAmount",type:"uint256"}],name:"PublishMarketFeesChanged",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"signer",type:"address"},{indexed:!1,internalType:"uint256",name:"timestamp",type:"uint256"},{indexed:!1,internalType:"uint256",name:"blockNumber",type:"uint256"}],name:"RemovedMinter",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"signer",type:"address"},{indexed:!1,internalType:"uint256",name:"timestamp",type:"uint256"},{indexed:!1,internalType:"uint256",name:"blockNumber",type:"uint256"}],name:"RemovedPaymentManager",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Transfer",type:"event"},{stateMutability:"payable",type:"fallback"},{inputs:[],name:"BASE",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"BASE_COMMUNITY_FEE_PERCENTAGE",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"DOMAIN_SEPARATOR",outputs:[{internalType:"bytes32",name:"",type:"bytes32"}],stateMutability:"view",type:"function"},{inputs:[],name:"PERMIT_TYPEHASH",outputs:[{internalType:"bytes32",name:"",type:"bytes32"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"_minter",type:"address"}],name:"addMinter",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"_paymentManager",type:"address"}],name:"addPaymentManager",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"owner",type:"address"},{internalType:"address",name:"spender",type:"address"}],name:"allowance",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"approve",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"",type:"uint256"}],name:"authERC20",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"account",type:"address"}],name:"balanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"amount",type:"uint256"}],name:"burn",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"account",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"burnFrom",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{components:[{internalType:"address",name:"consumer",type:"address"},{internalType:"uint256",name:"serviceIndex",type:"uint256"},{internalType:"address",name:"providerFeeAddress",type:"address"},{internalType:"address",name:"providerFeeToken",type:"address"},{internalType:"uint256",name:"providerFeeAmount",type:"uint256"},{internalType:"uint8",name:"v",type:"uint8"},{internalType:"bytes32",name:"r",type:"bytes32"},{internalType:"bytes32",name:"s",type:"bytes32"},{internalType:"bytes",name:"providerData",type:"bytes"}],internalType:"struct ERC20TemplateEnterprise.OrderParams",name:"_orderParams",type:"tuple"},{internalType:"address",name:"dispenserContract",type:"address"}],name:"buyFromDispenserAndOrder",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{components:[{internalType:"address",name:"consumer",type:"address"},{internalType:"uint256",name:"serviceIndex",type:"uint256"},{internalType:"address",name:"providerFeeAddress",type:"address"},{internalType:"address",name:"providerFeeToken",type:"address"},{internalType:"uint256",name:"providerFeeAmount",type:"uint256"},{internalType:"uint8",name:"v",type:"uint8"},{internalType:"bytes32",name:"r",type:"bytes32"},{internalType:"bytes32",name:"s",type:"bytes32"},{internalType:"bytes",name:"providerData",type:"bytes"}],internalType:"struct ERC20TemplateEnterprise.OrderParams",name:"_orderParams",type:"tuple"},{components:[{internalType:"address",name:"exchangeContract",type:"address"},{internalType:"bytes32",name:"exchangeId",type:"bytes32"},{internalType:"uint256",name:"maxBaseTokenAmount",type:"uint256"},{internalType:"uint256",name:"swapMarketFee",type:"uint256"},{internalType:"address",name:"marketFeeAddress",type:"address"}],internalType:"struct ERC20TemplateEnterprise.FreParams",name:"_freParams",type:"tuple"}],name:"buyFromFreAndOrder",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"cap",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"cleanFrom721",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"cleanPermissions",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"_dispenser",type:"address"},{internalType:"uint256",name:"maxTokens",type:"uint256"},{internalType:"uint256",name:"maxBalance",type:"uint256"},{internalType:"bool",name:"withMint",type:"bool"}],name:"createDispenser",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"fixedPriceAddress",type:"address"},{internalType:"address[]",name:"addresses",type:"address[]"},{internalType:"uint256[]",name:"uints",type:"uint256[]"}],name:"createFixedRate",outputs:[{internalType:"bytes32",name:"exchangeId",type:"bytes32"}],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"decimals",outputs:[{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"pure",type:"function"},{inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"subtractedValue",type:"uint256"}],name:"decreaseAllowance",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"getERC721Address",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"getId",outputs:[{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"pure",type:"function"},{inputs:[],name:"getPaymentCollector",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"user",type:"address"}],name:"getPermissions",outputs:[{components:[{internalType:"bool",name:"minter",type:"bool"},{internalType:"bool",name:"paymentManager",type:"bool"}],internalType:"struct ERC20Roles.RolesERC20",name:"",type:"tuple"}],stateMutability:"view",type:"function"},{inputs:[],name:"getPublishingMarketFee",outputs:[{internalType:"address",name:"",type:"address"},{internalType:"address",name:"",type:"address"},{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"addedValue",type:"uint256"}],name:"increaseAllowance",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"string[]",name:"strings_",type:"string[]"},{internalType:"address[]",name:"addresses_",type:"address[]"},{internalType:"address[]",name:"factoryAddresses_",type:"address[]"},{internalType:"uint256[]",name:"uints_",type:"uint256[]"},{internalType:"bytes[]",name:"bytes_",type:"bytes[]"}],name:"initialize",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"user",type:"address"}],name:"isERC20Deployer",outputs:[{internalType:"bool",name:"deployer",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"isInitialized",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"account",type:"address"}],name:"isMinter",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"account",type:"address"},{internalType:"uint256",name:"value",type:"uint256"}],name:"mint",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"name",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"",type:"address"}],name:"nonces",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"",type:"address"}],name:"permissions",outputs:[{internalType:"bool",name:"minter",type:"bool"},{internalType:"bool",name:"paymentManager",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"owner",type:"address"},{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"value",type:"uint256"},{internalType:"uint256",name:"deadline",type:"uint256"},{internalType:"uint8",name:"v",type:"uint8"},{internalType:"bytes32",name:"r",type:"bytes32"},{internalType:"bytes32",name:"s",type:"bytes32"}],name:"permit",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"_minter",type:"address"}],name:"removeMinter",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"_paymentManager",type:"address"}],name:"removePaymentManager",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"router",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes",name:"_value",type:"bytes"}],name:"setData",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"_newPaymentCollector",type:"address"}],name:"setPaymentCollector",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"_publishMarketFeeAddress",type:"address"},{internalType:"address",name:"_publishMarketFeeToken",type:"address"},{internalType:"uint256",name:"_publishMarketFeeAmount",type:"uint256"}],name:"setPublishingMarketFee",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"consumer",type:"address"},{internalType:"uint256",name:"serviceIndex",type:"uint256"},{internalType:"address",name:"providerFeeAddress",type:"address"},{internalType:"address",name:"providerFeeToken",type:"address"},{internalType:"uint256",name:"providerFeeAmount",type:"uint256"},{internalType:"uint8",name:"v",type:"uint8"},{internalType:"bytes32",name:"r",type:"bytes32"},{internalType:"bytes32",name:"s",type:"bytes32"},{internalType:"bytes",name:"providerData",type:"bytes"}],name:"startOrder",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"symbol",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[],name:"totalSupply",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"recipient",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transfer",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"sender",type:"address"},{internalType:"address",name:"recipient",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transferFrom",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"withdrawETH",outputs:[],stateMutability:"payable",type:"function"}],bytecode:"0x6080604052600a805460ff60a01b191690553480156200001e57600080fd5b5060408051808201825260048152631d195cdd60e21b60208083019182528351808501909452600a8452691d195cdd14de5b589bdb60b21b9084015281519192916200006d916003916200008c565b508051620000839060049060208401906200008c565b5050506200016f565b8280546200009a9062000132565b90600052602060002090601f016020900481019282620000be576000855562000109565b82601f10620000d957805160ff191683800117855562000109565b8280016001018555821562000109579182015b8281111562000109578251825591602001919060010190620000ec565b50620001179291506200011b565b5090565b5b808211156200011757600081556001016200011c565b600181811c908216806200014757607f821691505b602082108114156200016957634e487b7160e01b600052602260045260246000fd5b50919050565b61466c806200017f6000396000f3fe60806040526004361061027d5760003560e01c806379cc67901161014e578063ab62f0e1116100bb578063e487c2e811610077578063e487c2e8146108b1578063ec342ad0146108c6578063ee88ade1146108e2578063ef867ff414610902578063f887ea4014610922578063f94bb4211461094257005b8063ab62f0e1146107ee578063b2263a5d1461080e578063b3998be014610823578063d505accf14610843578063dd62ed3e14610863578063e086e5ec146108a957005b8063983b2d561161010a578063983b2d56146107155780639b4f44b614610735578063a457c2d714610755578063a9059cbb14610775578063aa271e1a14610795578063aa492ef9146107ce57005b806379cc67901461065e5780637ecebe001461067e57806382c03da5146106ab5780638b96412b146106c057806395d89b41146106e057806396fb3eaf146106f557005b8063355274ea116101ec57806342966c68116101a857806342966c681461059f5780634f189cb2146105bf57806357a3a31b146105d457806357ad5ff6146105f45780635d1ca6311461061457806370a082311461062857005b8063355274ea146104d95780633644e515146104ee578063392e53cd146105045780633950935114610523578063397b37431461054357806340c10f191461057f57005b806318636d3c1161023b57806318636d3c1461040357806323b872dd1461042357806325b00243146104435780633092afd51461046357806330adf81f14610483578063313ce567146104b757005b80627ffb781461027f57806301e88208146102b657806306fdde0314610306578063095ea7b314610328578063160a79251461035857806318160ddd146103e4575b005b34801561028b57600080fd5b50600b546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102c257600080fd5b506102ef6102d13660046137b5565b60056020526000908152604090205460ff8082169161010090041682565b6040805192151583529015156020830152016102ad565b34801561031257600080fd5b5061031b610962565b6040516102ad919061382a565b34801561033457600080fd5b5061034861034336600461383d565b6109f4565b60405190151581526020016102ad565b34801561036457600080fd5b506103c56103733660046137b5565b6040805180820190915260008082526020820152506001600160a01b031660009081526005602090815260409182902082518084019093525460ff808216151584526101009091041615159082015290565b60408051825115158152602092830151151592810192909252016102ad565b3480156103f057600080fd5b506002545b6040519081526020016102ad565b34801561040f57600080fd5b5061027d61041e366004613a38565b610a0a565b34801561042f57600080fd5b5061034861043e366004613a89565b610b1b565b34801561044f57600080fd5b5061027d61045e3660046137b5565b610bc7565b34801561046f57600080fd5b5061027d61047e3660046137b5565b610c61565b34801561048f57600080fd5b506103f57f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b3480156104c357600080fd5b5060125b60405160ff90911681526020016102ad565b3480156104e557600080fd5b506009546103f5565b3480156104fa57600080fd5b506103f560105481565b34801561051057600080fd5b50600a54600160a01b900460ff16610348565b34801561052f57600080fd5b5061034861053e36600461383d565b610cf8565b34801561054f57600080fd5b50600d54600e54600f54604080516001600160a01b039485168152939092166020840152908201526060016102ad565b34801561058b57600080fd5b5061027d61059a36600461383d565b610d34565b3480156105ab57600080fd5b5061027d6105ba366004613aca565b610e05565b3480156105cb57600080fd5b5061027d610e0f565b3480156105e057600080fd5b5061027d6105ef3660046137b5565b610ef6565b34801561060057600080fd5b5061027d61060f366004613a89565b611038565b34801561062057600080fd5b5060026104c7565b34801561063457600080fd5b506103f56106433660046137b5565b6001600160a01b031660009081526020819052604090205490565b34801561066a57600080fd5b5061027d61067936600461383d565b61118c565b34801561068a57600080fd5b506103f56106993660046137b5565b60116020526000908152604090205481565b3480156106b757600080fd5b5061027d61120d565b3480156106cc57600080fd5b506103f56106db366004613b71565b611267565b3480156106ec57600080fd5b5061031b611428565b34801561070157600080fd5b506103486107103660046137b5565b611437565b34801561072157600080fd5b5061027d6107303660046137b5565b6114b2565b34801561074157600080fd5b5061027d610750366004613c46565b611549565b34801561076157600080fd5b5061034861077036600461383d565b611565565b34801561078157600080fd5b5061034861079036600461383d565b6115fe565b3480156107a157600080fd5b506103486107b03660046137b5565b6001600160a01b031660009081526005602052604090205460ff1690565b3480156107da57600080fd5b5061027d6107e93660046137b5565b61160b565b3480156107fa57600080fd5b5061027d610809366004613cf2565b6116a2565b34801561081a57600080fd5b506103f56117d3565b34801561082f57600080fd5b5061034861083e366004613dae565b6117e9565b34801561084f57600080fd5b5061027d61085e366004613e9e565b611923565b34801561086f57600080fd5b506103f561087e366004613f0c565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61027d611b2a565b3480156108bd57600080fd5b50610299611b6a565b3480156108d257600080fd5b506103f5670de0b6b3a764000081565b3480156108ee57600080fd5b5061027d6108fd366004613f3a565b611bff565b34801561090e57600080fd5b5061029961091d366004613aca565b611fdd565b34801561092e57600080fd5b50601254610299906001600160a01b031681565b34801561094e57600080fd5b5061027d61095d366004613fea565b612007565b60606007805461097190614034565b80601f016020809104026020016040519081016040528092919081815260200182805461099d90614034565b80156109ea5780601f106109bf576101008083540402835291602001916109ea565b820191906000526020600020905b8154815290600101906020018083116109cd57829003601f168201915b5050505050905090565b6000610a0133848461212a565b50600192915050565b604051631d746d8360e01b8152306004820152670de0b6b3a764000060248201819052336044830152906001600160a01b03831690631d746d8390606401600060405180830381600087803b158015610a6257600080fd5b505af1158015610a76573d6000803e3d6000fd5b50503360009081526020819052604090205483925090501015610ae05760405162461bcd60e51b815260206004820152601f60248201527f556e61626c6520746f206765742044542066726f6d2044697370656e7365720060448201526064015b60405180910390fd5b610b16836000015184602001518560400151866060015187608001518860a001518960c001518a60e001518b610100015161224e565b505050565b6000610b2884848461267e565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610bad5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610ad7565b610bba853385840361212a565b60019150505b9392505050565b600b5460405163160a792560e01b81523360048201526001600160a01b039091169063160a7925906024016080604051808303816000875af1158015610c11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c35919061406f565b60200151610c555760405162461bcd60e51b8152600401610ad7906140f3565b610c5e8161284c565b50565b600b5460405163160a792560e01b81523360048201526001600160a01b039091169063160a7925906024016080604051808303816000875af1158015610cab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ccf919061406f565b60200151610cef5760405162461bcd60e51b8152600401610ad7906140f3565b610c5e816128b9565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610a01918590610d2f90869061413e565b61212a565b3360009081526005602052604090205460ff16610d935760405162461bcd60e51b815260206004820152601960248201527f455243323054656d706c6174653a204e4f54204d494e544552000000000000006044820152606401610ad7565b600954610da982610da360025490565b90612919565b1115610df75760405162461bcd60e51b815260206004820152601f60248201527f44617461546f6b656e54656d706c6174653a20636170206578636565646564006044820152606401610ad7565b610e018282612925565b5050565b610c5e3382612a04565b600b546040516331a9108f60e11b8152600160048201526001600160a01b0390911690636352211e90602401602060405180830381865afa158015610e58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e7c9190614156565b6001600160a01b0316336001600160a01b031614610edc5760405162461bcd60e51b815260206004820152601b60248201527f455243323054656d706c6174653a206e6f74204e46544f776e657200000000006044820152606401610ad7565b610ee4612b52565b600c80546001600160a01b0319169055565b33600090815260056020526040902054610100900460ff1680610f875750600b5460405163160a792560e01b81523360048201526001600160a01b039091169063160a7925906024016080604051808303816000875af1158015610f5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f82919061406f565b602001515b610fe75760405162461bcd60e51b815260206004820152602b60248201527f455243323054656d706c6174653a204e4f54205041594d454e54204d414e414760448201526a22a91037b91027aba722a960a91b6064820152608401610ad7565b610ff081612c01565b604080514281524360208201526001600160a01b0383169133917f4d7694d695c57cc54947177c8e8a0e61aae664e9223492a798c32fadfc6419cc910160405180910390a350565b600d546001600160a01b031633146110a55760405162461bcd60e51b815260206004820152602a60248201527f455243323054656d706c6174653a206e6f74207075626c6973684d61726b65746044820152694665654164647265737360b01b6064820152608401610ad7565b6001600160a01b03831661110c5760405162461bcd60e51b815260206004820152602860248201527f496e76616c6964205f7075626c6973684d61726b657446656541646472657373604482015267206164647265737360c01b6064820152608401610ad7565b600d80546001600160a01b038581166001600160a01b03199283168117909355600e8054918616919092168117909155600f839055604080513381526020810193909352820152606081018290527fe0b85b6f04fa914cf57f6401c5672a83a32b1c388d194c3d78e17f2897d46f439060800160405180910390a1505050565b6000611198833361087e565b9050818110156111f65760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f77604482015263616e636560e01b6064820152608401610ad7565b611203833384840361212a565b610b168383612a04565b600b546001600160a01b03163314610edc5760405162461bcd60e51b815260206004820152601f60248201527f455243323054656d706c6174653a204e4f542037323120436f6e7472616374006044820152606401610ad7565b600b5460405163160a792560e01b81523360048201526000916001600160a01b03169063160a7925906024016080604051808303816000875af11580156112b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112d6919061406f565b602001516112f65760405162461bcd60e51b8152600401610ad7906140f3565b308360038151811061130a5761130a614173565b6001600160a01b039283166020918202929092010152601254604051638244937560e01b815291169063824493759061134b90879087908790600401614189565b6020604051808303816000875af115801561136a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061138e919061421d565b90506000826004815181106113a5576113a5614173565b602002602001015111156113bc576113bc84612c23565b7f195d202f33578769e120c3041341554af3193e67ee004175095bc9c06e6e616581846000815181106113f1576113f1614173565b60200260200101516040516114199291909182526001600160a01b0316602082015260400190565b60405180910390a19392505050565b60606008805461097190614034565b600b5460405163160a792560e01b81526001600160a01b038381166004830152600092169063160a7925906024016080604051808303816000875af1158015611484573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a8919061406f565b6020015192915050565b600b5460405163160a792560e01b81523360048201526001600160a01b039091169063160a7925906024016080604051808303816000875af11580156114fc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611520919061406f565b602001516115405760405162461bcd60e51b8152600401610ad7906140f3565b610c5e81612c23565b61155a89898989898989898961224e565b505050505050505050565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156115e75760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610ad7565b6115f4338585840361212a565b5060019392505050565b6000610a0133848461267e565b600b5460405163160a792560e01b81523360048201526001600160a01b039091169063160a7925906024016080604051808303816000875af1158015611655573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611679919061406f565b602001516116995760405162461bcd60e51b8152600401610ad7906140f3565b610c5e81612d1d565b600b5460405163160a792560e01b81523360048201526001600160a01b039091169063160a7925906024016080604051808303816000875af11580156116ec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611710919061406f565b602001516117305760405162461bcd60e51b8152600401610ad7906140f3565b6040516bffffffffffffffffffffffff193060601b16602082015260009060340160408051601f19818403018152908290528051602090910120600b546301caf8fd60e31b83529092506001600160a01b031690630e57c7e89061179c90849087908790600401614236565b600060405180830381600087803b1580156117b657600080fd5b505af11580156117ca573d6000803e3d6000fd5b50505050505050565b6117e66064670de0b6b3a764000061426c565b81565b600a54600090600160a01b900460ff16156118605760405162461bcd60e51b815260206004820152603160248201527f455243323054656d706c6174653a20746f6b656e20696e7374616e636520616c6044820152701c9958591e481a5b9a5d1a585b1a5e9959607a1b6064820152608401610ad7565b61191461186d8b8d61428e565b8a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808e0282810182019093528d82529093508d92508c91829185019084908082843760009201919091525050604080516020808d0282810182019093528c82529093508c92508b91829185019084908082843760009201919091525061190f92508991508a9050614315565b612e2b565b9b9a5050505050505050505050565b438410156119665760405162461bcd60e51b815260206004820152601060248201526f115490cc8c11150e881156141254915160821b6044820152606401610ad7565b6010546001600160a01b038816600090815260116020526040812080549192917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b9190876119b98361437c565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e00160405160208183030381529060405280519060200120604051602001611a3292919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015611a9d573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590611ad35750886001600160a01b0316816001600160a01b0316145b611b1f5760405162461bcd60e51b815260206004820152601a60248201527f455243323044543a20494e56414c49445f5349474e41545552450000000000006044820152606401610ad7565b61155a89898961212a565b611b32611b6a565b6001600160a01b03166108fc479081150290604051600060405180830381858888f19350505050158015610c5e573d6000803e3d6000fd5b600c546000906001600160a01b0316611bef57600b546040516331a9108f60e11b8152600160048201526001600160a01b0390911690636352211e90602401602060405180830381865afa158015611bc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bea9190614156565b905090565b50600c546001600160a01b031690565b80516020820151604051634c87087d60e01b815260009283926001600160a01b0390911691634c87087d91611c3a9160040190815260200190565b61018060405180830381865afa158015611c58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c7c9190614397565b5050505050505050935050925050306001600160a01b0316826001600160a01b031614611cfb5760405162461bcd60e51b815260206004820152602760248201527f5468697320466978656452617465206973206e6f742070726f766964696e67206044820152661d1a1a5cc8111560ca1b6064820152608401610ad7565b8251602084015160405163c99733a760e01b81526004810191909152670de0b6b3a7640000602482015260009182916001600160a01b039091169063c99733a790604401608060405180830381865afa158015611d5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d809190614454565b5050915091508460400151821115611dea5760405162461bcd60e51b815260206004820152602760248201527f46697865645261746545786368616e67653a20546f6f206d616e79206261736560448201526620746f6b656e7360c81b6064820152608401610ad7565b6000670de0b6b3a7640000866060015183611e05919061448a565b611e0f919061426c565b9050611e1b818461413e565b9250611e326001600160a01b03851633308661332a565b8551611e49906001600160a01b0386169085613395565b8551602087015160405163412dae6b60e11b81526004810191909152670de0b6b3a76400006024820152604481018590526001600160a01b039091169063825b5cd690606401600060405180830381600087803b158015611ea957600080fd5b505af1158015611ebd573d6000803e3d6000fd5b505030600090815260208190526040902054670de0b6b3a7640000925090501015611f2a5760405162461bcd60e51b815260206004820152601f60248201527f556e61626c6520746f206275792044542066726f6d20466978656452617465006044820152606401610ad7565b611f3d3033670de0b6b3a764000061267e565b611f738760000151886020015189604001518a606001518b608001518c60a001518d60c001518e60e001518f610100015161224e565b8015611f93576080860151611f93906001600160a01b0386169083613447565b60408051338152602081018590529081018290527fe89458a7527f4bf466ab18794ab8b1ca208b478483a1a87bcf0d976d421b4aff9060600160405180910390a150505050505050565b60068181548110611fed57600080fd5b6000918252602090912001546001600160a01b0316905081565b600b5460405163160a792560e01b81523360048201526001600160a01b039091169063160a7925906024016080604051808303816000875af1158015612051573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612075919061406f565b602001516120955760405162461bcd60e51b8152600401610ad7906140f3565b601254604051636b14d00560e11b81526001600160a01b0386811660048301523060248301819052604483018790526064830186905233608484015260a48301529091169063d629a00a9060c401600060405180830381600087803b1580156120fd57600080fd5b505af1158015612111573d6000803e3d6000fd5b5050505080156121245761212484612c23565b50505050565b6001600160a01b03831661218c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ad7565b6001600160a01b0382166121ed5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ad7565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b33600090815260208190526040812054670de0b6b3a764000091908211156122c65760405162461bcd60e51b815260206004820152602560248201527f4e6f7420656e6f756768204461746120546f6b656e7320746f2073746172742060448201526427b93232b960d91b6064820152608401610ad7565b600d5460408051338152602081018590529081018c90524260608201524360808201526001600160a01b03918216918d16907fe1c4fa794edfa8f619b8257a077398950357b9c6398528f94480307352f9afcc9060a00160405180910390a36000600f541180156123415750600e546001600160a01b031615155b80156123575750600d546001600160a01b031615155b1561248257600f54600e5461237b916001600160a01b03909116903390309061332a565b600f54612389906064613477565b600d54600f549192506123bf916001600160a01b03909116906123ac9084613483565b600e546001600160a01b03169190613447565b600e54600d54600f546001600160a01b0392831692909116907ff666b31c81334b6085802ba4149907fa724689d43bc31df6de1a51291ddc55b4906124049085613483565b60405190815260200160405180910390a3801561248257600a54600e54612438916001600160a01b03918216911683613447565b600e54600a546040518381526001600160a01b0392831692909116907ff666b31c81334b6085802ba4149907fa724689d43bc31df6de1a51291ddc55b49060200160405180910390a35b60006040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152509050600081858c8c8c6040516020016124d694939291906144a9565b604051602081830303815290604052805190602001206040516020016124fd9291906144ef565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff8c1692840192909252606083018a9052608083018990529092509060019060a0016020604051602081039080840390855afa158015612568573d6000803e3d6000fd5b5050506020604051035190508b6001600160a01b0316816001600160a01b0316146125cc5760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642070726f76696465722066656560601b6044820152606401610ad7565b8a6001600160a01b03168c6001600160a01b03167f144fc6ed7d0a617ba44a01131b1f724d0370297a3640b6201f343e081ada64468c898d8d8d604051612617959493929190614511565b60405180910390a360008a11801561263757506001600160a01b038b1615155b801561264b57506001600160a01b038c1615155b15612665576126656001600160a01b038c16338e8d61332a565b61266e85610e05565b5050505050505050505050505050565b6001600160a01b0383166126e25760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610ad7565b6001600160a01b0382166127445760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610ad7565b6001600160a01b038316600090815260208190526040902054818110156127bc5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610ad7565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906127f390849061413e565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161283f91815260200190565b60405180910390a3612124565b6001600160a01b03811660008181526005602052604090819020805461ff00191681559051909133917faee911eec8b2df8f3ae0464841541b1e5f339519bd5cf51889fe8b07fecff658906128ad9042904390918252602082015260400190565b60405180910390a35050565b6001600160a01b03811660008181526005602052604090819020805460ff191681559051909133917fefa2735987005aaa89c050c0ff8cc9ae7d9079d19382081c429130f98c52d480906128ad9042904390918252602082015260400190565b6000610bc0828461413e565b6001600160a01b03821661297b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610ad7565b806002600082825461298d919061413e565b90915550506001600160a01b038216600090815260208190526040812080548392906129ba90849061413e565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b038216612a645760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610ad7565b6001600160a01b03821660009081526020819052604090205481811015612ad85760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610ad7565b6001600160a01b0383166000908152602081905260408120838303905560028054849290612b0790849061454a565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b60005b600654811015612bb85760006005600060068481548110612b7857612b78614173565b60009182526020808320909101546001600160a01b031683528201929092526040019020805461ffff191690555080612bb08161437c565b915050612b55565b50612bc5600660006136d9565b6040805142815243602082015233917f712bc71db81927a76b8bf1ea346247bb0ad58f18e4e5c1bd4aa0ec6573e02a2b910160405180910390a2565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166000908152600560205260409020805460ff1615612c8d5760405162461bcd60e51b815260206004820152601d60248201527f4552433230526f6c65733a2020414c52454144592041204d494e5445520000006044820152606401610ad7565b8054600160ff19909116811782556006805491820181556000527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319166001600160a01b038416908117909155604080514281524360208201523392917f4f7e100eb1ee13e903798bd0d6aa854152e07eb05544f392b9409c12935c809591016128ad565b6001600160a01b03811660009081526005602052604090208054610100900460ff1615612d975760405162461bcd60e51b815260206004820152602260248201527f4552433230526f6c65733a2020414c5245414459204120464545204d414e414760448201526122a960f11b6064820152608401610ad7565b805461ff001916610100178155600680546001810182556000919091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0384166001600160a01b03199091168117909155604080514281524360208201523392917fb17da2e9910b4ba5754e8872385ba315a238bafb5ae221fc85093c33432c40a791016128ad565b60008084600081518110612e4157612e41614173565b60200260200101519050600085600181518110612e6057612e60614173565b6020026020010151905060006001600160a01b0316826001600160a01b03161415612ee25760405162461bcd60e51b815260206004820152602c60248201527f455243323054656d706c6174653a20496e76616c6964206d696e7465722c202060448201526b7a65726f206164647265737360a01b6064820152608401610ad7565b6001600160a01b038116612f5e5760405162461bcd60e51b815260206004820152603c60248201527f455243323054656d706c6174653a20496e76616c696420636f6d6d756e69747960448201527f2066656520636f6c6c6563746f722c207a65726f2061646472657373000000006064820152608401610ad7565b84600081518110612f7157612f71614173565b602002602001015160001415612fd55760405162461bcd60e51b8152602060048201526024808201527f44617461546f6b656e54656d706c6174653a20496e76616c6964206361702076604482015263616c756560e01b6064820152608401610ad7565b84600081518110612fe857612fe8614173565b60200260200101516009819055508760008151811061300957613009614173565b6020026020010151600790805190602001906130269291906136f7565b508760018151811061303a5761303a614173565b6020026020010151600890805190602001906130579291906136f7565b50600b80546001600160a01b0319166001600160a01b03841617905585518690600290811061308857613088614173565b6020908102919091010151601280546001600160a01b039283166001600160a01b0319909116179055600a80546001600160a81b03191691831691909117600160a01b17905586516130f29088906000906130e5576130e5614173565b6020026020010151612c23565b60006001600160a01b03168760018151811061311057613110614173565b60200260200101516001600160a01b0316146131ba576131498760018151811061313c5761313c614173565b6020026020010151612c01565b8660018151811061315c5761315c614173565b60200260200101516001600160a01b0316336001600160a01b03167f4d7694d695c57cc54947177c8e8a0e61aae664e9223492a798c32fadfc6419cc42436040516131b1929190918252602082015260400190565b60405180910390a35b866002815181106131cd576131cd614173565b6020026020010151600d60006101000a8154816001600160a01b0302191690836001600160a01b031602179055508660038151811061320e5761320e614173565b6020026020010151600e60006101000a8154816001600160a01b0302191690836001600160a01b031602179055508460018151811061324f5761324f614173565b6020026020010151600f8190555060004690507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60076040516132929190614561565b60408051918290038220828201825260018352603160f81b6020938401528151928301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018290523060a082015260c00160408051808303601f1901815291905280516020909101206010555050600a54600160a01b900460ff16979650505050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526121249085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261348f565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156133e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061340a919061421d565b613414919061413e565b6040516001600160a01b03851660248201526044810182905290915061212490859063095ea7b360e01b9060640161335e565b6040516001600160a01b038316602482015260448101829052610b1690849063a9059cbb60e01b9060640161335e565b6000610bc0828461426c565b6000610bc0828461454a565b60006134e4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166135619092919063ffffffff16565b805190915015610b16578080602001905181019061350291906145fd565b610b165760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610ad7565b60606135708484600085613578565b949350505050565b6060824710156135d95760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610ad7565b843b6136275760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610ad7565b600080866001600160a01b03168587604051613643919061461a565b60006040518083038185875af1925050503d8060008114613680576040519150601f19603f3d011682016040523d82523d6000602084013e613685565b606091505b50915091506136958282866136a0565b979650505050505050565b606083156136af575081610bc0565b8251156136bf5782518084602001fd5b8160405162461bcd60e51b8152600401610ad7919061382a565b5080546000825590600052602060002090810190610c5e919061377b565b82805461370390614034565b90600052602060002090601f016020900481019282613725576000855561376b565b82601f1061373e57805160ff191683800117855561376b565b8280016001018555821561376b579182015b8281111561376b578251825591602001919060010190613750565b5061377792915061377b565b5090565b5b80821115613777576000815560010161377c565b6001600160a01b0381168114610c5e57600080fd5b80356137b081613790565b919050565b6000602082840312156137c757600080fd5b8135610bc081613790565b60005b838110156137ed5781810151838201526020016137d5565b838111156121245750506000910152565b600081518084526138168160208601602086016137d2565b601f01601f19169290920160200192915050565b602081526000610bc060208301846137fe565b6000806040838503121561385057600080fd5b823561385b81613790565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b60405161012081016001600160401b03811182821017156138a2576138a2613869565b60405290565b60405160a081016001600160401b03811182821017156138a2576138a2613869565b604051601f8201601f191681016001600160401b03811182821017156138f2576138f2613869565b604052919050565b803560ff811681146137b057600080fd5b60006001600160401b0383111561392457613924613869565b613937601f8401601f19166020016138ca565b905082815283838301111561394b57600080fd5b828260208301376000602084830101529392505050565b600082601f83011261397357600080fd5b610bc08383356020850161390b565b6000610120828403121561399557600080fd5b61399d61387f565b90506139a8826137a5565b8152602082013560208201526139c0604083016137a5565b60408201526139d1606083016137a5565b6060820152608082013560808201526139ec60a083016138fa565b60a082015260c082013560c082015260e082013560e0820152610100808301356001600160401b03811115613a2057600080fd5b613a2c85828601613962565b82840152505092915050565b60008060408385031215613a4b57600080fd5b82356001600160401b03811115613a6157600080fd5b613a6d85828601613982565b9250506020830135613a7e81613790565b809150509250929050565b600080600060608486031215613a9e57600080fd5b8335613aa981613790565b92506020840135613ab981613790565b929592945050506040919091013590565b600060208284031215613adc57600080fd5b5035919050565b60006001600160401b03821115613afc57613afc613869565b5060051b60200190565b600082601f830112613b1757600080fd5b81356020613b2c613b2783613ae3565b6138ca565b82815260059290921b84018101918181019086841115613b4b57600080fd5b8286015b84811015613b665780358352918301918301613b4f565b509695505050505050565b600080600060608486031215613b8657600080fd5b8335613b9181613790565b92506020848101356001600160401b0380821115613bae57600080fd5b818701915087601f830112613bc257600080fd5b8135613bd0613b2782613ae3565b81815260059190911b8301840190848101908a831115613bef57600080fd5b938501935b82851015613c16578435613c0781613790565b82529385019390850190613bf4565b965050506040870135925080831115613c2e57600080fd5b5050613c3c86828701613b06565b9150509250925092565b60008060008060008060008060006101208a8c031215613c6557600080fd5b8935613c7081613790565b985060208a0135975060408a0135613c8781613790565b965060608a0135613c9781613790565b955060808a01359450613cac60a08b016138fa565b935060c08a0135925060e08a013591506101008a01356001600160401b03811115613cd657600080fd5b613ce28c828d01613962565b9150509295985092959850929598565b60008060208385031215613d0557600080fd5b82356001600160401b0380821115613d1c57600080fd5b818501915085601f830112613d3057600080fd5b813581811115613d3f57600080fd5b866020828501011115613d5157600080fd5b60209290920196919550909350505050565b60008083601f840112613d7557600080fd5b5081356001600160401b03811115613d8c57600080fd5b6020830191508360208260051b8501011115613da757600080fd5b9250929050565b60008060008060008060008060008060a08b8d031215613dcd57600080fd5b8a356001600160401b0380821115613de457600080fd5b613df08e838f01613d63565b909c509a5060208d0135915080821115613e0957600080fd5b613e158e838f01613d63565b909a50985060408d0135915080821115613e2e57600080fd5b613e3a8e838f01613d63565b909850965060608d0135915080821115613e5357600080fd5b613e5f8e838f01613d63565b909650945060808d0135915080821115613e7857600080fd5b50613e858d828e01613d63565b915080935050809150509295989b9194979a5092959850565b600080600080600080600060e0888a031215613eb957600080fd5b8735613ec481613790565b96506020880135613ed481613790565b95506040880135945060608801359350613ef0608089016138fa565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215613f1f57600080fd5b8235613f2a81613790565b91506020830135613a7e81613790565b60008082840360c0811215613f4e57600080fd5b83356001600160401b03811115613f6457600080fd5b613f7086828701613982565b93505060a0601f1982011215613f8557600080fd5b50613f8e6138a8565b6020840135613f9c81613790565b8082525060408401356020820152606084013560408201526080840135606082015260a0840135613fcc81613790565b6080820152919491935090915050565b8015158114610c5e57600080fd5b6000806000806080858703121561400057600080fd5b843561400b81613790565b93506020850135925060408501359150606085013561402981613fdc565b939692955090935050565b600181811c9082168061404857607f821691505b6020821081141561406957634e487b7160e01b600052602260045260246000fd5b50919050565b60006080828403121561408157600080fd5b604051608081018181106001600160401b03821117156140a3576140a3613869565b60405282516140b181613fdc565b815260208301516140c181613fdc565b602082015260408301516140d481613fdc565b604082015260608301516140e781613fdc565b60608201529392505050565b6020808252818101527f455243323054656d706c6174653a204e4f54204445504c4f59455220524f4c45604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561415157614151614128565b500190565b60006020828403121561416857600080fd5b8151610bc081613790565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b038481168252606060208084018290528551918401829052600092868201929091906080860190855b818110156141d75785518516835294830194918301916001016141b9565b5050858103604087015286518082529082019350915080860160005b8381101561420f578151855293820193908201906001016141f3565b509298975050505050505050565b60006020828403121561422f57600080fd5b5051919050565b83815260406020820152816040820152818360608301376000818301606090810191909152601f909201601f1916010192915050565b60008261428957634e487b7160e01b600052601260045260246000fd5b500490565b600061429c613b2784613ae3565b80848252602080830192508560051b8501368111156142ba57600080fd5b855b818110156143095780356001600160401b038111156142db5760008081fd5b870136601f8201126142ed5760008081fd5b6142fb36823586840161390b565b8652509382019382016142bc565b50919695505050505050565b6000614323613b2784613ae3565b80848252602080830192508560051b85013681111561434157600080fd5b855b818110156143095780356001600160401b038111156143625760008081fd5b61436e36828a01613962565b865250938201938201614343565b600060001982141561439057614390614128565b5060010190565b6000806000806000806000806000806000806101808d8f0312156143ba57600080fd5b8c516143c581613790565b60208e0151909c506143d681613790565b60408e015160608f0151919c509a506143ee81613790565b8099505060808d0151975060a08d0151965060c08d015161440e81613fdc565b8096505060e08d015194506101008d015193506101208d015192506101408d015191506101608d015161444081613fdc565b809150509295989b509295989b509295989b565b6000806000806080858703121561446a57600080fd5b505082516020840151604085015160609095015191969095509092509050565b60008160001904831182151516156144a4576144a4614128565b500290565b600085516144bb818460208a016137d2565b6bffffffffffffffffffffffff19606096871b8116919093019081529390941b166014830152602882015260480192915050565b600083516145018184602088016137d2565b9190910191825250602001919050565b85815260a06020820152600061452a60a08301876137fe565b60ff95909516604083015250606081019290925260809091015292915050565b60008282101561455c5761455c614128565b500390565b600080835481600182811c91508083168061457d57607f831692505b602080841082141561459d57634e487b7160e01b86526022600452602486fd5b8180156145b157600181146145c2576145ef565b60ff198616895284890196506145ef565b60008a81526020902060005b868110156145e75781548b8201529085019083016145ce565b505084890196505b509498975050505050505050565b60006020828403121561460f57600080fd5b8151610bc081613fdc565b6000825161462c8184602087016137d2565b919091019291505056fea26469706673582212209041cd5099503a2e31e599b01c0c938b713c90fa811d0e03aacc28d1251e8ce164736f6c634300080a0033",deployedBytecode:"0x60806040526004361061027d5760003560e01c806379cc67901161014e578063ab62f0e1116100bb578063e487c2e811610077578063e487c2e8146108b1578063ec342ad0146108c6578063ee88ade1146108e2578063ef867ff414610902578063f887ea4014610922578063f94bb4211461094257005b8063ab62f0e1146107ee578063b2263a5d1461080e578063b3998be014610823578063d505accf14610843578063dd62ed3e14610863578063e086e5ec146108a957005b8063983b2d561161010a578063983b2d56146107155780639b4f44b614610735578063a457c2d714610755578063a9059cbb14610775578063aa271e1a14610795578063aa492ef9146107ce57005b806379cc67901461065e5780637ecebe001461067e57806382c03da5146106ab5780638b96412b146106c057806395d89b41146106e057806396fb3eaf146106f557005b8063355274ea116101ec57806342966c68116101a857806342966c681461059f5780634f189cb2146105bf57806357a3a31b146105d457806357ad5ff6146105f45780635d1ca6311461061457806370a082311461062857005b8063355274ea146104d95780633644e515146104ee578063392e53cd146105045780633950935114610523578063397b37431461054357806340c10f191461057f57005b806318636d3c1161023b57806318636d3c1461040357806323b872dd1461042357806325b00243146104435780633092afd51461046357806330adf81f14610483578063313ce567146104b757005b80627ffb781461027f57806301e88208146102b657806306fdde0314610306578063095ea7b314610328578063160a79251461035857806318160ddd146103e4575b005b34801561028b57600080fd5b50600b546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102c257600080fd5b506102ef6102d13660046137b5565b60056020526000908152604090205460ff8082169161010090041682565b6040805192151583529015156020830152016102ad565b34801561031257600080fd5b5061031b610962565b6040516102ad919061382a565b34801561033457600080fd5b5061034861034336600461383d565b6109f4565b60405190151581526020016102ad565b34801561036457600080fd5b506103c56103733660046137b5565b6040805180820190915260008082526020820152506001600160a01b031660009081526005602090815260409182902082518084019093525460ff808216151584526101009091041615159082015290565b60408051825115158152602092830151151592810192909252016102ad565b3480156103f057600080fd5b506002545b6040519081526020016102ad565b34801561040f57600080fd5b5061027d61041e366004613a38565b610a0a565b34801561042f57600080fd5b5061034861043e366004613a89565b610b1b565b34801561044f57600080fd5b5061027d61045e3660046137b5565b610bc7565b34801561046f57600080fd5b5061027d61047e3660046137b5565b610c61565b34801561048f57600080fd5b506103f57f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b3480156104c357600080fd5b5060125b60405160ff90911681526020016102ad565b3480156104e557600080fd5b506009546103f5565b3480156104fa57600080fd5b506103f560105481565b34801561051057600080fd5b50600a54600160a01b900460ff16610348565b34801561052f57600080fd5b5061034861053e36600461383d565b610cf8565b34801561054f57600080fd5b50600d54600e54600f54604080516001600160a01b039485168152939092166020840152908201526060016102ad565b34801561058b57600080fd5b5061027d61059a36600461383d565b610d34565b3480156105ab57600080fd5b5061027d6105ba366004613aca565b610e05565b3480156105cb57600080fd5b5061027d610e0f565b3480156105e057600080fd5b5061027d6105ef3660046137b5565b610ef6565b34801561060057600080fd5b5061027d61060f366004613a89565b611038565b34801561062057600080fd5b5060026104c7565b34801561063457600080fd5b506103f56106433660046137b5565b6001600160a01b031660009081526020819052604090205490565b34801561066a57600080fd5b5061027d61067936600461383d565b61118c565b34801561068a57600080fd5b506103f56106993660046137b5565b60116020526000908152604090205481565b3480156106b757600080fd5b5061027d61120d565b3480156106cc57600080fd5b506103f56106db366004613b71565b611267565b3480156106ec57600080fd5b5061031b611428565b34801561070157600080fd5b506103486107103660046137b5565b611437565b34801561072157600080fd5b5061027d6107303660046137b5565b6114b2565b34801561074157600080fd5b5061027d610750366004613c46565b611549565b34801561076157600080fd5b5061034861077036600461383d565b611565565b34801561078157600080fd5b5061034861079036600461383d565b6115fe565b3480156107a157600080fd5b506103486107b03660046137b5565b6001600160a01b031660009081526005602052604090205460ff1690565b3480156107da57600080fd5b5061027d6107e93660046137b5565b61160b565b3480156107fa57600080fd5b5061027d610809366004613cf2565b6116a2565b34801561081a57600080fd5b506103f56117d3565b34801561082f57600080fd5b5061034861083e366004613dae565b6117e9565b34801561084f57600080fd5b5061027d61085e366004613e9e565b611923565b34801561086f57600080fd5b506103f561087e366004613f0c565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61027d611b2a565b3480156108bd57600080fd5b50610299611b6a565b3480156108d257600080fd5b506103f5670de0b6b3a764000081565b3480156108ee57600080fd5b5061027d6108fd366004613f3a565b611bff565b34801561090e57600080fd5b5061029961091d366004613aca565b611fdd565b34801561092e57600080fd5b50601254610299906001600160a01b031681565b34801561094e57600080fd5b5061027d61095d366004613fea565b612007565b60606007805461097190614034565b80601f016020809104026020016040519081016040528092919081815260200182805461099d90614034565b80156109ea5780601f106109bf576101008083540402835291602001916109ea565b820191906000526020600020905b8154815290600101906020018083116109cd57829003601f168201915b5050505050905090565b6000610a0133848461212a565b50600192915050565b604051631d746d8360e01b8152306004820152670de0b6b3a764000060248201819052336044830152906001600160a01b03831690631d746d8390606401600060405180830381600087803b158015610a6257600080fd5b505af1158015610a76573d6000803e3d6000fd5b50503360009081526020819052604090205483925090501015610ae05760405162461bcd60e51b815260206004820152601f60248201527f556e61626c6520746f206765742044542066726f6d2044697370656e7365720060448201526064015b60405180910390fd5b610b16836000015184602001518560400151866060015187608001518860a001518960c001518a60e001518b610100015161224e565b505050565b6000610b2884848461267e565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610bad5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610ad7565b610bba853385840361212a565b60019150505b9392505050565b600b5460405163160a792560e01b81523360048201526001600160a01b039091169063160a7925906024016080604051808303816000875af1158015610c11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c35919061406f565b60200151610c555760405162461bcd60e51b8152600401610ad7906140f3565b610c5e8161284c565b50565b600b5460405163160a792560e01b81523360048201526001600160a01b039091169063160a7925906024016080604051808303816000875af1158015610cab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ccf919061406f565b60200151610cef5760405162461bcd60e51b8152600401610ad7906140f3565b610c5e816128b9565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610a01918590610d2f90869061413e565b61212a565b3360009081526005602052604090205460ff16610d935760405162461bcd60e51b815260206004820152601960248201527f455243323054656d706c6174653a204e4f54204d494e544552000000000000006044820152606401610ad7565b600954610da982610da360025490565b90612919565b1115610df75760405162461bcd60e51b815260206004820152601f60248201527f44617461546f6b656e54656d706c6174653a20636170206578636565646564006044820152606401610ad7565b610e018282612925565b5050565b610c5e3382612a04565b600b546040516331a9108f60e11b8152600160048201526001600160a01b0390911690636352211e90602401602060405180830381865afa158015610e58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e7c9190614156565b6001600160a01b0316336001600160a01b031614610edc5760405162461bcd60e51b815260206004820152601b60248201527f455243323054656d706c6174653a206e6f74204e46544f776e657200000000006044820152606401610ad7565b610ee4612b52565b600c80546001600160a01b0319169055565b33600090815260056020526040902054610100900460ff1680610f875750600b5460405163160a792560e01b81523360048201526001600160a01b039091169063160a7925906024016080604051808303816000875af1158015610f5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f82919061406f565b602001515b610fe75760405162461bcd60e51b815260206004820152602b60248201527f455243323054656d706c6174653a204e4f54205041594d454e54204d414e414760448201526a22a91037b91027aba722a960a91b6064820152608401610ad7565b610ff081612c01565b604080514281524360208201526001600160a01b0383169133917f4d7694d695c57cc54947177c8e8a0e61aae664e9223492a798c32fadfc6419cc910160405180910390a350565b600d546001600160a01b031633146110a55760405162461bcd60e51b815260206004820152602a60248201527f455243323054656d706c6174653a206e6f74207075626c6973684d61726b65746044820152694665654164647265737360b01b6064820152608401610ad7565b6001600160a01b03831661110c5760405162461bcd60e51b815260206004820152602860248201527f496e76616c6964205f7075626c6973684d61726b657446656541646472657373604482015267206164647265737360c01b6064820152608401610ad7565b600d80546001600160a01b038581166001600160a01b03199283168117909355600e8054918616919092168117909155600f839055604080513381526020810193909352820152606081018290527fe0b85b6f04fa914cf57f6401c5672a83a32b1c388d194c3d78e17f2897d46f439060800160405180910390a1505050565b6000611198833361087e565b9050818110156111f65760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f77604482015263616e636560e01b6064820152608401610ad7565b611203833384840361212a565b610b168383612a04565b600b546001600160a01b03163314610edc5760405162461bcd60e51b815260206004820152601f60248201527f455243323054656d706c6174653a204e4f542037323120436f6e7472616374006044820152606401610ad7565b600b5460405163160a792560e01b81523360048201526000916001600160a01b03169063160a7925906024016080604051808303816000875af11580156112b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112d6919061406f565b602001516112f65760405162461bcd60e51b8152600401610ad7906140f3565b308360038151811061130a5761130a614173565b6001600160a01b039283166020918202929092010152601254604051638244937560e01b815291169063824493759061134b90879087908790600401614189565b6020604051808303816000875af115801561136a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061138e919061421d565b90506000826004815181106113a5576113a5614173565b602002602001015111156113bc576113bc84612c23565b7f195d202f33578769e120c3041341554af3193e67ee004175095bc9c06e6e616581846000815181106113f1576113f1614173565b60200260200101516040516114199291909182526001600160a01b0316602082015260400190565b60405180910390a19392505050565b60606008805461097190614034565b600b5460405163160a792560e01b81526001600160a01b038381166004830152600092169063160a7925906024016080604051808303816000875af1158015611484573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a8919061406f565b6020015192915050565b600b5460405163160a792560e01b81523360048201526001600160a01b039091169063160a7925906024016080604051808303816000875af11580156114fc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611520919061406f565b602001516115405760405162461bcd60e51b8152600401610ad7906140f3565b610c5e81612c23565b61155a89898989898989898961224e565b505050505050505050565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156115e75760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610ad7565b6115f4338585840361212a565b5060019392505050565b6000610a0133848461267e565b600b5460405163160a792560e01b81523360048201526001600160a01b039091169063160a7925906024016080604051808303816000875af1158015611655573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611679919061406f565b602001516116995760405162461bcd60e51b8152600401610ad7906140f3565b610c5e81612d1d565b600b5460405163160a792560e01b81523360048201526001600160a01b039091169063160a7925906024016080604051808303816000875af11580156116ec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611710919061406f565b602001516117305760405162461bcd60e51b8152600401610ad7906140f3565b6040516bffffffffffffffffffffffff193060601b16602082015260009060340160408051601f19818403018152908290528051602090910120600b546301caf8fd60e31b83529092506001600160a01b031690630e57c7e89061179c90849087908790600401614236565b600060405180830381600087803b1580156117b657600080fd5b505af11580156117ca573d6000803e3d6000fd5b50505050505050565b6117e66064670de0b6b3a764000061426c565b81565b600a54600090600160a01b900460ff16156118605760405162461bcd60e51b815260206004820152603160248201527f455243323054656d706c6174653a20746f6b656e20696e7374616e636520616c6044820152701c9958591e481a5b9a5d1a585b1a5e9959607a1b6064820152608401610ad7565b61191461186d8b8d61428e565b8a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808e0282810182019093528d82529093508d92508c91829185019084908082843760009201919091525050604080516020808d0282810182019093528c82529093508c92508b91829185019084908082843760009201919091525061190f92508991508a9050614315565b612e2b565b9b9a5050505050505050505050565b438410156119665760405162461bcd60e51b815260206004820152601060248201526f115490cc8c11150e881156141254915160821b6044820152606401610ad7565b6010546001600160a01b038816600090815260116020526040812080549192917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b9190876119b98361437c565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e00160405160208183030381529060405280519060200120604051602001611a3292919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015611a9d573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590611ad35750886001600160a01b0316816001600160a01b0316145b611b1f5760405162461bcd60e51b815260206004820152601a60248201527f455243323044543a20494e56414c49445f5349474e41545552450000000000006044820152606401610ad7565b61155a89898961212a565b611b32611b6a565b6001600160a01b03166108fc479081150290604051600060405180830381858888f19350505050158015610c5e573d6000803e3d6000fd5b600c546000906001600160a01b0316611bef57600b546040516331a9108f60e11b8152600160048201526001600160a01b0390911690636352211e90602401602060405180830381865afa158015611bc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bea9190614156565b905090565b50600c546001600160a01b031690565b80516020820151604051634c87087d60e01b815260009283926001600160a01b0390911691634c87087d91611c3a9160040190815260200190565b61018060405180830381865afa158015611c58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c7c9190614397565b5050505050505050935050925050306001600160a01b0316826001600160a01b031614611cfb5760405162461bcd60e51b815260206004820152602760248201527f5468697320466978656452617465206973206e6f742070726f766964696e67206044820152661d1a1a5cc8111560ca1b6064820152608401610ad7565b8251602084015160405163c99733a760e01b81526004810191909152670de0b6b3a7640000602482015260009182916001600160a01b039091169063c99733a790604401608060405180830381865afa158015611d5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d809190614454565b5050915091508460400151821115611dea5760405162461bcd60e51b815260206004820152602760248201527f46697865645261746545786368616e67653a20546f6f206d616e79206261736560448201526620746f6b656e7360c81b6064820152608401610ad7565b6000670de0b6b3a7640000866060015183611e05919061448a565b611e0f919061426c565b9050611e1b818461413e565b9250611e326001600160a01b03851633308661332a565b8551611e49906001600160a01b0386169085613395565b8551602087015160405163412dae6b60e11b81526004810191909152670de0b6b3a76400006024820152604481018590526001600160a01b039091169063825b5cd690606401600060405180830381600087803b158015611ea957600080fd5b505af1158015611ebd573d6000803e3d6000fd5b505030600090815260208190526040902054670de0b6b3a7640000925090501015611f2a5760405162461bcd60e51b815260206004820152601f60248201527f556e61626c6520746f206275792044542066726f6d20466978656452617465006044820152606401610ad7565b611f3d3033670de0b6b3a764000061267e565b611f738760000151886020015189604001518a606001518b608001518c60a001518d60c001518e60e001518f610100015161224e565b8015611f93576080860151611f93906001600160a01b0386169083613447565b60408051338152602081018590529081018290527fe89458a7527f4bf466ab18794ab8b1ca208b478483a1a87bcf0d976d421b4aff9060600160405180910390a150505050505050565b60068181548110611fed57600080fd5b6000918252602090912001546001600160a01b0316905081565b600b5460405163160a792560e01b81523360048201526001600160a01b039091169063160a7925906024016080604051808303816000875af1158015612051573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612075919061406f565b602001516120955760405162461bcd60e51b8152600401610ad7906140f3565b601254604051636b14d00560e11b81526001600160a01b0386811660048301523060248301819052604483018790526064830186905233608484015260a48301529091169063d629a00a9060c401600060405180830381600087803b1580156120fd57600080fd5b505af1158015612111573d6000803e3d6000fd5b5050505080156121245761212484612c23565b50505050565b6001600160a01b03831661218c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ad7565b6001600160a01b0382166121ed5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ad7565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b33600090815260208190526040812054670de0b6b3a764000091908211156122c65760405162461bcd60e51b815260206004820152602560248201527f4e6f7420656e6f756768204461746120546f6b656e7320746f2073746172742060448201526427b93232b960d91b6064820152608401610ad7565b600d5460408051338152602081018590529081018c90524260608201524360808201526001600160a01b03918216918d16907fe1c4fa794edfa8f619b8257a077398950357b9c6398528f94480307352f9afcc9060a00160405180910390a36000600f541180156123415750600e546001600160a01b031615155b80156123575750600d546001600160a01b031615155b1561248257600f54600e5461237b916001600160a01b03909116903390309061332a565b600f54612389906064613477565b600d54600f549192506123bf916001600160a01b03909116906123ac9084613483565b600e546001600160a01b03169190613447565b600e54600d54600f546001600160a01b0392831692909116907ff666b31c81334b6085802ba4149907fa724689d43bc31df6de1a51291ddc55b4906124049085613483565b60405190815260200160405180910390a3801561248257600a54600e54612438916001600160a01b03918216911683613447565b600e54600a546040518381526001600160a01b0392831692909116907ff666b31c81334b6085802ba4149907fa724689d43bc31df6de1a51291ddc55b49060200160405180910390a35b60006040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152509050600081858c8c8c6040516020016124d694939291906144a9565b604051602081830303815290604052805190602001206040516020016124fd9291906144ef565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff8c1692840192909252606083018a9052608083018990529092509060019060a0016020604051602081039080840390855afa158015612568573d6000803e3d6000fd5b5050506020604051035190508b6001600160a01b0316816001600160a01b0316146125cc5760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642070726f76696465722066656560601b6044820152606401610ad7565b8a6001600160a01b03168c6001600160a01b03167f144fc6ed7d0a617ba44a01131b1f724d0370297a3640b6201f343e081ada64468c898d8d8d604051612617959493929190614511565b60405180910390a360008a11801561263757506001600160a01b038b1615155b801561264b57506001600160a01b038c1615155b15612665576126656001600160a01b038c16338e8d61332a565b61266e85610e05565b5050505050505050505050505050565b6001600160a01b0383166126e25760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610ad7565b6001600160a01b0382166127445760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610ad7565b6001600160a01b038316600090815260208190526040902054818110156127bc5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610ad7565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906127f390849061413e565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161283f91815260200190565b60405180910390a3612124565b6001600160a01b03811660008181526005602052604090819020805461ff00191681559051909133917faee911eec8b2df8f3ae0464841541b1e5f339519bd5cf51889fe8b07fecff658906128ad9042904390918252602082015260400190565b60405180910390a35050565b6001600160a01b03811660008181526005602052604090819020805460ff191681559051909133917fefa2735987005aaa89c050c0ff8cc9ae7d9079d19382081c429130f98c52d480906128ad9042904390918252602082015260400190565b6000610bc0828461413e565b6001600160a01b03821661297b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610ad7565b806002600082825461298d919061413e565b90915550506001600160a01b038216600090815260208190526040812080548392906129ba90849061413e565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b038216612a645760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610ad7565b6001600160a01b03821660009081526020819052604090205481811015612ad85760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610ad7565b6001600160a01b0383166000908152602081905260408120838303905560028054849290612b0790849061454a565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b60005b600654811015612bb85760006005600060068481548110612b7857612b78614173565b60009182526020808320909101546001600160a01b031683528201929092526040019020805461ffff191690555080612bb08161437c565b915050612b55565b50612bc5600660006136d9565b6040805142815243602082015233917f712bc71db81927a76b8bf1ea346247bb0ad58f18e4e5c1bd4aa0ec6573e02a2b910160405180910390a2565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166000908152600560205260409020805460ff1615612c8d5760405162461bcd60e51b815260206004820152601d60248201527f4552433230526f6c65733a2020414c52454144592041204d494e5445520000006044820152606401610ad7565b8054600160ff19909116811782556006805491820181556000527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319166001600160a01b038416908117909155604080514281524360208201523392917f4f7e100eb1ee13e903798bd0d6aa854152e07eb05544f392b9409c12935c809591016128ad565b6001600160a01b03811660009081526005602052604090208054610100900460ff1615612d975760405162461bcd60e51b815260206004820152602260248201527f4552433230526f6c65733a2020414c5245414459204120464545204d414e414760448201526122a960f11b6064820152608401610ad7565b805461ff001916610100178155600680546001810182556000919091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0384166001600160a01b03199091168117909155604080514281524360208201523392917fb17da2e9910b4ba5754e8872385ba315a238bafb5ae221fc85093c33432c40a791016128ad565b60008084600081518110612e4157612e41614173565b60200260200101519050600085600181518110612e6057612e60614173565b6020026020010151905060006001600160a01b0316826001600160a01b03161415612ee25760405162461bcd60e51b815260206004820152602c60248201527f455243323054656d706c6174653a20496e76616c6964206d696e7465722c202060448201526b7a65726f206164647265737360a01b6064820152608401610ad7565b6001600160a01b038116612f5e5760405162461bcd60e51b815260206004820152603c60248201527f455243323054656d706c6174653a20496e76616c696420636f6d6d756e69747960448201527f2066656520636f6c6c6563746f722c207a65726f2061646472657373000000006064820152608401610ad7565b84600081518110612f7157612f71614173565b602002602001015160001415612fd55760405162461bcd60e51b8152602060048201526024808201527f44617461546f6b656e54656d706c6174653a20496e76616c6964206361702076604482015263616c756560e01b6064820152608401610ad7565b84600081518110612fe857612fe8614173565b60200260200101516009819055508760008151811061300957613009614173565b6020026020010151600790805190602001906130269291906136f7565b508760018151811061303a5761303a614173565b6020026020010151600890805190602001906130579291906136f7565b50600b80546001600160a01b0319166001600160a01b03841617905585518690600290811061308857613088614173565b6020908102919091010151601280546001600160a01b039283166001600160a01b0319909116179055600a80546001600160a81b03191691831691909117600160a01b17905586516130f29088906000906130e5576130e5614173565b6020026020010151612c23565b60006001600160a01b03168760018151811061311057613110614173565b60200260200101516001600160a01b0316146131ba576131498760018151811061313c5761313c614173565b6020026020010151612c01565b8660018151811061315c5761315c614173565b60200260200101516001600160a01b0316336001600160a01b03167f4d7694d695c57cc54947177c8e8a0e61aae664e9223492a798c32fadfc6419cc42436040516131b1929190918252602082015260400190565b60405180910390a35b866002815181106131cd576131cd614173565b6020026020010151600d60006101000a8154816001600160a01b0302191690836001600160a01b031602179055508660038151811061320e5761320e614173565b6020026020010151600e60006101000a8154816001600160a01b0302191690836001600160a01b031602179055508460018151811061324f5761324f614173565b6020026020010151600f8190555060004690507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60076040516132929190614561565b60408051918290038220828201825260018352603160f81b6020938401528151928301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018290523060a082015260c00160408051808303601f1901815291905280516020909101206010555050600a54600160a01b900460ff16979650505050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526121249085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261348f565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156133e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061340a919061421d565b613414919061413e565b6040516001600160a01b03851660248201526044810182905290915061212490859063095ea7b360e01b9060640161335e565b6040516001600160a01b038316602482015260448101829052610b1690849063a9059cbb60e01b9060640161335e565b6000610bc0828461426c565b6000610bc0828461454a565b60006134e4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166135619092919063ffffffff16565b805190915015610b16578080602001905181019061350291906145fd565b610b165760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610ad7565b60606135708484600085613578565b949350505050565b6060824710156135d95760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610ad7565b843b6136275760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610ad7565b600080866001600160a01b03168587604051613643919061461a565b60006040518083038185875af1925050503d8060008114613680576040519150601f19603f3d011682016040523d82523d6000602084013e613685565b606091505b50915091506136958282866136a0565b979650505050505050565b606083156136af575081610bc0565b8251156136bf5782518084602001fd5b8160405162461bcd60e51b8152600401610ad7919061382a565b5080546000825590600052602060002090810190610c5e919061377b565b82805461370390614034565b90600052602060002090601f016020900481019282613725576000855561376b565b82601f1061373e57805160ff191683800117855561376b565b8280016001018555821561376b579182015b8281111561376b578251825591602001919060010190613750565b5061377792915061377b565b5090565b5b80821115613777576000815560010161377c565b6001600160a01b0381168114610c5e57600080fd5b80356137b081613790565b919050565b6000602082840312156137c757600080fd5b8135610bc081613790565b60005b838110156137ed5781810151838201526020016137d5565b838111156121245750506000910152565b600081518084526138168160208601602086016137d2565b601f01601f19169290920160200192915050565b602081526000610bc060208301846137fe565b6000806040838503121561385057600080fd5b823561385b81613790565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b60405161012081016001600160401b03811182821017156138a2576138a2613869565b60405290565b60405160a081016001600160401b03811182821017156138a2576138a2613869565b604051601f8201601f191681016001600160401b03811182821017156138f2576138f2613869565b604052919050565b803560ff811681146137b057600080fd5b60006001600160401b0383111561392457613924613869565b613937601f8401601f19166020016138ca565b905082815283838301111561394b57600080fd5b828260208301376000602084830101529392505050565b600082601f83011261397357600080fd5b610bc08383356020850161390b565b6000610120828403121561399557600080fd5b61399d61387f565b90506139a8826137a5565b8152602082013560208201526139c0604083016137a5565b60408201526139d1606083016137a5565b6060820152608082013560808201526139ec60a083016138fa565b60a082015260c082013560c082015260e082013560e0820152610100808301356001600160401b03811115613a2057600080fd5b613a2c85828601613962565b82840152505092915050565b60008060408385031215613a4b57600080fd5b82356001600160401b03811115613a6157600080fd5b613a6d85828601613982565b9250506020830135613a7e81613790565b809150509250929050565b600080600060608486031215613a9e57600080fd5b8335613aa981613790565b92506020840135613ab981613790565b929592945050506040919091013590565b600060208284031215613adc57600080fd5b5035919050565b60006001600160401b03821115613afc57613afc613869565b5060051b60200190565b600082601f830112613b1757600080fd5b81356020613b2c613b2783613ae3565b6138ca565b82815260059290921b84018101918181019086841115613b4b57600080fd5b8286015b84811015613b665780358352918301918301613b4f565b509695505050505050565b600080600060608486031215613b8657600080fd5b8335613b9181613790565b92506020848101356001600160401b0380821115613bae57600080fd5b818701915087601f830112613bc257600080fd5b8135613bd0613b2782613ae3565b81815260059190911b8301840190848101908a831115613bef57600080fd5b938501935b82851015613c16578435613c0781613790565b82529385019390850190613bf4565b965050506040870135925080831115613c2e57600080fd5b5050613c3c86828701613b06565b9150509250925092565b60008060008060008060008060006101208a8c031215613c6557600080fd5b8935613c7081613790565b985060208a0135975060408a0135613c8781613790565b965060608a0135613c9781613790565b955060808a01359450613cac60a08b016138fa565b935060c08a0135925060e08a013591506101008a01356001600160401b03811115613cd657600080fd5b613ce28c828d01613962565b9150509295985092959850929598565b60008060208385031215613d0557600080fd5b82356001600160401b0380821115613d1c57600080fd5b818501915085601f830112613d3057600080fd5b813581811115613d3f57600080fd5b866020828501011115613d5157600080fd5b60209290920196919550909350505050565b60008083601f840112613d7557600080fd5b5081356001600160401b03811115613d8c57600080fd5b6020830191508360208260051b8501011115613da757600080fd5b9250929050565b60008060008060008060008060008060a08b8d031215613dcd57600080fd5b8a356001600160401b0380821115613de457600080fd5b613df08e838f01613d63565b909c509a5060208d0135915080821115613e0957600080fd5b613e158e838f01613d63565b909a50985060408d0135915080821115613e2e57600080fd5b613e3a8e838f01613d63565b909850965060608d0135915080821115613e5357600080fd5b613e5f8e838f01613d63565b909650945060808d0135915080821115613e7857600080fd5b50613e858d828e01613d63565b915080935050809150509295989b9194979a5092959850565b600080600080600080600060e0888a031215613eb957600080fd5b8735613ec481613790565b96506020880135613ed481613790565b95506040880135945060608801359350613ef0608089016138fa565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215613f1f57600080fd5b8235613f2a81613790565b91506020830135613a7e81613790565b60008082840360c0811215613f4e57600080fd5b83356001600160401b03811115613f6457600080fd5b613f7086828701613982565b93505060a0601f1982011215613f8557600080fd5b50613f8e6138a8565b6020840135613f9c81613790565b8082525060408401356020820152606084013560408201526080840135606082015260a0840135613fcc81613790565b6080820152919491935090915050565b8015158114610c5e57600080fd5b6000806000806080858703121561400057600080fd5b843561400b81613790565b93506020850135925060408501359150606085013561402981613fdc565b939692955090935050565b600181811c9082168061404857607f821691505b6020821081141561406957634e487b7160e01b600052602260045260246000fd5b50919050565b60006080828403121561408157600080fd5b604051608081018181106001600160401b03821117156140a3576140a3613869565b60405282516140b181613fdc565b815260208301516140c181613fdc565b602082015260408301516140d481613fdc565b604082015260608301516140e781613fdc565b60608201529392505050565b6020808252818101527f455243323054656d706c6174653a204e4f54204445504c4f59455220524f4c45604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561415157614151614128565b500190565b60006020828403121561416857600080fd5b8151610bc081613790565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b038481168252606060208084018290528551918401829052600092868201929091906080860190855b818110156141d75785518516835294830194918301916001016141b9565b5050858103604087015286518082529082019350915080860160005b8381101561420f578151855293820193908201906001016141f3565b509298975050505050505050565b60006020828403121561422f57600080fd5b5051919050565b83815260406020820152816040820152818360608301376000818301606090810191909152601f909201601f1916010192915050565b60008261428957634e487b7160e01b600052601260045260246000fd5b500490565b600061429c613b2784613ae3565b80848252602080830192508560051b8501368111156142ba57600080fd5b855b818110156143095780356001600160401b038111156142db5760008081fd5b870136601f8201126142ed5760008081fd5b6142fb36823586840161390b565b8652509382019382016142bc565b50919695505050505050565b6000614323613b2784613ae3565b80848252602080830192508560051b85013681111561434157600080fd5b855b818110156143095780356001600160401b038111156143625760008081fd5b61436e36828a01613962565b865250938201938201614343565b600060001982141561439057614390614128565b5060010190565b6000806000806000806000806000806000806101808d8f0312156143ba57600080fd5b8c516143c581613790565b60208e0151909c506143d681613790565b60408e015160608f0151919c509a506143ee81613790565b8099505060808d0151975060a08d0151965060c08d015161440e81613fdc565b8096505060e08d015194506101008d015193506101208d015192506101408d015191506101608d015161444081613fdc565b809150509295989b509295989b509295989b565b6000806000806080858703121561446a57600080fd5b505082516020840151604085015160609095015191969095509092509050565b60008160001904831182151516156144a4576144a4614128565b500290565b600085516144bb818460208a016137d2565b6bffffffffffffffffffffffff19606096871b8116919093019081529390941b166014830152602882015260480192915050565b600083516145018184602088016137d2565b9190910191825250602001919050565b85815260a06020820152600061452a60a08301876137fe565b60ff95909516604083015250606081019290925260809091015292915050565b60008282101561455c5761455c614128565b500390565b600080835481600182811c91508083168061457d57607f831692505b602080841082141561459d57634e487b7160e01b86526022600452602486fd5b8180156145b157600181146145c2576145ef565b60ff198616895284890196506145ef565b60008a81526020902060005b868110156145e75781548b8201529085019083016145ce565b505084890196505b509498975050505050505050565b60006020828403121561460f57600080fd5b8151610bc081613fdc565b6000825161462c8184602087016137d2565b919091019291505056fea26469706673582212209041cd5099503a2e31e599b01c0c938b713c90fa811d0e03aacc28d1251e8ce164736f6c634300080a0033",linkReferences:{},deployedLinkReferences:{}},N={_format:"hh-sol-artifact-1",contractName:"ERC721Template",sourceName:"contracts/templates/ERC721Template.sol",abi:[{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"signer",type:"address"},{indexed:!1,internalType:"uint256",name:"timestamp",type:"uint256"},{indexed:!1,internalType:"uint256",name:"blockNumber",type:"uint256"}],name:"AddedManager",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"signer",type:"address"},{indexed:!1,internalType:"uint256",name:"timestamp",type:"uint256"},{indexed:!1,internalType:"uint256",name:"blockNumber",type:"uint256"}],name:"AddedTo725StoreList",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"signer",type:"address"},{indexed:!1,internalType:"uint256",name:"timestamp",type:"uint256"},{indexed:!1,internalType:"uint256",name:"blockNumber",type:"uint256"}],name:"AddedToCreateERC20List",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"signer",type:"address"},{indexed:!1,internalType:"uint256",name:"timestamp",type:"uint256"},{indexed:!1,internalType:"uint256",name:"blockNumber",type:"uint256"}],name:"AddedToMetadataList",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"owner",type:"address"},{indexed:!0,internalType:"address",name:"approved",type:"address"},{indexed:!0,internalType:"uint256",name:"tokenId",type:"uint256"}],name:"Approval",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"owner",type:"address"},{indexed:!0,internalType:"address",name:"operator",type:"address"},{indexed:!1,internalType:"bool",name:"approved",type:"bool"}],name:"ApprovalForAll",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"signer",type:"address"},{indexed:!1,internalType:"uint256",name:"timestamp",type:"uint256"},{indexed:!1,internalType:"uint256",name:"blockNumber",type:"uint256"}],name:"CleanedPermissions",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"contractAddress",type:"address"}],name:"ContractCreated",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"bytes32",name:"key",type:"bytes32"},{indexed:!1,internalType:"bytes",name:"value",type:"bytes"}],name:"DataChanged",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"uint256",name:"_operation",type:"uint256"},{indexed:!0,internalType:"address",name:"_to",type:"address"},{indexed:!0,internalType:"uint256",name:"_value",type:"uint256"},{indexed:!1,internalType:"bytes",name:"_data",type:"bytes"}],name:"Executed",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"createdBy",type:"address"},{indexed:!1,internalType:"uint8",name:"state",type:"uint8"},{indexed:!1,internalType:"string",name:"decryptorUrl",type:"string"},{indexed:!1,internalType:"bytes",name:"flags",type:"bytes"},{indexed:!1,internalType:"bytes",name:"data",type:"bytes"},{indexed:!1,internalType:"bytes32",name:"metaDataHash",type:"bytes32"},{indexed:!1,internalType:"uint256",name:"timestamp",type:"uint256"},{indexed:!1,internalType:"uint256",name:"blockNumber",type:"uint256"}],name:"MetadataCreated",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"updatedBy",type:"address"},{indexed:!1,internalType:"uint8",name:"state",type:"uint8"},{indexed:!1,internalType:"uint256",name:"timestamp",type:"uint256"},{indexed:!1,internalType:"uint256",name:"blockNumber",type:"uint256"}],name:"MetadataState",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"updatedBy",type:"address"},{indexed:!1,internalType:"uint8",name:"state",type:"uint8"},{indexed:!1,internalType:"string",name:"decryptorUrl",type:"string"},{indexed:!1,internalType:"bytes",name:"flags",type:"bytes"},{indexed:!1,internalType:"bytes",name:"data",type:"bytes"},{indexed:!1,internalType:"bytes32",name:"metaDataHash",type:"bytes32"},{indexed:!1,internalType:"uint256",name:"timestamp",type:"uint256"},{indexed:!1,internalType:"uint256",name:"blockNumber",type:"uint256"}],name:"MetadataUpdated",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"validator",type:"address"},{indexed:!1,internalType:"bytes32",name:"metaDataHash",type:"bytes32"},{indexed:!1,internalType:"uint8",name:"v",type:"uint8"},{indexed:!1,internalType:"bytes32",name:"r",type:"bytes32"},{indexed:!1,internalType:"bytes32",name:"s",type:"bytes32"}],name:"MetadataValidated",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"signer",type:"address"},{indexed:!1,internalType:"uint256",name:"timestamp",type:"uint256"},{indexed:!1,internalType:"uint256",name:"blockNumber",type:"uint256"}],name:"RemovedFrom725StoreList",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"signer",type:"address"},{indexed:!1,internalType:"uint256",name:"timestamp",type:"uint256"},{indexed:!1,internalType:"uint256",name:"blockNumber",type:"uint256"}],name:"RemovedFromCreateERC20List",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"signer",type:"address"},{indexed:!1,internalType:"uint256",name:"timestamp",type:"uint256"},{indexed:!1,internalType:"uint256",name:"blockNumber",type:"uint256"}],name:"RemovedFromMetadataList",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"signer",type:"address"},{indexed:!1,internalType:"uint256",name:"timestamp",type:"uint256"},{indexed:!1,internalType:"uint256",name:"blockNumber",type:"uint256"}],name:"RemovedManager",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"newTokenAddress",type:"address"},{indexed:!0,internalType:"address",name:"templateAddress",type:"address"},{indexed:!1,internalType:"string",name:"name",type:"string"},{indexed:!1,internalType:"string",name:"symbol",type:"string"},{indexed:!1,internalType:"uint256",name:"cap",type:"uint256"},{indexed:!1,internalType:"address",name:"creator",type:"address"}],name:"TokenCreated",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"updatedBy",type:"address"},{indexed:!1,internalType:"string",name:"tokenURI",type:"string"},{indexed:!1,internalType:"uint256",name:"tokenID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"timestamp",type:"uint256"},{indexed:!1,internalType:"uint256",name:"blockNumber",type:"uint256"}],name:"TokenURIUpdate",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!0,internalType:"uint256",name:"tokenId",type:"uint256"}],name:"Transfer",type:"event"},{stateMutability:"payable",type:"fallback"},{inputs:[{internalType:"address",name:"_managerAddress",type:"address"}],name:"addManager",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"_allowedAddress",type:"address"}],name:"addTo725StoreList",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"_allowedAddress",type:"address"}],name:"addToCreateERC20List",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"_allowedAddress",type:"address"}],name:"addToMetadataList",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"to",type:"address"},{internalType:"uint256",name:"tokenId",type:"uint256"}],name:"approve",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"",type:"uint256"}],name:"auth",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"owner",type:"address"}],name:"balanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"cleanPermissions",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"_templateIndex",type:"uint256"},{internalType:"string[]",name:"strings",type:"string[]"},{internalType:"address[]",name:"addresses",type:"address[]"},{internalType:"uint256[]",name:"uints",type:"uint256[]"},{internalType:"bytes[]",name:"bytess",type:"bytes[]"}],name:"createERC20",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"_operation",type:"uint256"},{internalType:"address",name:"_to",type:"address"},{internalType:"uint256",name:"_value",type:"uint256"},{internalType:"bytes",name:"_data",type:"bytes"}],name:"executeCall",outputs:[],stateMutability:"payable",type:"function"},{inputs:[{internalType:"uint256",name:"tokenId",type:"uint256"}],name:"getApproved",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"_key",type:"bytes32"}],name:"getData",outputs:[{internalType:"bytes",name:"_value",type:"bytes"}],stateMutability:"view",type:"function"},{inputs:[],name:"getId",outputs:[{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"pure",type:"function"},{inputs:[],name:"getMetaData",outputs:[{internalType:"string",name:"",type:"string"},{internalType:"string",name:"",type:"string"},{internalType:"uint8",name:"",type:"uint8"},{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"user",type:"address"}],name:"getPermissions",outputs:[{components:[{internalType:"bool",name:"manager",type:"bool"},{internalType:"bool",name:"deployERC20",type:"bool"},{internalType:"bool",name:"updateMetadata",type:"bool"},{internalType:"bool",name:"store",type:"bool"}],internalType:"struct ERC721RolesAddress.Roles",name:"",type:"tuple"}],stateMutability:"view",type:"function"},{inputs:[],name:"getTokensList",outputs:[{internalType:"address[]",name:"",type:"address[]"}],stateMutability:"view",type:"function"},{inputs:[],name:"hasMetaData",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"owner",type:"address"},{internalType:"string",name:"name_",type:"string"},{internalType:"string",name:"symbol_",type:"string"},{internalType:"address",name:"tokenFactory",type:"address"},{internalType:"address",name:"additionalERC20Deployer",type:"address"},{internalType:"string",name:"tokenURI",type:"string"}],name:"initialize",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"owner",type:"address"},{internalType:"address",name:"operator",type:"address"}],name:"isApprovedForAll",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"datatoken",type:"address"}],name:"isDeployed",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"account",type:"address"}],name:"isERC20Deployer",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[],name:"isInitialized",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[],name:"metaDataDecryptorAddress",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[],name:"metaDataDecryptorUrl",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[],name:"metaDataState",outputs:[{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"view",type:"function"},{inputs:[],name:"name",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"tokenId",type:"uint256"}],name:"ownerOf",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"_allowedAddress",type:"address"}],name:"removeFrom725StoreList",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"_allowedAddress",type:"address"}],name:"removeFromCreateERC20List",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"_allowedAddress",type:"address"}],name:"removeFromMetadataList",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"_managerAddress",type:"address"}],name:"removeManager",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"from",type:"address"},{internalType:"address",name:"to",type:"address"},{internalType:"uint256",name:"tokenId",type:"uint256"}],name:"safeTransferFrom",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"operator",type:"address"},{internalType:"bool",name:"approved",type:"bool"}],name:"setApprovalForAll",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"string",name:"_baseURI",type:"string"}],name:"setBaseURI",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes32",name:"_key",type:"bytes32"},{internalType:"bytes",name:"_value",type:"bytes"}],name:"setDataERC20",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint8",name:"_metaDataState",type:"uint8"},{internalType:"string",name:"_metaDataDecryptorUrl",type:"string"},{internalType:"string",name:"_metaDataDecryptorAddress",type:"string"},{internalType:"bytes",name:"flags",type:"bytes"},{internalType:"bytes",name:"data",type:"bytes"},{internalType:"bytes32",name:"_metaDataHash",type:"bytes32"},{components:[{internalType:"address",name:"validatorAddress",type:"address"},{internalType:"uint8",name:"v",type:"uint8"},{internalType:"bytes32",name:"r",type:"bytes32"},{internalType:"bytes32",name:"s",type:"bytes32"}],internalType:"struct ERC721Template.metaDataProof[]",name:"_metadataProofs",type:"tuple[]"}],name:"setMetaData",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint8",name:"_metaDataState",type:"uint8"}],name:"setMetaDataState",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes32",name:"_key",type:"bytes32"},{internalType:"bytes",name:"_value",type:"bytes"}],name:"setNewData",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"tokenId",type:"uint256"},{internalType:"string",name:"tokenURI",type:"string"}],name:"setTokenURI",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"ssContract",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes4",name:"interfaceId",type:"bytes4"}],name:"supportsInterface",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[],name:"symbol",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"tokenId",type:"uint256"}],name:"tokenURI",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"from",type:"address"},{internalType:"address",name:"to",type:"address"},{internalType:"uint256",name:"tokenId",type:"uint256"}],name:"transferFrom",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"withdrawETH",outputs:[],stateMutability:"payable",type:"function"}],bytecode:"0x60806040523480156200001157600080fd5b50604080518082018252600881526754656d706c61746560c01b60208083019182528351808501909452600e84526d15195b5c1b185d1954de5b589bdb60921b908401528151919291620000689160009162000136565b5080516200007e90600190602084019062000136565b50620000959150632260147f60e11b9050620000b2565b620000a7632bd57b7360e01b620000b2565b6001600c5562000219565b6001600160e01b03198082161415620001115760405162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015260640160405180910390fd5b6001600160e01b0319166000908152600a60205260409020805460ff19166001179055565b8280546200014490620001dc565b90600052602060002090601f016020900481019282620001685760008555620001b3565b82601f106200018357805160ff1916838001178555620001b3565b82800160010185558215620001b3579182015b82811115620001b357825182559160200191906001019062000196565b50620001c1929150620001c5565b5090565b5b80821115620001c15760008155600101620001c6565b600181811c90821680620001f157607f821691505b602082108114156200021357634e487b7160e01b600052602260045260246000fd5b50919050565b6143cc80620002296000396000f3fe60806040526004361061025d5760003560e01c806354f6127f11610143578063a22cb465116100bb578063d2786ba411610077578063d2786ba41461082d578063d8053ad314610852578063e086e5ec14610871578063e38d7cad14610879578063e985e9c514610899578063fe1ec880146108e257005b8063a22cb46514610780578063ac18de43146107a0578063b0c41ead146107c0578063c55f8126146107e0578063c87b56dd146107f3578063ccd7d4761461081357005b806370a082311161010a57806370a082311461069157806370c166d7146106bf57806382cf129d146106df57806390184b02146106f457806395d89b411461072d57806396fb3eaf1461074257005b806354f6127f146105ef57806355f804b31461060f5780635d1ca6311461062f5780636352211e1461065157806367530a611461067157005b806323b872dd116101d6578063431053ac1161019d578063431053ac14610538578063466bca0214610558578063467c97f51461057a5780634a63740a1461059a5780634b2ee5e9146105ba5780634f189cb2146105da57005b806323b872dd146104a0578063273e06b3146104c05780632d06177a146104e0578063392e53cd1461050057806342842e0e1461051857005b80630e57c7e8116102255780630e57c7e81461032357806310c558bf14610343578063160a792514610363578063162094c41461044057806319c186e5146104605780631aa3adf91461048057005b806301ffc9a71461025f57806306fdde0314610294578063081812fc146102b6578063095ea7b3146102ee5780630e05662e1461030e575b005b34801561026b57600080fd5b5061027f61027a366004613545565b610902565b60405190151581526020015b60405180910390f35b3480156102a057600080fd5b506102a9610942565b60405161028b91906135c1565b3480156102c257600080fd5b506102d66102d13660046135d4565b6109d4565b6040516001600160a01b03909116815260200161028b565b3480156102fa57600080fd5b5061025d610309366004613602565b610a6e565b34801561031a57600080fd5b506102a9610b84565b34801561032f57600080fd5b5061025d61033e366004613676565b610c12565b34801561034f57600080fd5b5061025d61035e3660046136c1565b610c87565b34801561036f57600080fd5b5061040561037e3660046136c1565b604080516080810182526000808252602082018190529181018290526060810191909152506001600160a01b03166000908152600860209081526040918290208251608081018452905460ff808216151583526101008204811615159383019390935262010000810483161515938201939093526301000000909204161515606082015290565b60405161028b919081511515815260208083015115159082015260408083015115159082015260609182015115159181019190915260800190565b34801561044c57600080fd5b5061025d61045b3660046137bb565b610d5a565b34801561046c57600080fd5b5061025d61047b3660046136c1565b610de9565b34801561048c57600080fd5b5061025d61049b3660046138de565b610eb2565b3480156104ac57600080fd5b5061025d6104bb3660046139e5565b6112f0565b3480156104cc57600080fd5b5061025d6104db3660046136c1565b6113c2565b3480156104ec57600080fd5b5061025d6104fb3660046136c1565b6114fb565b34801561050c57600080fd5b50600f5460ff1661027f565b34801561052457600080fd5b5061025d6105333660046139e5565b61153e565b34801561054457600080fd5b5061025d6105533660046136c1565b6115e4565b34801561056457600080fd5b5061056d611719565b60405161028b9190613a26565b34801561058657600080fd5b5061025d610595366004613a73565b61177a565b3480156105a657600080fd5b5061025d6105b53660046136c1565b611805565b3480156105c657600080fd5b506014546102d6906001600160a01b031681565b3480156105e657600080fd5b5061025d6118ca565b3480156105fb57600080fd5b506102a961060a3660046135d4565b61190e565b34801561061b57600080fd5b5061025d61062a366004613a8e565b6119b0565b34801561063b57600080fd5b5060015b60405160ff909116815260200161028b565b34801561065d57600080fd5b506102d661066c3660046135d4565b611a01565b34801561067d57600080fd5b5061025d61068c366004613676565b611a78565b34801561069d57600080fd5b506106b16106ac3660046136c1565b611ae8565b60405190815260200161028b565b3480156106cb57600080fd5b5061027f6106da366004613ac2565b611b6f565b3480156106eb57600080fd5b506102a9611c8c565b34801561070057600080fd5b5061027f61070f3660046136c1565b6001600160a01b031660009081526015602052604090205460ff1690565b34801561073957600080fd5b506102a9611c99565b34801561074e57600080fd5b5061027f61075d3660046136c1565b6001600160a01b0316600090815260086020526040902054610100900460ff1690565b34801561078c57600080fd5b5061025d61079b366004613b90565b611ca8565b3480156107ac57600080fd5b5061025d6107bb3660046136c1565b611d66565b3480156107cc57600080fd5b506102d66107db3660046135d4565b611da9565b61025d6107ee366004613bce565b611dd3565b3480156107ff57600080fd5b506102a961080e3660046135d4565b611e1b565b34801561081f57600080fd5b5060125461063f9060ff1681565b34801561083957600080fd5b50610842611f79565b60405161028b9493929190613c37565b34801561085e57600080fd5b50600f5461027f90610100900460ff1681565b61025d6120c9565b34801561088557600080fd5b506102d6610894366004613cbc565b61210b565b3480156108a557600080fd5b5061027f6108b4366004613d8b565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b3480156108ee57600080fd5b5061025d6108fd3660046136c1565b6122db565b60006301ffc9a760e01b6001600160e01b03198316148061093c57506001600160e01b031982166000908152600a602052604090205460ff165b92915050565b6060600d805461095190613db9565b80601f016020809104026020016040519081016040528092919081815260200182805461097d90613db9565b80156109ca5780601f1061099f576101008083540402835291602001916109ca565b820191906000526020600020905b8154815290600101906020018083116109ad57829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b0316610a525760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b6000610a7982611a01565b9050806001600160a01b0316836001600160a01b03161415610ae75760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610a49565b336001600160a01b0382161480610b035750610b0381336108b4565b610b755760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a49565b610b7f838361240b565b505050565b60118054610b9190613db9565b80601f0160208091040260200160405190810160405280929190818152602001828054610bbd90613db9565b8015610c0a5780601f10610bdf57610100808354040283529160200191610c0a565b820191906000526020600020905b815481529060010190602001808311610bed57829003601f168201915b505050505081565b3360009081526015602052604090205460ff16610c7c5760405162461bcd60e51b815260206004820152602260248201527f45524337323154656d706c6174653a204e4f5420455243323020436f6e74726160448201526118dd60f21b6064820152608401610a49565b610b7f838383612479565b3360009081526008602052604090205460ff161515600114610cbb5760405162461bcd60e51b8152600401610a4990613df4565b6001600160a01b038116600081815260086020526040808220805462ff000019166201000017815560098054600181018255935260008051602061437783398151915290920180546001600160a01b0319168417905551909133917fc2a42571a74ce1442c8c44d375ba9442e7d55d94b37afeace261c83c62128fa490610d4e9042904390918252602082015260400190565b60405180910390a35050565b610d646001611a01565b6001600160a01b0316336001600160a01b031614610d945760405162461bcd60e51b8152600401610a4990613e2b565b610d9e82826124d2565b336001600160a01b03167f6de6cd3982065cbd31e789e3109106f4d76d1c8a46e85262045cf947fb3fd4ed82844243604051610ddd9493929190613e62565b60405180910390a25050565b3360009081526008602052604090205460ff161515600114610e1d5760405162461bcd60e51b8152600401610a4990613df4565b6001600160a01b038116600081815260086020526040808220805463ff0000001916630100000017815560098054600181018255935260008051602061437783398151915290920180546001600160a01b0319168417905551909133917feb09276310ed110a7e565d64966d0ff68a47112d2dd5eeb6cbd7451836ce35ee90610d4e9042904390918252602082015260400190565b3360009081526008602052604090205462010000900460ff16610ee75760405162461bcd60e51b8152600401610a4990613e91565b6012805460ff191660ff8d16179055610f0260108b8b613408565b50610f0f60118989613408565b50600f54610100900460ff16610f8657336001600160a01b03167f5463569dcc320958360074a9ab27e809e8a6942c394fb151d139b5f7b4ecb1bd8c8c8c8a8a8a8a8a4243604051610f6a9a99989796959493929190613efb565b60405180910390a2600f805461ff001916610100179055610fd8565b60125460405133917fe5c4cf86b1815151e6f453e1e133d4454ae3b0b07145db39f2e0178685deac8491610fcf9160ff16908e908e908c908c908c908c908c9042904390613efb565b60405180910390a25b60328151111561101c5760405162461bcd60e51b815260206004820152600f60248201526e546f6f204d616e792050726f6f667360881b6044820152606401610a49565b60408051808201909152601c81527f19457468657265756d205369676e6564204d6573736167653a0a333200000000602082015260005b82518110156112e15760006001600160a01b031683828151811061107957611079613f63565b6020026020010151600001516001600160a01b0316146111fb57600082856040516020016110a8929190613f79565b60405160208183030381529060405280519060200120905060006001828685815181106110d7576110d7613f63565b6020026020010151602001518786815181106110f5576110f5613f63565b60200260200101516040015188878151811061111357611113613f63565b60200260200101516060015160405160008152602001604052604051611155949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa158015611177573d6000803e3d6000fd5b50505060206040510351905084838151811061119557611195613f63565b6020026020010151600001516001600160a01b0316816001600160a01b0316146111f85760405162461bcd60e51b815260206004820152601460248201527324b73b30b634b210383937b7b31039b4b3b732b960611b6044820152606401610a49565b50505b82818151811061120d5761120d613f63565b6020026020010151600001516001600160a01b03167f2819d8badf5cff2c9220b8ee99dacc14d67058e343d7f0c2c444d198507fe9418585848151811061125657611256613f63565b60200260200101516020015186858151811061127457611274613f63565b60200260200101516040015187868151811061129257611292613f63565b6020026020010151606001516040516112c7949392919093845260ff9290921660208401526040830152606082015260800190565b60405180910390a2806112d981613fb1565b915050611053565b50505050505050505050505050565b806001146113105760405162461bcd60e51b8152600401610a4990613fcc565b61137a611375601380548060200260200160405190810160405280929190818152602001828054801561136c57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161134e575b50505050505190565b61256c565b6113826125fd565b61138d8383836126ae565b611396826126ef565b506001600160a01b03166000908152600860205260409020805463ffffff001916630101010017905550565b3360009081526008602052604090205460ff161515600114806114135750336001600160a01b0382161480156114135750336000908152600860205260409020546301000000900460ff1615156001145b1561147b576001600160a01b03811660008181526008602052604090819020805463ff000000191681559051909133917fc929b18b08ffea86a1f95e29384dbe8968f2fcbd70cfd735df3aba1cc548cbf390610d4e9042904390918252602082015260400190565b60405162461bcd60e51b815260206004820152604660248201527f455243373231526f6c6573416464726573733a204e6f7420656e6f756768207060448201527f65726d697373696f6e7320746f2072656d6f76652066726f6d2037323553746f6064820152651c99531a5cdd60d21b608482015260a401610a49565b50565b6115056001611a01565b6001600160a01b0316336001600160a01b0316146115355760405162461bcd60e51b8152600401610a4990613e2b565b6114f8816126ef565b8060011461155e5760405162461bcd60e51b8152600401610a4990613fcc565b6115c1611375601380548060200260200160405190810160405280929190818152602001828054801561136c576020028201919060005260206000209081546001600160a01b0316815260019091019060200180831161134e5750505050505190565b6115c96125fd565b61138d83838360405180602001604052806000815250612780565b3360009081526008602052604090205460ff161515600114806116345750336001600160a01b03821614801561163457503360009081526008602052604090205462010000900460ff1615156001145b1561169b576001600160a01b03811660008181526008602052604090819020805462ff0000191681559051909133917f9b41e1311fa819e825bc77fa2568492112e15ea92d173f3f8ee1c8ec3c1c562b90610d4e9042904390918252602082015260400190565b60405162461bcd60e51b815260206004820152604760248201527f455243373231526f6c6573416464726573733a204e6f7420656e6f756768207060448201527f65726d697373696f6e7320746f2072656d6f76652066726f6d206d65746164616064820152661d18481b1a5cdd60ca1b608482015260a401610a49565b606060138054806020026020016040519081016040528092919081815260200182805480156109ca57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611753575050505050905090565b3360009081526008602052604090205462010000900460ff166117af5760405162461bcd60e51b8152600401610a4990613e91565b6012805460ff191660ff831690811790915560408051918252426020830152439082015233907fa8336411cc72db0e5bdc4dff989eeb35879bafaceffb59b54b37645c3395adb99060600160405180910390a250565b3360009081526008602052604090205460ff1615156001146118395760405162461bcd60e51b8152600401610a4990613df4565b6001600160a01b038116600081815260086020526040808220805461ff00191661010017815560098054600181018255935260008051602061437783398151915290920180546001600160a01b0319168417905551909133917f0572d56343be407a66810f01449212e8545e14ff5049c479d34be944cdfd0d4f90610d4e9042904390918252602082015260400190565b6118d46001611a01565b6001600160a01b0316336001600160a01b0316146119045760405162461bcd60e51b8152600401610a4990613e2b565b61190c6125fd565b565b6000818152600b6020526040902080546060919061192b90613db9565b80601f016020809104026020016040519081016040528092919081815260200182805461195790613db9565b80156119a45780601f10611979576101008083540402835291602001916119a4565b820191906000526020600020905b81548152906001019060200180831161198757829003601f168201915b50505050509050919050565b6119ba6001611a01565b6001600160a01b0316336001600160a01b0316146119ea5760405162461bcd60e51b8152600401610a4990613e2b565b80516119fd90600290602084019061348c565b5050565b6000818152600360205260408120546001600160a01b03168061093c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610a49565b336000908152600860205260409020546301000000900460ff16610c7c5760405162461bcd60e51b815260206004820152602160248201527f45524337323154656d706c6174653a204e4f542053544f5245205550444154456044820152602960f91b6064820152608401610a49565b60006001600160a01b038216611b535760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610a49565b506001600160a01b031660009081526004602052604090205490565b600f5460009060ff1615611be05760405162461bcd60e51b815260206004820152603260248201527f45524337323154656d706c6174653a20746f6b656e20696e7374616e636520616044820152711b1c9958591e481a5b9a5d1a585b1a5e995960721b6064820152608401610a49565b6000611c5a8a8a8a8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8e018190048102820181019092528c815292508c91508b90819084018382808284376000920191909152508b92508991506127b89050565b9050808015611c7157506001600160a01b03841615155b15611c7f57611c7f84611839565b9998505050505050505050565b60108054610b9190613db9565b6060600e805461095190613db9565b6001600160a01b038216331415611d015760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a49565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319101610d4e565b611d706001611a01565b6001600160a01b0316336001600160a01b031614611da05760405162461bcd60e51b8152600401610a4990613e2b565b6114f8816128f8565b60098181548110611db957600080fd5b6000918252602090912001546001600160a01b0316905081565b3360009081526008602052604090205460ff161515600114611e075760405162461bcd60e51b8152600401610a4990613df4565b611e148585858585612958565b5050505050565b6000818152600360205260409020546060906001600160a01b0316611e9a5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610a49565b60008281526007602052604081208054611eb390613db9565b80601f0160208091040260200160405190810160405280929190818152602001828054611edf90613db9565b8015611f2c5780601f10611f0157610100808354040283529160200191611f2c565b820191906000526020600020905b815481529060010190602001808311611f0f57829003601f168201915b505050505090506000611f3d612b81565b825190915015611f72578082604051602001611f5a929190614018565b60405160208183030381529060405292505050919050565b5092915050565b60608060008060106011601260009054906101000a900460ff16600f60019054906101000a900460ff16838054611faf90613db9565b80601f0160208091040260200160405190810160405280929190818152602001828054611fdb90613db9565b80156120285780601f10611ffd57610100808354040283529160200191612028565b820191906000526020600020905b81548152906001019060200180831161200b57829003601f168201915b5050505050935082805461203b90613db9565b80601f016020809104026020016040519081016040528092919081815260200182805461206790613db9565b80156120b45780601f10612089576101008083540402835291602001916120b4565b820191906000526020600020905b81548152906001019060200180831161209757829003601f168201915b50505050509250935093509350935090919293565b6120d36001611a01565b6001600160a01b03166108fc479081150290604051600060405180830381858888f193505050501580156114f8573d6000803e3d6000fd5b60006002600c5414156121605760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a49565b6002600c5533600090815260086020526040902054610100900460ff166121d85760405162461bcd60e51b815260206004820152602660248201527f45524337323154656d706c6174653a204e4f542045524332304445504c4f5945604482015265525f524f4c4560d01b6064820152608401610a49565b601254604051630557fcfb60e41b815260009161010090046001600160a01b03169063557fcfb09061221e908e908e908e908e908e908e908e908e908e90600401614168565b6020604051808303816000875af115801561223d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122619190614219565b6001600160a01b0381166000818152601560205260408120805460ff191660019081179091556013805491820181559091527f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0900180546001600160a01b03191690911790559150506001600c559998505050505050505050565b3360009081526008602052604090205460ff1615156001148061232b5750336001600160a01b03821614801561232b57503360009081526008602052604090205460ff6101009091041615156001145b15612391576001600160a01b03811660008181526008602052604090819020805461ff00191681559051909133917f59bd33f4c27cc16a2d74450e1fa43d7896020be9aecea4bee009db9294de899790610d4e9042904390918252602082015260400190565b60405162461bcd60e51b815260206004820152604360248201527f455243373231526f6c6573416464726573733a204e6f7420656e6f756768207060448201527f65726d697373696f6e7320746f2072656d6f76652066726f6d2045524332304c6064820152621a5cdd60ea1b608482015260a401610a49565b600081815260056020526040902080546001600160a01b0319166001600160a01b038416908117909155819061244082611a01565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000838152600b60205260409020612492908383613408565b50827fece574603820d07bc9b91f2a932baadf4628aabcb8afba49776529c14a6104b283836040516124c5929190614236565b60405180910390a2505050565b6000828152600360205260409020546001600160a01b031661254d5760405162461bcd60e51b815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b6064820152608401610a49565b60008281526007602090815260409091208251610b7f9284019061348c565b60005b818110156119fd576013818154811061258a5761258a613f63565b6000918252602082200154604080516382c03da560e01b815290516001600160a01b03909216926382c03da59260048084019382900301818387803b1580156125d257600080fd5b505af11580156125e6573d6000803e3d6000fd5b5050505080806125f590613fb1565b91505061256f565b60005b600954811015612665576000600860006009848154811061262357612623613f63565b60009182526020808320909101546001600160a01b031683528201929092526040019020805463ffffffff19169055508061265d81613fb1565b915050612600565b5061267260096000613500565b6040805142815243602082015233917f712bc71db81927a76b8bf1ea346247bb0ad58f18e4e5c1bd4aa0ec6573e02a2b910160405180910390a2565b6126b83382612b90565b6126d45760405162461bcd60e51b8152600401610a499061424a565b610b7f83838360405180602001604052806000815250612780565b6001600160a01b038116600081815260086020526040808220805460ff19166001908117825560098054918201815590935260008051602061437783398151915290920180546001600160a01b0319168417905551909133917faf8fc8b6726138c96881c895390a08e9d91a94c288f06281e7f9821c49c7155b90610d4e9042904390918252602082015260400190565b61278a3383612b90565b6127a65760405162461bcd60e51b8152600401610a499061424a565b6127b284848484612c87565b50505050565b60006001600160a01b0386166128275760405162461bcd60e51b815260206004820152602e60248201527f45524337323154656d706c6174653a3a20496e76616c6964206d696e7465722c60448201526d20207a65726f206164647265737360901b6064820152608401610a49565b845161283a90600d90602088019061348c565b50835161284e90600e90602087019061348c565b5060128054610100600160a81b0319166101006001600160a01b0386160217905560408051602081019182905260009081905261288d9160029161348c565b50600f805461ffff191660019081179091556128aa908790612cba565b6128b3866126ef565b6001600160a01b0386166000908152600860205260409020805463ffffff00191663010101001781556128e76001846124d2565b5050600f5460ff1695945050505050565b6001600160a01b03811660008181526008602052604090819020805460ff191681559051909133917fb572db0e6da4924b771ed1712b980d48b5992b9a1c27aede55fbb3318c48996a90610d4e9042904390918252602082015260400190565b82846001600160a01b0316867f1f920dbda597d7bf95035464170fa58d0a4b57f13a1c315ace6793b9f63688b88585604051612995929190614236565b60405180910390a460006109c45a6129ad919061429b565b9050856129fd576129f7858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250879250612cd4915050565b50612b79565b6003861415612a46576129f78484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612cec92505050565b6002861415612b3a576000612a9d84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612a9892506020915087905061429b565b612d88565b90506000612aec85858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509250612ae79150602090508861429b565b612de6565b90506000612afb878484612ef3565b6040519091506001600160a01b038216907fcf78cf0d6f3d8371e1075c69c492ab4ec5d8cf23a1a239b6a51a1d00be7ca31290600090a2505050612b79565b60405162461bcd60e51b815260206004820152601460248201527357726f6e67206f7065726174696f6e207479706560601b6044820152606401610a49565b505050505050565b60606002805461095190613db9565b6000818152600360205260408120546001600160a01b0316612c095760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610a49565b6000612c1483611a01565b9050806001600160a01b0316846001600160a01b03161480612c4f5750836001600160a01b0316612c44846109d4565b6001600160a01b0316145b80612c7f57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b612c92848484612ff5565b612c9e84848484613195565b6127b25760405162461bcd60e51b8152600401610a49906142b2565b6119fd828260405180602001604052806000815250613293565b6000806000845160208601878987f195945050505050565b600081516020830184f090506001600160a01b038116612d4e5760405162461bcd60e51b815260206004820152601960248201527f436f756c64206e6f74206465706c6f7920636f6e7472616374000000000000006044820152606401610a49565b6040516001600160a01b038216907fcf78cf0d6f3d8371e1075c69c492ab4ec5d8cf23a1a239b6a51a1d00be7ca31290600090a292915050565b6000612d95826020614304565b83511015612ddd5760405162461bcd60e51b8152602060048201526015602482015274746f427974657333325f6f75744f66426f756e647360581b6044820152606401610a49565b50016020015190565b606081612df481601f614304565b1015612e335760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b6044820152606401610a49565b612e3d8284614304565b84511015612e815760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b6044820152606401610a49565b606082158015612ea05760405191506000825260208201604052612eea565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015612ed9578051835260209283019201612ec1565b5050858452601f01601f1916604052505b50949350505050565b60008084471015612f465760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610a49565b8251612f945760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610a49565b8383516020850187f590506001600160a01b038116612c7f5760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401610a49565b826001600160a01b031661300882611a01565b6001600160a01b0316146130705760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610a49565b6001600160a01b0382166130d25760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a49565b6130dd60008261240b565b6001600160a01b038316600090815260046020526040812080546001929061310690849061429b565b90915550506001600160a01b0382166000908152600460205260408120805460019290613134908490614304565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006001600160a01b0384163b1561328857604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906131d990339089908890889060040161431c565b6020604051808303816000875af1925050508015613214575060408051601f3d908101601f1916820190925261321191810190614359565b60015b61326e573d808015613242576040519150601f19603f3d011682016040523d82523d6000602084013e613247565b606091505b5080516132665760405162461bcd60e51b8152600401610a49906142b2565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612c7f565b506001949350505050565b61329d83836132c6565b6132aa6000848484613195565b610b7f5760405162461bcd60e51b8152600401610a49906142b2565b6001600160a01b03821661331c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a49565b6000818152600360205260409020546001600160a01b0316156133815760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a49565b6001600160a01b03821660009081526004602052604081208054600192906133aa908490614304565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461341490613db9565b90600052602060002090601f016020900481019282613436576000855561347c565b82601f1061344f5782800160ff1982351617855561347c565b8280016001018555821561347c579182015b8281111561347c578235825591602001919060010190613461565b5061348892915061351a565b5090565b82805461349890613db9565b90600052602060002090601f0160209004810192826134ba576000855561347c565b82601f106134d357805160ff191683800117855561347c565b8280016001018555821561347c579182015b8281111561347c5782518255916020019190600101906134e5565b50805460008255906000526020600020908101906114f891905b5b80821115613488576000815560010161351b565b6001600160e01b0319811681146114f857600080fd5b60006020828403121561355757600080fd5b81356135628161352f565b9392505050565b60005b8381101561358457818101518382015260200161356c565b838111156127b25750506000910152565b600081518084526135ad816020860160208601613569565b601f01601f19169290920160200192915050565b6020815260006135626020830184613595565b6000602082840312156135e657600080fd5b5035919050565b6001600160a01b03811681146114f857600080fd5b6000806040838503121561361557600080fd5b8235613620816135ed565b946020939093013593505050565b60008083601f84011261364057600080fd5b5081356001600160401b0381111561365757600080fd5b60208301915083602082850101111561366f57600080fd5b9250929050565b60008060006040848603121561368b57600080fd5b8335925060208401356001600160401b038111156136a857600080fd5b6136b48682870161362e565b9497909650939450505050565b6000602082840312156136d357600080fd5b8135613562816135ed565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b0381118282101715613716576137166136de565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613744576137446136de565b604052919050565b600082601f83011261375d57600080fd5b81356001600160401b03811115613776576137766136de565b613789601f8201601f191660200161371c565b81815284602083860101111561379e57600080fd5b816020850160208301376000918101602001919091529392505050565b600080604083850312156137ce57600080fd5b8235915060208301356001600160401b038111156137eb57600080fd5b6137f78582860161374c565b9150509250929050565b803560ff8116811461381257600080fd5b919050565b600082601f83011261382857600080fd5b813560206001600160401b03821115613843576138436136de565b613851818360051b0161371c565b82815260079290921b8401810191818101908684111561387057600080fd5b8286015b848110156138d3576080818903121561388d5760008081fd5b6138956136f4565b81356138a0816135ed565b81526138ad828601613801565b818601526040828101359082015260608083013590820152835291830191608001613874565b509695505050505050565b600080600080600080600080600080600060e08c8e0312156138ff57600080fd5b6139088c613801565b9a506001600160401b038060208e0135111561392357600080fd5b6139338e60208f01358f0161362e565b909b50995060408d013581101561394957600080fd5b6139598e60408f01358f0161362e565b909950975060608d013581101561396f57600080fd5b61397f8e60608f01358f0161362e565b909750955060808d013581101561399557600080fd5b6139a58e60808f01358f0161362e565b909550935060a08d0135925060c08d01358110156139c257600080fd5b506139d38d60c08e01358e01613817565b90509295989b509295989b9093969950565b6000806000606084860312156139fa57600080fd5b8335613a05816135ed565b92506020840135613a15816135ed565b929592945050506040919091013590565b6020808252825182820181905260009190848201906040850190845b81811015613a675783516001600160a01b031683529284019291840191600101613a42565b50909695505050505050565b600060208284031215613a8557600080fd5b61356282613801565b600060208284031215613aa057600080fd5b81356001600160401b03811115613ab657600080fd5b612c7f8482850161374c565b60008060008060008060008060c0898b031215613ade57600080fd5b8835613ae9816135ed565b975060208901356001600160401b0380821115613b0557600080fd5b613b118c838d0161362e565b909950975060408b0135915080821115613b2a57600080fd5b613b368c838d0161362e565b909750955060608b01359150613b4b826135ed565b90935060808a013590613b5d826135ed565b90925060a08a01359080821115613b7357600080fd5b50613b808b828c0161374c565b9150509295985092959890939650565b60008060408385031215613ba357600080fd5b8235613bae816135ed565b915060208301358015158114613bc357600080fd5b809150509250929050565b600080600080600060808688031215613be657600080fd5b853594506020860135613bf8816135ed565b93506040860135925060608601356001600160401b03811115613c1a57600080fd5b613c268882890161362e565b969995985093965092949392505050565b608081526000613c4a6080830187613595565b8281036020840152613c5c8187613595565b60ff959095166040840152505090151560609091015292915050565b60008083601f840112613c8a57600080fd5b5081356001600160401b03811115613ca157600080fd5b6020830191508360208260051b850101111561366f57600080fd5b600080600080600080600080600060a08a8c031215613cda57600080fd5b8935985060208a01356001600160401b0380821115613cf857600080fd5b613d048d838e01613c78565b909a50985060408c0135915080821115613d1d57600080fd5b613d298d838e01613c78565b909850965060608c0135915080821115613d4257600080fd5b613d4e8d838e01613c78565b909650945060808c0135915080821115613d6757600080fd5b50613d748c828d01613c78565b915080935050809150509295985092959850929598565b60008060408385031215613d9e57600080fd5b8235613da9816135ed565b91506020830135613bc3816135ed565b600181811c90821680613dcd57607f821691505b60208210811415613dee57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601f908201527f455243373231526f6c6573416464726573733a204e4f54204d414e4147455200604082015260600190565b6020808252601c908201527f45524337323154656d706c6174653a206e6f74204e46544f776e657200000000604082015260600190565b608081526000613e756080830187613595565b6020830195909552506040810192909252606090910152919050565b60208082526021908201527f45524337323154656d706c6174653a204e4f54204d455441444154415f524f4c6040820152604560f81b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60ff8b16815260e060208201526000613f1860e083018b8d613ed2565b8281036040840152613f2b818a8c613ed2565b90508281036060840152613f4081888a613ed2565b6080840196909652505060a081019290925260c090910152979650505050505050565b634e487b7160e01b600052603260045260246000fd5b60008351613f8b818460208801613569565b9190910191825250602001919050565b634e487b7160e01b600052601160045260246000fd5b6000600019821415613fc557613fc5613f9b565b5060010190565b6020808252602c908201527f45524337323154656d706c6174653a2043616e6e6f74207472616e736665722060408201526b1d1a1a5cc81d1bdad95b925960a21b606082015260800190565b6000835161402a818460208801613569565b83519083019061403e818360208801613569565b01949350505050565b6000808335601e1984360301811261405e57600080fd5b83016020810192503590506001600160401b0381111561407d57600080fd5b80360383131561366f57600080fd5b8183526000602080850194508260005b858110156140ca5781356140af816135ed565b6001600160a01b03168752958201959082019060010161409c565b509495945050505050565b81835260006001600160fb1b038311156140ee57600080fd5b8260051b8083602087013760009401602001938452509192915050565b81835260006020808501808196508560051b810191508460005b8781101561415b57828403895261413c8288614047565b614147868284613ed2565b9a87019a9550505090840190600101614125565b5091979650505050505050565b89815260a0602082018190528101889052600060c060058a901b830181019083018b835b8c8110156141c95785840360bf190183526141a7828f614047565b6141b2868284613ed2565b95505050602092830192919091019060010161418c565b50505082810360408401526141df81898b61408c565b905082810360608401526141f48187896140d5565b9050828103608084015261420981858761410b565b9c9b505050505050505050505050565b60006020828403121561422b57600080fd5b8151613562816135ed565b602081526000612c7f602083018486613ed2565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000828210156142ad576142ad613f9b565b500390565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6000821982111561431757614317613f9b565b500190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061434f90830184613595565b9695505050505050565b60006020828403121561436b57600080fd5b81516135628161352f56fe6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7afa26469706673582212206d0bc2d2cba31628d81338472b8edc29d561d59a0f52686f6ad9fb78da838a2264736f6c634300080a0033",deployedBytecode:"0x60806040526004361061025d5760003560e01c806354f6127f11610143578063a22cb465116100bb578063d2786ba411610077578063d2786ba41461082d578063d8053ad314610852578063e086e5ec14610871578063e38d7cad14610879578063e985e9c514610899578063fe1ec880146108e257005b8063a22cb46514610780578063ac18de43146107a0578063b0c41ead146107c0578063c55f8126146107e0578063c87b56dd146107f3578063ccd7d4761461081357005b806370a082311161010a57806370a082311461069157806370c166d7146106bf57806382cf129d146106df57806390184b02146106f457806395d89b411461072d57806396fb3eaf1461074257005b806354f6127f146105ef57806355f804b31461060f5780635d1ca6311461062f5780636352211e1461065157806367530a611461067157005b806323b872dd116101d6578063431053ac1161019d578063431053ac14610538578063466bca0214610558578063467c97f51461057a5780634a63740a1461059a5780634b2ee5e9146105ba5780634f189cb2146105da57005b806323b872dd146104a0578063273e06b3146104c05780632d06177a146104e0578063392e53cd1461050057806342842e0e1461051857005b80630e57c7e8116102255780630e57c7e81461032357806310c558bf14610343578063160a792514610363578063162094c41461044057806319c186e5146104605780631aa3adf91461048057005b806301ffc9a71461025f57806306fdde0314610294578063081812fc146102b6578063095ea7b3146102ee5780630e05662e1461030e575b005b34801561026b57600080fd5b5061027f61027a366004613545565b610902565b60405190151581526020015b60405180910390f35b3480156102a057600080fd5b506102a9610942565b60405161028b91906135c1565b3480156102c257600080fd5b506102d66102d13660046135d4565b6109d4565b6040516001600160a01b03909116815260200161028b565b3480156102fa57600080fd5b5061025d610309366004613602565b610a6e565b34801561031a57600080fd5b506102a9610b84565b34801561032f57600080fd5b5061025d61033e366004613676565b610c12565b34801561034f57600080fd5b5061025d61035e3660046136c1565b610c87565b34801561036f57600080fd5b5061040561037e3660046136c1565b604080516080810182526000808252602082018190529181018290526060810191909152506001600160a01b03166000908152600860209081526040918290208251608081018452905460ff808216151583526101008204811615159383019390935262010000810483161515938201939093526301000000909204161515606082015290565b60405161028b919081511515815260208083015115159082015260408083015115159082015260609182015115159181019190915260800190565b34801561044c57600080fd5b5061025d61045b3660046137bb565b610d5a565b34801561046c57600080fd5b5061025d61047b3660046136c1565b610de9565b34801561048c57600080fd5b5061025d61049b3660046138de565b610eb2565b3480156104ac57600080fd5b5061025d6104bb3660046139e5565b6112f0565b3480156104cc57600080fd5b5061025d6104db3660046136c1565b6113c2565b3480156104ec57600080fd5b5061025d6104fb3660046136c1565b6114fb565b34801561050c57600080fd5b50600f5460ff1661027f565b34801561052457600080fd5b5061025d6105333660046139e5565b61153e565b34801561054457600080fd5b5061025d6105533660046136c1565b6115e4565b34801561056457600080fd5b5061056d611719565b60405161028b9190613a26565b34801561058657600080fd5b5061025d610595366004613a73565b61177a565b3480156105a657600080fd5b5061025d6105b53660046136c1565b611805565b3480156105c657600080fd5b506014546102d6906001600160a01b031681565b3480156105e657600080fd5b5061025d6118ca565b3480156105fb57600080fd5b506102a961060a3660046135d4565b61190e565b34801561061b57600080fd5b5061025d61062a366004613a8e565b6119b0565b34801561063b57600080fd5b5060015b60405160ff909116815260200161028b565b34801561065d57600080fd5b506102d661066c3660046135d4565b611a01565b34801561067d57600080fd5b5061025d61068c366004613676565b611a78565b34801561069d57600080fd5b506106b16106ac3660046136c1565b611ae8565b60405190815260200161028b565b3480156106cb57600080fd5b5061027f6106da366004613ac2565b611b6f565b3480156106eb57600080fd5b506102a9611c8c565b34801561070057600080fd5b5061027f61070f3660046136c1565b6001600160a01b031660009081526015602052604090205460ff1690565b34801561073957600080fd5b506102a9611c99565b34801561074e57600080fd5b5061027f61075d3660046136c1565b6001600160a01b0316600090815260086020526040902054610100900460ff1690565b34801561078c57600080fd5b5061025d61079b366004613b90565b611ca8565b3480156107ac57600080fd5b5061025d6107bb3660046136c1565b611d66565b3480156107cc57600080fd5b506102d66107db3660046135d4565b611da9565b61025d6107ee366004613bce565b611dd3565b3480156107ff57600080fd5b506102a961080e3660046135d4565b611e1b565b34801561081f57600080fd5b5060125461063f9060ff1681565b34801561083957600080fd5b50610842611f79565b60405161028b9493929190613c37565b34801561085e57600080fd5b50600f5461027f90610100900460ff1681565b61025d6120c9565b34801561088557600080fd5b506102d6610894366004613cbc565b61210b565b3480156108a557600080fd5b5061027f6108b4366004613d8b565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b3480156108ee57600080fd5b5061025d6108fd3660046136c1565b6122db565b60006301ffc9a760e01b6001600160e01b03198316148061093c57506001600160e01b031982166000908152600a602052604090205460ff165b92915050565b6060600d805461095190613db9565b80601f016020809104026020016040519081016040528092919081815260200182805461097d90613db9565b80156109ca5780601f1061099f576101008083540402835291602001916109ca565b820191906000526020600020905b8154815290600101906020018083116109ad57829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b0316610a525760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b6000610a7982611a01565b9050806001600160a01b0316836001600160a01b03161415610ae75760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610a49565b336001600160a01b0382161480610b035750610b0381336108b4565b610b755760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a49565b610b7f838361240b565b505050565b60118054610b9190613db9565b80601f0160208091040260200160405190810160405280929190818152602001828054610bbd90613db9565b8015610c0a5780601f10610bdf57610100808354040283529160200191610c0a565b820191906000526020600020905b815481529060010190602001808311610bed57829003601f168201915b505050505081565b3360009081526015602052604090205460ff16610c7c5760405162461bcd60e51b815260206004820152602260248201527f45524337323154656d706c6174653a204e4f5420455243323020436f6e74726160448201526118dd60f21b6064820152608401610a49565b610b7f838383612479565b3360009081526008602052604090205460ff161515600114610cbb5760405162461bcd60e51b8152600401610a4990613df4565b6001600160a01b038116600081815260086020526040808220805462ff000019166201000017815560098054600181018255935260008051602061437783398151915290920180546001600160a01b0319168417905551909133917fc2a42571a74ce1442c8c44d375ba9442e7d55d94b37afeace261c83c62128fa490610d4e9042904390918252602082015260400190565b60405180910390a35050565b610d646001611a01565b6001600160a01b0316336001600160a01b031614610d945760405162461bcd60e51b8152600401610a4990613e2b565b610d9e82826124d2565b336001600160a01b03167f6de6cd3982065cbd31e789e3109106f4d76d1c8a46e85262045cf947fb3fd4ed82844243604051610ddd9493929190613e62565b60405180910390a25050565b3360009081526008602052604090205460ff161515600114610e1d5760405162461bcd60e51b8152600401610a4990613df4565b6001600160a01b038116600081815260086020526040808220805463ff0000001916630100000017815560098054600181018255935260008051602061437783398151915290920180546001600160a01b0319168417905551909133917feb09276310ed110a7e565d64966d0ff68a47112d2dd5eeb6cbd7451836ce35ee90610d4e9042904390918252602082015260400190565b3360009081526008602052604090205462010000900460ff16610ee75760405162461bcd60e51b8152600401610a4990613e91565b6012805460ff191660ff8d16179055610f0260108b8b613408565b50610f0f60118989613408565b50600f54610100900460ff16610f8657336001600160a01b03167f5463569dcc320958360074a9ab27e809e8a6942c394fb151d139b5f7b4ecb1bd8c8c8c8a8a8a8a8a4243604051610f6a9a99989796959493929190613efb565b60405180910390a2600f805461ff001916610100179055610fd8565b60125460405133917fe5c4cf86b1815151e6f453e1e133d4454ae3b0b07145db39f2e0178685deac8491610fcf9160ff16908e908e908c908c908c908c908c9042904390613efb565b60405180910390a25b60328151111561101c5760405162461bcd60e51b815260206004820152600f60248201526e546f6f204d616e792050726f6f667360881b6044820152606401610a49565b60408051808201909152601c81527f19457468657265756d205369676e6564204d6573736167653a0a333200000000602082015260005b82518110156112e15760006001600160a01b031683828151811061107957611079613f63565b6020026020010151600001516001600160a01b0316146111fb57600082856040516020016110a8929190613f79565b60405160208183030381529060405280519060200120905060006001828685815181106110d7576110d7613f63565b6020026020010151602001518786815181106110f5576110f5613f63565b60200260200101516040015188878151811061111357611113613f63565b60200260200101516060015160405160008152602001604052604051611155949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa158015611177573d6000803e3d6000fd5b50505060206040510351905084838151811061119557611195613f63565b6020026020010151600001516001600160a01b0316816001600160a01b0316146111f85760405162461bcd60e51b815260206004820152601460248201527324b73b30b634b210383937b7b31039b4b3b732b960611b6044820152606401610a49565b50505b82818151811061120d5761120d613f63565b6020026020010151600001516001600160a01b03167f2819d8badf5cff2c9220b8ee99dacc14d67058e343d7f0c2c444d198507fe9418585848151811061125657611256613f63565b60200260200101516020015186858151811061127457611274613f63565b60200260200101516040015187868151811061129257611292613f63565b6020026020010151606001516040516112c7949392919093845260ff9290921660208401526040830152606082015260800190565b60405180910390a2806112d981613fb1565b915050611053565b50505050505050505050505050565b806001146113105760405162461bcd60e51b8152600401610a4990613fcc565b61137a611375601380548060200260200160405190810160405280929190818152602001828054801561136c57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161134e575b50505050505190565b61256c565b6113826125fd565b61138d8383836126ae565b611396826126ef565b506001600160a01b03166000908152600860205260409020805463ffffff001916630101010017905550565b3360009081526008602052604090205460ff161515600114806114135750336001600160a01b0382161480156114135750336000908152600860205260409020546301000000900460ff1615156001145b1561147b576001600160a01b03811660008181526008602052604090819020805463ff000000191681559051909133917fc929b18b08ffea86a1f95e29384dbe8968f2fcbd70cfd735df3aba1cc548cbf390610d4e9042904390918252602082015260400190565b60405162461bcd60e51b815260206004820152604660248201527f455243373231526f6c6573416464726573733a204e6f7420656e6f756768207060448201527f65726d697373696f6e7320746f2072656d6f76652066726f6d2037323553746f6064820152651c99531a5cdd60d21b608482015260a401610a49565b50565b6115056001611a01565b6001600160a01b0316336001600160a01b0316146115355760405162461bcd60e51b8152600401610a4990613e2b565b6114f8816126ef565b8060011461155e5760405162461bcd60e51b8152600401610a4990613fcc565b6115c1611375601380548060200260200160405190810160405280929190818152602001828054801561136c576020028201919060005260206000209081546001600160a01b0316815260019091019060200180831161134e5750505050505190565b6115c96125fd565b61138d83838360405180602001604052806000815250612780565b3360009081526008602052604090205460ff161515600114806116345750336001600160a01b03821614801561163457503360009081526008602052604090205462010000900460ff1615156001145b1561169b576001600160a01b03811660008181526008602052604090819020805462ff0000191681559051909133917f9b41e1311fa819e825bc77fa2568492112e15ea92d173f3f8ee1c8ec3c1c562b90610d4e9042904390918252602082015260400190565b60405162461bcd60e51b815260206004820152604760248201527f455243373231526f6c6573416464726573733a204e6f7420656e6f756768207060448201527f65726d697373696f6e7320746f2072656d6f76652066726f6d206d65746164616064820152661d18481b1a5cdd60ca1b608482015260a401610a49565b606060138054806020026020016040519081016040528092919081815260200182805480156109ca57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611753575050505050905090565b3360009081526008602052604090205462010000900460ff166117af5760405162461bcd60e51b8152600401610a4990613e91565b6012805460ff191660ff831690811790915560408051918252426020830152439082015233907fa8336411cc72db0e5bdc4dff989eeb35879bafaceffb59b54b37645c3395adb99060600160405180910390a250565b3360009081526008602052604090205460ff1615156001146118395760405162461bcd60e51b8152600401610a4990613df4565b6001600160a01b038116600081815260086020526040808220805461ff00191661010017815560098054600181018255935260008051602061437783398151915290920180546001600160a01b0319168417905551909133917f0572d56343be407a66810f01449212e8545e14ff5049c479d34be944cdfd0d4f90610d4e9042904390918252602082015260400190565b6118d46001611a01565b6001600160a01b0316336001600160a01b0316146119045760405162461bcd60e51b8152600401610a4990613e2b565b61190c6125fd565b565b6000818152600b6020526040902080546060919061192b90613db9565b80601f016020809104026020016040519081016040528092919081815260200182805461195790613db9565b80156119a45780601f10611979576101008083540402835291602001916119a4565b820191906000526020600020905b81548152906001019060200180831161198757829003601f168201915b50505050509050919050565b6119ba6001611a01565b6001600160a01b0316336001600160a01b0316146119ea5760405162461bcd60e51b8152600401610a4990613e2b565b80516119fd90600290602084019061348c565b5050565b6000818152600360205260408120546001600160a01b03168061093c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610a49565b336000908152600860205260409020546301000000900460ff16610c7c5760405162461bcd60e51b815260206004820152602160248201527f45524337323154656d706c6174653a204e4f542053544f5245205550444154456044820152602960f91b6064820152608401610a49565b60006001600160a01b038216611b535760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610a49565b506001600160a01b031660009081526004602052604090205490565b600f5460009060ff1615611be05760405162461bcd60e51b815260206004820152603260248201527f45524337323154656d706c6174653a20746f6b656e20696e7374616e636520616044820152711b1c9958591e481a5b9a5d1a585b1a5e995960721b6064820152608401610a49565b6000611c5a8a8a8a8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8e018190048102820181019092528c815292508c91508b90819084018382808284376000920191909152508b92508991506127b89050565b9050808015611c7157506001600160a01b03841615155b15611c7f57611c7f84611839565b9998505050505050505050565b60108054610b9190613db9565b6060600e805461095190613db9565b6001600160a01b038216331415611d015760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a49565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319101610d4e565b611d706001611a01565b6001600160a01b0316336001600160a01b031614611da05760405162461bcd60e51b8152600401610a4990613e2b565b6114f8816128f8565b60098181548110611db957600080fd5b6000918252602090912001546001600160a01b0316905081565b3360009081526008602052604090205460ff161515600114611e075760405162461bcd60e51b8152600401610a4990613df4565b611e148585858585612958565b5050505050565b6000818152600360205260409020546060906001600160a01b0316611e9a5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610a49565b60008281526007602052604081208054611eb390613db9565b80601f0160208091040260200160405190810160405280929190818152602001828054611edf90613db9565b8015611f2c5780601f10611f0157610100808354040283529160200191611f2c565b820191906000526020600020905b815481529060010190602001808311611f0f57829003601f168201915b505050505090506000611f3d612b81565b825190915015611f72578082604051602001611f5a929190614018565b60405160208183030381529060405292505050919050565b5092915050565b60608060008060106011601260009054906101000a900460ff16600f60019054906101000a900460ff16838054611faf90613db9565b80601f0160208091040260200160405190810160405280929190818152602001828054611fdb90613db9565b80156120285780601f10611ffd57610100808354040283529160200191612028565b820191906000526020600020905b81548152906001019060200180831161200b57829003601f168201915b5050505050935082805461203b90613db9565b80601f016020809104026020016040519081016040528092919081815260200182805461206790613db9565b80156120b45780601f10612089576101008083540402835291602001916120b4565b820191906000526020600020905b81548152906001019060200180831161209757829003601f168201915b50505050509250935093509350935090919293565b6120d36001611a01565b6001600160a01b03166108fc479081150290604051600060405180830381858888f193505050501580156114f8573d6000803e3d6000fd5b60006002600c5414156121605760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a49565b6002600c5533600090815260086020526040902054610100900460ff166121d85760405162461bcd60e51b815260206004820152602660248201527f45524337323154656d706c6174653a204e4f542045524332304445504c4f5945604482015265525f524f4c4560d01b6064820152608401610a49565b601254604051630557fcfb60e41b815260009161010090046001600160a01b03169063557fcfb09061221e908e908e908e908e908e908e908e908e908e90600401614168565b6020604051808303816000875af115801561223d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122619190614219565b6001600160a01b0381166000818152601560205260408120805460ff191660019081179091556013805491820181559091527f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0900180546001600160a01b03191690911790559150506001600c559998505050505050505050565b3360009081526008602052604090205460ff1615156001148061232b5750336001600160a01b03821614801561232b57503360009081526008602052604090205460ff6101009091041615156001145b15612391576001600160a01b03811660008181526008602052604090819020805461ff00191681559051909133917f59bd33f4c27cc16a2d74450e1fa43d7896020be9aecea4bee009db9294de899790610d4e9042904390918252602082015260400190565b60405162461bcd60e51b815260206004820152604360248201527f455243373231526f6c6573416464726573733a204e6f7420656e6f756768207060448201527f65726d697373696f6e7320746f2072656d6f76652066726f6d2045524332304c6064820152621a5cdd60ea1b608482015260a401610a49565b600081815260056020526040902080546001600160a01b0319166001600160a01b038416908117909155819061244082611a01565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000838152600b60205260409020612492908383613408565b50827fece574603820d07bc9b91f2a932baadf4628aabcb8afba49776529c14a6104b283836040516124c5929190614236565b60405180910390a2505050565b6000828152600360205260409020546001600160a01b031661254d5760405162461bcd60e51b815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b6064820152608401610a49565b60008281526007602090815260409091208251610b7f9284019061348c565b60005b818110156119fd576013818154811061258a5761258a613f63565b6000918252602082200154604080516382c03da560e01b815290516001600160a01b03909216926382c03da59260048084019382900301818387803b1580156125d257600080fd5b505af11580156125e6573d6000803e3d6000fd5b5050505080806125f590613fb1565b91505061256f565b60005b600954811015612665576000600860006009848154811061262357612623613f63565b60009182526020808320909101546001600160a01b031683528201929092526040019020805463ffffffff19169055508061265d81613fb1565b915050612600565b5061267260096000613500565b6040805142815243602082015233917f712bc71db81927a76b8bf1ea346247bb0ad58f18e4e5c1bd4aa0ec6573e02a2b910160405180910390a2565b6126b83382612b90565b6126d45760405162461bcd60e51b8152600401610a499061424a565b610b7f83838360405180602001604052806000815250612780565b6001600160a01b038116600081815260086020526040808220805460ff19166001908117825560098054918201815590935260008051602061437783398151915290920180546001600160a01b0319168417905551909133917faf8fc8b6726138c96881c895390a08e9d91a94c288f06281e7f9821c49c7155b90610d4e9042904390918252602082015260400190565b61278a3383612b90565b6127a65760405162461bcd60e51b8152600401610a499061424a565b6127b284848484612c87565b50505050565b60006001600160a01b0386166128275760405162461bcd60e51b815260206004820152602e60248201527f45524337323154656d706c6174653a3a20496e76616c6964206d696e7465722c60448201526d20207a65726f206164647265737360901b6064820152608401610a49565b845161283a90600d90602088019061348c565b50835161284e90600e90602087019061348c565b5060128054610100600160a81b0319166101006001600160a01b0386160217905560408051602081019182905260009081905261288d9160029161348c565b50600f805461ffff191660019081179091556128aa908790612cba565b6128b3866126ef565b6001600160a01b0386166000908152600860205260409020805463ffffff00191663010101001781556128e76001846124d2565b5050600f5460ff1695945050505050565b6001600160a01b03811660008181526008602052604090819020805460ff191681559051909133917fb572db0e6da4924b771ed1712b980d48b5992b9a1c27aede55fbb3318c48996a90610d4e9042904390918252602082015260400190565b82846001600160a01b0316867f1f920dbda597d7bf95035464170fa58d0a4b57f13a1c315ace6793b9f63688b88585604051612995929190614236565b60405180910390a460006109c45a6129ad919061429b565b9050856129fd576129f7858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250879250612cd4915050565b50612b79565b6003861415612a46576129f78484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612cec92505050565b6002861415612b3a576000612a9d84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612a9892506020915087905061429b565b612d88565b90506000612aec85858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509250612ae79150602090508861429b565b612de6565b90506000612afb878484612ef3565b6040519091506001600160a01b038216907fcf78cf0d6f3d8371e1075c69c492ab4ec5d8cf23a1a239b6a51a1d00be7ca31290600090a2505050612b79565b60405162461bcd60e51b815260206004820152601460248201527357726f6e67206f7065726174696f6e207479706560601b6044820152606401610a49565b505050505050565b60606002805461095190613db9565b6000818152600360205260408120546001600160a01b0316612c095760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610a49565b6000612c1483611a01565b9050806001600160a01b0316846001600160a01b03161480612c4f5750836001600160a01b0316612c44846109d4565b6001600160a01b0316145b80612c7f57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b612c92848484612ff5565b612c9e84848484613195565b6127b25760405162461bcd60e51b8152600401610a49906142b2565b6119fd828260405180602001604052806000815250613293565b6000806000845160208601878987f195945050505050565b600081516020830184f090506001600160a01b038116612d4e5760405162461bcd60e51b815260206004820152601960248201527f436f756c64206e6f74206465706c6f7920636f6e7472616374000000000000006044820152606401610a49565b6040516001600160a01b038216907fcf78cf0d6f3d8371e1075c69c492ab4ec5d8cf23a1a239b6a51a1d00be7ca31290600090a292915050565b6000612d95826020614304565b83511015612ddd5760405162461bcd60e51b8152602060048201526015602482015274746f427974657333325f6f75744f66426f756e647360581b6044820152606401610a49565b50016020015190565b606081612df481601f614304565b1015612e335760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b6044820152606401610a49565b612e3d8284614304565b84511015612e815760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b6044820152606401610a49565b606082158015612ea05760405191506000825260208201604052612eea565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015612ed9578051835260209283019201612ec1565b5050858452601f01601f1916604052505b50949350505050565b60008084471015612f465760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610a49565b8251612f945760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610a49565b8383516020850187f590506001600160a01b038116612c7f5760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401610a49565b826001600160a01b031661300882611a01565b6001600160a01b0316146130705760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610a49565b6001600160a01b0382166130d25760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a49565b6130dd60008261240b565b6001600160a01b038316600090815260046020526040812080546001929061310690849061429b565b90915550506001600160a01b0382166000908152600460205260408120805460019290613134908490614304565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006001600160a01b0384163b1561328857604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906131d990339089908890889060040161431c565b6020604051808303816000875af1925050508015613214575060408051601f3d908101601f1916820190925261321191810190614359565b60015b61326e573d808015613242576040519150601f19603f3d011682016040523d82523d6000602084013e613247565b606091505b5080516132665760405162461bcd60e51b8152600401610a49906142b2565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612c7f565b506001949350505050565b61329d83836132c6565b6132aa6000848484613195565b610b7f5760405162461bcd60e51b8152600401610a49906142b2565b6001600160a01b03821661331c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a49565b6000818152600360205260409020546001600160a01b0316156133815760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a49565b6001600160a01b03821660009081526004602052604081208054600192906133aa908490614304565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461341490613db9565b90600052602060002090601f016020900481019282613436576000855561347c565b82601f1061344f5782800160ff1982351617855561347c565b8280016001018555821561347c579182015b8281111561347c578235825591602001919060010190613461565b5061348892915061351a565b5090565b82805461349890613db9565b90600052602060002090601f0160209004810192826134ba576000855561347c565b82601f106134d357805160ff191683800117855561347c565b8280016001018555821561347c579182015b8281111561347c5782518255916020019190600101906134e5565b50805460008255906000526020600020908101906114f891905b5b80821115613488576000815560010161351b565b6001600160e01b0319811681146114f857600080fd5b60006020828403121561355757600080fd5b81356135628161352f565b9392505050565b60005b8381101561358457818101518382015260200161356c565b838111156127b25750506000910152565b600081518084526135ad816020860160208601613569565b601f01601f19169290920160200192915050565b6020815260006135626020830184613595565b6000602082840312156135e657600080fd5b5035919050565b6001600160a01b03811681146114f857600080fd5b6000806040838503121561361557600080fd5b8235613620816135ed565b946020939093013593505050565b60008083601f84011261364057600080fd5b5081356001600160401b0381111561365757600080fd5b60208301915083602082850101111561366f57600080fd5b9250929050565b60008060006040848603121561368b57600080fd5b8335925060208401356001600160401b038111156136a857600080fd5b6136b48682870161362e565b9497909650939450505050565b6000602082840312156136d357600080fd5b8135613562816135ed565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b0381118282101715613716576137166136de565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613744576137446136de565b604052919050565b600082601f83011261375d57600080fd5b81356001600160401b03811115613776576137766136de565b613789601f8201601f191660200161371c565b81815284602083860101111561379e57600080fd5b816020850160208301376000918101602001919091529392505050565b600080604083850312156137ce57600080fd5b8235915060208301356001600160401b038111156137eb57600080fd5b6137f78582860161374c565b9150509250929050565b803560ff8116811461381257600080fd5b919050565b600082601f83011261382857600080fd5b813560206001600160401b03821115613843576138436136de565b613851818360051b0161371c565b82815260079290921b8401810191818101908684111561387057600080fd5b8286015b848110156138d3576080818903121561388d5760008081fd5b6138956136f4565b81356138a0816135ed565b81526138ad828601613801565b818601526040828101359082015260608083013590820152835291830191608001613874565b509695505050505050565b600080600080600080600080600080600060e08c8e0312156138ff57600080fd5b6139088c613801565b9a506001600160401b038060208e0135111561392357600080fd5b6139338e60208f01358f0161362e565b909b50995060408d013581101561394957600080fd5b6139598e60408f01358f0161362e565b909950975060608d013581101561396f57600080fd5b61397f8e60608f01358f0161362e565b909750955060808d013581101561399557600080fd5b6139a58e60808f01358f0161362e565b909550935060a08d0135925060c08d01358110156139c257600080fd5b506139d38d60c08e01358e01613817565b90509295989b509295989b9093969950565b6000806000606084860312156139fa57600080fd5b8335613a05816135ed565b92506020840135613a15816135ed565b929592945050506040919091013590565b6020808252825182820181905260009190848201906040850190845b81811015613a675783516001600160a01b031683529284019291840191600101613a42565b50909695505050505050565b600060208284031215613a8557600080fd5b61356282613801565b600060208284031215613aa057600080fd5b81356001600160401b03811115613ab657600080fd5b612c7f8482850161374c565b60008060008060008060008060c0898b031215613ade57600080fd5b8835613ae9816135ed565b975060208901356001600160401b0380821115613b0557600080fd5b613b118c838d0161362e565b909950975060408b0135915080821115613b2a57600080fd5b613b368c838d0161362e565b909750955060608b01359150613b4b826135ed565b90935060808a013590613b5d826135ed565b90925060a08a01359080821115613b7357600080fd5b50613b808b828c0161374c565b9150509295985092959890939650565b60008060408385031215613ba357600080fd5b8235613bae816135ed565b915060208301358015158114613bc357600080fd5b809150509250929050565b600080600080600060808688031215613be657600080fd5b853594506020860135613bf8816135ed565b93506040860135925060608601356001600160401b03811115613c1a57600080fd5b613c268882890161362e565b969995985093965092949392505050565b608081526000613c4a6080830187613595565b8281036020840152613c5c8187613595565b60ff959095166040840152505090151560609091015292915050565b60008083601f840112613c8a57600080fd5b5081356001600160401b03811115613ca157600080fd5b6020830191508360208260051b850101111561366f57600080fd5b600080600080600080600080600060a08a8c031215613cda57600080fd5b8935985060208a01356001600160401b0380821115613cf857600080fd5b613d048d838e01613c78565b909a50985060408c0135915080821115613d1d57600080fd5b613d298d838e01613c78565b909850965060608c0135915080821115613d4257600080fd5b613d4e8d838e01613c78565b909650945060808c0135915080821115613d6757600080fd5b50613d748c828d01613c78565b915080935050809150509295985092959850929598565b60008060408385031215613d9e57600080fd5b8235613da9816135ed565b91506020830135613bc3816135ed565b600181811c90821680613dcd57607f821691505b60208210811415613dee57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601f908201527f455243373231526f6c6573416464726573733a204e4f54204d414e4147455200604082015260600190565b6020808252601c908201527f45524337323154656d706c6174653a206e6f74204e46544f776e657200000000604082015260600190565b608081526000613e756080830187613595565b6020830195909552506040810192909252606090910152919050565b60208082526021908201527f45524337323154656d706c6174653a204e4f54204d455441444154415f524f4c6040820152604560f81b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60ff8b16815260e060208201526000613f1860e083018b8d613ed2565b8281036040840152613f2b818a8c613ed2565b90508281036060840152613f4081888a613ed2565b6080840196909652505060a081019290925260c090910152979650505050505050565b634e487b7160e01b600052603260045260246000fd5b60008351613f8b818460208801613569565b9190910191825250602001919050565b634e487b7160e01b600052601160045260246000fd5b6000600019821415613fc557613fc5613f9b565b5060010190565b6020808252602c908201527f45524337323154656d706c6174653a2043616e6e6f74207472616e736665722060408201526b1d1a1a5cc81d1bdad95b925960a21b606082015260800190565b6000835161402a818460208801613569565b83519083019061403e818360208801613569565b01949350505050565b6000808335601e1984360301811261405e57600080fd5b83016020810192503590506001600160401b0381111561407d57600080fd5b80360383131561366f57600080fd5b8183526000602080850194508260005b858110156140ca5781356140af816135ed565b6001600160a01b03168752958201959082019060010161409c565b509495945050505050565b81835260006001600160fb1b038311156140ee57600080fd5b8260051b8083602087013760009401602001938452509192915050565b81835260006020808501808196508560051b810191508460005b8781101561415b57828403895261413c8288614047565b614147868284613ed2565b9a87019a9550505090840190600101614125565b5091979650505050505050565b89815260a0602082018190528101889052600060c060058a901b830181019083018b835b8c8110156141c95785840360bf190183526141a7828f614047565b6141b2868284613ed2565b95505050602092830192919091019060010161418c565b50505082810360408401526141df81898b61408c565b905082810360608401526141f48187896140d5565b9050828103608084015261420981858761410b565b9c9b505050505050505050505050565b60006020828403121561422b57600080fd5b8151613562816135ed565b602081526000612c7f602083018486613ed2565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000828210156142ad576142ad613f9b565b500390565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6000821982111561431757614317613f9b565b500190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061434f90830184613595565b9695505050505050565b60006020828403121561436b57600080fd5b81516135628161352f56fe6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7afa26469706673582212206d0bc2d2cba31628d81338472b8edc29d561d59a0f52686f6ad9fb78da838a2264736f6c634300080a0033",linkReferences:{},deployedLinkReferences:{}};class W{constructor(e,a,t){this.GASLIMIT_DEFAULT=1e6,this.factory721Address=void 0,this.factory721Abi=void 0,this.nftAbi=void 0,this.web3=void 0,this.startBlock=void 0,this.nftAbi=a||N.abi,this.web3=e,this.startBlock=t||0}async estGasCreateErc20(e,a,t,b,n,d,f,s,i,c,r,o){const p=o||new this.web3.eth.Contract(this.nftAbi,e),y=this.GASLIMIT_DEFAULT;let u;try{u=await p.methods.createERC20(r,[i,c],[t,b,n,d],[this.web3.utils.toWei(s),this.web3.utils.toWei(f)],[]).estimateGas({from:a},(e,a)=>e?y:a)}catch(e){u=y}return u}async createErc20(e,a,t,b,n,d,f,s,i,c,r){if(!0!==(await this.getNftPermissions(e,a)).deployERC20)throw new Error("Caller is not ERC20Deployer");r||(r=1),i&&c||({name:i,symbol:c}=A());const o=new this.web3.eth.Contract(this.nftAbi,e),p=await this.estGasCreateErc20(e,a,t,b,n,d,f,s,i,c,r,o),y=await o.methods.createERC20(r,[i,c],[t,b,n,d],[this.web3.utils.toWei(s),this.web3.utils.toWei(f)],[]).send({from:a,gas:p+1,gasPrice:await w(this.web3)});let u=null;try{u=y.events.TokenCreated.returnValues[0]}catch(e){T.error(`ERROR: Failed to create datatoken : ${e.message}`)}return u}async estGasAddManager(e,a,t,b){const n=b||new this.web3.eth.Contract(this.nftAbi,e),d=this.GASLIMIT_DEFAULT;let f;try{f=await n.methods.addManager(t).estimateGas({from:a},(e,a)=>e?d:a)}catch(e){f=d}return f}async addManager(e,a,t){const b=new this.web3.eth.Contract(this.nftAbi,e);if(await this.getNftOwner(e)!==a)throw new Error("Caller is not NFT Owner");const n=await this.estGasAddManager(e,a,t,b);return await b.methods.addManager(t).send({from:a,gas:n+1,gasPrice:await w(this.web3)})}async estGasRemoveManager(e,a,t,b){const n=b||new this.web3.eth.Contract(this.nftAbi,e),d=this.GASLIMIT_DEFAULT;let f;try{f=await n.methods.removeManager(t).estimateGas({from:a},(e,a)=>e?d:a)}catch(e){f=d}return f}async removeManager(e,a,t){const b=new this.web3.eth.Contract(this.nftAbi,e);if(await this.getNftOwner(e)!==a)throw new Error("Caller is not NFT Owner");const n=await this.estGasRemoveManager(e,a,t,b);return await b.methods.removeManager(t).send({from:a,gas:n+1,gasPrice:await w(this.web3)})}async estGasAddErc20Deployer(e,a,t,b){const n=b||new this.web3.eth.Contract(this.nftAbi,e),d=this.GASLIMIT_DEFAULT;let f;try{f=await n.methods.addToCreateERC20List(t).estimateGas({from:a},(e,a)=>e?d:a)}catch(e){f=d}return f}async addErc20Deployer(e,a,t){const b=new this.web3.eth.Contract(this.nftAbi,e);if(!0!==(await this.getNftPermissions(e,a)).manager)throw new Error("Caller is not Manager");const n=await this.estGasAddErc20Deployer(e,a,t,b);return await b.methods.addToCreateERC20List(t).send({from:a,gas:n+1,gasPrice:await w(this.web3)})}async estGasRemoveErc20Deployer(e,a,t,b){const n=b||new this.web3.eth.Contract(this.nftAbi,e),d=this.GASLIMIT_DEFAULT;let f;try{f=await n.methods.removeFromCreateErc20List(t).estimateGas({from:a},(e,a)=>e?d:a)}catch(e){f=d}return f}async removeErc20Deployer(e,a,t){const b=new this.web3.eth.Contract(this.nftAbi,e);if(!0!==(await this.getNftPermissions(e,a)).manager||a===t&&!0!==(await this.getNftPermissions(e,a)).deployERC20)throw new Error("Caller is not Manager nor ERC20Deployer");const n=await this.estGasRemoveErc20Deployer(e,a,t,b);return await b.methods.removeFromCreateERC20List(t).send({from:a,gas:n+1,gasPrice:await w(this.web3)})}async estGasAddMetadataUpdater(e,a,t,b){const n=b||new this.web3.eth.Contract(this.nftAbi,e),d=this.GASLIMIT_DEFAULT;let f;try{f=await n.methods.addToMetadataList(t).estimateGas({from:a},(e,a)=>e?d:a)}catch(e){f=d}return f}async addMetadataUpdater(e,a,t){const b=new this.web3.eth.Contract(this.nftAbi,e);if(!0!==(await this.getNftPermissions(e,a)).manager)throw new Error("Caller is not Manager");const n=await this.estGasAddMetadataUpdater(e,a,t,b);return await b.methods.addToMetadataList(t).send({from:a,gas:n+1,gasPrice:await w(this.web3)})}async esGasRemoveMetadataUpdater(e,a,t,b){const n=b||new this.web3.eth.Contract(this.nftAbi,e),d=this.GASLIMIT_DEFAULT;let f;try{f=await n.methods.removeFromMetadataList(t).estimateGas({from:a},(e,a)=>e?d:a)}catch(e){f=d}return f}async removeMetadataUpdater(e,a,t){const b=new this.web3.eth.Contract(this.nftAbi,e);if(!0!==(await this.getNftPermissions(e,a)).manager||a!==t&&!0!==(await this.getNftPermissions(e,a)).updateMetadata)throw new Error("Caller is not Manager nor Metadata Updater");const n=await this.esGasRemoveMetadataUpdater(e,a,t,b);return await b.methods.removeFromMetadataList(t).send({from:a,gas:n+1,gasPrice:await w(this.web3)})}async estGasAddStoreUpdater(e,a,t,b){const n=b||new this.web3.eth.Contract(this.nftAbi,e),d=this.GASLIMIT_DEFAULT;let f;try{f=await n.methods.addTo725StoreList(t).estimateGas({from:a},(e,a)=>e?d:a)}catch(e){f=d}return f}async addStoreUpdater(e,a,t){const b=new this.web3.eth.Contract(this.nftAbi,e);if(!0!==(await this.getNftPermissions(e,a)).manager)throw new Error("Caller is not Manager");const n=await this.estGasAddStoreUpdater(e,a,t,b);return await b.methods.addTo725StoreList(t).send({from:a,gas:n+1,gasPrice:await w(this.web3)})}async estGasRemoveStoreUpdater(e,a,t,b){const n=b||new this.web3.eth.Contract(this.nftAbi,e),d=this.GASLIMIT_DEFAULT;let f;try{f=await n.methods.removeFrom725StoreList(t).estimateGas({from:a},(e,a)=>e?d:a)}catch(e){f=d}return f}async removeStoreUpdater(e,a,t){const b=new this.web3.eth.Contract(this.nftAbi,e);if(!0!==(await this.getNftPermissions(e,a)).manager||a!==t&&!0!==(await this.getNftPermissions(e,a)).store)throw new Error("Caller is not Manager nor storeUpdater");const n=await this.estGasRemoveStoreUpdater(e,a,t,b);return await b.methods.removeFrom725StoreList(t).send({from:a,gas:n+1,gasPrice:await w(this.web3)})}async estGasCleanPermissions(e,a,t){const b=t||new this.web3.eth.Contract(this.nftAbi,e),n=this.GASLIMIT_DEFAULT;let d;try{d=await b.methods.cleanPermissions().estimateGas({from:a},(e,a)=>e?n:a)}catch(e){d=n}return d}async cleanPermissions(e,a){const t=new this.web3.eth.Contract(this.nftAbi,e);if(await this.getNftOwner(e)!==a)throw new Error("Caller is not NFT Owner");const b=await this.estGasCleanPermissions(e,a,t);return await t.methods.cleanPermissions().send({from:a,gas:b+1,gasPrice:await w(this.web3)})}async estGasTransferNft(e,a,t,b,n){const d=n||new this.web3.eth.Contract(this.nftAbi,e),f=this.GASLIMIT_DEFAULT;let s;try{s=await d.methods.transferFrom(a,t,b).estimateGas({from:a},(e,a)=>e?f:a)}catch(e){s=f}return s}async transferNft(e,a,t,b){const n=new this.web3.eth.Contract(this.nftAbi,e);if(await this.getNftOwner(e)!==a)throw new Error("Caller is not NFT Owner");const d=b||1,f=await this.estGasTransferNft(e,a,t,d,n);return await n.methods.transferFrom(a,t,d).send({from:a,gas:f+1,gasPrice:await w(this.web3)})}async estGasSafeTransferNft(e,a,t,b,n){const d=n||new this.web3.eth.Contract(this.nftAbi,e),f=this.GASLIMIT_DEFAULT;let s;try{s=await d.methods.safeTransferFrom(a,t,b).estimateGas({from:a},(e,a)=>e?f:a)}catch(e){s=f}return s}async safeTransferNft(e,a,t,b){const n=new this.web3.eth.Contract(this.nftAbi,e);if(await this.getNftOwner(e)!==a)throw new Error("Caller is not NFT Owner");const d=b||1,f=await this.estGasSafeTransferNft(e,a,t,d,n);return await n.methods.safeTransferFrom(a,t,d).send({from:a,gas:f+1,gasPrice:await w(this.web3)})}async estGasSetMetadata(e,a,t,b,n,d,f,s,i,c){const r=c||new this.web3.eth.Contract(this.nftAbi,e),o=this.GASLIMIT_DEFAULT;let p;try{p=await r.methods.setMetaData(t,b,n,d,f,s,i).estimateGas({from:a},(e,a)=>e?o:a)}catch(e){p=o}return p}async setMetadata(e,a,t,b,n,d,f,s,i){const c=new this.web3.eth.Contract(this.nftAbi,e);if(i||(i=[]),!(await this.getNftPermissions(e,a)).updateMetadata)throw new Error("Caller is not Metadata updater");const r=await this.estGasSetMetadata(e,a,t,b,n,d,f,s,i,c);return await c.methods.setMetaData(t,b,n,d,f,s,i).send({from:a,gas:r+1,gasPrice:await w(this.web3)})}async estGasSetMetadataState(e,a,t,b){const n=b||new this.web3.eth.Contract(this.nftAbi,e),d=this.GASLIMIT_DEFAULT;let f;try{f=await n.methods.setMetaDataState(t).estimateGas({from:a},(e,a)=>e?d:a)}catch(e){f=d}return f}async setMetadataState(e,a,t){const b=new this.web3.eth.Contract(this.nftAbi,e);if(!(await this.getNftPermissions(e,a)).updateMetadata)throw new Error("Caller is not Metadata updater");const n=await this.estGasSetMetadataState(e,a,t);return await b.methods.setMetaDataState(t).send({from:a,gas:n+1,gasPrice:await w(this.web3)})}async estSetTokenURI(e,a,t){const b=new this.web3.eth.Contract(this.nftAbi,e),n=this.GASLIMIT_DEFAULT;let d;try{d=await b.methods.setTokenURI("1",t).estimateGas({from:a},(e,a)=>e?n:a)}catch(e){d=n}return d}async setTokenURI(e,a,t){const b=new this.web3.eth.Contract(this.nftAbi,e),n=await this.estSetTokenURI(e,a,t);return await b.methods.setTokenURI("1",t).send({from:a,gas:n+1,gasPrice:await w(this.web3)})}async getNftOwner(e){const a=new this.web3.eth.Contract(this.nftAbi,e);return await a.methods.ownerOf(1).call()}async getNftPermissions(e,a){const t=new this.web3.eth.Contract(this.nftAbi,e);return await t.methods.getPermissions(a).call()}async getMetadata(e){const a=new this.web3.eth.Contract(this.nftAbi,e);return await a.methods.getMetaData().call()}async isErc20Deployer(e,a){const t=new this.web3.eth.Contract(this.nftAbi,e);return await t.methods.isERC20Deployer(a).call()}async getData(e,a){const t=new this.web3.eth.Contract(this.nftAbi,e);return await t.methods.getData(a).call()}async getTokenURI(e,a){const t=new this.web3.eth.Contract(this.nftAbi,e);return await t.methods.tokenURI(a).call()}}var B={_format:"hh-sol-artifact-1",contractName:"ERC721Factory",sourceName:"contracts/ERC721Factory.sol",abi:[{inputs:[{internalType:"address",name:"_template721",type:"address"},{internalType:"address",name:"_template",type:"address"},{internalType:"address",name:"_collector",type:"address"},{internalType:"address",name:"_router",type:"address"}],stateMutability:"nonpayable",type:"constructor"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"datatokenAddress",type:"address"},{indexed:!0,internalType:"address",name:"owner",type:"address"},{indexed:!1,internalType:"uint256",name:"maxTokens",type:"uint256"},{indexed:!1,internalType:"uint256",name:"maxBalance",type:"uint256"},{indexed:!1,internalType:"address",name:"allowedSwapper",type:"address"}],name:"DispenserCreated",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"instance",type:"address"}],name:"InstanceDeployed",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"newTokenAddress",type:"address"},{indexed:!0,internalType:"address",name:"templateAddress",type:"address"},{indexed:!1,internalType:"string",name:"tokenName",type:"string"},{indexed:!1,internalType:"address",name:"admin",type:"address"},{indexed:!1,internalType:"string",name:"symbol",type:"string"},{indexed:!1,internalType:"string",name:"tokenURI",type:"string"}],name:"NFTCreated",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"bytes32",name:"exchangeId",type:"bytes32"},{indexed:!1,internalType:"address",name:"owner",type:"address"}],name:"NewFixedRate",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"poolAddress",type:"address"},{indexed:!1,internalType:"address",name:"ssContract",type:"address"},{indexed:!1,internalType:"address",name:"basetokenAddress",type:"address"}],name:"NewPool",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"previousOwner",type:"address"},{indexed:!0,internalType:"address",name:"newOwner",type:"address"}],name:"OwnershipTransferred",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_templateAddress",type:"address"},{indexed:!0,internalType:"uint256",name:"nftTemplateCount",type:"uint256"}],name:"Template20Added",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_templateAddress",type:"address"},{indexed:!0,internalType:"uint256",name:"nftTemplateCount",type:"uint256"}],name:"Template721Added",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"newTokenAddress",type:"address"},{indexed:!0,internalType:"address",name:"templateAddress",type:"address"},{indexed:!1,internalType:"string",name:"name",type:"string"},{indexed:!1,internalType:"string",name:"symbol",type:"string"},{indexed:!1,internalType:"uint256",name:"cap",type:"uint256"},{indexed:!1,internalType:"address",name:"creator",type:"address"}],name:"TokenCreated",type:"event"},{inputs:[{internalType:"address",name:"_templateAddress",type:"address"}],name:"add721TokenTemplate",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"_templateAddress",type:"address"}],name:"addTokenTemplate",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"nonpayable",type:"function"},{inputs:[{components:[{internalType:"string",name:"name",type:"string"},{internalType:"string",name:"symbol",type:"string"},{internalType:"uint256",name:"templateIndex",type:"uint256"},{internalType:"string",name:"tokenURI",type:"string"}],internalType:"struct ERC721Factory.NftCreateData",name:"_NftCreateData",type:"tuple"},{components:[{internalType:"uint256",name:"templateIndex",type:"uint256"},{internalType:"string[]",name:"strings",type:"string[]"},{internalType:"address[]",name:"addresses",type:"address[]"},{internalType:"uint256[]",name:"uints",type:"uint256[]"},{internalType:"bytes[]",name:"bytess",type:"bytes[]"}],internalType:"struct ERC721Factory.ErcCreateData",name:"_ErcCreateData",type:"tuple"},{components:[{internalType:"address",name:"dispenserAddress",type:"address"},{internalType:"uint256",name:"maxTokens",type:"uint256"},{internalType:"uint256",name:"maxBalance",type:"uint256"},{internalType:"bool",name:"withMint",type:"bool"},{internalType:"address",name:"allowedSwapper",type:"address"}],internalType:"struct ERC721Factory.DispenserData",name:"_DispenserData",type:"tuple"}],name:"createNftErcWithDispenser",outputs:[{internalType:"address",name:"erc721Address",type:"address"},{internalType:"address",name:"erc20Address",type:"address"}],stateMutability:"nonpayable",type:"function"},{inputs:[{components:[{internalType:"string",name:"name",type:"string"},{internalType:"string",name:"symbol",type:"string"},{internalType:"uint256",name:"templateIndex",type:"uint256"},{internalType:"string",name:"tokenURI",type:"string"}],internalType:"struct ERC721Factory.NftCreateData",name:"_NftCreateData",type:"tuple"},{components:[{internalType:"uint256",name:"templateIndex",type:"uint256"},{internalType:"string[]",name:"strings",type:"string[]"},{internalType:"address[]",name:"addresses",type:"address[]"},{internalType:"uint256[]",name:"uints",type:"uint256[]"},{internalType:"bytes[]",name:"bytess",type:"bytes[]"}],internalType:"struct ERC721Factory.ErcCreateData",name:"_ErcCreateData",type:"tuple"},{components:[{internalType:"address",name:"fixedPriceAddress",type:"address"},{internalType:"address[]",name:"addresses",type:"address[]"},{internalType:"uint256[]",name:"uints",type:"uint256[]"}],internalType:"struct ERC721Factory.FixedData",name:"_FixedData",type:"tuple"}],name:"createNftErcWithFixedRate",outputs:[{internalType:"address",name:"erc721Address",type:"address"},{internalType:"address",name:"erc20Address",type:"address"},{internalType:"bytes32",name:"exchangeId",type:"bytes32"}],stateMutability:"nonpayable",type:"function"},{inputs:[{components:[{internalType:"string",name:"name",type:"string"},{internalType:"string",name:"symbol",type:"string"},{internalType:"uint256",name:"templateIndex",type:"uint256"},{internalType:"string",name:"tokenURI",type:"string"}],internalType:"struct ERC721Factory.NftCreateData",name:"_NftCreateData",type:"tuple"},{components:[{internalType:"uint256",name:"templateIndex",type:"uint256"},{internalType:"string[]",name:"strings",type:"string[]"},{internalType:"address[]",name:"addresses",type:"address[]"},{internalType:"uint256[]",name:"uints",type:"uint256[]"},{internalType:"bytes[]",name:"bytess",type:"bytes[]"}],internalType:"struct ERC721Factory.ErcCreateData",name:"_ErcCreateData",type:"tuple"},{components:[{internalType:"address[]",name:"addresses",type:"address[]"},{internalType:"uint256[]",name:"ssParams",type:"uint256[]"},{internalType:"uint256[]",name:"swapFees",type:"uint256[]"}],internalType:"struct ERC721Factory.PoolData",name:"_PoolData",type:"tuple"}],name:"createNftErcWithPool",outputs:[{internalType:"address",name:"erc721Address",type:"address"},{internalType:"address",name:"erc20Address",type:"address"},{internalType:"address",name:"poolAddress",type:"address"}],stateMutability:"nonpayable",type:"function"},{inputs:[{components:[{internalType:"string",name:"name",type:"string"},{internalType:"string",name:"symbol",type:"string"},{internalType:"uint256",name:"templateIndex",type:"uint256"},{internalType:"string",name:"tokenURI",type:"string"}],internalType:"struct ERC721Factory.NftCreateData",name:"_NftCreateData",type:"tuple"},{components:[{internalType:"uint256",name:"templateIndex",type:"uint256"},{internalType:"string[]",name:"strings",type:"string[]"},{internalType:"address[]",name:"addresses",type:"address[]"},{internalType:"uint256[]",name:"uints",type:"uint256[]"},{internalType:"bytes[]",name:"bytess",type:"bytes[]"}],internalType:"struct ERC721Factory.ErcCreateData",name:"_ErcCreateData",type:"tuple"}],name:"createNftWithErc",outputs:[{internalType:"address",name:"erc721Address",type:"address"},{internalType:"address",name:"erc20Address",type:"address"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"_templateIndex",type:"uint256"},{internalType:"string[]",name:"strings",type:"string[]"},{internalType:"address[]",name:"addresses",type:"address[]"},{internalType:"uint256[]",name:"uints",type:"uint256[]"},{internalType:"bytes[]",name:"bytess",type:"bytes[]"}],name:"createToken",outputs:[{internalType:"address",name:"token",type:"address"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"string",name:"name",type:"string"},{internalType:"string",name:"symbol",type:"string"},{internalType:"uint256",name:"_templateIndex",type:"uint256"},{internalType:"address",name:"additionalERC20Deployer",type:"address"},{internalType:"string",name:"tokenURI",type:"string"}],name:"deployERC721Contract",outputs:[{internalType:"address",name:"token",type:"address"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"_index",type:"uint256"}],name:"disable721TokenTemplate",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"_index",type:"uint256"}],name:"disableTokenTemplate",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"",type:"address"}],name:"erc20List",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"",type:"address"}],name:"erc721List",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"getCurrentNFTCount",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"getCurrentNFTTemplateCount",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"getCurrentTemplateCount",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"getCurrentTokenCount",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"_index",type:"uint256"}],name:"getNFTTemplate",outputs:[{components:[{internalType:"address",name:"templateAddress",type:"address"},{internalType:"bool",name:"isActive",type:"bool"}],internalType:"struct ERC721Factory.Template",name:"",type:"tuple"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"_index",type:"uint256"}],name:"getTokenTemplate",outputs:[{components:[{internalType:"address",name:"templateAddress",type:"address"},{internalType:"bool",name:"isActive",type:"bool"}],internalType:"struct ERC721Factory.Template",name:"",type:"tuple"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"",type:"uint256"}],name:"nftTemplateList",outputs:[{internalType:"address",name:"templateAddress",type:"address"},{internalType:"bool",name:"isActive",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[],name:"owner",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"_index",type:"uint256"}],name:"reactivate721TokenTemplate",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"_index",type:"uint256"}],name:"reactivateTokenTemplate",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"renounceOwnership",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"router",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{components:[{internalType:"address",name:"tokenAddress",type:"address"},{internalType:"address",name:"consumer",type:"address"},{internalType:"uint256",name:"serviceIndex",type:"uint256"},{internalType:"address",name:"providerFeeAddress",type:"address"},{internalType:"address",name:"providerFeeToken",type:"address"},{internalType:"uint256",name:"providerFeeAmount",type:"uint256"},{internalType:"uint8",name:"v",type:"uint8"},{internalType:"bytes32",name:"r",type:"bytes32"},{internalType:"bytes32",name:"s",type:"bytes32"},{internalType:"bytes",name:"providerData",type:"bytes"}],internalType:"struct ERC721Factory.tokenOrder[]",name:"orders",type:"tuple[]"}],name:"startMultipleTokenOrder",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"templateCount",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"",type:"uint256"}],name:"templateList",outputs:[{internalType:"address",name:"templateAddress",type:"address"},{internalType:"bool",name:"isActive",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"newOwner",type:"address"}],name:"transferOwnership",outputs:[],stateMutability:"nonpayable",type:"function"}],bytecode:"0x60806040526000600a553480156200001657600080fd5b50604051620039c8380380620039c88339810160408190526200003991620005ab565b6200004433620001be565b600180556001600160a01b038316158015906200006957506001600160a01b03821615155b80156200007e57506001600160a01b03841615155b620001065760405162461bcd60e51b815260206004820152604760248201527f4552433732314454466163746f72793a20496e76616c69642074656d706c617460448201527f6520746f6b656e2f636f6d6d756e6974792066656520636f6c6c6563746f72206064820152666164647265737360c81b608482015260a4015b60405180910390fd5b6001600160a01b0381166200016e5760405162461bcd60e51b815260206004820152602760248201527f4552433732314454466163746f72793a20496e76616c696420726f75746572206044820152666164647265737360c81b6064820152608401620000fd565b62000179846200020e565b506200018583620003d1565b50600c80546001600160a01b039283166001600160a01b03199182161790915560028054939092169216919091179055506200062f9050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080546001600160a01b031633146200025a5760405162461bcd60e51b81526020600482018190526024820152600080516020620039a88339815191526044820152606401620000fd565b6001600160a01b038216620002d85760405162461bcd60e51b815260206004820152603760248201527f4552433732314454466163746f72793a204552433732312074656d706c61746560448201527f2061646472657373283029204e4f5420414c4c4f5745440000000000000000006064820152608401620000fd565b813b620003285760405162461bcd60e51b815260206004820152601b60248201527f455243373231466163746f72793a204e4f5420434f4e545241435400000000006044820152606401620000fd565b6001600560008282546200033d919062000608565b90915550506040805180820182526001600160a01b038085168083526001602080850191825260058054600090815260069092528682208651815494511515600160a01b026001600160a81b03199095169616959095179290921790935554935192939290917fc0167b92c8eb4a2bad2c05e0134f076fba5d3cd54671a3e8edf13d2e61443bd991a350506005545b919050565b600080546001600160a01b031633146200041d5760405162461bcd60e51b81526020600482018190526024820152600080516020620039a88339815191526044820152606401620000fd565b6001600160a01b0382166200049b5760405162461bcd60e51b815260206004820152603460248201527f4552433230466163746f72793a204552433732312074656d706c61746520616460448201527f6472657373283029204e4f5420414c4c4f5745440000000000000000000000006064820152608401620000fd565b813b620004eb5760405162461bcd60e51b815260206004820152601a60248201527f4552433230466163746f72793a204e4f5420434f4e54524143540000000000006044820152606401620000fd565b6001600b600082825462000500919062000608565b90915550506040805180820182526001600160a01b0380851680835260016020808501918252600b8054600090815260079092528682208651815494511515600160a01b026001600160a81b03199095169616959095179290921790935554935192939290917fdcd16da87b60cea6dbd55a83f73b8a4bf9a54655db58ae0f35b82a2373fc150d91a35050600b54919050565b80516001600160a01b0381168114620003cc57600080fd5b60008060008060808587031215620005c257600080fd5b620005cd8562000593565b9350620005dd6020860162000593565b9250620005ed6040860162000593565b9150620005fd6060860162000593565b905092959194509250565b600082198211156200062a57634e487b7160e01b600052601160045260246000fd5b500190565b613369806200063f6000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c80638da5cb5b116100f9578063c6cf868a11610097578063e5fc01f011610071578063e5fc01f0146104ff578063f2fde38b14610507578063f887ea401461051a578063fd024d6a1461052d57600080fd5b8063c6cf868a14610487578063ca4abc691461048f578063e3491099146104cc57600080fd5b806395c60305116100d357806395c6030514610420578063a33ef2a614610428578063b9cd22641461043b578063bbf8d71f1461047457600080fd5b80638da5cb5b146103c75780638f6051af146103d857806394051699146103eb57600080fd5b80635de329fd116101665780637b20bccf116101405780637b20bccf1461033a578063809d81051461034d57806382c442041461036057806389898869146103b457600080fd5b80635de329fd146102f6578063715018a61461030957806372f670f01461031157600080fd5b806326705c3c116101a257806326705c3c1461024f5780633315efd114610266578063557fcfb0146102c35780635c705982146102ee57600080fd5b8063042ab9b3146101c95780630ffda88714610207578063226e76151461021c575b600080fd5b6101dc6101d73660046124e0565b610540565b6040805182516001600160a01b03168152602092830151151592810192909252015b60405180910390f35b61021a6102153660046124e0565b6105c7565b005b61023f61022a366004612519565b60096020526000908152604090205460ff1681565b60405190151581526020016101fe565b610258600b5481565b6040519081526020016101fe565b6101dc6102743660046124e0565b6040805180820190915260008082526020820152506000908152600660209081526040918290208251808401909352546001600160a01b0381168352600160a01b900460ff1615159082015290565b6102d66102d1366004612799565b61060c565b6040516001600160a01b0390911681526020016101fe565b600354610258565b61021a610304366004612877565b6106ad565b61021a610b97565b6102d661031f366004612519565b6008602052600090815260409020546001600160a01b031681565b610258610348366004612519565b610bcd565b61021a61035b3660046124e0565b610d60565b61039561036e3660046124e0565b6006602052600090815260409020546001600160a01b03811690600160a01b900460ff1682565b604080516001600160a01b0390931683529015156020830152016101fe565b6102d66103c23660046129e7565b610dd2565b6000546001600160a01b03166102d6565b6102586103e6366004612519565b6110a3565b6103956103f93660046124e0565b6007602052600090815260409020546001600160a01b03811690600160a01b900460ff1682565b600b54610258565b61021a6104363660046124e0565b61123e565b61044e610449366004612abc565b6112b6565b604080516001600160a01b039485168152939092166020840152908201526060016101fe565b61021a6104823660046124e0565b611516565b600a54610258565b6104a261049d366004612abc565b6115d2565b604080516001600160a01b03948516815292841660208401529216918101919091526060016101fe565b6104df6104da366004612b43565b6117a0565b604080516001600160a01b039384168152929091166020830152016101fe565b600554610258565b61021a610515366004612519565b611928565b600c546102d6906001600160a01b031681565b6104df61053b366004612ba6565b6119c3565b60408051808201909152600080825260208201526000828152600760209081526040918290208251808401909352546001600160a01b0381168352600160a01b900460ff16151590820152600b54831180159061059c57508215155b6105c15760405162461bcd60e51b81526004016105b890612c1a565b60405180910390fd5b92915050565b6000546001600160a01b031633146105f15760405162461bcd60e51b81526004016105b890612c63565b6000908152600760205260409020805460ff60a01b19169055565b3360008181526008602052604081205490916001600160a01b03909116146106955760405162461bcd60e51b815260206004820152603660248201527f455243373231466163746f72793a204f4e4c592045524337323120494e5354416044820152754e43452046524f4d20455243373231464143544f525960501b60648201526084016105b8565b6106a3868686868633611bfa565b9695505050505050565b600260015414156106d05760405162461bcd60e51b81526004016105b890612c98565b60026001558051603210156107275760405162461bcd60e51b815260206004820152601e60248201527f455243373231466163746f72793a20546f6f204d616e79204f7264657273000060448201526064016105b8565b60005b8151811015610b8f57600080600084848151811061074a5761074a612ccf565b6020026020010151600001516001600160a01b031663397b37436040518163ffffffff1660e01b8152600401606060405180830381865afa158015610793573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b79190612ce5565b9250925092506000811180156107d557506001600160a01b03821615155b80156107e957506001600160a01b03831615155b15610835576108036001600160a01b038316333084611edf565b61083585858151811061081857610818612ccf565b6020908102919091010151516001600160a01b0384169083611f50565b600085858151811061084957610849612ccf565b602002602001015160a00151118015610892575060006001600160a01b031685858151811061087a5761087a612ccf565b6020026020010151608001516001600160a01b031614155b80156108ce575060006001600160a01b03168585815181106108b6576108b6612ccf565b6020026020010151606001516001600160a01b031614155b156109a25761092d33308787815181106108ea576108ea612ccf565b602002602001015160a0015188888151811061090857610908612ccf565b6020026020010151608001516001600160a01b0316611edf909392919063ffffffff16565b6109a285858151811061094257610942612ccf565b60200260200101516000015186868151811061096057610960612ccf565b602002602001015160a0015187878151811061097e5761097e612ccf565b6020026020010151608001516001600160a01b0316611f509092919063ffffffff16565b6109e73330670de0b6b3a76400008888815181106109c2576109c2612ccf565b6020026020010151600001516001600160a01b0316611edf909392919063ffffffff16565b8484815181106109f9576109f9612ccf565b6020026020010151600001516001600160a01b0316639b4f44b6868681518110610a2557610a25612ccf565b602002602001015160200151878781518110610a4357610a43612ccf565b602002602001015160400151888881518110610a6157610a61612ccf565b602002602001015160600151898981518110610a7f57610a7f612ccf565b6020026020010151608001518a8a81518110610a9d57610a9d612ccf565b602002602001015160a001518b8b81518110610abb57610abb612ccf565b602002602001015160c001518c8c81518110610ad957610ad9612ccf565b602002602001015160e001518d8d81518110610af757610af7612ccf565b602002602001015161010001518e8e81518110610b1657610b16612ccf565b602002602001015161012001516040518a63ffffffff1660e01b8152600401610b4799989796959493929190612d80565b600060405180830381600087803b158015610b6157600080fd5b505af1158015610b75573d6000803e3d6000fd5b505050505050508080610b8790612dfc565b91505061072a565b505060018055565b6000546001600160a01b03163314610bc15760405162461bcd60e51b81526004016105b890612c63565b610bcb6000612002565b565b600080546001600160a01b03163314610bf85760405162461bcd60e51b81526004016105b890612c63565b6001600160a01b038216610c6b5760405162461bcd60e51b815260206004820152603460248201527f4552433230466163746f72793a204552433732312074656d706c617465206164604482015273191c995cdcca0c0a481393d50810531313d5d15160621b60648201526084016105b8565b813b610cb95760405162461bcd60e51b815260206004820152601a60248201527f4552433230466163746f72793a204e4f5420434f4e545241435400000000000060448201526064016105b8565b6001600b6000828254610ccc9190612e17565b90915550506040805180820182526001600160a01b0380851680835260016020808501918252600b8054600090815260079092528682208651815494511515600160a01b026001600160a81b03199095169616959095179290921790935554935192939290917fdcd16da87b60cea6dbd55a83f73b8a4bf9a54655db58ae0f35b82a2373fc150d91a35050600b545b919050565b6000546001600160a01b03163314610d8a5760405162461bcd60e51b81526004016105b890612c63565b6005548111158015610d9b57508015155b610db75760405162461bcd60e51b81526004016105b890612e2f565b6000908152600660205260409020805460ff60a01b19169055565b60006005548411158015610de557508315155b610e015760405162461bcd60e51b81526004016105b890612e2f565b6000848152600660209081526040918290208251808401909352546001600160a01b0381168352600160a01b900460ff161515908201819052610e9d5760405162461bcd60e51b815260206004820152602e60248201527f4552433732314454466163746f72793a20455243373231546f6b656e2054656d60448201526d1c1b185d1948191a5cd8589b195960921b60648201526084016105b8565b8051610ea890612052565b91506001600160a01b038216610f28576040805162461bcd60e51b81526020600482015260248101919091527f4552433732314454466163746f72793a204661696c656420746f20706572666f60448201527f726d206d696e696d616c206465706c6f79206f662061206e657720746f6b656e60648201526084016105b8565b6001600160a01b0382166000818152600860205260409081902080546001600160a01b03191683179055516370c166d760e01b81528391906370c166d790610f7e9033908c908c9030908c908c90600401612e7b565b6020604051808303816000875af1158015610f9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc19190612eef565b61102a5760405162461bcd60e51b815260206004820152603460248201527f4552433732314454466163746f72793a20556e61626c6520746f20696e697469604482015273616c697a6520746f6b656e20696e7374616e636560601b60648201526084016105b8565b81600001516001600160a01b0316836001600160a01b03167f46f5e3cee761854fc3892024ae7aa2c832007dff583603ce093f177ebd9c4c968a338b896040516110779493929190612f0c565b60405180910390a36001600360008282546110929190612e17565b909155509298975050505050505050565b600080546001600160a01b031633146110ce5760405162461bcd60e51b81526004016105b890612c63565b6001600160a01b03821661114a5760405162461bcd60e51b815260206004820152603760248201527f4552433732314454466163746f72793a204552433732312074656d706c61746560448201527f2061646472657373283029204e4f5420414c4c4f57454400000000000000000060648201526084016105b8565b813b6111985760405162461bcd60e51b815260206004820152601b60248201527f455243373231466163746f72793a204e4f5420434f4e5452414354000000000060448201526064016105b8565b6001600560008282546111ab9190612e17565b90915550506040805180820182526001600160a01b038085168083526001602080850191825260058054600090815260069092528682208651815494511515600160a01b026001600160a81b03199095169616959095179290921790935554935192939290917fc0167b92c8eb4a2bad2c05e0134f076fba5d3cd54671a3e8edf13d2e61443bd991a35050600554919050565b6000546001600160a01b031633146112685760405162461bcd60e51b81526004016105b890612c63565b600554811115801561127957508015155b6112955760405162461bcd60e51b81526004016105b890612e2f565b6000908152600660205260409020805460ff60a01b1916600160a01b179055565b6000806000600260015414156112de5760405162461bcd60e51b81526004016105b890612c98565b60026001556113b36112f08780612f54565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611332925050506020890189612f54565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505060408901353061137960608c018c612f54565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610dd292505050565b925061146a85356113c76020880188612fa1565b6113d091612fea565b6113dd6040890189612fa1565b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061141c9250505060608a018a612fa1565b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061145b9250505060808b018b612fa1565b61146491612fea565b88611bfa565b91506001600160a01b038216638b96412b6114886020870187612519565b6114956020880188612fa1565b6114a260408a018a612fa1565b6040518663ffffffff1660e01b81526004016114c2959493929190613076565b6020604051808303816000875af11580156114e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150591906130ba565b600180559296919550919350915050565b6000546001600160a01b031633146115405760405162461bcd60e51b81526004016105b890612c63565b600b54811115801561155157508015155b6115b15760405162461bcd60e51b815260206004820152602b60248201527f45524332304454466163746f72793a2054656d706c61746520696e646578206460448201526a1bd95cdb9d08195e1a5cdd60aa1b60648201526084016105b8565b6000908152600760205260409020805460ff60a01b1916600160a01b179055565b6000806000600260015414156115fa5760405162461bcd60e51b81526004016105b890612c98565b600260015561166d33306116116020880188612fa1565b600481811061162257611622612ccf565b602002919091013590506116368880612fa1565b600181811061164757611647612ccf565b905060200201602081019061165c9190612519565b6001600160a01b0316929190611edf565b61167a6112f08780612f54565b925061168e85356113c76020880188612fa1565b600c54909250611709906001600160a01b03166116ae6020870187612fa1565b60048181106116bf576116bf612ccf565b602002919091013590506116d38780612fa1565b60018181106116e4576116e4612ccf565b90506020020160208101906116f99190612519565b6001600160a01b03169190611f50565b6001600160a01b038216635bfe4da06117256020870187612fa1565b6117326040890189612fa1565b61173c8a80612fa1565b6040518763ffffffff1660e01b815260040161175d969594939291906130d3565b6020604051808303816000875af115801561177c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611505919061311c565b600080600260015414156117c65760405162461bcd60e51b81526004016105b890612c98565b60026001556118626117d88580612f54565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061181a925050506020870187612f54565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525060408b013593509150611379905060608a018a612f54565b915061191983356118766020860186612fa1565b61187f91612fea565b61188c6040870187612fa1565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506118cb925050506060880188612fa1565b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061190a925050506080890189612fa1565b61191391612fea565b87611bfa565b60018055919491935090915050565b6000546001600160a01b031633146119525760405162461bcd60e51b81526004016105b890612c63565b6001600160a01b0381166119b75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105b8565b6119c081612002565b50565b600080600260015414156119e95760405162461bcd60e51b81526004016105b890612c98565b6002600155611a846119fb8680612f54565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611a3d925050506020880188612f54565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505060408801353061137960608b018b612f54565b9150611b2c8435611a986020870187612fa1565b611aa191612fea565b611aae6040880188612fa1565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611aed925050506060890189612fa1565b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061190a9250505060808a018a612fa1565b90506001600160a01b03811663191c918a611b4a6020860186612519565b60208601356040870135611b646080890160608a01613139565b611b7460a08a0160808b01612519565b60405160e087901b6001600160e01b03191681526001600160a01b0395861660048201526024810194909452604484019290925215156064830152909116608482015260a401600060405180830381600087803b158015611bd457600080fd5b505af1158015611be8573d6000803e3d6000fd5b50506001805550919590945092505050565b600083600081518110611c0f57611c0f612ccf565b602002602001015160001415611c755760405162461bcd60e51b815260206004820152602560248201527f4552433230466163746f72793a207a65726f20636170206973206e6f7420616c6044820152641b1bddd95960da1b60648201526084016105b8565b600b548711158015611c8657508615155b611ca25760405162461bcd60e51b81526004016105b890612c1a565b6000878152600760209081526040918290208251808401909352546001600160a01b0381168352600160a01b900460ff161515908201819052611d3b5760405162461bcd60e51b815260206004820152602b60248201527f4552433230466163746f72793a20455243373231546f6b656e2054656d706c6160448201526a1d1948191a5cd8589b195960aa1b60648201526084016105b8565b8051611d4690612052565b6001600160a01b0381166000818152600960205260409020805460ff19166001179055909250611dde5760405162461bcd60e51b815260206004820152603e60248201527f455243373231466163746f72793a204661696c656420746f20706572666f726d60448201527f206d696e696d616c206465706c6f79206f662061206e657720746f6b656e000060648201526084016105b8565b80600001516001600160a01b0316826001600160a01b03167f567699dbf7c5f63a51a42fd451f5e065bca0dfc723adf2cc498bbb7cfb780b9089600081518110611e2a57611e2a612ccf565b60200260200101518a600181518110611e4557611e45612ccf565b602002602001015189600081518110611e6057611e60612ccf565b602002602001015188604051611e799493929190613156565b60405180910390a36001600a6000828254611e949190612e17565b90915550506040805160a081018252888152602081018890529081018690526001600160a01b038416608082015260608101859052611ed383826120e2565b50509695505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052611f4a9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261228f565b50505050565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015611fa1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fc591906130ba565b611fcf9190612e17565b6040516001600160a01b038516602482015260448101829052909150611f4a90859063095ea7b360e01b90606401611f13565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000808260601b9050604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528160148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f06040516001600160a01b03821681529093507f117c72e6c25f0a072e36e148df71468ce2f3dbe7defec5b2c257a6e3eb65278c915060200160405180910390a150919050565b604080516003808252608082019092528391600091906020820160608036833701905050905082608001518160008151811061212057612120612ccf565b6001600160a01b03928316602091820292909201015260025482519116908290600190811061215157612151612ccf565b6001600160a01b039283166020918202929092010152600c5482519116908290600290811061218257612182612ccf565b60200260200101906001600160a01b031690816001600160a01b031681525050816001600160a01b031663b3998be08460000151856020015184876040015188606001516040518663ffffffff1660e01b81526004016121e695949392919061325b565b6020604051808303816000875af1158015612205573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122299190612eef565b611f4a5760405162461bcd60e51b815260206004820152603160248201527f4552433230466163746f72793a20556e61626c6520746f20696e697469616c696044820152707a6520746f6b656e20696e7374616e636560781b60648201526084016105b8565b60006122e4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166123669092919063ffffffff16565b80519091501561236157808060200190518101906123029190612eef565b6123615760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016105b8565b505050565b6060612375848460008561237f565b90505b9392505050565b6060824710156123e05760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016105b8565b843b61242e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105b8565b600080866001600160a01b0316858760405161244a9190613304565b60006040518083038185875af1925050503d8060008114612487576040519150601f19603f3d011682016040523d82523d6000602084013e61248c565b606091505b509150915061249c8282866124a7565b979650505050505050565b606083156124b6575081612378565b8251156124c65782518084602001fd5b8160405162461bcd60e51b81526004016105b89190613320565b6000602082840312156124f257600080fd5b5035919050565b6001600160a01b03811681146119c057600080fd5b8035610d5b816124f9565b60006020828403121561252b57600080fd5b8135612378816124f9565b634e487b7160e01b600052604160045260246000fd5b60405161014081016001600160401b038111828210171561256f5761256f612536565b60405290565b604051601f8201601f191681016001600160401b038111828210171561259d5761259d612536565b604052919050565b60006001600160401b038211156125be576125be612536565b5060051b60200190565b600082601f8301126125d957600080fd5b81356001600160401b038111156125f2576125f2612536565b612605601f8201601f1916602001612575565b81815284602083860101111561261a57600080fd5b816020850160208301376000918101602001919091529392505050565b600061264a612645846125a5565b612575565b8381529050602080820190600585901b84018681111561266957600080fd5b845b818110156126a45780356001600160401b0381111561268a5760008081fd5b612696898289016125c8565b85525092820192820161266b565b505050509392505050565b600082601f8301126126c057600080fd5b813560206126d0612645836125a5565b82815260059290921b840181019181810190868411156126ef57600080fd5b8286015b84811015612713578035612706816124f9565b83529183019183016126f3565b509695505050505050565b600082601f83011261272f57600080fd5b8135602061273f612645836125a5565b82815260059290921b8401810191818101908684111561275e57600080fd5b8286015b848110156127135780358352918301918301612762565b600082601f83011261278a57600080fd5b61237883833560208501612637565b600080600080600060a086880312156127b157600080fd5b8535945060208601356001600160401b03808211156127cf57600080fd5b818801915088601f8301126127e357600080fd5b6127f289833560208501612637565b9550604088013591508082111561280857600080fd5b61281489838a016126af565b9450606088013591508082111561282a57600080fd5b61283689838a0161271e565b9350608088013591508082111561284c57600080fd5b5061285988828901612779565b9150509295509295909350565b803560ff81168114610d5b57600080fd5b6000602080838503121561288a57600080fd5b82356001600160401b03808211156128a157600080fd5b818501915085601f8301126128b557600080fd5b81356128c3612645826125a5565b81815260059190911b830184019084810190888311156128e257600080fd5b8585015b838110156129da578035858111156128fe5760008081fd5b8601610140818c03601f19018113156129175760008081fd5b61291f61254c565b61292a8a840161250e565b8152604061293981850161250e565b8b830152606080850135828401526080915061295682860161250e565b9083015260a061296785820161250e565b8284015260c0915081850135818401525060e0612985818601612866565b8284015261010091508185013581840152506101208085013582840152838501359350898411156129b857600091508182fd5b6129c68f8d868801016125c8565b9083015250855250509186019186016128e6565b5098975050505050505050565b600080600080600060a086880312156129ff57600080fd5b85356001600160401b0380821115612a1657600080fd5b612a2289838a016125c8565b96506020880135915080821115612a3857600080fd5b612a4489838a016125c8565b95506040880135945060608801359150612a5d826124f9565b90925060808701359080821115612a7357600080fd5b50612859888289016125c8565b600060808284031215612a9257600080fd5b50919050565b600060a08284031215612a9257600080fd5b600060608284031215612a9257600080fd5b600080600060608486031215612ad157600080fd5b83356001600160401b0380821115612ae857600080fd5b612af487838801612a80565b94506020860135915080821115612b0a57600080fd5b612b1687838801612a98565b93506040860135915080821115612b2c57600080fd5b50612b3986828701612aaa565b9150509250925092565b60008060408385031215612b5657600080fd5b82356001600160401b0380821115612b6d57600080fd5b612b7986838701612a80565b93506020850135915080821115612b8f57600080fd5b50612b9c85828601612a98565b9150509250929050565b600080600060e08486031215612bbb57600080fd5b83356001600160401b0380821115612bd257600080fd5b612bde87838801612a80565b94506020860135915080821115612bf457600080fd5b50612c0186828701612a98565b925050612c118560408601612a98565b90509250925092565b60208082526029908201527f4552433230466163746f72793a2054656d706c61746520696e64657820646f656040820152681cdb9d08195e1a5cdd60ba1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052603260045260246000fd5b600080600060608486031215612cfa57600080fd5b8351612d05816124f9565b6020850151909350612d16816124f9565b80925050604084015190509250925092565b60005b83811015612d43578181015183820152602001612d2b565b83811115611f4a5750506000910152565b60008151808452612d6c816020860160208601612d28565b601f01601f19169290920160200192915050565b600061012060018060a01b03808d1684528b6020850152808b166040850152808a1660608501525087608084015260ff871660a08401528560c08401528460e084015280610100840152612dd681840185612d54565b9c9b505050505050505050505050565b634e487b7160e01b600052601160045260246000fd5b6000600019821415612e1057612e10612de6565b5060010190565b60008219821115612e2a57612e2a612de6565b500190565b6020808252602c908201527f4552433732314454466163746f72793a2054656d706c61746520696e6465782060408201526b191bd95cdb9d08195e1a5cdd60a21b606082015260800190565b600060018060a01b03808916835260c06020840152612e9d60c0840189612d54565b8381036040850152612eaf8189612d54565b90508187166060850152818616608085015283810360a0850152612ed38186612d54565b9a9950505050505050505050565b80151581146119c057600080fd5b600060208284031215612f0157600080fd5b815161237881612ee1565b608081526000612f1f6080830187612d54565b6001600160a01b03861660208401528281036040840152612f408186612d54565b9050828103606084015261249c8185612d54565b6000808335601e19843603018112612f6b57600080fd5b8301803591506001600160401b03821115612f8557600080fd5b602001915036819003821315612f9a57600080fd5b9250929050565b6000808335601e19843603018112612fb857600080fd5b8301803591506001600160401b03821115612fd257600080fd5b6020019150600581901b3603821315612f9a57600080fd5b6000612378368484612637565b8183526000602080850194508260005b8581101561303557813561301a816124f9565b6001600160a01b031687529582019590820190600101613007565b509495945050505050565b81835260006001600160fb1b0383111561305957600080fd5b8260051b8083602087013760009401602001938452509192915050565b6001600160a01b038616815260606020820181905260009061309b9083018688612ff7565b82810360408401526130ae818587613040565b98975050505050505050565b6000602082840312156130cc57600080fd5b5051919050565b6060815260006130e760608301888a613040565b82810360208401526130fa818789613040565b9050828103604084015261310f818587612ff7565b9998505050505050505050565b60006020828403121561312e57600080fd5b8151612378816124f9565b60006020828403121561314b57600080fd5b813561237881612ee1565b6080815260006131696080830187612d54565b828103602084015261317b8187612d54565b604084019590955250506001600160a01b039190911660609091015292915050565b600081518084526020808501945080840160005b838110156130355781516001600160a01b0316875295820195908201906001016131b1565b600081518084526020808501945080840160005b83811015613035578151875295820195908201906001016131ea565b600081518084526020808501808196508360051b8101915082860160005b8581101561324e57828403895261323c848351612d54565b98850198935090840190600101613224565b5091979650505050505050565b600060a0820160a0835280885180835260c08501915060c08160051b86010192506020808b0160005b838110156132b25760bf198887030185526132a0868351612d54565b95509382019390820190600101613284565b5050858403818701525050506132c8818861319d565b905082810360408401526132dc818761319d565b905082810360608401526132f081866131d6565b905082810360808401526130ae8185613206565b60008251613316818460208701612d28565b9190910192915050565b6020815260006123786020830184612d5456fea2646970667358221220bcb5079a8dfc5ac89d9c8b15c3e22a453d4e07b4f9e047affc6d9f1866d96f7264736f6c634300080a00334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572",deployedBytecode:"0x608060405234801561001057600080fd5b50600436106101c45760003560e01c80638da5cb5b116100f9578063c6cf868a11610097578063e5fc01f011610071578063e5fc01f0146104ff578063f2fde38b14610507578063f887ea401461051a578063fd024d6a1461052d57600080fd5b8063c6cf868a14610487578063ca4abc691461048f578063e3491099146104cc57600080fd5b806395c60305116100d357806395c6030514610420578063a33ef2a614610428578063b9cd22641461043b578063bbf8d71f1461047457600080fd5b80638da5cb5b146103c75780638f6051af146103d857806394051699146103eb57600080fd5b80635de329fd116101665780637b20bccf116101405780637b20bccf1461033a578063809d81051461034d57806382c442041461036057806389898869146103b457600080fd5b80635de329fd146102f6578063715018a61461030957806372f670f01461031157600080fd5b806326705c3c116101a257806326705c3c1461024f5780633315efd114610266578063557fcfb0146102c35780635c705982146102ee57600080fd5b8063042ab9b3146101c95780630ffda88714610207578063226e76151461021c575b600080fd5b6101dc6101d73660046124e0565b610540565b6040805182516001600160a01b03168152602092830151151592810192909252015b60405180910390f35b61021a6102153660046124e0565b6105c7565b005b61023f61022a366004612519565b60096020526000908152604090205460ff1681565b60405190151581526020016101fe565b610258600b5481565b6040519081526020016101fe565b6101dc6102743660046124e0565b6040805180820190915260008082526020820152506000908152600660209081526040918290208251808401909352546001600160a01b0381168352600160a01b900460ff1615159082015290565b6102d66102d1366004612799565b61060c565b6040516001600160a01b0390911681526020016101fe565b600354610258565b61021a610304366004612877565b6106ad565b61021a610b97565b6102d661031f366004612519565b6008602052600090815260409020546001600160a01b031681565b610258610348366004612519565b610bcd565b61021a61035b3660046124e0565b610d60565b61039561036e3660046124e0565b6006602052600090815260409020546001600160a01b03811690600160a01b900460ff1682565b604080516001600160a01b0390931683529015156020830152016101fe565b6102d66103c23660046129e7565b610dd2565b6000546001600160a01b03166102d6565b6102586103e6366004612519565b6110a3565b6103956103f93660046124e0565b6007602052600090815260409020546001600160a01b03811690600160a01b900460ff1682565b600b54610258565b61021a6104363660046124e0565b61123e565b61044e610449366004612abc565b6112b6565b604080516001600160a01b039485168152939092166020840152908201526060016101fe565b61021a6104823660046124e0565b611516565b600a54610258565b6104a261049d366004612abc565b6115d2565b604080516001600160a01b03948516815292841660208401529216918101919091526060016101fe565b6104df6104da366004612b43565b6117a0565b604080516001600160a01b039384168152929091166020830152016101fe565b600554610258565b61021a610515366004612519565b611928565b600c546102d6906001600160a01b031681565b6104df61053b366004612ba6565b6119c3565b60408051808201909152600080825260208201526000828152600760209081526040918290208251808401909352546001600160a01b0381168352600160a01b900460ff16151590820152600b54831180159061059c57508215155b6105c15760405162461bcd60e51b81526004016105b890612c1a565b60405180910390fd5b92915050565b6000546001600160a01b031633146105f15760405162461bcd60e51b81526004016105b890612c63565b6000908152600760205260409020805460ff60a01b19169055565b3360008181526008602052604081205490916001600160a01b03909116146106955760405162461bcd60e51b815260206004820152603660248201527f455243373231466163746f72793a204f4e4c592045524337323120494e5354416044820152754e43452046524f4d20455243373231464143544f525960501b60648201526084016105b8565b6106a3868686868633611bfa565b9695505050505050565b600260015414156106d05760405162461bcd60e51b81526004016105b890612c98565b60026001558051603210156107275760405162461bcd60e51b815260206004820152601e60248201527f455243373231466163746f72793a20546f6f204d616e79204f7264657273000060448201526064016105b8565b60005b8151811015610b8f57600080600084848151811061074a5761074a612ccf565b6020026020010151600001516001600160a01b031663397b37436040518163ffffffff1660e01b8152600401606060405180830381865afa158015610793573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b79190612ce5565b9250925092506000811180156107d557506001600160a01b03821615155b80156107e957506001600160a01b03831615155b15610835576108036001600160a01b038316333084611edf565b61083585858151811061081857610818612ccf565b6020908102919091010151516001600160a01b0384169083611f50565b600085858151811061084957610849612ccf565b602002602001015160a00151118015610892575060006001600160a01b031685858151811061087a5761087a612ccf565b6020026020010151608001516001600160a01b031614155b80156108ce575060006001600160a01b03168585815181106108b6576108b6612ccf565b6020026020010151606001516001600160a01b031614155b156109a25761092d33308787815181106108ea576108ea612ccf565b602002602001015160a0015188888151811061090857610908612ccf565b6020026020010151608001516001600160a01b0316611edf909392919063ffffffff16565b6109a285858151811061094257610942612ccf565b60200260200101516000015186868151811061096057610960612ccf565b602002602001015160a0015187878151811061097e5761097e612ccf565b6020026020010151608001516001600160a01b0316611f509092919063ffffffff16565b6109e73330670de0b6b3a76400008888815181106109c2576109c2612ccf565b6020026020010151600001516001600160a01b0316611edf909392919063ffffffff16565b8484815181106109f9576109f9612ccf565b6020026020010151600001516001600160a01b0316639b4f44b6868681518110610a2557610a25612ccf565b602002602001015160200151878781518110610a4357610a43612ccf565b602002602001015160400151888881518110610a6157610a61612ccf565b602002602001015160600151898981518110610a7f57610a7f612ccf565b6020026020010151608001518a8a81518110610a9d57610a9d612ccf565b602002602001015160a001518b8b81518110610abb57610abb612ccf565b602002602001015160c001518c8c81518110610ad957610ad9612ccf565b602002602001015160e001518d8d81518110610af757610af7612ccf565b602002602001015161010001518e8e81518110610b1657610b16612ccf565b602002602001015161012001516040518a63ffffffff1660e01b8152600401610b4799989796959493929190612d80565b600060405180830381600087803b158015610b6157600080fd5b505af1158015610b75573d6000803e3d6000fd5b505050505050508080610b8790612dfc565b91505061072a565b505060018055565b6000546001600160a01b03163314610bc15760405162461bcd60e51b81526004016105b890612c63565b610bcb6000612002565b565b600080546001600160a01b03163314610bf85760405162461bcd60e51b81526004016105b890612c63565b6001600160a01b038216610c6b5760405162461bcd60e51b815260206004820152603460248201527f4552433230466163746f72793a204552433732312074656d706c617465206164604482015273191c995cdcca0c0a481393d50810531313d5d15160621b60648201526084016105b8565b813b610cb95760405162461bcd60e51b815260206004820152601a60248201527f4552433230466163746f72793a204e4f5420434f4e545241435400000000000060448201526064016105b8565b6001600b6000828254610ccc9190612e17565b90915550506040805180820182526001600160a01b0380851680835260016020808501918252600b8054600090815260079092528682208651815494511515600160a01b026001600160a81b03199095169616959095179290921790935554935192939290917fdcd16da87b60cea6dbd55a83f73b8a4bf9a54655db58ae0f35b82a2373fc150d91a35050600b545b919050565b6000546001600160a01b03163314610d8a5760405162461bcd60e51b81526004016105b890612c63565b6005548111158015610d9b57508015155b610db75760405162461bcd60e51b81526004016105b890612e2f565b6000908152600660205260409020805460ff60a01b19169055565b60006005548411158015610de557508315155b610e015760405162461bcd60e51b81526004016105b890612e2f565b6000848152600660209081526040918290208251808401909352546001600160a01b0381168352600160a01b900460ff161515908201819052610e9d5760405162461bcd60e51b815260206004820152602e60248201527f4552433732314454466163746f72793a20455243373231546f6b656e2054656d60448201526d1c1b185d1948191a5cd8589b195960921b60648201526084016105b8565b8051610ea890612052565b91506001600160a01b038216610f28576040805162461bcd60e51b81526020600482015260248101919091527f4552433732314454466163746f72793a204661696c656420746f20706572666f60448201527f726d206d696e696d616c206465706c6f79206f662061206e657720746f6b656e60648201526084016105b8565b6001600160a01b0382166000818152600860205260409081902080546001600160a01b03191683179055516370c166d760e01b81528391906370c166d790610f7e9033908c908c9030908c908c90600401612e7b565b6020604051808303816000875af1158015610f9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc19190612eef565b61102a5760405162461bcd60e51b815260206004820152603460248201527f4552433732314454466163746f72793a20556e61626c6520746f20696e697469604482015273616c697a6520746f6b656e20696e7374616e636560601b60648201526084016105b8565b81600001516001600160a01b0316836001600160a01b03167f46f5e3cee761854fc3892024ae7aa2c832007dff583603ce093f177ebd9c4c968a338b896040516110779493929190612f0c565b60405180910390a36001600360008282546110929190612e17565b909155509298975050505050505050565b600080546001600160a01b031633146110ce5760405162461bcd60e51b81526004016105b890612c63565b6001600160a01b03821661114a5760405162461bcd60e51b815260206004820152603760248201527f4552433732314454466163746f72793a204552433732312074656d706c61746560448201527f2061646472657373283029204e4f5420414c4c4f57454400000000000000000060648201526084016105b8565b813b6111985760405162461bcd60e51b815260206004820152601b60248201527f455243373231466163746f72793a204e4f5420434f4e5452414354000000000060448201526064016105b8565b6001600560008282546111ab9190612e17565b90915550506040805180820182526001600160a01b038085168083526001602080850191825260058054600090815260069092528682208651815494511515600160a01b026001600160a81b03199095169616959095179290921790935554935192939290917fc0167b92c8eb4a2bad2c05e0134f076fba5d3cd54671a3e8edf13d2e61443bd991a35050600554919050565b6000546001600160a01b031633146112685760405162461bcd60e51b81526004016105b890612c63565b600554811115801561127957508015155b6112955760405162461bcd60e51b81526004016105b890612e2f565b6000908152600660205260409020805460ff60a01b1916600160a01b179055565b6000806000600260015414156112de5760405162461bcd60e51b81526004016105b890612c98565b60026001556113b36112f08780612f54565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611332925050506020890189612f54565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505060408901353061137960608c018c612f54565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610dd292505050565b925061146a85356113c76020880188612fa1565b6113d091612fea565b6113dd6040890189612fa1565b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061141c9250505060608a018a612fa1565b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061145b9250505060808b018b612fa1565b61146491612fea565b88611bfa565b91506001600160a01b038216638b96412b6114886020870187612519565b6114956020880188612fa1565b6114a260408a018a612fa1565b6040518663ffffffff1660e01b81526004016114c2959493929190613076565b6020604051808303816000875af11580156114e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150591906130ba565b600180559296919550919350915050565b6000546001600160a01b031633146115405760405162461bcd60e51b81526004016105b890612c63565b600b54811115801561155157508015155b6115b15760405162461bcd60e51b815260206004820152602b60248201527f45524332304454466163746f72793a2054656d706c61746520696e646578206460448201526a1bd95cdb9d08195e1a5cdd60aa1b60648201526084016105b8565b6000908152600760205260409020805460ff60a01b1916600160a01b179055565b6000806000600260015414156115fa5760405162461bcd60e51b81526004016105b890612c98565b600260015561166d33306116116020880188612fa1565b600481811061162257611622612ccf565b602002919091013590506116368880612fa1565b600181811061164757611647612ccf565b905060200201602081019061165c9190612519565b6001600160a01b0316929190611edf565b61167a6112f08780612f54565b925061168e85356113c76020880188612fa1565b600c54909250611709906001600160a01b03166116ae6020870187612fa1565b60048181106116bf576116bf612ccf565b602002919091013590506116d38780612fa1565b60018181106116e4576116e4612ccf565b90506020020160208101906116f99190612519565b6001600160a01b03169190611f50565b6001600160a01b038216635bfe4da06117256020870187612fa1565b6117326040890189612fa1565b61173c8a80612fa1565b6040518763ffffffff1660e01b815260040161175d969594939291906130d3565b6020604051808303816000875af115801561177c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611505919061311c565b600080600260015414156117c65760405162461bcd60e51b81526004016105b890612c98565b60026001556118626117d88580612f54565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061181a925050506020870187612f54565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525060408b013593509150611379905060608a018a612f54565b915061191983356118766020860186612fa1565b61187f91612fea565b61188c6040870187612fa1565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506118cb925050506060880188612fa1565b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061190a925050506080890189612fa1565b61191391612fea565b87611bfa565b60018055919491935090915050565b6000546001600160a01b031633146119525760405162461bcd60e51b81526004016105b890612c63565b6001600160a01b0381166119b75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105b8565b6119c081612002565b50565b600080600260015414156119e95760405162461bcd60e51b81526004016105b890612c98565b6002600155611a846119fb8680612f54565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611a3d925050506020880188612f54565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505060408801353061137960608b018b612f54565b9150611b2c8435611a986020870187612fa1565b611aa191612fea565b611aae6040880188612fa1565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611aed925050506060890189612fa1565b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061190a9250505060808a018a612fa1565b90506001600160a01b03811663191c918a611b4a6020860186612519565b60208601356040870135611b646080890160608a01613139565b611b7460a08a0160808b01612519565b60405160e087901b6001600160e01b03191681526001600160a01b0395861660048201526024810194909452604484019290925215156064830152909116608482015260a401600060405180830381600087803b158015611bd457600080fd5b505af1158015611be8573d6000803e3d6000fd5b50506001805550919590945092505050565b600083600081518110611c0f57611c0f612ccf565b602002602001015160001415611c755760405162461bcd60e51b815260206004820152602560248201527f4552433230466163746f72793a207a65726f20636170206973206e6f7420616c6044820152641b1bddd95960da1b60648201526084016105b8565b600b548711158015611c8657508615155b611ca25760405162461bcd60e51b81526004016105b890612c1a565b6000878152600760209081526040918290208251808401909352546001600160a01b0381168352600160a01b900460ff161515908201819052611d3b5760405162461bcd60e51b815260206004820152602b60248201527f4552433230466163746f72793a20455243373231546f6b656e2054656d706c6160448201526a1d1948191a5cd8589b195960aa1b60648201526084016105b8565b8051611d4690612052565b6001600160a01b0381166000818152600960205260409020805460ff19166001179055909250611dde5760405162461bcd60e51b815260206004820152603e60248201527f455243373231466163746f72793a204661696c656420746f20706572666f726d60448201527f206d696e696d616c206465706c6f79206f662061206e657720746f6b656e000060648201526084016105b8565b80600001516001600160a01b0316826001600160a01b03167f567699dbf7c5f63a51a42fd451f5e065bca0dfc723adf2cc498bbb7cfb780b9089600081518110611e2a57611e2a612ccf565b60200260200101518a600181518110611e4557611e45612ccf565b602002602001015189600081518110611e6057611e60612ccf565b602002602001015188604051611e799493929190613156565b60405180910390a36001600a6000828254611e949190612e17565b90915550506040805160a081018252888152602081018890529081018690526001600160a01b038416608082015260608101859052611ed383826120e2565b50509695505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052611f4a9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261228f565b50505050565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015611fa1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fc591906130ba565b611fcf9190612e17565b6040516001600160a01b038516602482015260448101829052909150611f4a90859063095ea7b360e01b90606401611f13565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000808260601b9050604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528160148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f06040516001600160a01b03821681529093507f117c72e6c25f0a072e36e148df71468ce2f3dbe7defec5b2c257a6e3eb65278c915060200160405180910390a150919050565b604080516003808252608082019092528391600091906020820160608036833701905050905082608001518160008151811061212057612120612ccf565b6001600160a01b03928316602091820292909201015260025482519116908290600190811061215157612151612ccf565b6001600160a01b039283166020918202929092010152600c5482519116908290600290811061218257612182612ccf565b60200260200101906001600160a01b031690816001600160a01b031681525050816001600160a01b031663b3998be08460000151856020015184876040015188606001516040518663ffffffff1660e01b81526004016121e695949392919061325b565b6020604051808303816000875af1158015612205573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122299190612eef565b611f4a5760405162461bcd60e51b815260206004820152603160248201527f4552433230466163746f72793a20556e61626c6520746f20696e697469616c696044820152707a6520746f6b656e20696e7374616e636560781b60648201526084016105b8565b60006122e4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166123669092919063ffffffff16565b80519091501561236157808060200190518101906123029190612eef565b6123615760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016105b8565b505050565b6060612375848460008561237f565b90505b9392505050565b6060824710156123e05760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016105b8565b843b61242e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105b8565b600080866001600160a01b0316858760405161244a9190613304565b60006040518083038185875af1925050503d8060008114612487576040519150601f19603f3d011682016040523d82523d6000602084013e61248c565b606091505b509150915061249c8282866124a7565b979650505050505050565b606083156124b6575081612378565b8251156124c65782518084602001fd5b8160405162461bcd60e51b81526004016105b89190613320565b6000602082840312156124f257600080fd5b5035919050565b6001600160a01b03811681146119c057600080fd5b8035610d5b816124f9565b60006020828403121561252b57600080fd5b8135612378816124f9565b634e487b7160e01b600052604160045260246000fd5b60405161014081016001600160401b038111828210171561256f5761256f612536565b60405290565b604051601f8201601f191681016001600160401b038111828210171561259d5761259d612536565b604052919050565b60006001600160401b038211156125be576125be612536565b5060051b60200190565b600082601f8301126125d957600080fd5b81356001600160401b038111156125f2576125f2612536565b612605601f8201601f1916602001612575565b81815284602083860101111561261a57600080fd5b816020850160208301376000918101602001919091529392505050565b600061264a612645846125a5565b612575565b8381529050602080820190600585901b84018681111561266957600080fd5b845b818110156126a45780356001600160401b0381111561268a5760008081fd5b612696898289016125c8565b85525092820192820161266b565b505050509392505050565b600082601f8301126126c057600080fd5b813560206126d0612645836125a5565b82815260059290921b840181019181810190868411156126ef57600080fd5b8286015b84811015612713578035612706816124f9565b83529183019183016126f3565b509695505050505050565b600082601f83011261272f57600080fd5b8135602061273f612645836125a5565b82815260059290921b8401810191818101908684111561275e57600080fd5b8286015b848110156127135780358352918301918301612762565b600082601f83011261278a57600080fd5b61237883833560208501612637565b600080600080600060a086880312156127b157600080fd5b8535945060208601356001600160401b03808211156127cf57600080fd5b818801915088601f8301126127e357600080fd5b6127f289833560208501612637565b9550604088013591508082111561280857600080fd5b61281489838a016126af565b9450606088013591508082111561282a57600080fd5b61283689838a0161271e565b9350608088013591508082111561284c57600080fd5b5061285988828901612779565b9150509295509295909350565b803560ff81168114610d5b57600080fd5b6000602080838503121561288a57600080fd5b82356001600160401b03808211156128a157600080fd5b818501915085601f8301126128b557600080fd5b81356128c3612645826125a5565b81815260059190911b830184019084810190888311156128e257600080fd5b8585015b838110156129da578035858111156128fe5760008081fd5b8601610140818c03601f19018113156129175760008081fd5b61291f61254c565b61292a8a840161250e565b8152604061293981850161250e565b8b830152606080850135828401526080915061295682860161250e565b9083015260a061296785820161250e565b8284015260c0915081850135818401525060e0612985818601612866565b8284015261010091508185013581840152506101208085013582840152838501359350898411156129b857600091508182fd5b6129c68f8d868801016125c8565b9083015250855250509186019186016128e6565b5098975050505050505050565b600080600080600060a086880312156129ff57600080fd5b85356001600160401b0380821115612a1657600080fd5b612a2289838a016125c8565b96506020880135915080821115612a3857600080fd5b612a4489838a016125c8565b95506040880135945060608801359150612a5d826124f9565b90925060808701359080821115612a7357600080fd5b50612859888289016125c8565b600060808284031215612a9257600080fd5b50919050565b600060a08284031215612a9257600080fd5b600060608284031215612a9257600080fd5b600080600060608486031215612ad157600080fd5b83356001600160401b0380821115612ae857600080fd5b612af487838801612a80565b94506020860135915080821115612b0a57600080fd5b612b1687838801612a98565b93506040860135915080821115612b2c57600080fd5b50612b3986828701612aaa565b9150509250925092565b60008060408385031215612b5657600080fd5b82356001600160401b0380821115612b6d57600080fd5b612b7986838701612a80565b93506020850135915080821115612b8f57600080fd5b50612b9c85828601612a98565b9150509250929050565b600080600060e08486031215612bbb57600080fd5b83356001600160401b0380821115612bd257600080fd5b612bde87838801612a80565b94506020860135915080821115612bf457600080fd5b50612c0186828701612a98565b925050612c118560408601612a98565b90509250925092565b60208082526029908201527f4552433230466163746f72793a2054656d706c61746520696e64657820646f656040820152681cdb9d08195e1a5cdd60ba1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052603260045260246000fd5b600080600060608486031215612cfa57600080fd5b8351612d05816124f9565b6020850151909350612d16816124f9565b80925050604084015190509250925092565b60005b83811015612d43578181015183820152602001612d2b565b83811115611f4a5750506000910152565b60008151808452612d6c816020860160208601612d28565b601f01601f19169290920160200192915050565b600061012060018060a01b03808d1684528b6020850152808b166040850152808a1660608501525087608084015260ff871660a08401528560c08401528460e084015280610100840152612dd681840185612d54565b9c9b505050505050505050505050565b634e487b7160e01b600052601160045260246000fd5b6000600019821415612e1057612e10612de6565b5060010190565b60008219821115612e2a57612e2a612de6565b500190565b6020808252602c908201527f4552433732314454466163746f72793a2054656d706c61746520696e6465782060408201526b191bd95cdb9d08195e1a5cdd60a21b606082015260800190565b600060018060a01b03808916835260c06020840152612e9d60c0840189612d54565b8381036040850152612eaf8189612d54565b90508187166060850152818616608085015283810360a0850152612ed38186612d54565b9a9950505050505050505050565b80151581146119c057600080fd5b600060208284031215612f0157600080fd5b815161237881612ee1565b608081526000612f1f6080830187612d54565b6001600160a01b03861660208401528281036040840152612f408186612d54565b9050828103606084015261249c8185612d54565b6000808335601e19843603018112612f6b57600080fd5b8301803591506001600160401b03821115612f8557600080fd5b602001915036819003821315612f9a57600080fd5b9250929050565b6000808335601e19843603018112612fb857600080fd5b8301803591506001600160401b03821115612fd257600080fd5b6020019150600581901b3603821315612f9a57600080fd5b6000612378368484612637565b8183526000602080850194508260005b8581101561303557813561301a816124f9565b6001600160a01b031687529582019590820190600101613007565b509495945050505050565b81835260006001600160fb1b0383111561305957600080fd5b8260051b8083602087013760009401602001938452509192915050565b6001600160a01b038616815260606020820181905260009061309b9083018688612ff7565b82810360408401526130ae818587613040565b98975050505050505050565b6000602082840312156130cc57600080fd5b5051919050565b6060815260006130e760608301888a613040565b82810360208401526130fa818789613040565b9050828103604084015261310f818587612ff7565b9998505050505050505050565b60006020828403121561312e57600080fd5b8151612378816124f9565b60006020828403121561314b57600080fd5b813561237881612ee1565b6080815260006131696080830187612d54565b828103602084015261317b8187612d54565b604084019590955250506001600160a01b039190911660609091015292915050565b600081518084526020808501945080840160005b838110156130355781516001600160a01b0316875295820195908201906001016131b1565b600081518084526020808501945080840160005b83811015613035578151875295820195908201906001016131ea565b600081518084526020808501808196508360051b8101915082860160005b8581101561324e57828403895261323c848351612d54565b98850198935090840190600101613224565b5091979650505050505050565b600060a0820160a0835280885180835260c08501915060c08160051b86010192506020808b0160005b838110156132b25760bf198887030185526132a0868351612d54565b95509382019390820190600101613284565b5050858403818701525050506132c8818861319d565b905082810360408401526132dc818761319d565b905082810360608401526132f081866131d6565b905082810360808401526130ae8185613206565b60008251613316818460208701612d28565b9190910192915050565b6020815260006123786020830184612d5456fea2646970667358221220bcb5079a8dfc5ac89d9c8b15c3e22a453d4e07b4f9e047affc6d9f1866d96f7264736f6c634300080a0033",linkReferences:{},deployedLinkReferences:{}};const $="0x0000000000000000000000000000000000000000",j=e=>function(e="",a){const{valid:t,output:b}=function(e,a,t){if("string"!=typeof e)throw T.debug("Not input string:"),T.debug(e),new Error("[zeroXTransformer] Expected string, input type: "+typeof e);const b=e.match(/^(?:0x)*([a-f0-9]+)$/i);return b?{valid:!0,output:b[1]}:(T.warn("[zeroXTransformer] Input transformation failed."),{valid:!1,output:e})}(e);return(a&&t?"0x":"")+b}(e,!1);class z{async getEndpoints(e){try{const a=await k(e);return await a.json()}catch(e){return T.error("Finding the service endpoints failed:",e),null}}getEndpointURL(e,a){return e?e.find(e=>e.serviceName===a):null}async getServiceEndpoints(e,a){const t=[];for(const b in a.serviceEndpoints)t.push({serviceName:b,method:a.serviceEndpoints[b][0],urlPath:e+a.serviceEndpoints[b][1]});return t}async getNonce(e,a,t,b,n){b||(b=await this.getEndpoints(e)),n||(n=await this.getServiceEndpoints(e,b));const d=this.getEndpointURL(n,"nonce")?this.getEndpointURL(n,"nonce").urlPath:null;if(!d)return null;try{const e=await t(d+`?userAddress=${a}`);return String((await e.json()).nonce)}catch(e){throw T.error(e),new Error("HTTP request failed")}}async createSignature(e,a,t){return await R(e,j(t),a)}async createHashSignature(e,a,t){return await S(e,t,a)}async encrypt(e,a,t){const b=await this.getEndpoints(a),n=await this.getServiceEndpoints(a,b),d=this.getEndpointURL(n,"encrypt")?this.getEndpointURL(n,"encrypt").urlPath:null;if(!d)return null;try{return await t("POST",d,decodeURI(JSON.stringify(e)),{"Content-Type":"application/octet-stream"})}catch(e){throw T.error(e),new Error("HTTP request failed")}}async checkDidFiles(e,a,t,b){const n=await this.getEndpoints(t),d=await this.getServiceEndpoints(t,n),f={did:e,serviceId:a},s=[],i=this.getEndpointURL(d,"fileinfo")?this.getEndpointURL(d,"fileinfo").urlPath:null;if(!i)return null;try{const e=await b(i,JSON.stringify(f)),a=await e.json();for(const e of a)s.push(e);return s}catch(e){return null}}async checkFileUrl(e,a,t){const b=await this.getEndpoints(a),n=await this.getServiceEndpoints(a,b),d={url:e,type:"url"},f=[],s=this.getEndpointURL(n,"fileinfo")?this.getEndpointURL(n,"fileinfo").urlPath:null;if(!s)return null;try{const e=await t("POST",s,JSON.stringify(d)),a=await e.json();for(const e of a)f.push(e);return f}catch(e){return null}}async initialize(e,a,t,b,n,d,f,s){const i=await this.getEndpoints(n),c=await this.getServiceEndpoints(n,i);let r=this.getEndpointURL(c,"initialize")?this.getEndpointURL(c,"initialize").urlPath:null;if(!r)return null;r+=`?documentId=${e}`,r+=`&serviceId=${a}`,r+=`&fileIndex=${t}`,r+=`&consumerAddress=${b}`,f&&(r+="&userdata="+encodeURI(JSON.stringify(f))),s&&(r+="&computeEnv="+encodeURI(s));try{const e=await d("GET",r);return await e.json()}catch(e){throw T.error(e),new Error("Asset URL not found or not available.")}}async getDownloadUrl(e,a,t,b,n,d,f,s){const i=await this.getEndpoints(d),c=await this.getServiceEndpoints(d,i),r=this.getEndpointURL(c,"download")?this.getEndpointURL(c,"download").urlPath:null;if(!r)return null;const o=Date.now();let p=r;return p+=`?fileIndex=${b}`,p+=`&documentId=${e}`,p+=`&transferTxId=${n}`,p+=`&serviceId=${t}`,p+=`&consumerAddress=${a}`,p+=`&nonce=${o}`,p+=`&signature=${await this.createSignature(f,a,e+o)}`,s&&(p+="&userdata="+encodeURI(JSON.stringify(s))),p}async computeStart(e,a,t,b,n,d,f,s,i){const c=await this.getEndpoints(e),r=await this.getServiceEndpoints(e,c),o=this.getEndpointURL(r,"computeStart")?this.getEndpointURL(r,"computeStart").urlPath:null,p=Date.now();let y=b;y+=d.documentId,y+=p;const u=await this.createHashSignature(a,b,y),l=Object();if(l.consumerAddress=b,l.signature=u,l.nonce=p,l.computeEnv=n,l.dataset=d,l.algorithm=f,l.additionalDatasets&&(l.additionalDatasets=s),i&&(l.output=i),!o)return null;try{const e=await t("POST",o,JSON.stringify(l),{"Content-Type":"application/json"});return null!=e&&e.ok?await e.json():(console.error("Compute start failed:",e.status,e.statusText),T.error("Payload was:",l),null)}catch(e){return T.error("Compute start failed:"),T.error(e),T.error("Payload was:",l),null}}async computeStop(e,a,t,b,n,d){const f=await this.getEndpoints(b),s=await this.getServiceEndpoints(b,f),i=this.getEndpointURL(s,"computeStop")?this.getEndpointURL(s,"computeStop").urlPath:null,c=await this.getNonce(b,a,d,f,s);let r=a;r+=t||"",r+=e&&`${j(e)}`||"",r+=c;const o=await this.createHashSignature(n,a,r),p=Object();if(p.signature=o,p.documentId=j(e),p.consumerAddress=a,t&&(p.jobId=t),!i)return null;try{const e=await d(i,JSON.stringify(p));return null!=e&&e.ok?await e.json():(T.error("Compute stop failed:",e.status,e.statusText),T.error("Payload was:",p),null)}catch(e){return T.error("Compute stop failed:"),T.error(e),T.error("Payload was:",p),null}}async computeStatus(e,a,t,b,n){if(!t&&!b&&!n)throw new Error("You need at least one of jobId, did, consumerAddress");const d=await this.getEndpoints(e),f=await this.getServiceEndpoints(e,d),s=this.getEndpointURL(f,"computeStatus")?this.getEndpointURL(f,"computeStatus").urlPath:null;let i="?documentId="+j(b);if(i+=`&consumerAddress=${n}`,i+=t&&`&jobId=${t}`||"",!s)return null;try{const e=await a("GET",s+i);return null!=e&&e.ok?await e.json():(T.error("Get compute status failed:",e.status,e.statusText),null)}catch(e){return T.error("Get compute status failed"),T.error(e),null}}async computeResult(e,a,t,b,n,d,f){const s=await this.getEndpoints(n),i=await this.getServiceEndpoints(n,s),c=this.getEndpointURL(i,"computeResult")?this.getEndpointURL(i,"computeResult").urlPath:null,r=await this.getNonce(n,b,f,s,i);let o=b;o+=e,o+=String(a),o+=r;const p=await this.createHashSignature(d,b,o);let y=c;if(y+=`?consumerAddress=${b}`,y+=`&jobId=${e}`,y+=`&index=${String(a)}`,y+=p&&`&signature=${p}`||"",!c)return null;try{t?await f.downloadFile(y,t,a):await f.downloadFileBrowser(y)}catch(e){throw T.error("Error getting job result"),T.error(e),e}return t}async computeDelete(e,a,t,b,n,d){const f=await this.getEndpoints(b),s=await this.getServiceEndpoints(b,f),i=this.getEndpointURL(s,"computeDelete")?this.getEndpointURL(s,"computeDelete").urlPath:null,c=await this.getNonce(b,a,d,f,s);let r=a;r+=t||"",r+=e&&`${j(e)}`||"",r+=c;const o=await this.createHashSignature(n,a,r),p=Object();if(p.documentId=j(e),p.consumerAddress=a,p.jobId=t,o&&(p.signature=o),!i)return null;try{const e=await d(i,JSON.stringify(p));return null!=e&&e.ok?await e.json():(T.error("Delete compute job failed:",e.status,e.statusText),T.error("Payload was:",p),null)}catch(e){return T.error("Delete compute job failed:"),T.error(e),T.error("Payload was:",p),null}}async isValidProvider(e,a){try{const t=await a(e);if(null!=t&&t.ok){const e=await t.json();if(e&&e.providerAddress)return!0}return!1}catch(e){return T.error(`Error validating provider: ${e.message}`),!1}}}const H=new z;exports.Config=class{constructor(){this.nodeUri=void 0,this.providerAddress=void 0,this.metadataCacheUri=void 0,this.providerUri=void 0,this.web3Provider=void 0,this.oceanTokenAddress=void 0,this.erc721FactoryAddress=void 0,this.erc721FFactoryABI=void 0,this.datatokensABI=void 0,this.poolTemplateAddress=void 0,this.poolFactoryABI=void 0,this.poolABI=void 0,this.fixedRateExchangeAddress=void 0,this.fixedRateExchangeAddressABI=void 0,this.dispenserAddress=void 0,this.dispenserABI=void 0,this.opfCommunityFeeCollector=void 0,this.sideStakingAddress=void 0,this.startBlock=void 0,this.verbose=void 0,this.authMessage=void 0,this.authTokenExpiration=void 0,this.parityUri=void 0,this.threshold=void 0,this.chainId=void 0,this.network=void 0,this.subgraphUri=void 0,this.explorerUri=void 0,this.oceanTokenSymbol=void 0}},exports.ConfigHelper=class{getAddressesFromEnv(e){let a;if(C[e]){const{FixedPrice:t,Dispenser:b,Staking:n,poolTemplate:d,OPFCommunityFeeCollector:f,ERC721Factory:s,Ocean:i,chainId:c,startBlock:r}=C[e];a=E({erc721FactoryAddress:s,sideStakingAddress:n,opfCommunityFeeCollector:f,poolTemplateAddress:d,fixedRateExchangeAddress:t,dispenserAddress:b,oceanTokenAddress:i,chainId:c,startBlock:r},process.env.AQUARIUS_URI&&{metadataCacheUri:process.env.AQUARIUS_URI})}if(y.default&&process.env.ADDRESS_FILE)try{const t=JSON.parse(y.default.readFileSync(process.env.ADDRESS_FILE||`${d.homedir}/.ocean/ocean-contracts/artifacts/address.json`,"utf8")),{FixedPrice:b,Dispenser:n,Staking:f,poolTemplate:s,ERC721Factory:i,OPFCommunityFeeCollector:c,Ocean:r,chainId:o,startBlock:p}=t[e];a=E({erc721FactoryAddress:i,sideStakingAddress:f,opfCommunityFeeCollector:c,poolTemplateAddress:s,fixedRateExchangeAddress:b,dispenserAddress:n,oceanTokenAddress:r,chainId:o,startBlock:p},process.env.AQUARIUS_URI&&{metadataCacheUri:process.env.AQUARIUS_URI})}catch(e){}return a}getConfig(e,a){const t="string"==typeof e?"network":"chainId";let b=I.find(a=>a[t]===e);return b?(b=E({},b,this.getAddressesFromEnv(b.network)),E({},b,{nodeUri:a?`${b.nodeUri}/${a}`:b.nodeUri})):(T.error(`No config found for given network '${e}'`),null)}},exports.Datatoken=class{constructor(e,a,t,b){this.GASLIMIT_DEFAULT=1e6,this.factoryAddress=void 0,this.factoryABI=void 0,this.datatokensAbi=void 0,this.datatokensEnterpriseAbi=void 0,this.web3=void 0,this.startBlock=void 0,this.nft=void 0,this.web3=e,this.datatokensAbi=a||P.abi,this.datatokensEnterpriseAbi=t||_.abi,this.startBlock=b||0,this.nft=new W(this.web3)}async estGasApprove(e,a,t,b,n){const d=n||new this.web3.eth.Contract(this.datatokensAbi,e),f=this.GASLIMIT_DEFAULT;let s;try{s=await d.methods.approve(a,this.web3.utils.toWei(t)).estimateGas({from:b},(e,a)=>e?f:a)}catch(e){s=f}return s}async approve(e,a,t,b){const n=new this.web3.eth.Contract(this.datatokensAbi,e),d=await this.estGasApprove(e,a,t,b,n);return await n.methods.approve(a,this.web3.utils.toWei(t)).send({from:b,gas:d+1,gasPrice:await w(this.web3)})}async estGasMint(e,a,t,b,n){const d=n||new this.web3.eth.Contract(this.datatokensAbi,e),f=this.GASLIMIT_DEFAULT;let s;try{s=await d.methods.mint(b||a,this.web3.utils.toWei(t)).estimateGas({from:a},(e,a)=>e?f:a)}catch(e){s=f}return s}async estGasCreateFixedRate(e,a,t,b){const n=b||new this.web3.eth.Contract(this.datatokensAbi,e),d=this.GASLIMIT_DEFAULT;t.allowedConsumer||(t.allowedConsumer="0x0000000000000000000000000000000000000000");const f=t.withMint?1:0;let s;try{s=await n.methods.createFixedRate(t.fixedRateAddress,[t.baseTokenAddress,a,t.marketFeeCollector,t.allowedConsumer],[t.baseTokenDecimals,t.dataTokenDecimals,t.fixedRate,t.marketFee,f]).estimateGas({from:a},(e,a)=>e?d:a)}catch(e){s=d}return s}async createFixedRate(e,a,t){const b=new this.web3.eth.Contract(this.datatokensAbi,e);if(!await this.isERC20Deployer(e,a))throw new Error("User is not ERC20 Deployer");t.allowedConsumer||(t.allowedConsumer="0x0000000000000000000000000000000000000000");const n=t.withMint?1:0,d=await this.estGasCreateFixedRate(e,a,t,b);return await b.methods.createFixedRate(t.fixedRateAddress,[t.baseTokenAddress,t.owner,t.marketFeeCollector,t.allowedConsumer],[t.baseTokenDecimals,t.dataTokenDecimals,t.fixedRate,t.marketFee,n]).send({from:a,gas:d+1,gasPrice:await w(this.web3)})}async estGasCreateDispenser(e,a,t,b,n){const d=n||new this.web3.eth.Contract(this.datatokensAbi,e);b.allowedSwapper||(b.allowedSwapper="0x0000000000000000000000000000000000000000"),b.withMint||(b.withMint=!1);const f=this.GASLIMIT_DEFAULT;let s;try{s=await d.methods.createDispenser(t,b.maxTokens,b.maxBalance,b.withMint,b.allowedSwapper).estimateGas({from:a},(e,a)=>e?f:a)}catch(e){s=f}return s}async createDispenser(e,a,t,b){if(!await this.isERC20Deployer(e,a))throw new Error("User is not ERC20 Deployer");const n=new this.web3.eth.Contract(this.datatokensAbi,e);b.allowedSwapper||(b.allowedSwapper="0x0000000000000000000000000000000000000000"),b.withMint||(b.withMint=!1);const d=await this.estGasCreateDispenser(e,a,t,b,n);return await n.methods.createDispenser(t,b.maxTokens,b.maxBalance,b.withMint,b.allowedSwapper).send({from:a,gas:d+1,gasPrice:await w(this.web3)})}async mint(e,a,t,b){const n=new this.web3.eth.Contract(this.datatokensAbi,e);if(!0!==(await this.getDTPermissions(e,a)).minter)throw new Error("Caller is not Minter");const d=await this.getCap(e);if(new m.default(d).gte(t)){const d=await this.estGasMint(e,a,t,b,n);return await n.methods.mint(b||a,this.web3.utils.toWei(t)).send({from:a,gas:d+1,gasPrice:await w(this.web3)})}throw new Error("Mint amount exceeds cap available")}async estGasAddMinter(e,a,t,b){const n=b||new this.web3.eth.Contract(this.datatokensAbi,e),d=this.GASLIMIT_DEFAULT;let f;try{f=await n.methods.addMinter(t).estimateGas({from:a},(e,a)=>e?d:a)}catch(e){f=d}return f}async addMinter(e,a,t){const b=new this.web3.eth.Contract(this.datatokensAbi,e);if(!0!==await this.isERC20Deployer(e,a))throw new Error("Caller is not ERC20Deployer");const n=await this.estGasAddMinter(e,a,t,b);return await b.methods.addMinter(t).send({from:a,gas:n+1,gasPrice:await w(this.web3)})}async estGasRemoveMinter(e,a,t,b){const n=b||new this.web3.eth.Contract(this.datatokensAbi,e),d=this.GASLIMIT_DEFAULT;let f;try{f=await n.methods.removeMinter(t).estimateGas({from:a},(e,a)=>e?d:a)}catch(e){f=d}return f}async removeMinter(e,a,t){const b=new this.web3.eth.Contract(this.datatokensAbi,e);if(!0!==await this.isERC20Deployer(e,a))throw new Error("Caller is not ERC20Deployer");const n=await this.estGasRemoveMinter(e,a,t,b);return await b.methods.removeMinter(t).send({from:a,gas:n+1,gasPrice:await w(this.web3)})}async estGasAddPaymentManager(e,a,t,b){const n=b||new this.web3.eth.Contract(this.datatokensAbi,e),d=this.GASLIMIT_DEFAULT;let f;try{f=await n.methods.addPaymentManager(t).estimateGas({from:a},(e,a)=>e?d:a)}catch(e){f=d}return f}async addPaymentManager(e,a,t){const b=new this.web3.eth.Contract(this.datatokensAbi,e);if(!0!==await this.isERC20Deployer(e,a))throw new Error("Caller is not ERC20Deployer");const n=await this.estGasAddPaymentManager(e,a,t,b);return await b.methods.addPaymentManager(t).send({from:a,gas:n+1,gasPrice:await w(this.web3)})}async estGasRemovePaymentManager(e,a,t,b){const n=b||new this.web3.eth.Contract(this.datatokensAbi,e),d=this.GASLIMIT_DEFAULT;let f;try{f=await n.methods.removePaymentManager(t).estimateGas({from:a},(e,a)=>e?d:a)}catch(e){f=d}return f}async removePaymentManager(e,a,t){const b=new this.web3.eth.Contract(this.datatokensAbi,e);if(!0!==await this.isERC20Deployer(e,a))throw new Error("Caller is not ERC20Deployer");const n=await this.estGasRemovePaymentManager(e,a,t,b);return await b.methods.removePaymentManager(t).send({from:a,gas:n+1,gasPrice:await w(this.web3)})}async estGasSetPaymentCollector(e,a,t,b){const n=b||new this.web3.eth.Contract(this.datatokensAbi,e),d=this.GASLIMIT_DEFAULT;let f;try{f=await n.methods.setPaymentCollector(t).estimateGas({from:a},(e,a)=>e?d:a)}catch(e){f=d}return f}async setPaymentCollector(e,a,t){const b=new this.web3.eth.Contract(this.datatokensAbi,e);if(!0!==(await this.getDTPermissions(e,a)).paymentManager)throw new Error("Caller is not Fee Manager");const n=await this.estGasSetPaymentCollector(e,a,t,b);return await b.methods.setPaymentCollector(t).send({from:a,gas:n+1,gasPrice:await w(this.web3)})}async getPaymentCollector(e){const a=new this.web3.eth.Contract(this.datatokensAbi,e);return await a.methods.getPaymentCollector().call()}async transfer(e,a,t,b){const n=this.web3.utils.toWei(t);return this.transferWei(e,a,n,b)}async estGasTransfer(e,a,t,b,n){const d=n||new this.web3.eth.Contract(this.datatokensAbi,e),f=this.GASLIMIT_DEFAULT;let s;try{s=await d.methods.transfer(a,t).estimateGas({from:b},(e,a)=>e?f:a)}catch(e){s=f}return s}async transferWei(e,a,t,b){const n=new this.web3.eth.Contract(this.datatokensAbi,e);try{const d=await this.estGasTransfer(e,a,t,b,n);return await n.methods.transfer(a,t).send({from:b,gas:d+1,gasPrice:await w(this.web3)})}catch(e){throw T.error(`ERROR: Failed to transfer tokens: ${e.message}`),new Error(`Failed Failed to transfer tokens: ${e.message}`)}}async estGasStartOrder(e,a,t,b,n,d,f,s,i,c,r,o){const p=o||new this.web3.eth.Contract(this.datatokensAbi,e),y=this.GASLIMIT_DEFAULT;let u;try{u=await p.methods.startOrder(t,b,n,d,f,s,i,c,r).estimateGas({from:a},(e,a)=>e?y:a)}catch(e){u=y}return u}async startOrder(e,a,t,b,n,d,f,s,i,c,r){const o=new this.web3.eth.Contract(this.datatokensAbi,e);n||(n="0x0000000000000000000000000000000000000000");try{const p=await this.estGasStartOrder(e,a,t,b,n,d,f,s,i,c,r,o);return await o.methods.startOrder(t,b,n,d,f,s,i,c,r).send({from:a,gas:p+1,gasPrice:await w(this.web3)})}catch(e){throw T.error(`ERROR: Failed to start order : ${e.message}`),new Error(`Failed to start order: ${e.message}`)}}async estGasBuyFromFreAndOrder(e,a,t,b,n){const d=n||new this.web3.eth.Contract(this.datatokensEnterpriseAbi,e),f=this.GASLIMIT_DEFAULT;let s;try{s=await d.methods.buyFromFreAndOrder(t,b).estimateGas({from:a},(e,a)=>e?f:a)}catch(e){s=f}return s}async buyFromFreAndOrder(e,a,t,b){const n=new this.web3.eth.Contract(this.datatokensEnterpriseAbi,e);try{const d=await this.estGasBuyFromFreAndOrder(e,a,t,b,n);return await n.methods.buyFromFreAndOrder(t,b).send({from:a,gas:d+1,gasPrice:await w(this.web3)})}catch(e){throw T.error(`ERROR: Failed to buy DT From Fre And Order : ${e.message}`),new Error(`Failed to buy DT From Fre And Order: ${e.message}`)}}async estGasBuyFromDispenserAndOrder(e,a,t,b,n){const d=n||new this.web3.eth.Contract(this.datatokensEnterpriseAbi,e),f=this.GASLIMIT_DEFAULT;let s;try{s=await d.methods.buyFromDispenserAndOrder(t,b).estimateGas({from:a},(e,a)=>e?f:a)}catch(e){s=f}return s}async buyFromDispenserAndOrder(e,a,t,b){const n=new this.web3.eth.Contract(this.datatokensEnterpriseAbi,e);try{const d=await this.estGasBuyFromDispenserAndOrder(e,a,t,b,n);return await n.methods.buyFromDispenserAndOrder(t,b).send({from:a,gas:d+1,gasPrice:await w(this.web3)})}catch(e){throw T.error(`ERROR: Failed to buy DT From Fre And Order : ${e.message}`),new Error(`Failed to buy DT From Fre And Order: ${e.message}`)}}async estGasSetData(e,a,t,b){const n=b||new this.web3.eth.Contract(this.datatokensAbi,e),d=this.GASLIMIT_DEFAULT;let f;try{f=await n.methods.setData(t).estimateGas({from:a},(e,a)=>e?d:a)}catch(e){f=d}return f}async setData(e,a,t){if(!await this.isERC20Deployer(e,a))throw new Error("User is not ERC20 Deployer");const b=new this.web3.eth.Contract(this.datatokensAbi,e),n=await this.estGasSetData(e,a,t,b);return await b.methods.setData(t).send({from:a,gas:n+1,gasPrice:await w(this.web3)})}async estGasCleanPermissions(e,a,t){const b=t||new this.web3.eth.Contract(this.datatokensAbi,e),n=this.GASLIMIT_DEFAULT;let d;try{d=await b.methods.cleanPermissions().estimateGas({from:a},(e,a)=>e?n:a)}catch(e){d=n}return d}async cleanPermissions(e,a){if(await this.nft.getNftOwner(await this.getNFTAddress(e))!==a)throw new Error("Caller is NOT Nft Owner");const t=new this.web3.eth.Contract(this.datatokensAbi,e),b=await this.estGasCleanPermissions(e,a,t);return await t.methods.cleanPermissions().send({from:a,gas:b+1,gasPrice:await w(this.web3)})}async getDTPermissions(e,a){const t=new this.web3.eth.Contract(this.datatokensAbi,e);return await t.methods.permissions(a).call()}async getCap(e){const a=new this.web3.eth.Contract(this.datatokensAbi,e),t=await a.methods.cap().call();return this.web3.utils.fromWei(t)}async getDecimals(e){const a=new this.web3.eth.Contract(this.datatokensAbi,e);return await a.methods.decimals().call()}async getNFTAddress(e){const a=new this.web3.eth.Contract(this.datatokensAbi,e);return await a.methods.getERC721Address().call()}async isERC20Deployer(e,a){const t=new this.web3.eth.Contract(this.datatokensAbi,e);return await t.methods.isERC20Deployer(a).call()}async balance(e,a){const t=new this.web3.eth.Contract(this.datatokensAbi,e,{from:a}),b=await t.methods.balanceOf(a).call();return this.web3.utils.fromWei(b)}},exports.Dispenser=class{constructor(e,a=null,t=null,b){this.GASLIMIT_DEFAULT=1e6,this.web3=null,this.dispenserAddress=void 0,this.startBlock=void 0,this.dispenserAbi=void 0,this.dispenserContract=void 0,this.web3=e,this.dispenserAddress=a,this.startBlock=b||0,this.dispenserAbi=t||G.abi,e&&(this.dispenserContract=new this.web3.eth.Contract(this.dispenserAbi,this.dispenserAddress))}async status(e){try{const a=await this.dispenserContract.methods.status(e).call();return a.maxTokens=this.web3.utils.fromWei(a.maxTokens),a.maxBalance=this.web3.utils.fromWei(a.maxBalance),a.balance=this.web3.utils.fromWei(a.balance),a}catch(a){T.warn(`No dispenser available for data token: ${e}`)}return null}async estGasCreate(e,a,t,b,n){const d=this.GASLIMIT_DEFAULT;let f;try{f=await this.dispenserContract.methods.create(e,this.web3.utils.toWei(t),this.web3.utils.toWei(b),a,n).estimateGas({from:a},(e,a)=>e?d:a)}catch(e){f=d}return f}async create(e,a,t,b,n){const d=await this.estGasCreate(e,a,t,b,n);return await this.dispenserContract.methods.create(e,this.web3.utils.toWei(t),this.web3.utils.toWei(b),a,n).send({from:a,gas:d+1,gasPrice:await w(this.web3)})}async estGasActivate(e,a,t,b){let n;const d=this.GASLIMIT_DEFAULT;try{n=await this.dispenserContract.methods.activate(e,this.web3.utils.toWei(a),this.web3.utils.toWei(t)).estimateGas({from:b},(e,a)=>e?d:a)}catch(e){n=d}return n}async activate(e,a,t,b){try{const n=await this.estGasActivate(e,a,t,b);return await this.dispenserContract.methods.activate(e,this.web3.utils.toWei(a),this.web3.utils.toWei(t)).send({from:b,gas:n+1,gasPrice:await w(this.web3)})}catch(e){T.error(`ERROR: Failed to activate dispenser: ${e.message}`)}return null}async estGasDeactivate(e,a){let t;const b=this.GASLIMIT_DEFAULT;try{t=await this.dispenserContract.methods.deactivate(e).estimateGas({from:a},(e,a)=>e?b:a)}catch(e){t=b}return t}async deactivate(e,a){try{const t=await this.estGasDeactivate(e,a);return await this.dispenserContract.methods.deactivate(e).send({from:a,gas:t+1,gasPrice:await w(this.web3)})}catch(e){T.error(`ERROR: Failed to activate dispenser: ${e.message}`)}return null}async estGasSetAllowedSwapper(e,a,t){let b;const n=this.GASLIMIT_DEFAULT;try{b=await this.dispenserContract.methods.setAllowedSwapper(e,t).estimateGas({from:a},(e,a)=>e?n:a)}catch(e){b=n}return b}async setAllowedSwapper(e,a,t){try{const b=await this.estGasSetAllowedSwapper(e,a,t);return await this.dispenserContract.methods.setAllowedSwapper(e,t).send({from:a,gas:b+1,gasPrice:await w(this.web3)})}catch(e){T.error(`ERROR: Failed to activate dispenser: ${e.message}`)}return null}async estGasDispense(e,a,t="1",b){let n;const d=this.GASLIMIT_DEFAULT;try{n=await this.dispenserContract.methods.dispense(e,this.web3.utils.toWei(t),b).estimateGas({from:a},(e,a)=>e?d:a)}catch(e){n=d}return n}async dispense(e,a,t="1",b){const n=await this.estGasDispense(e,a,t,b);try{return await this.dispenserContract.methods.dispense(e,this.web3.utils.toWei(t),b).send({from:a,gas:n+1,gasPrice:await w(this.web3)})}catch(e){T.error(`ERROR: Failed to dispense tokens: ${e.message}`)}return null}async estGasOwnerWithdraw(e,a){let t;const b=this.GASLIMIT_DEFAULT;try{t=await this.dispenserContract.methods.ownerWithdraw(e).estimateGas({from:a},(e,a)=>e?b:a)}catch(e){t=b}return t}async ownerWithdraw(e,a){const t=await this.estGasOwnerWithdraw(e,a);try{return await this.dispenserContract.methods.ownerWithdraw(e).send({from:a,gas:t+1,gasPrice:await w(this.web3)})}catch(e){T.error(`ERROR: Failed to withdraw tokens: ${e.message}`)}return null}async isDispensable(e,a,t,b="1"){const n=await this.status(e);return!(!n||!1===n.active||new m.default(await a.balance(e,t)).greaterThanOrEqualTo(n.maxBalance)||new m.default(String(b)).greaterThan(n.maxTokens)||!new m.default(n.balance).greaterThanOrEqualTo(b)&&!0!==n.isMinter)}},exports.FixedRateExchange=class{constructor(e,a,t=null,b=null,n){this.GASLIMIT_DEFAULT=1e6,this.oceanAddress=null,this.fixedRateAddress=void 0,this.fixedRateExchangeAbi=void 0,this.fixedRateContract=void 0,this.web3=void 0,this.contract=null,this.startBlock=void 0,this.ssAbi=void 0,this.web3=e,this.startBlock=n||0,this.fixedRateExchangeAbi=t||U.abi,this.oceanAddress=b,this.fixedRateAddress=a,this.contract=new this.web3.eth.Contract(this.fixedRateExchangeAbi,this.fixedRateAddress)}async amountToUnits(e,a){let t=18;const b=new this.web3.eth.Contract(P.abi,e);try{t=await b.methods.decimals().call()}catch(e){T.error("ERROR: FAILED TO CALL DECIMALS(), USING 18")}return new r.default(parseInt(a)*10**t).toString()}async unitsToAmount(e,a){let t=18;const b=new this.web3.eth.Contract(P.abi,e);try{t=await b.methods.decimals().call()}catch(e){T.error("ERROR: FAILED TO CALL DECIMALS(), USING 18")}return new r.default(parseInt(a)/10**t).toString()}async generateExchangeId(e,a,t){return await this.contract.methods.generateExchangeId(e,a,t).call()}async estBuyDT(e,a,t,b,n){const d=n||this.fixedRateContract,f=this.GASLIMIT_DEFAULT;let s;try{s=await d.methods.buyDT(a,t.toString(),b.toString()).estimateGas({from:e},(e,a)=>e?f:a)}catch(e){s=f}return s}async buyDT(e,a,t,b){const n=await this.amountToUnits((await this.getExchange(a)).dataToken,t),d=await this.amountToUnits((await this.getExchange(a)).baseToken,b),f=await this.estBuyDT(e,a,n,d);try{return await this.contract.methods.buyDT(a,n,d).send({from:e,gas:f+1,gasPrice:await w(this.web3)})}catch(e){return T.error(`ERROR: Failed to buy datatokens: ${e.message}`),null}}async estSellDT(e,a,t,b,n){const d=n||this.fixedRateContract,f=this.GASLIMIT_DEFAULT;let s;try{s=await d.methods.sellDT(a,t,b).estimateGas({from:e},(e,a)=>e?f:a)}catch(e){s=f}return s}async sellDT(e,a,t,b){const n=await this.amountToUnits((await this.getExchange(a)).dataToken,t),d=await this.amountToUnits((await this.getExchange(a)).baseToken,b),f=await this.estBuyDT(e,a,n,d);try{return await this.contract.methods.sellDT(a,n,d).send({from:e,gas:f+1,gasPrice:await w(this.web3)})}catch(e){return T.error(`ERROR: Failed to sell datatokens: ${e.message}`),null}}async getNumberOfExchanges(){return await this.contract.methods.getNumberOfExchanges().call()}async estSetRate(e,a,t,b){const n=b||this.fixedRateContract,d=this.GASLIMIT_DEFAULT;let f;try{f=await n.methods.setRate(a,t).estimateGas({from:e},(e,a)=>e?d:a)}catch(e){f=d}return f}async setRate(e,a,t){const b=await this.estSetRate(e,a,this.web3.utils.toWei(String(t)));return await this.contract.methods.setRate(a,this.web3.utils.toWei(t)).send({from:e,gas:b+1,gasPrice:await w(this.web3)})}async estSetAllowedSwapper(e,a,t,b){const n=b||this.fixedRateContract,d=this.GASLIMIT_DEFAULT;let f;try{f=await n.methods.setRate(a,t).estimateGas({from:e},(e,a)=>e?d:a)}catch(e){f=d}return f}async setAllowedSwapper(e,a,t){const b=await this.estSetAllowedSwapper(e,a,t);return await this.contract.methods.setAllowedSwapper(a,t).send({from:e,gas:b+1,gasPrice:await w(this.web3)})}async estActivate(e,a,t){const b=t||this.fixedRateContract,n=this.GASLIMIT_DEFAULT;let d;try{d=await b.methods.toggleExchangeState(a).estimateGas({from:e},(e,a)=>e?n:a)}catch(e){d=n}return d}async activate(e,a){const t=await this.getExchange(a);if(!t)return null;if(!0===t.active)return null;const b=await this.estActivate(e,a);return await this.contract.methods.toggleExchangeState(a).send({from:e,gas:b+1,gasPrice:await w(this.web3)})}async estDeactivate(e,a,t){const b=t||this.fixedRateContract,n=this.GASLIMIT_DEFAULT;let d;try{d=await b.methods.toggleExchangeState(a).estimateGas({from:e},(e,a)=>e?n:a)}catch(e){d=n}return d}async deactivate(e,a){const t=await this.getExchange(a);if(!t)return null;if(!1===t.active)return null;const b=await this.estDeactivate(e,a);return await this.contract.methods.toggleExchangeState(a).send({from:e,gas:b+1,gasPrice:await w(this.web3)})}async getRate(e){const a=await this.contract.methods.getRate(e).call();return this.web3.utils.fromWei(a)}async getDTSupply(e){const a=await this.contract.methods.getDTSupply(e).call();return await this.unitsToAmount((await this.getExchange(e)).dataToken,a)}async getBTSupply(e){const a=await this.contract.methods.getBTSupply(e).call();return await this.unitsToAmount((await this.getExchange(e)).baseToken,a)}async getAllowedSwapper(e){return await this.contract.methods.getAllowedSwapper(e).call()}async getAmountBTIn(e,a){const t=await this.contract.methods.calcBaseInGivenOutDT(e,await this.amountToUnits((await this.getExchange(e)).dataToken,a)).call();return await this.unitsToAmount((await this.getExchange(e)).baseToken,t.baseTokenAmount)}async getAmountBTOut(e,a){const t=await this.contract.methods.calcBaseOutGivenInDT(e,await this.amountToUnits((await this.getExchange(e)).dataToken,a)).call();return await this.unitsToAmount((await this.getExchange(e)).baseToken,t.baseTokenAmount)}async getExchange(e){const a=await this.contract.methods.getExchange(e).call();return a.dtDecimals=a.dtDecimals.toString(),a.btDecimals=a.btDecimals.toString(),a.dtBalance=await this.unitsToAmount(a.dataToken,a.dtBalance),a.btBalance=await this.unitsToAmount(a.baseToken,a.btBalance),a.dtSupply=await this.unitsToAmount(a.dataToken,a.dtSupply),a.btSupply=await this.unitsToAmount(a.baseToken,a.btSupply),a.fixedRate=this.web3.utils.fromWei(a.fixedRate),a.exchangeId=e,a}async getFeesInfo(e){const a=await this.contract.methods.getFeesInfo(e).call();return a.opfFee=this.web3.utils.fromWei(a.opfFee.toString()),a.marketFee=this.web3.utils.fromWei(a.marketFee.toString()),a.marketFeeAvailable=await this.unitsToAmount((await this.getExchange(e)).baseToken,a.marketFeeAvailable),a.oceanFeeAvailable=await this.unitsToAmount((await this.getExchange(e)).baseToken,a.oceanFeeAvailable),a.exchangeId=e,a}async getExchanges(){return await this.contract.methods.getExchanges().call()}async isActive(e){return await this.contract.methods.isActive(e).call()}async estActivateMint(e,a,t){const b=t||this.fixedRateContract,n=this.GASLIMIT_DEFAULT;let d;try{d=await b.methods.toggleMintState(a,!0).estimateGas({from:e},(e,a)=>e?n:a)}catch(e){d=n}return d}async activateMint(e,a){const t=await this.getExchange(a);if(!t)return null;if(!0===t.withMint)return null;const b=await this.estActivateMint(e,a);return await this.contract.methods.toggleMintState(a,!0).send({from:e,gas:b+1,gasPrice:await w(this.web3)})}async estDeactivateMint(e,a,t){const b=t||this.fixedRateContract,n=this.GASLIMIT_DEFAULT;let d;try{d=await b.methods.toggleMintState(a).estimateGas({from:e},(e,a)=>e?n:a)}catch(e){d=n}return d}async deactivateMint(e,a){const t=await this.getExchange(a);if(!t)return null;if(!1===t.withMint)return null;const b=await this.estDeactivate(e,a);return await this.contract.methods.toggleMintState(a,!1).send({from:e,gas:b+1,gasPrice:await w(this.web3)})}async estCollectBT(e,a,t){const b=t||this.fixedRateContract,n=this.GASLIMIT_DEFAULT;let d;try{d=await b.methods.collectBT(a).estimateGas({from:e},(e,a)=>e?n:a)}catch(e){d=n}return d}async collectBT(e,a){if(!await this.getExchange(a))return null;const t=await this.estCollectBT(e,a);return await this.contract.methods.collectBT(a).send({from:e,gas:t+1,gasPrice:await w(this.web3)})}async estCollectDT(e,a,t){const b=t||this.fixedRateContract,n=this.GASLIMIT_DEFAULT;let d;try{d=await b.methods.collectDT(a).estimateGas({from:e},(e,a)=>e?n:a)}catch(e){d=n}return d}async collectDT(e,a){if(!await this.getExchange(a))return null;const t=await this.estCollectDT(e,a);return await this.contract.methods.collectDT(a).send({from:e,gas:t+1,gasPrice:await w(this.web3)})}async estCollectMarketFee(e,a,t){const b=t||this.fixedRateContract,n=this.GASLIMIT_DEFAULT;let d;try{d=await b.methods.collectMarketFee(a).estimateGas({from:e},(e,a)=>e?n:a)}catch(e){d=n}return d}async collectMarketFee(e,a){if(!await this.getExchange(a))return null;const t=await this.estCollectMarketFee(e,a);return await this.contract.methods.collectMarketFee(a).send({from:e,gas:t+1,gasPrice:await w(this.web3)})}async estCollectOceanFee(e,a,t){const b=t||this.fixedRateContract,n=this.GASLIMIT_DEFAULT;let d;try{d=await b.methods.collectMarketFee(a).estimateGas({from:e},(e,a)=>e?n:a)}catch(e){d=n}return d}async collectOceanFee(e,a){if(!await this.getExchange(a))return null;const t=await this.estCollectOceanFee(e,a);return await this.contract.methods.collectOceanFee(a).send({from:e,gas:t+1,gasPrice:await w(this.web3)})}async getOPFCollector(){let e=null;try{e=await this.contract.methods.opfCollector().call()}catch(e){T.error(`ERROR: Failed to get OPF Collector address: ${e.message}`)}return e}async getRouter(){let e=null;try{e=await this.contract.methods.router().call()}catch(e){T.error(`ERROR: Failed to get Router address: ${e.message}`)}return e}async getExchangeOwner(e){let a=null;try{a=await(await this.getExchange(e)).exchangeOwner}catch(e){T.error(`ERROR: Failed to get OPF Collector address: ${e.message}`)}return a}async estUpdateMarketFee(e,a,t,b){const n=b||this.fixedRateContract,d=this.GASLIMIT_DEFAULT;let f;try{f=await n.methods.updateMarketFee(a,t).estimateGas({from:e},(e,a)=>e?d:a)}catch(e){f=d}return f}async updateMarketFee(e,a,t){const b=await this.estSetRate(e,a,this.web3.utils.toWei(t));return await this.contract.methods.updateMarketFee(a,this.web3.utils.toWei(t)).send({from:e,gas:b+1,gasPrice:await w(this.web3)})}async estUpdateMarketFeeCollector(e,a,t,b){const n=b||this.fixedRateContract,d=this.GASLIMIT_DEFAULT;let f;try{f=await n.methods.updateMarketFeeCollector(a,t).estimateGas({from:e},(e,a)=>e?d:a)}catch(e){f=d}return f}async updateMarketFeeCollector(e,a,t){const b=await this.estUpdateMarketFeeCollector(e,a,t);return await this.contract.methods.updateMarketFeeCollector(a,t).send({from:e,gas:b+1,gasPrice:await w(this.web3)})}},exports.Logger=h,exports.LoggerInstance=T,exports.Nft=W,exports.NftFactory=class{constructor(e,a,t,b){this.GASLIMIT_DEFAULT=1e6,this.factory721Address=void 0,this.factory721Abi=void 0,this.web3=void 0,this.startBlock=void 0,this.factory721=void 0,this.factory721Address=e,this.factory721Abi=t||B.abi,this.web3=a,this.startBlock=b||0,this.factory721=new this.web3.eth.Contract(this.factory721Abi,this.factory721Address)}async estGasCreateNFT(e,a){const t=this.GASLIMIT_DEFAULT;let b;try{b=await this.factory721.methods.deployERC721Contract(a.name,a.symbol,a.templateIndex,$,a.tokenURI).estimateGas({from:e},(e,a)=>e?t:a)}catch(e){b=t}return b}async createNFT(e,a){if(a.templateIndex||(a.templateIndex=1),!a.name||!a.symbol){const{name:e,symbol:t}=A();a.name=e,a.symbol=t}if(a.templateIndex>await this.getCurrentNFTTemplateCount())throw new Error("Template index doesnt exist");if(0===a.templateIndex)throw new Error("Template index cannot be ZERO");if(!1===(await this.getNFTTemplate(a.templateIndex)).isActive)throw new Error("Template is not active");const t=await this.estGasCreateNFT(e,a),b=await this.factory721.methods.deployERC721Contract(a.name,a.symbol,a.templateIndex,$,a.tokenURI).send({from:e,gas:t+1,gasPrice:await w(this.web3)});let n=null;try{n=b.events.NFTCreated.returnValues[0]}catch(e){T.error(`ERROR: Failed to create datatoken : ${e.message}`)}return n}async getCurrentNFTCount(){return await this.factory721.methods.getCurrentNFTCount().call()}async getCurrentTokenCount(){return await this.factory721.methods.getCurrentTokenCount().call()}async getOwner(){return await this.factory721.methods.owner().call()}async getCurrentNFTTemplateCount(){return await this.factory721.methods.getCurrentNFTTemplateCount().call()}async getCurrentTokenTemplateCount(){return await this.factory721.methods.getCurrentTemplateCount().call()}async getNFTTemplate(e){if(e>await this.getCurrentNFTTemplateCount())throw new Error("Template index doesnt exist");if(0===e)throw new Error("Template index cannot be ZERO");return await this.factory721.methods.getNFTTemplate(e).call()}async getTokenTemplate(e){return await this.factory721.methods.getTokenTemplate(e).call()}async checkDatatoken(e){return await this.factory721.methods.erc20List(e).call()}async checkNFT(e){return await this.factory721.methods.erc721List(e).call()}async estGasAddNFTTemplate(e,a){const t=this.GASLIMIT_DEFAULT;let b;try{b=await this.factory721.methods.add721TokenTemplate(a).estimateGas({from:e},(e,a)=>e?t:a)}catch(e){b=t}return b}async addNFTTemplate(e,a){if(await this.getOwner()!==e)throw new Error("Caller is not Factory Owner");if(a===$)throw new Error("Template cannot be ZERO address");const t=await this.estGasAddNFTTemplate(e,a);return await this.factory721.methods.add721TokenTemplate(a).send({from:e,gas:t+1,gasPrice:await w(this.web3)})}async estGasDisableNFTTemplate(e,a){const t=this.GASLIMIT_DEFAULT;let b;try{b=await this.factory721.methods.disable721TokenTemplate(a).estimateGas({from:e},(e,a)=>e?t:a)}catch(e){b=t}return b}async disableNFTTemplate(e,a){if(await this.getOwner()!==e)throw new Error("Caller is not Factory Owner");if(a>await this.getCurrentNFTTemplateCount())throw new Error("Template index doesnt exist");if(0===a)throw new Error("Template index cannot be ZERO");const t=await this.estGasDisableNFTTemplate(e,a);return await this.factory721.methods.disable721TokenTemplate(a).send({from:e,gas:t+1,gasPrice:await w(this.web3)})}async estGasReactivateNFTTemplate(e,a){const t=this.GASLIMIT_DEFAULT;let b;try{b=await this.factory721.methods.reactivate721TokenTemplate(a).estimateGas({from:e},(e,a)=>e?t:a)}catch(e){b=t}return b}async reactivateNFTTemplate(e,a){if(await this.getOwner()!==e)throw new Error("Caller is not Factory Owner");if(a>await this.getCurrentNFTTemplateCount())throw new Error("Template index doesnt exist");if(0===a)throw new Error("Template index cannot be ZERO");const t=await this.estGasReactivateNFTTemplate(e,a);return await this.factory721.methods.reactivate721TokenTemplate(a).send({from:e,gas:t+1,gasPrice:await w(this.web3)})}async estGasAddTokenTemplate(e,a){const t=this.GASLIMIT_DEFAULT;let b;try{b=await this.factory721.methods.addTokenTemplate(a).estimateGas({from:e},(e,a)=>e?t:a)}catch(e){b=t}return b}async addTokenTemplate(e,a){if(await this.getOwner()!==e)throw new Error("Caller is not Factory Owner");if(a===$)throw new Error("Template cannot be address ZERO");const t=await this.estGasAddTokenTemplate(e,a);return await this.factory721.methods.addTokenTemplate(a).send({from:e,gas:t+1,gasPrice:await w(this.web3)})}async estGasDisableTokenTemplate(e,a){const t=this.GASLIMIT_DEFAULT;let b;try{b=await this.factory721.methods.disableTokenTemplate(a).estimateGas({from:e},(e,a)=>e?t:a)}catch(e){b=t}return b}async disableTokenTemplate(e,a){if(await this.getOwner()!==e)throw new Error("Caller is not Factory Owner");if(a>await this.getCurrentNFTTemplateCount())throw new Error("Template index doesnt exist");if(0===a)throw new Error("Template index cannot be ZERO");if(!1===(await this.getNFTTemplate(a)).isActive)throw new Error("Template is already disabled");const t=await this.estGasDisableTokenTemplate(e,a);return await this.factory721.methods.disableTokenTemplate(a).send({from:e,gas:t+1,gasPrice:await w(this.web3)})}async estGasReactivateTokenTemplate(e,a){const t=this.GASLIMIT_DEFAULT;let b;try{b=await this.factory721.methods.reactivateTokenTemplate(a).estimateGas({from:e},(e,a)=>e?t:a)}catch(e){b=t}return b}async reactivateTokenTemplate(e,a){if(await this.getOwner()!==e)throw new Error("Caller is not Factory Owner");if(a>await this.getCurrentNFTTemplateCount())throw new Error("Template index doesnt exist");if(0===a)throw new Error("Template index cannot be ZERO");if(!0===(await this.getTokenTemplate(a)).isActive)throw new Error("Template is already active");const t=await this.estGasReactivateTokenTemplate(e,a);return await this.factory721.methods.reactivateTokenTemplate(a).send({from:e,gas:t+1,gasPrice:await w(this.web3)})}async estGasStartMultipleTokenOrder(e,a){const t=this.GASLIMIT_DEFAULT;let b;try{b=await this.factory721.methods.startMultipleTokenOrder(a).estimateGas({from:e},(e,a)=>e?t:a)}catch(e){b=t}return b}async startMultipleTokenOrder(e,a){if(a.length>50)throw new Error("Too many orders");const t=await this.estGasStartMultipleTokenOrder(e,a);return await this.factory721.methods.startMultipleTokenOrder(a).send({from:e,gas:t+1,gasPrice:await w(this.web3)})}async estGasCreateNftWithErc(e,a,t){const b=this.GASLIMIT_DEFAULT;let n;try{const d=x(t);n=await this.factory721.methods.createNftWithErc(a,d).estimateGas({from:e},(e,a)=>e?b:a)}catch(e){n=b}return n}async createNftWithErc(e,a,t){const b=x(t),n=await this.estGasCreateNftWithErc(e,a,t);return await this.factory721.methods.createNftWithErc(a,b).send({from:e,gas:n+1,gasPrice:await w(this.web3)})}async estGasCreateNftErcWithPool(e,a,t,b){const n=this.GASLIMIT_DEFAULT;let d;try{const f=x(t),s=M(b);d=await this.factory721.methods.createNftErcWithPool(a,f,s).estimateGas({from:e},(e,a)=>e?n:a)}catch(e){d=n}return d}async createNftErcWithPool(e,a,t,b){const n=await this.estGasCreateNftErcWithPool(e,a,t,b),d=x(t),f=M(b);return await this.factory721.methods.createNftErcWithPool(a,d,f).send({from:e,gas:n+1,gasPrice:await w(this.web3)})}async estGasCreateNftErcWithFixedRate(e,a,t,b){const n=this.GASLIMIT_DEFAULT;let d;const f=x(t),s=v(b);try{d=await this.factory721.methods.createNftErcWithFixedRate(a,f,s).estimateGas({from:e},(e,a)=>e?n:a)}catch(e){d=n}return d}async createNftErcWithFixedRate(e,a,t,b){const n=x(t),d=v(b),f=await this.estGasCreateNftErcWithFixedRate(e,a,t,b);return await this.factory721.methods.createNftErcWithFixedRate(a,n,d).send({from:e,gas:f+1,gasPrice:await w(this.web3)})}async estGasCreateNftErcWithDispenser(e,a,t,b){const n=this.GASLIMIT_DEFAULT;let d;const f=x(t);try{d=await this.factory721.methods.createNftErcWithDispenser(a,f,b).estimateGas({from:e},(e,a)=>e?n:a)}catch(e){d=n,T.error("Failed to estimate gas for createNftErcWithDispenser",e)}return d}async createNftErcWithDispenser(e,a,t,b){const n=x(t),d=await this.estGasCreateNftErcWithDispenser(e,a,t,b);return await this.factory721.methods.createNftErcWithDispenser(a,n,b).send({from:e,gas:d+1,gasPrice:await w(this.web3)})}},exports.Pool=class{constructor(e,a,t=null){this.poolAbi=void 0,this.web3=void 0,this.GASLIMIT_DEFAULT=1e6,this.logger=void 0,this.poolAbi=t||O,this.web3=e,this.logger=a}async estApprove(e,a,t,b,n){const d=n||new this.web3.eth.Contract(P.abi,a),f=this.GASLIMIT_DEFAULT;let s;try{s=await d.methods.approve(t,b).estimateGas({from:e},(e,a)=>e?f:a)}catch(e){s=f,T.error("estimate gas failed for approve!",e)}return s}async allowance(e,a,t){const b=new this.web3.eth.Contract(P.abi,e),n=await b.methods.allowance(a,t).call();return await this.unitsToAmount(e,n)}async approve(e,a,t,b,n=!1){const d=new this.web3.eth.Contract([{constant:!1,inputs:[{name:"_spender",type:"address"},{name:"_value",type:"uint256"}],name:"approve",outputs:[{name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"}],a);if(!n){const n=await this.allowance(a,e,t);if(new m.default(n).greaterThanOrEqualTo(new m.default(b)))return n}let f=null;const s=await this.amountToUnits(a,b),i=await this.estApprove(e,a,t,s);try{f=await d.methods.approve(t,s).send({from:e,gas:i+1,gasPrice:await w(this.web3)})}catch(e){this.logger.error(`ERRPR: Failed to approve spender to spend tokens : ${e.message}`)}return f}async sharesBalance(e,a){let t=null;try{const b=new this.web3.eth.Contract(this.poolAbi,a),n=await b.methods.balanceOf(e).call();t=this.web3.utils.fromWei(n)}catch(e){this.logger.error(`ERROR: Failed to get shares of pool : ${e.message}`)}return t}async estSetSwapFee(e,a,t,b){const n=b||new this.web3.eth.Contract(P.abi,a),d=this.GASLIMIT_DEFAULT;let f;try{f=await n.methods.setSwapFee(t).estimateGas({from:e},(e,a)=>e?d:a)}catch(e){f=d}return f}async setSwapFee(e,a,t){const b=new this.web3.eth.Contract(this.poolAbi,a,{from:e});let n=null;const d=await this.estSetSwapFee(e,a,t);try{n=await b.methods.setSwapFee(this.web3.utils.toWei(t)).send({from:e,gas:d,gasPrice:await w(this.web3)})}catch(e){this.logger.error(`ERROR: Failed to set pool swap fee: ${e.message}`)}return n}async getNumTokens(e){const a=new this.web3.eth.Contract(this.poolAbi,e);let t=null;try{t=await a.methods.getNumTokens().call()}catch(e){this.logger.error(`ERROR: Failed to get number of tokens: ${e.message}`)}return t}async getPoolSharesTotalSupply(e){const a=new this.web3.eth.Contract(this.poolAbi,e);let t=null;try{const e=await a.methods.totalSupply().call();t=this.web3.utils.fromWei(e)}catch(e){this.logger.error(`ERROR: Failed to get total supply of pool shares: ${e.message}`)}return t}async getCurrentTokens(e){const a=new this.web3.eth.Contract(this.poolAbi,e);let t=null;try{t=await a.methods.getCurrentTokens().call()}catch(e){this.logger.error(`ERROR: Failed to get tokens composing this pool: ${e.message}`)}return t}async getFinalTokens(e){const a=new this.web3.eth.Contract(this.poolAbi,e);let t=null;try{t=await a.methods.getFinalTokens().call()}catch(e){this.logger.error("ERROR: Failed to get the final tokens composing this pool")}return t}async getController(e){const a=new this.web3.eth.Contract(this.poolAbi,e);let t=null;try{t=await a.methods.getController().call()}catch(e){this.logger.error(`ERROR: Failed to get pool controller address: ${e.message}`)}return t}async getBasetoken(e){const a=new this.web3.eth.Contract(this.poolAbi,e);let t=null;try{t=await a.methods.getBaseTokenAddress().call()}catch(e){this.logger.error(`ERROR: Failed to get basetoken address: ${e.message}`)}return t}async getDatatoken(e){const a=new this.web3.eth.Contract(this.poolAbi,e);let t=null;try{t=await a.methods.getDataTokenAddress().call()}catch(e){this.logger.error(`ERROR: Failed to get datatoken address: ${e.message}`)}return t}async getMarketFeeCollector(e){const a=new this.web3.eth.Contract(this.poolAbi,e);let t=null;try{t=await a.methods._publishMarketCollector().call()}catch(e){this.logger.error(`ERROR: Failed to get marketFeeCollector address: ${e.message}`)}return t}async getOPFCollector(e){const a=new this.web3.eth.Contract(this.poolAbi,e);let t=null;try{t=await a.methods._opfCollector().call()}catch(e){this.logger.error(`ERROR: Failed to get OPF Collector address: ${e.message}`)}return t}async isBound(e,a){const t=new this.web3.eth.Contract(this.poolAbi,e);let b=null;try{b=await t.methods.isBound(a).call()}catch(e){this.logger.error(`ERROR: Failed to check whether a token bounded to a pool. ${e.message}`)}return b}async getReserve(e,a){let t=null;try{const b=new this.web3.eth.Contract(this.poolAbi,e),n=await b.methods.getBalance(a).call();t=await this.unitsToAmount(a,n)}catch(e){this.logger.error(`ERROR: Failed to get how many tokens are in the pool: ${e.message}`)}return t.toString()}async isFinalized(e){const a=new this.web3.eth.Contract(this.poolAbi,e);let t=null;try{t=await a.methods.isFinalized().call()}catch(e){this.logger.error(`ERROR: Failed to check whether pool is finalized: ${e.message}`)}return t}async getSwapFee(e){const a=new this.web3.eth.Contract(this.poolAbi,e);let t=null;try{const e=await a.methods.getSwapFee().call();t=this.web3.utils.fromWei(e)}catch(e){this.logger.error(`ERROR: Failed to get pool fee: ${e.message}`)}return t}async getNormalizedWeight(e,a){const t=new this.web3.eth.Contract(this.poolAbi,e);let b=null;try{const e=await t.methods.getNormalizedWeight(a).call();b=this.web3.utils.fromWei(e)}catch(e){this.logger.error(`ERROR: Failed to get normalized weight of a token: ${e.message}`)}return b}async getDenormalizedWeight(e,a){const t=new this.web3.eth.Contract(this.poolAbi,e);let b=null;try{const e=await t.methods.getDenormalizedWeight(a).call();b=this.web3.utils.fromWei(e)}catch(e){this.logger.error("ERROR: Failed to get denormalized weight of a token in pool")}return b}async getTotalDenormalizedWeight(e){const a=new this.web3.eth.Contract(this.poolAbi,e);let t=null;try{const e=await a.methods.getTotalDenormalizedWeight().call();t=this.web3.utils.fromWei(e)}catch(e){this.logger.error("ERROR: Failed to get total denormalized weight in pool")}return t}async getMarketFees(e,a){const t=new this.web3.eth.Contract(this.poolAbi,e);let b=null;try{const e=await t.methods.publishMarketFees(a).call();b=await this.unitsToAmount(a,e)}catch(e){this.logger.error(`ERROR: Failed to get market fees for a token: ${e.message}`)}return b}async getCurrentMarketFees(e){const a=new this.web3.eth.Contract(this.poolAbi,e);try{return await a.methods.getCurrentOPFFees().call()}catch(e){this.logger.error(`ERROR: Failed to get community fees for a token: ${e.message}`)}}async getCurrentOPFFees(e){const a=new this.web3.eth.Contract(this.poolAbi,e);try{return await a.methods.getCurrentOPFFees().call()}catch(e){this.logger.error(`ERROR: Failed to get community fees for a token: ${e.message}`)}}async getCommunityFees(e,a){const t=new this.web3.eth.Contract(this.poolAbi,e);let b=null;try{const e=await t.methods.communityFees(a).call();b=await this.unitsToAmount(a,e)}catch(e){this.logger.error(`ERROR: Failed to get community fees for a token: ${e.message}`)}return b}async estCollectOPF(e,a,t){const b=t||new this.web3.eth.Contract(this.poolAbi,a),n=this.GASLIMIT_DEFAULT;let d;try{d=await b.methods.collectOPF().estimateGas({from:e},(e,a)=>e?n:a)}catch(e){d=n}return d}async collectOPF(e,a){const t=new this.web3.eth.Contract(this.poolAbi,a);let b=null;const n=await this.estCollectOPF(e,a);try{b=await t.methods.collectOPF().send({from:e,gas:n+1,gasPrice:await w(this.web3)})}catch(e){this.logger.error(`ERROR: Failed to swap exact amount in : ${e.message}`)}return b}async estCollectMarketFee(e,a,t){const b=t||new this.web3.eth.Contract(this.poolAbi,a),n=this.GASLIMIT_DEFAULT;let d;try{d=await b.methods.collectMarketFee().estimateGas({from:e},(e,a)=>e?n:a)}catch(e){d=n}return d}async collectMarketFee(e,a){if(await this.getMarketFeeCollector(a)!==e)throw new Error("Caller is not MarketFeeCollector");const t=new this.web3.eth.Contract(this.poolAbi,a);let b=null;const n=await this.estCollectMarketFee(e,a);try{b=await t.methods.collectMarketFee().send({from:e,gas:n+1,gasPrice:await w(this.web3)})}catch(e){this.logger.error(`ERROR: Failed to swap exact amount in : ${e.message}`)}return b}async estUpdateMarketFeeCollector(e,a,t,b){const n=b||new this.web3.eth.Contract(this.poolAbi,a),d=this.GASLIMIT_DEFAULT;let f;try{f=await n.methods.updateMarketFeeCollector(t).estimateGas({from:e},(e,a)=>e?d:a)}catch(e){f=d}return f}async updateMarketFeeCollector(e,a,t){if(await this.getMarketFeeCollector(a)!==e)throw new Error("Caller is not MarketFeeCollector");const b=new this.web3.eth.Contract(this.poolAbi,a);let n=null;const d=await this.estUpdateMarketFeeCollector(e,a,t);try{n=await b.methods.updateMarketFeeCollector(t).send({from:e,gas:d+1,gasPrice:await w(this.web3)})}catch(e){this.logger.error(`ERROR: Failed to swap exact amount in : ${e.message}`)}return n}async amountToUnits(e,a){try{const t=new this.web3.eth.Contract(P.abi,e);let b=await t.methods.decimals().call();"0"===b&&(b=18);const n=new r.default(parseInt(a)*10**b);return r.default.config({EXPONENTIAL_AT:50}),n.toString()}catch(e){this.logger.error("ERROR: FAILED TO CALL DECIMALS(), USING 18")}}async unitsToAmount(e,a){try{const t=new this.web3.eth.Contract(P.abi,e);let b=await t.methods.decimals().call();return"0"===b&&(b=18),new r.default(parseInt(a)/10**b).toString()}catch(e){this.logger.error("ERROR: FAILED TO CALL DECIMALS(), USING 18")}}async estSwapExactAmountIn(e,a,t,b,n){const d=n||new this.web3.eth.Contract(this.poolAbi,a),f=b.maxPrice?this.web3.utils.toWei(b.maxPrice):D,s=this.GASLIMIT_DEFAULT;let i;try{i=await d.methods.swapExactAmountIn([t.tokenIn,t.tokenOut,t.marketFeeAddress],[b.tokenAmountIn,b.minAmountOut,f,this.web3.utils.toWei(b.swapMarketFee)]).estimateGas({from:e},(e,a)=>e?s:a)}catch(e){i=s}return i}async swapExactAmountIn(e,a,t,b){const n=new this.web3.eth.Contract(this.poolAbi,a);b.tokenAmountIn=await this.amountToUnits(t.tokenIn,b.tokenAmountIn),b.minAmountOut=await this.amountToUnits(t.tokenOut,b.minAmountOut);let d=null;const f=await this.estSwapExactAmountIn(e,a,t,b),s=b.maxPrice?this.web3.utils.toWei(b.maxPrice):D;try{d=await n.methods.swapExactAmountIn([t.tokenIn,t.tokenOut,t.marketFeeAddress],[b.tokenAmountIn,b.minAmountOut,s,this.web3.utils.toWei(b.swapMarketFee)]).send({from:e,gas:f+1,gasPrice:await w(this.web3)})}catch(e){this.logger.error(`ERROR: Failed to swap exact amount in : ${e.message}`)}return d}async estSwapExactAmountOut(e,a,t,b,n){const d=n||new this.web3.eth.Contract(this.poolAbi,a),f=this.GASLIMIT_DEFAULT,s=b.maxPrice?this.web3.utils.toWei(b.maxPrice):D;let i;try{i=await d.methods.swapExactAmountOut([t.tokenIn,t.tokenOut,t.marketFeeAddress],[b.maxAmountIn,b.tokenAmountOut,s,this.web3.utils.toWei(b.swapMarketFee)]).estimateGas({from:e},(e,a)=>e?f:a)}catch(e){i=f}return i}async swapExactAmountOut(e,a,t,b){const n=new this.web3.eth.Contract(this.poolAbi,a);let d=null;b.maxAmountIn=await this.amountToUnits(t.tokenIn,b.maxAmountIn),b.tokenAmountOut=await this.amountToUnits(t.tokenOut,b.tokenAmountOut);const f=await this.estSwapExactAmountOut(e,a,t,b),s=b.maxPrice?this.web3.utils.toWei(b.maxPrice):D;try{d=await n.methods.swapExactAmountOut([t.tokenIn,t.tokenOut,t.marketFeeAddress],[b.maxAmountIn,b.tokenAmountOut,s,this.web3.utils.toWei(b.swapMarketFee)]).send({from:e,gas:f+1,gasPrice:await w(this.web3)})}catch(e){this.logger.error(`ERROR: Failed to swap exact amount out: ${e.message}`)}return d}async estJoinPool(e,a,t,b,n){const d=n||new this.web3.eth.Contract(this.poolAbi,a),f=this.GASLIMIT_DEFAULT;let s;try{s=await d.methods.joinPool(t,b).estimateGas({from:e},(e,a)=>e?f:a)}catch(e){s=f}return s}async joinPool(e,a,t,b){const n=new this.web3.eth.Contract(this.poolAbi,a),d=[],f=await this.getFinalTokens(a);for(let e=0;e<2;e++){const a=await this.amountToUnits(f[e],b[e]);d.push(a)}let s=null;const i=await this.estJoinPool(e,a,this.web3.utils.toWei(t),d);try{s=await n.methods.joinPool(this.web3.utils.toWei(t),d).send({from:e,gas:i+1,gasPrice:await w(this.web3)})}catch(e){this.logger.error(`ERROR: Failed to join pool: ${e.message}`)}return s}async estExitPool(e,a,t,b,n){const d=n||new this.web3.eth.Contract(this.poolAbi,a),f=this.GASLIMIT_DEFAULT;let s;try{s=await d.methods.exitPool(t,b).estimateGas({from:e},(e,a)=>e?f:a)}catch(e){s=f}return s}async exitPool(e,a,t,b){const n=new this.web3.eth.Contract(this.poolAbi,a),d=[],f=await this.getFinalTokens(a);for(let e=0;e<2;e++){const a=await this.amountToUnits(f[e],b[e]);d.push(a)}let s=null;const i=await this.estExitPool(e,a,this.web3.utils.toWei(t),d);try{s=await n.methods.exitPool(this.web3.utils.toWei(t),d).send({from:e,gas:i,gasPrice:await w(this.web3)})}catch(e){this.logger.error(`ERROR: Failed to exit pool: ${e.message}`)}return s}async estJoinswapExternAmountIn(e,a,t,b,n,d){const f=d||new this.web3.eth.Contract(this.poolAbi,a),s=this.GASLIMIT_DEFAULT;let i;try{i=await f.methods.joinswapExternAmountIn(t,b,n).estimateGas({from:e},(e,a)=>e?s:a)}catch(e){i=s}return i}async joinswapExternAmountIn(e,a,t,b,n){const d=new this.web3.eth.Contract(this.poolAbi,a);let f=null;const s=await this.amountToUnits(t,b),i=await this.estJoinswapExternAmountIn(e,a,t,s,this.web3.utils.toWei(n));try{f=await d.methods.joinswapExternAmountIn(t,s,this.web3.utils.toWei(n)).send({from:e,gas:i+1,gasPrice:await w(this.web3)})}catch(e){this.logger.error(`ERROR: Failed to pay tokens in order to join the pool: ${e.message}`)}return f}async estJoinswapPoolAmountOut(e,a,t,b,n,d){const f=d||new this.web3.eth.Contract(this.poolAbi,a),s=this.GASLIMIT_DEFAULT;let i;try{i=await f.methods.joinswapPoolAmountOut(t,b,n).estimateGas({from:e},(e,a)=>e?s:a)}catch(e){i=s}return i}async joinswapPoolAmountOut(e,a,t,b,n){const d=new this.web3.eth.Contract(this.poolAbi,a);let f=null;const s=await this.amountToUnits(t,n),i=await this.estJoinswapPoolAmountOut(e,a,t,this.web3.utils.toWei(b),s);try{f=await d.methods.joinswapPoolAmountOut(t,this.web3.utils.toWei(b),s).send({from:e,gas:i+1,gasPrice:await w(this.web3)})}catch(e){this.logger.error("ERROR: Failed to join swap pool amount out")}return f}async estExitswapPoolAmountIn(e,a,t,b,n,d){const f=d||new this.web3.eth.Contract(this.poolAbi,a),s=this.GASLIMIT_DEFAULT;let i;try{i=await f.methods.exitswapPoolAmountIn(t,b,n).estimateGas({from:e},(e,a)=>e?s:a)}catch(e){i=s}return i}async exitswapPoolAmountIn(e,a,t,b,n){const d=new this.web3.eth.Contract(this.poolAbi,a);let f=null;const s=await this.amountToUnits(t,n),i=await this.estExitswapPoolAmountIn(e,a,t,this.web3.utils.toWei(b),s);try{f=await d.methods.exitswapPoolAmountIn(t,this.web3.utils.toWei(b),s).send({from:e,gas:i+1,gasPrice:await w(this.web3)})}catch(e){this.logger.error(`ERROR: Failed to pay pool shares into the pool: ${e.message}`)}return f}async estExitswapExternAmountOut(e,a,t,b,n,d){const f=d||new this.web3.eth.Contract(this.poolAbi,a),s=this.GASLIMIT_DEFAULT;let i;try{i=await f.methods.exitswapExternAmountOut(t,b,n).estimateGas({from:e},(e,a)=>e?s:a)}catch(e){i=s}return i}async exitswapExternAmountOut(e,a,t,b,n){const d=new this.web3.eth.Contract(this.poolAbi,a);let f=null;const s=await this.estExitswapExternAmountOut(e,a,t,this.web3.utils.toWei(b),this.web3.utils.toWei(n));try{f=await d.methods.exitswapExternAmountOut(t,this.web3.utils.toWei(b),this.web3.utils.toWei(n)).send({from:e,gas:s+1,gasPrice:await w(this.web3)})}catch(e){this.logger.error("ERROR: Failed to exitswapExternAmountOut")}return f}async getSpotPrice(e,a,t,b){const n=new this.web3.eth.Contract(this.poolAbi,e);let d=18,f=18;const s=new this.web3.eth.Contract(P.abi,a),i=new this.web3.eth.Contract(P.abi,t);try{d=await s.methods.decimals().call()}catch(e){this.logger.error("ERROR: FAILED TO CALL DECIMALS(), USING 18")}try{f=await i.methods.decimals().call()}catch(e){this.logger.error("ERROR: FAILED TO CALL DECIMALS(), USING 18")}let c,o=null;try{o=await n.methods.getSpotPrice(a,t,this.web3.utils.toWei(b)).call(),o=new r.default(o.toString())}catch(e){this.logger.error("ERROR: Failed to get spot price of swapping tokenIn to tokenOut")}return d>f?(c=d-f,o=new r.default(o/10**c),o/=10**f):(c=f-d,o=new r.default(o*10**(2*c)),o/=10**f),o.toString()}async getAmountInExactOut(e,a,t,b,n){const d=new this.web3.eth.Contract(this.poolAbi,e),f=await this.amountToUnits(t,b);let s=null;try{const e=await d.methods.getAmountInExactOut(a,t,f,this.web3.utils.toWei(n)).call();s=await this.unitsToAmount(a,e)}catch(e){this.logger.error("ERROR: Failed to calcInGivenOut")}return s}async getAmountOutExactIn(e,a,t,b,n){const d=new this.web3.eth.Contract(this.poolAbi,e),f=await this.amountToUnits(a,b);let s=null;try{const e=await d.methods.getAmountOutExactIn(a,t,f,this.web3.utils.toWei(n)).call();s=await this.unitsToAmount(t,e)}catch(e){this.logger.error("ERROR: Failed to calcOutGivenIn")}return s}async calcPoolOutGivenSingleIn(e,a,t){const b=new this.web3.eth.Contract(this.poolAbi,e);let n=null;try{const d=await b.methods.calcPoolOutSingleIn(a,await this.amountToUnits(a,t)).call();n=await this.unitsToAmount(e,d)}catch(e){this.logger.error(`ERROR: Failed to calculate PoolOutGivenSingleIn : ${e.message}`)}return n}async calcSingleInGivenPoolOut(e,a,t){const b=new this.web3.eth.Contract(this.poolAbi,e);let n=null;const d=await this.amountToUnits(e,t);try{const e=await b.methods.calcSingleInPoolOut(a,d).call();n=await this.unitsToAmount(a,e)}catch(e){this.logger.error(`ERROR: Failed to calculate SingleInGivenPoolOut : ${e.message}`)}return n}async calcSingleOutGivenPoolIn(e,a,t){const b=new this.web3.eth.Contract(this.poolAbi,e);let n=null;try{const d=await b.methods.calcSingleOutPoolIn(a,await this.amountToUnits(e,t)).call();n=await this.unitsToAmount(a,d)}catch(e){this.logger.error(`ERROR: Failed to calculate SingleOutGivenPoolIn : ${e}`)}return n}async calcPoolInGivenSingleOut(e,a,t){const b=new this.web3.eth.Contract(this.poolAbi,e);let n=null;try{const d=await b.methods.calcPoolInSingleOut(a,await this.amountToUnits(a,t)).call();n=await this.unitsToAmount(e,d)}catch(e){this.logger.error(`ERROR: Failed to calculate PoolInGivenSingleOut : ${e.message}`)}return n}getSwapEventSignature(){const e=this.poolAbi.find(function(e){if("LOG_SWAP"===e.name&&"event"===e.type)return e});return this.web3.eth.abi.encodeEventSignature(e)}getJoinEventSignature(){const e=this.poolAbi.find(function(e){if("LOG_JOIN"===e.name&&"event"===e.type)return e});return this.web3.eth.abi.encodeEventSignature(e)}getExitEventSignature(){const e=this.poolAbi.find(function(e){if("LOG_EXIT"===e.name&&"event"===e.type)return e});return this.web3.eth.abi.encodeEventSignature(e)}},exports.Provider=z,exports.ProviderInstance=H,exports.ZERO_ADDRESS="0x0000000000000000000000000000000000000000",exports.configHelperNetworks=I,exports.crossFetchGeneric=async function(e,a,t,b){return p.default(a,{method:e,body:t,headers:b})},exports.downloadFile=async function(e,a,t){const b=await p.default(e);if(!b.ok)throw new Error("Response error.");let n;try{n=b.headers.get("content-disposition").match(/attachment;filename=(.+)/)[1]}catch(a){try{n=e.split("/").pop()}catch(e){n=`file${t}`}}if(a)return y.default.mkdirSync(a,{recursive:!0}),y.default.writeFileSync(`${a}/${n}`,await b.text()),a;u.default(await b.arrayBuffer(),n)},exports.fetchData=async function(e,a){const t=await p.default(e,a);if(!t.ok)throw T.error(`Error requesting [${a.method}] ${e}`),T.error(`Response message: \n${await t.text()}`),t;return t},exports.generateDid=function(e,a){return e=o.default.utils.toChecksumAddress(e),`did:op:${l.default(e+a.toString(10)).toString()}`},exports.generateDtName=A,exports.getData=k,exports.getErcCreationParams=x,exports.getFairGasPrice=w,exports.getFreCreationParams=v,exports.getHash=function(e){return l.default(e).toString()},exports.getPoolCreationParams=M,exports.postData=async function(e,a){return async function(e,a,t){return p.default(e,null!=a?{method:"POST",body:a,headers:{"Content-type":"application/json"}}:{method:"POST"})}(e,a)},exports.signHash=async function(e,a,t){let b=await e.eth.sign(a,t);b=b.substr(2);const n="0x"+b.slice(0,64),d="0x"+b.slice(64,128);let f="0x"+b.slice(128,130);return"0x00"===f&&(f="0x1b"),"0x01"===f&&(f="0x1c"),{v:f,r:n,s:d}},exports.signText=R,exports.signWithHash=S;
|
|
2
2
|
//# sourceMappingURL=lib.js.map
|