From 1578b30208fd4a8f573373d798a5875348c124ad Mon Sep 17 00:00:00 2001 From: smol-ninja Date: Wed, 13 Mar 2024 12:36:29 +0000 Subject: [PATCH 1/4] feat: include base script in npm package --- package.json | 2 ++ script/DeployCore.s.sol | 2 +- script/DeployCorePrecompiles.s.sol | 31 ++++++++++++++++++++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 script/DeployCorePrecompiles.s.sol diff --git a/package.json b/package.json index 458f92b70..3bda6a966 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,8 @@ "files": [ "artifacts", "precompiles", + "script/Base.s.sol", + "script/DeployCorePrecompiles.s.sol", "src", "test/utils", "CHANGELOG.md", diff --git a/script/DeployCore.s.sol b/script/DeployCore.s.sol index c7635ab7f..ca1b53663 100644 --- a/script/DeployCore.s.sol +++ b/script/DeployCore.s.sol @@ -8,7 +8,7 @@ import { SablierV2NFTDescriptor } from "../src/SablierV2NFTDescriptor.sol"; import { BaseScript } from "./Base.s.sol"; -/// @notice Deploys all V2 Core contract in the following order: +/// @notice Deploys all V2 Core contracts in the following order: /// /// 1. {SablierV2NFTDescriptor} /// 2. {SablierV2LockupDynamic} diff --git a/script/DeployCorePrecompiles.s.sol b/script/DeployCorePrecompiles.s.sol new file mode 100644 index 000000000..add20a119 --- /dev/null +++ b/script/DeployCorePrecompiles.s.sol @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity >=0.8.22 <0.9.0; + +import { Precompiles } from "../precompiles/Precompiles.sol"; +import { ISablierV2LockupDynamic } from "../src/interfaces/ISablierV2LockupDynamic.sol"; +import { ISablierV2LockupLinear } from "../src/interfaces/ISablierV2LockupLinear.sol"; +import { ISablierV2LockupTranched } from "../src/interfaces/ISablierV2LockupTranched.sol"; +import { ISablierV2NFTDescriptor } from "../src/interfaces/ISablierV2NFTDescriptor.sol"; + +import { BaseScript } from "./Base.s.sol"; + +/// @notice Using precompiles, deploys the Sablier V2 core contracts in the following order: +/// +/// 1. {SablierV2NFTDescriptor} +/// 2. {SablierV2LockupDynamic} +/// 3. {SablierV2LockupLinear} +/// 4. {SablierV2LockupTranched} +contract DeployCorePrecompiles is BaseScript { + function run(address initialAdmin) + public + broadcast + returns ( + ISablierV2LockupDynamic lockupDynamic, + ISablierV2LockupLinear lockupLinear, + ISablierV2LockupTranched lockupTranched, + ISablierV2NFTDescriptor nftDescriptor + ) + { + (lockupDynamic, lockupLinear, lockupTranched, nftDescriptor) = new Precompiles().deployCore(initialAdmin); + } +} From 5116970ffd1f2b0696a5987398e2fd444f17e6fc Mon Sep 17 00:00:00 2001 From: smol-ninja Date: Wed, 13 Mar 2024 13:25:54 +0000 Subject: [PATCH 2/4] temp: comment importing precompiles --- script/DeployCorePrecompiles.s.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/DeployCorePrecompiles.s.sol b/script/DeployCorePrecompiles.s.sol index add20a119..133f5342f 100644 --- a/script/DeployCorePrecompiles.s.sol +++ b/script/DeployCorePrecompiles.s.sol @@ -26,6 +26,6 @@ contract DeployCorePrecompiles is BaseScript { ISablierV2NFTDescriptor nftDescriptor ) { - (lockupDynamic, lockupLinear, lockupTranched, nftDescriptor) = new Precompiles().deployCore(initialAdmin); + // (lockupDynamic, lockupLinear, lockupTranched, nftDescriptor) = new Precompiles().deployCore(initialAdmin); } } From 0ffb10e04cb507b27b509a09bbe81dc171c79dd6 Mon Sep 17 00:00:00 2001 From: andreivladbrg Date: Wed, 13 Mar 2024 15:47:38 +0200 Subject: [PATCH 3/4] build: allow precompiles path --- foundry.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/foundry.toml b/foundry.toml index 7dc72bba3..f71d2b359 100644 --- a/foundry.toml +++ b/foundry.toml @@ -1,4 +1,7 @@ [profile.default] + allow_paths = [ + "precompiles" + ] auto_detect_solc = false bytecode_hash = "none" emv_version = "paris" From 5d359ad4fbb1b586561ada73b7e331c2ca9ca979 Mon Sep 17 00:00:00 2001 From: andreivladbrg Date: Wed, 13 Mar 2024 15:59:39 +0200 Subject: [PATCH 4/4] temp: implement Precompiles in DeployCorePrecompiles --- script/DeployCorePrecompiles.s.sol | 195 ++++++++++++++++++++++++++++- 1 file changed, 193 insertions(+), 2 deletions(-) diff --git a/script/DeployCorePrecompiles.s.sol b/script/DeployCorePrecompiles.s.sol index 133f5342f..136462b29 100644 --- a/script/DeployCorePrecompiles.s.sol +++ b/script/DeployCorePrecompiles.s.sol @@ -1,14 +1,205 @@ // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity >=0.8.22 <0.9.0; -import { Precompiles } from "../precompiles/Precompiles.sol"; import { ISablierV2LockupDynamic } from "../src/interfaces/ISablierV2LockupDynamic.sol"; import { ISablierV2LockupLinear } from "../src/interfaces/ISablierV2LockupLinear.sol"; import { ISablierV2LockupTranched } from "../src/interfaces/ISablierV2LockupTranched.sol"; import { ISablierV2NFTDescriptor } from "../src/interfaces/ISablierV2NFTDescriptor.sol"; +import { SablierV2NFTDescriptor } from "../src/SablierV2NFTDescriptor.sol"; import { BaseScript } from "./Base.s.sol"; +contract Precompiles { + /*////////////////////////////////////////////////////////////////////////// + CONSTANTS + //////////////////////////////////////////////////////////////////////////*/ + + uint256 internal constant MAX_COUNT = 500; + + /*////////////////////////////////////////////////////////////////////////// + BYTECODES + //////////////////////////////////////////////////////////////////////////*/ + + bytes public constant BYTECODE_LOCKUP_DYNAMIC = + hex"60c034620003dc576001600160401b0390601f601f1962005b303881900383810183168501919086831186841017620002f557808692606094604052833981010312620003dc5782516001600160a01b038082169590929091869003620003dc5760209485810151938416809403620003dc57604001519362000081620003e1565b95601d87527f5361626c696572205632204c6f636b75702044796e616d6963204e465400000081880152620000b5620003e1565b90601182527029a0a116ab1916a627a1a5aaa816a22ca760791b81830152306080528751858111620002f5576001988954908a82811c92168015620003d1575b84831014620002d45781868493116200037b575b50839086831160011462000317576000926200030b575b5050600019600383901b1c191690891b1788555b8151948511620002f557600254938885811c95168015620002ea575b82861014620002d457848487961162000277575b50819385116001146200020d57505060009262000201575b5050600019600383901b1c191690841b176002555b60018060a01b03198481600054161760005560085416176008556040519260007fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a360a05260075561572e908162000402823960805181613acb015260a051818181610cdb0152613b8c0152f35b0151905038806200017c565b88959392919316600260005283600020936000905b8282106200025d575050841162000243575b505050811b0160025562000191565b015160001960f88460031b161c1916905538808062000234565b8484015186558a9790950194938401939081019062000222565b9091929394506002600052826000208580880160051c820192858910620002ca575b9188978c9297969594930160051c01915b828110620002ba57505062000164565b600081558897508b9101620002aa565b9250819262000299565b634e487b7160e01b600052602260045260246000fd5b94607f169462000150565b634e487b7160e01b600052604160045260246000fd5b01519050388062000120565b90878c94169184600052856000209260005b878282106200036457505084116200034a575b505050811b01885562000134565b015160001960f88460031b161c191690553880806200033c565b8385015186558f9790950194938401930162000329565b9091508a600052836000208680850160051c820192868610620003c7575b918d91869594930160051c01915b828110620003b757505062000109565b600081558594508d9101620003a7565b9250819262000399565b91607f1691620000f5565b600080fd5b60408051919082016001600160401b03811183821017620002f55760405256fe6080806040526004908136101561001557600080fd5b60003560e01c90816301ffc9a7146127a657508063027b67441461278357806306fdde03146126bb578063081812fc1461269d578063095ea7b3146125965780631400ecec146124f05780631c1cdd4c1461248a5780631e99d5691461246c57806323b872dd1461245557806331df3d481461234957806340e58ee514612048578063425d30dd14611ff257806342842e0e14611fa157806342966c6814611d8f5780634426757014611d685780634857501f14611cee5780634869e12d14611cb15780634cc55e1114611bb657806354c022921461191a5780636352211e146118eb5780636d0cee75146118eb57806370a082311461187b57806375829def146117e15780637cad6cd1146116e35780637de6b1db146114c65780638659c2701461116f578063894e9a0d14610dee5780638f69b99314610d535780639067b67714610cfe5780639188ec8414610cc357806395d89b4114610bb2578063a22cb46514610af4578063a80fc07114610a9d578063ad35efd414610a24578063b2564569146109ce578063b637b8651461096f578063b88d4fde146108e6578063b8a3be66146108b0578063b971302a1461085c578063bc2be1be14610807578063c156a11d146106b1578063c87b56dd1461059d578063cc364f4814610501578063d4dbd20b146104aa578063d511609f14610459578063d975dfed1461040b578063e985e9c5146103b4578063ea5ead1914610386578063eac8f5b81461032f578063f590c176146102ca578063f851a440146102a35763fdd46d601461025d57600080fd5b3461029e57606036600319011261029e576102766128d2565b604435906001600160801b038216820361029e5761029c92610296613ac1565b356134b3565b005b600080fd5b3461029e57600036600319011261029e5760206001600160a01b0360005416604051908152f35b503461029e57602036600319011261029e5780359081600052600960205260ff60016040600020015460a81c161561031a57506000526009602052602060406000205460f81c6040519015158152f35b6024916040519162b8e7e760e51b8352820152fd5b503461029e57602036600319011261029e5780359081600052600960205260ff60016040600020015460a81c161561031a5750600052600960205260206001600160a01b0360016040600020015416604051908152f35b503461029e57604036600319011261029e5761029c90356103a56128d2565b6103ae826142bc565b91613108565b3461029e57604036600319011261029e576103cd6128bc565b6103d56128d2565b906001600160a01b03809116600052600660205260406000209116600052602052602060ff604060002054166040519015158152f35b503461029e57602036600319011261029e5780359081600052600960205260ff60016040600020015460a81c161561031a576020610448836142bc565b6001600160801b0360405191168152f35b503461029e57602036600319011261029e5780359081600052600960205260ff60016040600020015460a81c161561031a57506000526009602052602060026040600020015460801c604051908152f35b503461029e57602036600319011261029e5780359081600052600960205260ff60016040600020015460a81c161561031a5750600052600960205260206001600160801b0360036040600020015416604051908152f35b503461029e57602036600319011261029e578035906000602060405161052681612a22565b828152015281600052600960205260ff60016040600020015460a81c161561031a575060005260096020526040806000205464ffffffffff82519161056a83612a22565b818160a01c16835260c81c16602082015261059b825180926020908164ffffffffff91828151168552015116910152565bf35b503461029e5760208060031936011261029e57600082356105bd81613842565b5060446001600160a01b03600854169460405195869384927fe9dc6375000000000000000000000000000000000000000000000000000000008452309084015260248301525afa9182156106a55760009261062c575b50610628604051928284938452830190612897565b0390f35b9091503d806000833e61063f8183612a6f565b810190828183031261029e5780519067ffffffffffffffff821161029e570181601f8201121561029e57805161067481612a91565b926106826040519485612a6f565b81845284828401011161029e5761069e91848085019101612874565b9038610613565b6040513d6000823e3d90fd5b503461029e57604036600319011261029e578035906106ce6128d2565b916106d7613ac1565b80600052600960205260ff60016040600020015460a81c16156107f1578060005260036020526001600160a01b038060406000205416938433036107ce5761071e836142bc565b6001600160801b0381166107bd575b50818116156107a557826107409161397c565b9081168061075f576024848460405191637e27328960e01b8352820152fd5b840361076757005b6107a1916040519485946364283d7b60e01b865285019193929060409160608401956001600160a01b038093168552602085015216910152565b0390fd5b602484600060405191633250574960e11b8352820152fd5b6107c8908685613108565b3861072d565b50506040805163216caf0d60e01b81529283019182523360208301528291010390fd5b602492506040519162b8e7e760e51b8352820152fd5b503461029e57602036600319011261029e5780359081600052600960205260ff60016040600020015460a81c161561031a57506000526009602052602064ffffffffff60406000205460a01c16604051908152f35b503461029e57602036600319011261029e5780359081600052600960205260ff60016040600020015460a81c161561031a5750600052600960205260206001600160a01b0360406000205416604051908152f35b503461029e57602036600319011261029e57356000526009602052602060ff60016040600020015460a81c166040519015158152f35b503461029e57608036600319011261029e576109006128bc565b6109086128d2565b906064359267ffffffffffffffff841161029e573660238501121561029e578301359161093483612a91565b926109426040519485612a6f565b808452366024828701011161029e57602081600092602461029c9801838801378501015260443591612f94565b503461029e57602036600319011261029e5780359081600052600960205260ff60016040600020015460a81c161561031a5750600052600a6020526106286109ba6040600020612f04565b604051918291602083526020830190612962565b503461029e57602036600319011261029e5780359081600052600960205260ff60016040600020015460a81c161561031a57506000526009602052602060ff60016040600020015460b01c166040519015158152f35b503461029e57602036600319011261029e57803580600052600960205260ff60016040600020015460a81c1615610a8857610a5e906138f5565b604051906005811015610a7357602092508152f35b602183634e487b7160e01b6000525260246000fd5b60405162b8e7e760e51b815291820152602490fd5b503461029e57602036600319011261029e5780359081600052600960205260ff60016040600020015460a81c161561031a5750600052600960205260206001600160801b0360026040600020015416604051908152f35b503461029e57604036600319011261029e57610b0e6128bc565b6024359081151580920361029e576001600160a01b0316918215610b825750336000526006602052604060002082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b60249083604051917f5b08ba18000000000000000000000000000000000000000000000000000000008352820152fd5b503461029e57600036600319011261029e576040519060006002549060018260011c92600181168015610cb9575b6020958686108214610ca457508487528693929186908215610c84575050600114610c27575b50610c1392500383612a6f565b610628604051928284938452830190612897565b84915060026000527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace906000915b858310610c6c575050610c13935082010138610c06565b80548389018501528794508693909201918101610c55565b60ff191685820152610c1395151560051b8501019250389150610c069050565b602290634e487b7160e01b6000525260246000fd5b93607f1693610be0565b3461029e57600036600319011261029e5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b503461029e57602036600319011261029e5780359081600052600960205260ff60016040600020015460a81c161561031a57506000526009602052602064ffffffffff60406000205460c81c16604051908152f35b503461029e57602036600319011261029e57803580600052600960205260ff60016040600020015460a81c1615610a8857610d8d906138f5565b9060058210159081610dcb5760028314918215610de0575b8215610db9575b6020836040519015158152f35b909150610dcb57602091143880610dac565b602190634e487b7160e01b6000525260246000fd5b506003831491506000610da5565b503461029e57602036600319011261029e57604051610160810181811067ffffffffffffffff82111761115a576060916101409160405260008152600060208201526000604082015260008382015260006080820152600060a0820152600060c0820152600060e08201526000610100820152610e69612eb1565b61012082015201528035600052600960205260ff60016040600020015460a81c16156111425780356000526009602052604060002090610f39600260405193610eb185612a52565b80546001600160a01b038116865264ffffffffff8160a01c16602087015264ffffffffff8160c81c16604087015260ff8160f01c161515606087015260f81c1515608086015260ff60018201546001600160a01b03811660a0880152818160a01c16151560c0880152818160a81c16151560e088015260b01c16151561010086015201612ed0565b610120830152610f4981356138f5565b600581101561112d57600214611121575b6101208201516001600160a01b0360a08401511664ffffffffff604085015116606085015115159061010086015115159260c087015115159160e08801511515936001600160a01b03895116918835600052600a602052604060002099608064ffffffffff6020830151169101511515936040519a8b67ffffffffffffffff61016082818101109201111761110c57506101608b016040908152908b5260208b01919091528901526060880152608087015260a086015260c085015260e08401526101008301526101208201526101409161103490612f04565b82820152610628604051928392602084526001600160a01b03815116602085015264ffffffffff602082015116604085015264ffffffffff60408201511660608501526060810151151560808501526080810151151560a08501526001600160a01b0360a08201511660c085015260c0810151151560e085015260e08101511515610100850152610100810151151561012085015261012081015160406001600160801b039182815116858801528260208201511661016088015201511661018085015201516101a0808401526101c0830190612962565b604190634e487b7160e01b6000525260246000fd5b60006060830152610f5a565b602182634e487b7160e01b6000525260246000fd5b6024906040519062b8e7e760e51b8252803590820152fd5b604183634e487b7160e01b6000525260246000fd5b503461029e576020908160031936011261029e57803567ffffffffffffffff811161029e576111a19036908301612931565b90926111ab613ac1565b6000915b8083106111b857005b6111c3838287612e56565b35926111cd613ac1565b8360005260099081845260ff60019080826040600020015460a81c16156114b057866000528386526040600020818382015460a01c16600014611221576024898960405191634a5541ef60e01b8352820152fd5b96909192939495965460f81c611499576112518160005260096020526001600160a01b0360406000205416331490565b156114775761125f8161387d565b94816000528088526112776002604060002001612ed0565b956001600160801b03938488511685831610156114605783600052828a5260406000205460f01c16156114495780848a6112b76112c194838c5116612ae5565b9901511690612ae5565b95826000528189528860406000207f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa50815499600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8c161783558781169a8b15611430575b600380940198861698896fffffffffffffffffffffffffffffffff198254161790556001600160a01b03809116998a9486528160406000205416978896526040600020015416946113798985886146fa565b604080518981526001600160801b0392831660208201529290911690820152606090a47ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce788604051848152a1803b6113dc575b50505050600191500191906111af565b803b1561029e578860006084926001988296604051988997889663c6f5ed0f60e01b88528701526024860152604485015260648401525af1611421575b8080806113cc565b61142a90612a3e565b38611419565b898401600160a01b60ff60a01b19825416179055611327565b60248a84604051916339c6dc7360e21b8352820152fd5b60248b85604051916322cad1af60e11b8352820152fd5b6040805163216caf0d60e01b8152808a01928352336020840152918291010390fd5b876024916040519163fe19f19f60e01b8352820152fd5b602488886040519162b8e7e760e51b8352820152fd5b503461029e576020908160031936011261029e5780356114e4613ac1565b806000526009835260ff60016040600020015460a81c16156107f157611509816138f5565b926005841015610a7357838303611531576024838360405191634a5541ef60e01b8352820152fd5b6003840361155057602483836040519163fe19f19f60e01b8352820152fd5b90600284146116cc576115798160005260096020526001600160a01b0360406000205416331490565b156116aa57806000526009825260ff60406000205460f01c1615611693578060005260098252604060002060ff60f01b198154169055604051817f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f600080a2600383526001600160a01b036040600020541693843b61161f575b7ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce78484604051908152a1005b843b1561029e578160248160007ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7988782967f450154640000000000000000000000000000000000000000000000000000000085528401525af1611684575b806115f3565b61168d90612a3e565b8361167e565b82602491604051916339c6dc7360e21b8352820152fd5b6040805163216caf0d60e01b8152938401918252336020830152839250010390fd5b82602491604051916322cad1af60e11b8352820152fd5b503461029e57602036600319011261029e5780356001600160a01b039081811680910361029e5781600054163381036117b5575060085491816001600160a01b03198416176008556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a26007546000198101919082116117a0577f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c604083815190600182526020820152a1005b601190634e487b7160e01b6000525260246000fd5b604080516331b339a960e21b81526001600160a01b039092168286019081523360208201528291010390fd5b503461029e57602036600319011261029e576117fb6128bc565b600054906001600160a01b039081831633810361184f57506001600160a01b03199350169182911617600055337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf80600080a3005b604080516331b339a960e21b81526001600160a01b039092168287019081523360208201528291010390fd5b503461029e57602036600319011261029e576001600160a01b0361189d6128bc565b1680156118ba576000526020526020604060002054604051908152f35b6024826000604051917f89c62b64000000000000000000000000000000000000000000000000000000008352820152fd5b503461029e57602036600319011261029e5761190960209135613842565b6001600160a01b0360405191168152f35b503461029e5760209060031990828236011261029e5780359167ffffffffffffffff9081841161029e576101208436039182011261029e5761195a613ac1565b60c4840135906022190181121561029e578301828101359082821161029e57602401606082023603811361029e57611993913691612d87565b92835192816119a185612d6f565b946119af6040519687612a6f565b808652601f196119be82612d6f565b018860005b828110611b985750505064ffffffffff90814216956001600160801b0398896119eb82613b1d565b515116828c6119f984613b1d565b5101511685806040611a0a86613b1d565b510151168b01169060405192611a1f84612a06565b83528d8301526040820152611a338a613b1d565b52611a3d89613b1d565b5060019360015b8c8b8d878410611b0957908c8a611a5c818e01612e90565b92611a6960248301612e90565b92611a7660448401612e7c565b946064840135946001600160a01b039586811680910361029e57611b0198611ac198611af698611aa860848a01612ea4565b9481611ab660a48c01612ea4565b976040519d8e6129d3565b168c52168c8b0152166040890152606088015215156080870152151560a086015260c085015260e084015260e4369101612e27565b610100820152613b3e565b604051908152f35b8899509084806040611b468a87611b368c9d9e9f9b9c99988b90611b2d828d613b2a565b5151169a613b2a565b5101511694600019890190613b2a565b51015116816040611b57888c613b2a565b5101511601169160405193611b6b85612a06565b84528301526040820152611b7f828d613b2a565b52611b8a818c613b2a565b500190879594939291611a44565b9091929350611ba5612eb1565b82828a0101520190888593926119c3565b503461029e57604036600319011261029e5767ffffffffffffffff90803582811161029e57611be89036908301612931565b9260243590811161029e57611c009036908401612931565b919092611c0b613ac1565b828503611c7b575060005b848110611c1f57005b80611c75611c306001938886612e56565b35611c3c838987612e56565b3560005260036020526001600160a01b0360406000205416611c67611c6285898b612e56565b612e7c565b91611c70613ac1565b6134b3565b01611c16565b6044908386604051927faec934400000000000000000000000000000000000000000000000000000000084528301526024820152fd5b503461029e57602036600319011261029e5780359081600052600960205260ff60016040600020015460a81c161561031a57602061044883614754565b503461029e57602036600319011261029e5780359081600052600960205260ff60016040600020015460a81c161561031a57600090611d2c836138f5565b906005821015610dcb5750600203611d4c575b6020906040519015158152f35b506000526009602052602060ff60406000205460f01c16611d3f565b3461029e57600036600319011261029e5760206001600160a01b0360085416604051908152f35b503461029e576020908160031936011261029e57803591611dae613ac1565b826000526009815260ff60016040600020015460a81c1615611f8b57826000526009815260ff60016040600020015460a01c1615611f5b57611def83614223565b15611f375782600052600381526001600160a01b0380604060002054166009835260ff60016040600020015460b01c16159081611f2d575b5080611f25575b611f0e577ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce790846000526003835260406000205416918215928315611ed4575b856000526003825260406000206001600160a01b03198154169055856000604051927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a4858152a1611ebe57005b60249160405191637e27328960e01b8352820152fd5b611ef586600052600560205260406000206001600160a01b03198154169055565b8060005284825260406000206000198154019055611e6e565b6024838560405191630da9b01360e01b8352820152fd5b506000611e2e565b9050151538611e27565b506040805163216caf0d60e01b815291820192835233602084015290918291010390fd5b50602491604051917f817cd639000000000000000000000000000000000000000000000000000000008352820152fd5b506024916040519162b8e7e760e51b8352820152fd5b503461029e57611fb0366128fc565b90604051926020840184811067ffffffffffffffff821117611fdd5761029c955060405260008452612f94565b604186634e487b7160e01b6000525260246000fd5b503461029e57602036600319011261029e5780359081600052600960205260ff60016040600020015460a81c161561031a57506000526009602052602060ff60016040600020015460a01c166040519015158152f35b503461029e576020908160031936011261029e578035612066613ac1565b80600052600980845260ff60016040600020015460a81c16156123335781600052808452604060002060ff600182015460a01c166000146120b8576024848460405191634a5541ef60e01b8352820152fd5b5460f81c61231c576120e08260005260096020526001600160a01b0360406000205416331490565b156122fa576120ee8261387d565b92826000528185526121066002604060002001612ed0565b936001600160801b03908186511682821610156122e3578460005283875260ff60406000205460f01c16156122cc578661219582847f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa509a61218b7ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce796838d5116612ae5565b9a01511690612ae5565b86600052858252604060002095865498600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8b1617885560038684169889156122b2575b0195811695866fffffffffffffffffffffffffffffffff198254161790556001600160a01b03809a169a8b91600386528a61225c8d604060002054169d8e96895260016040600020015416966122328b878a6146fa565b60405193849384916040919493606084019584526001600160801b03809216602085015216910152565b0390a4604051868152a1843b61226e57005b843b1561029e576000946084938692604051988997889663c6f5ed0f60e01b88528701526024860152604485015260648401525af16122a957005b61029c90612a3e565b60018101600160a01b60ff60a01b198254161790556121db565b60248386604051916339c6dc7360e21b8352820152fd5b60248386604051916322cad1af60e11b8352820152fd5b506040805163216caf0d60e01b81529283019182523360208301528291010390fd5b602483836040519163fe19f19f60e01b8352820152fd5b602483836040519162b8e7e760e51b8352820152fd5b503461029e576003199060203683011261029e5780359167ffffffffffffffff9081841161029e5761014090843603011261029e57612386613ac1565b60405190612393826129d3565b61239e8484016128e8565b82526123ac602485016128e8565b60208301526123bd60448501612aad565b604083015260648401356001600160a01b038116810361029e5760608301526123e8608485016129c6565b60808301526123f960a485016129c6565b60a083015261240a60c48501612d5d565b60c083015260e484013590811161029e578301913660238401121561029e57602093612445611af692611b0195602436928201359101612d87565b60e0840152610104369101612e27565b3461029e5761029c612466366128fc565b91612b14565b3461029e57600036600319011261029e576020600754604051908152f35b503461029e57602036600319011261029e57803580600052600960205260ff60016040600020015460a81c1615610a88576124c4906138f5565b906005821015610dcb57602082158381156124e5575b506040519015158152f35b6001915014826124da565b503461029e57602036600319011261029e5780359081600052600960205260ff60016040600020015460a81c161561031a576020826000908060005260098352604060002060ff815460f01c1680612584575b61255b575b50506001600160801b0360405191168152f35b61257d92506001600160801b036002612577920154169161387d565b90612ae5565b8280612548565b5060ff600182015460a01c1615612543565b503461029e57604036600319011261029e576125b06128bc565b90602435906125be82613842565b903315158061268a575b8061265c575b61262b575081906001600160a01b03809416938491167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a460005260056020526040600020906001600160a01b0319825416179055600080f35b602490604051907fa9fbf51f0000000000000000000000000000000000000000000000000000000082523390820152fd5b506001600160a01b038216600052600660205260406000203360005260205260ff60406000205416156125ce565b50336001600160a01b03831614156125c8565b503461029e57602036600319011261029e5761190960209135612ac1565b503461029e57600036600319011261029e57604051906000600190600154918260011c92600181168015612779575b6020958686108214610ca457508487528693929186908215610c8457505060011461271c5750610c1392500383612a6f565b84915060016000527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6906000915b858310612761575050610c13935082010138610c06565b8054838901850152879450869390920191810161274a565b93607f16936126ea565b3461029e57600036600319011261029e57602060405167016345785d8a00008152f35b823461029e57602036600319011261029e5735907fffffffff00000000000000000000000000000000000000000000000000000000821680920361029e57817f80ac58cd000000000000000000000000000000000000000000000000000000006020931490811561284a575b8115612820575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483612819565b7f5b5e139f0000000000000000000000000000000000000000000000000000000081149150612812565b60005b8381106128875750506000910152565b8181015183820152602001612877565b906020916128b081518092818552858086019101612874565b601f01601f1916010190565b600435906001600160a01b038216820361029e57565b602435906001600160a01b038216820361029e57565b35906001600160a01b038216820361029e57565b606090600319011261029e576001600160a01b0390600435828116810361029e5791602435908116810361029e579060443590565b9181601f8401121561029e5782359167ffffffffffffffff831161029e576020808501948460051b01011161029e57565b90815180825260208080930193019160005b828110612982575050505090565b835180516001600160801b031686528083015167ffffffffffffffff168684015260409081015164ffffffffff169086015260609094019392810192600101612974565b3590811515820361029e57565b610120810190811067ffffffffffffffff8211176129f057604052565b634e487b7160e01b600052604160045260246000fd5b6060810190811067ffffffffffffffff8211176129f057604052565b6040810190811067ffffffffffffffff8211176129f057604052565b67ffffffffffffffff81116129f057604052565b610140810190811067ffffffffffffffff8211176129f057604052565b90601f8019910116810190811067ffffffffffffffff8211176129f057604052565b67ffffffffffffffff81116129f057601f01601f191660200190565b35906001600160801b038216820361029e57565b612aca81613842565b5060005260056020526001600160a01b036040600020541690565b6001600160801b039182169082160391908211612afe57565b634e487b7160e01b600052601160045260246000fd5b906001600160a01b038091168015612d4557600091848352602091600383526040928284862054166009825260ff6001868820015460b01c16159081612d3b575b5080612d33575b612d1c578685526003815282848620541694873315159384612c6c575b7ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7945087612c34575b808352600484528683206001815401905581835260038452868320816001600160a01b0319825416179055877fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef88519480a4878152a183168203612c065750505050565b516364283d7b60e01b81526001600160a01b0392831660048201526024810193909352166044820152606490fd5b612c5582600052600560205260406000206001600160a01b03198154169055565b878352600484528683208054600019019055612ba2565b91929380915090612cdb575b15612c865790878392612b79565b848887612ca3576024915190637e27328960e01b82526004820152fd5b90517f177e802f0000000000000000000000000000000000000000000000000000000081523360048201526024810191909152604490fd5b503386148015612d00575b80612c785750878252600583523384868420541614612c78565b5085825260068352848220338352835260ff8583205416612ce6565b602487855190630da9b01360e01b82526004820152fd5b506001612b5c565b9050151538612b55565b6024604051633250574960e11b815260006004820152fd5b359064ffffffffff8216820361029e57565b67ffffffffffffffff81116129f05760051b60200190565b929192612d9382612d6f565b604094612da36040519283612a6f565b8195848352602080930191606080960285019481861161029e57925b858410612dcf5750505050505050565b868483031261029e57825190612de482612a06565b612ded85612aad565b8252858501359067ffffffffffffffff8216820361029e57828792838b950152612e18868801612d5d565b86820152815201930192612dbf565b919082604091031261029e57604051612e3f81612a22565b6020808294612e4d816128e8565b84520135910152565b9190811015612e665760051b0190565b634e487b7160e01b600052603260045260246000fd5b356001600160801b038116810361029e5790565b356001600160a01b038116810361029e5790565b35801515810361029e5790565b60405190612ebe82612a06565b60006040838281528260208201520152565b90604051612edd81612a06565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b908154612f1081612d6f565b92604093612f216040519182612a6f565b82815280946020809201926000526020600020906000935b858510612f4857505050505050565b60018481928451612f5881612a06565b64ffffffffff87546001600160801b038116835267ffffffffffffffff8160801c168584015260c01c1686820152815201930194019391612f39565b9190612fa1828285612b14565b803b612fae575b50505050565b61300a6001600160a01b03809216946040519384937f150b7a0200000000000000000000000000000000000000000000000000000000968786523360048701521660248501526044840152608060648401526084830190612897565b03906020816000938185885af1908290826130a0575b5050613057578261302f61428c565b80519190826130505760248260405190633250574960e11b82526004820152fd5b9050602001fd5b7fffffffff000000000000000000000000000000000000000000000000000000001603613088575038808080612fa8565b60249060405190633250574960e11b82526004820152fd5b909192506020813d602011613100575b816130bd60209383612a6f565b810103126130fc5751907fffffffff00000000000000000000000000000000000000000000000000000000821682036130f95750903880613020565b80fd5b5080fd5b3d91506130b0565b92919092613114613ac1565b60009381855260099260209380855260409260ff6001858a20015460a81c161561349d5784885281865260ff6001858a20015460a01c16613486576001600160a01b0391828216928315613476576001600160801b039384861691821561345f57888c5260038a5280888d20541693848314158061344f575b61342c5761319a8a6142bc565b87811685116133fb57508a8a928e928484528083528b8085209a8c848d54169c6002015460801c906131cb916142e4565b878752838652828720600201908282549160801b6fffffffffffffffffffffffffffffffff1916911617815561320090612ed0565b90808683015116918184818351169201511661321b91612ae5565b161115946001927f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d966133ce575b8782528552200154169461325e8189886146fa565b8a51908152a480331415806133c4575b61335f575b823314159081613354575b81613349575b506132b8575b5050507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce793945051908152a1565b813b15613345578351636fd110e960e01b8152600481018690523360248201526001600160a01b0390911660448201526001600160801b03909216606483015294957ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79582908183816084810103925af1613336575b85948161328a565b61333f90612a3e565b3861332e565b8780fd5b905082141538613284565b833b1515915061327e565b803b156133c0578451636fd110e960e01b8152600481018790523360248201526001600160a01b03831660448201526001600160801b0385166064820152898160848183865af16133b1575b50613273565b6133ba90612a3e565b386133ab565b8880fd5b50803b151561326e565b878252808652828220848101600160a01b60ff60a01b1982541617905560ff60f01b198154169055613249565b895163287ecaef60e21b8152600481018c90526001600160801b038a81166024830152919091166044820152606490fd5b60648a848b519163b34359d360e01b835260048301523360248301526044820152fd5b506134598a614223565b1561318d565b60248989519063d2aabcd960e01b82526004820152fd5b6004865163630d074f60e11b8152fd5b602485855190634a5541ef60e01b82526004820152fd5b60248585519062b8e7e760e51b82526004820152fd5b9291909260009381855260099060209382855260409260ff6001858a20015460a81c161561349d578785815281875260ff6001868320015460a01c1661382b576001600160a01b039081851692831561381b576001600160801b03938486169182156138045789845260038b528489852054169485831415806137f4575b6137d1576135588b838e61354483614754565b9289525260028c8820015460801c90612ae5565b87811685116137a05750908b8b928387528282528b808820998b838c54169b6002015460801c90613588916142e4565b868a52858552828a20600201908282549160801b6fffffffffffffffffffffffffffffffff191691161781556135bd90612ed0565b818086830151169381835116920151166135d691612ae5565b161115927f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d93613772575b848852825260018c88200154169461361a818c886146fa565b8b51908152a48133141580613768575b613702575b508133141590816136f7575b816136ec575b50613674575050507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce793945051908152a1565b908188923b156136e8578451636fd110e960e01b8152600481018790523360248201526001600160a01b0390941660448501526001600160801b03909116606484015282908183816084810103925af16136d0575b808061328a565b6136da8691612a3e565b6136e457846136c9565b8480fd5b8280fd5b905081141538613641565b823b1515915061363b565b813b156130f9578551636fd110e960e01b8152600481018890523360248201526001600160a01b03861660448201526001600160801b0385166064820152818160848183875af1613754575b5061362f565b61376091929a50612a3e565b97388061374e565b50813b151561362a565b8488528083528c882060018101600160a01b60ff60a01b1982541617905560ff60f01b198154169055613601565b8a5163287ecaef60e21b8152600481018d90526001600160801b038a81166024830152919091166044820152606490fd5b60648b848c519163b34359d360e01b835260048301523360248301526044820152fd5b506137fe8b614223565b15613531565b60248a8a519063d2aabcd960e01b82526004820152fd5b6004875163630d074f60e11b8152fd5b602486865190634a5541ef60e01b82526004820152fd5b8060005260036020526001600160a01b0360406000205416908115613865575090565b60249060405190637e27328960e01b82526004820152fd5b64ffffffffff804216826000526009602052604060002091825482828260a01c1610156138eb5760c81c1611156138d95750600a6020526001604060002054116000146138d0576138cd906143d0565b90565b6138cd906142ff565b6001600160801b039150600201541690565b5050505050600090565b806000526009602052604060002060ff600182015460a01c1660001461391c575050600490565b805460f81c613975575460a01c64ffffffffff16421061396f5761393f8161387d565b9060005260096020526001600160801b03806002604060002001541691161060001461396a57600190565b600290565b50600090565b5050600390565b916000828152602090600382526001600160a01b036040958187842054166009855260ff6001898620015460b01c16159081613ab7575b5080613aac575b613a95579480967ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79596828552600386527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84838720541694859283613a5d575b169283613a47575b84875260038852808720846001600160a01b0319825416179055519580a4948152a1565b8387526004885280872060018154019055613a23565b613a7e86600052600560205260406000206001600160a01b03198154169055565b838852600489528488208054600019019055613a1b565b602486885190630da9b01360e01b82526004820152fd5b5081811615156139ba565b90501515386139b3565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003613af357565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b805115612e665760200190565b8051821015612e665760209160051b010190565b90613b606001600160801b0360408401511660206101008501510151906145b0565b6001600160801b0381511660e084015164ffffffffff60c08601511682156141f957815180156141cf577f0000000000000000000000000000000000000000000000000000000000000000811161419e575064ffffffffff6040613bc384613b1d565b510151168110156141475750600090819082815184905b8082106140b6575050505064ffffffffff421664ffffffffff82168110156140765750506001600160801b031680820361403f575050600754928360005260096020526040600020916001600160801b0381511660028401906fffffffffffffffffffffffffffffffff198254161790556001600160a01b036060830151166001840154750100000000000000000000000000000000000000000060808501511515918654937fffffffffffffffffff0000ff000000000000000000000000000000000000000076ff0000000000000000000000000000000000000000000060a0890151151560b01b16921617171760018601556001600160a01b0384511678ffffffffff000000000000000000000000000000000000000060c086015160a01b169060e0860151937fff000000000000000000000000000000000000000000000000000000000000007eff0000000000000000000000000000000000000000000000000000000000007dffffffffff000000000000000000000000000000000000000000000000006040613d768951996000198b0190613b2a565b51015160c81b169560f01b16911617171717845560005b818110613f6d575050600185016007556001600160a01b036020830151168015612d4557613dc3866001600160a01b039261397c565b16613f3c57613dee6001600160a01b036060840151166001600160801b038351169030903390614689565b6001600160801b0360208201511680613f0c575b507f33eb09bbf19ea3fb22c760d5164234f8bf62ca07dcf5a437ad389e96b0bd644360206001600160a01b03845116926001600160a01b038286015116946001600160a01b0360608201511696613f01613ee260808401511515928c60a086015115156001600160a01b0361010060e089015194549864ffffffffff6040519a613e8b8c612a22565b818160a01c168c5260c81c168c8b015201515116956001600160801b036040519a8b9a610140958c5233828d01528281511660408d015201511660608a0152608089015260a08801528060c0880152860190612962565b9260e08501906020908164ffffffffff91828151168552015116910152565b6101208301520390a4565b613f36906001600160a01b036060850151166001600160a01b036101008601515116903390614689565b38613e02565b60246040517f73c6ac6e00000000000000000000000000000000000000000000000000000000815260006004820152fd5b86600052600a602052604060002090613f8a8160e0870151613b2a565b518254680100000000000000008110156129f05760018101808555811015612e6657600193600052602060002001906001600160801b03815116908254917fffffff00000000000000000000000000000000000000000000000000000000007cffffffffff000000000000000000000000000000000000000000000000604077ffffffffffffffff00000000000000000000000000000000602086015160801b1694015160c01b169316171717905501613d8d565b60449250604051917fd90b7e3900000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b91935091936140da906001600160801b036140d18588613b2a565b515116906142e4565b9364ffffffffff8060406140ee8685613b2a565b5101511694168085111561410a57506001849301909291613bda565b8385606492604051927f9588ac09000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b64ffffffffff604061415884613b1d565b5101516040517ff539a17c00000000000000000000000000000000000000000000000000000000815264ffffffffff938416600482015291169091166024820152604490fd5b602490604051907f4757689b0000000000000000000000000000000000000000000000000000000082526004820152fd5b60046040517f3952c64e000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b60009080825260036020526001600160a01b038060408420541692833314938415614268575b5050821561425657505090565b9091506142633392612ac1565b161490565b60ff9294509060409181526006602052818120338252602052205416913880614249565b3d156142b7573d9061429d82612a91565b916142ab6040519384612a6f565b82523d6000602084013e565b606090565b6138cd906142c981614754565b90600052600960205260026040600020015460801c90612ae5565b9190916001600160801b0380809416911601918211612afe57565b64ffffffffff614334600091838352600960205280806040852054818160a01c1693849160c81c1603169181421603166147cf565b91808252600a602052604082208054156143bc5790829167ffffffffffffffff935261438e602083205482845260096020526143896001600160801b03968760026040882001541696879360801c16906148bf565b61492d565b9283136143a45750506143a090614a17565b1690565b60029350604092508152600960205220015460801c90565b602483634e487b7160e01b81526032600452fd5b64ffffffffff80421660008381526009602052604091828220908351916143f683612a52565b80549661012061447c60026001600160a01b0394858c168852602088019b8b8160a01c168d528b8160c81c168b8a015260ff8160f01c16151560608a015260f81c1515608089015260ff600196600183015490811660a08b0152818160a01c16151560c08b0152818160a81c16151560e08b015260b01c16151561010089015201612ed0565b94019384528452600a602052614493858520612f04565b91849680876144a186613b1d565b5101511692828288955b161061457a57509161452f6143899284888161453498976001600160801b039e8f6144d6898c613b2a565b5151169d8e9a67ffffffffffffffff60206144f18c84613b2a565b510151169984836145028385613b2a565b510151169650801561456e5761451e9293506000190190613b2a565b5101511680925b03169203166147cf565b6148bf565b92831361454d5750506145478391614a17565b16011690565b5160200151929392831692841683101591506145699050575090565b905090565b50505051168092614525565b8093986001600160801b0390816145918c89613b2a565b51511601169801928282808a6145a7888a613b2a565b510151166144ab565b919091604051906145c082612a22565b600091828152826020820152936001600160801b039283831691821561466a5767016345785d8a000080821161463357506145fc8591846155df565b166020870192818452111561461f5750908261461a92511690612ae5565b168252565b80634e487b7160e01b602492526001600452fd5b60449250604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b509394505050506040519061467e82612a22565b808252602082015290565b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff8411176129f0576146f892604052614a53565b565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000060208201526001600160a01b039290921660248301526044808301939093529181526146f89161474f606483612a6f565b614a53565b80600052600960205261476d6002604060002001612ed0565b816000526009602052604060002060ff600182015460a01c166000146147a057506001600160801b039150602001511690565b5460f81c6147b257506138cd9061387d565b6138cd91506001600160801b036040818351169201511690612ae5565b600160ff1b8082149081156148b5575b5061488b57600081121561488257614808816000035b600084121561487b578360000390614aef565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311614844576000199118131561483e5790565b60000390565b60449250604051917fd49c26b300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b8390614aef565b614808816147f5565b60046040517f9fe2b450000000000000000000000000000000000000000000000000000000008152fd5b90508214386147df565b806148da57506148d557670de0b6b3a764000090565b600090565b90670de0b6b3a76400008083146149275750806148ff575050670de0b6b3a764000090565b670de0b6b3a764000081146149235761491e906143896138cd93614be9565b614d2b565b5090565b91505090565b600160ff1b808214908115614a0d575b506149e35760008112156149da57614966816000035b60008412156149d35783600003906155df565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831161499c576000199118131561483e5790565b60449250604051917f120b5b4300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b83906155df565b61496681614953565b60046040517fa6070c25000000000000000000000000000000000000000000000000000000008152fd5b905082143861493d565b60008112614a225790565b602490604051907f2463f3d50000000000000000000000000000000000000000000000000000000082526004820152fd5b6001600160a01b031690614a7e600080836020829551910182875af1614a7761428c565b908461568e565b908151918215159283614ac7575b505050614a965750565b602490604051907f5274afe70000000000000000000000000000000000000000000000000000000082526004820152fd5b8192935090602091810103126130fc5760200151908115918215036130f95750388080614a8c565b670de0b6b3a7640000916000198383099280830292838086109503948086039514614bab5782851015614b6f57908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b505080925015614bb9570490565b634e487b7160e01b600052601260045260246000fd5b8015614bb9576ec097ce7bc90715b34b9f10000000000590565b80600080831315614cfa57670de0b6b3a764000092838112614cd757506001925b808305906001600160801b03821160071b91821c9167ffffffffffffffff831160061b92831c63ffffffff811160051b90811c61ffff811160041b90811c60ff811160031b90811c91600f831160021b92831c93600197600160038711811b96871c11961717171717171781810294811d90828214614ccb57506706f05b59d3b20000905b848213614c9f5750505050500290565b808391020590671bc16d674ec80000821215614cbe575b831d90614c8f565b8091950194831d90614cb6565b93505093925050020290565b6000199392508015614bb9576ec097ce7bc90715b34b9f10000000000591614c0a565b602483604051907f059b101b0000000000000000000000000000000000000000000000000000000082526004820152fd5b6000811215614d5a5768033dd1780914b9711419811261396f57614d5190600003614d2b565b6138cd90614bcf565b680a688906bd8affffff81136155ae57670de0b6b3a764000080604092831b05907780000000000000000000000000000000000000000000000067ff000000000000008316615491575b66ff0000000000008316615389575b65ff00000000008316615289575b64ff000000008316615191575b63ff00000083166150a1575b62ff00008316614fb9575b61ff008316614ed9575b60ff8316614e02575b02911c60bf031c90565b60808316614ec7575b838316614eb5575b60208316614ea3575b60108316614e91575b60088316614e7f575b60048316614e6d575b60028316614e5b575b6001831615614df8576801000000000000000102831c614df8565b6801000000000000000102831c614e40565b6801000000000000000302831c614e37565b6801000000000000000602831c614e2e565b6801000000000000000b02831c614e25565b6801000000000000001602831c614e1c565b6801000000000000002c02831c614e13565b6801000000000000005902831c614e0b565b6180008316614fa7575b6140008316614f95575b6120008316614f83575b6110008316614f71575b6108008316614f5f575b6104008316614f4d575b6102008316614f3b575b610100831615614def57680100000000000000b102831c614def565b6801000000000000016302831c614f1f565b680100000000000002c602831c614f15565b6801000000000000058c02831c614f0b565b68010000000000000b1702831c614f01565b6801000000000000162e02831c614ef7565b68010000000000002c5d02831c614eed565b680100000000000058b902831c614ee3565b62800000831661508f575b62400000831661507d575b62200000831661506b575b621000008316615059575b620800008316615047575b620400008316615035575b620200008316615023575b62010000831615614de5576801000000000000b17202831c614de5565b680100000000000162e402831c615006565b6801000000000002c5c802831c614ffb565b68010000000000058b9102831c614ff0565b680100000000000b172102831c614fe5565b68010000000000162e4302831c614fda565b680100000000002c5c8602831c614fcf565b6801000000000058b90c02831c614fc4565b6380000000831661517f575b6340000000831661516d575b6320000000831661515b575b63100000008316615149575b63080000008316615137575b63040000008316615125575b63020000008316615113575b6301000000831615614dda5768010000000000b1721802831c614dda565b6801000000000162e43002831c6150f5565b68010000000002c5c86002831c6150e9565b680100000000058b90c002831c6150dd565b6801000000000b17217f02831c6150d1565b680100000000162e42ff02831c6150c5565b6801000000002c5c85fe02831c6150b9565b68010000000058b90bfc02831c6150ad565b6480000000008316615277575b6440000000008316615265575b6420000000008316615253575b6410000000008316615241575b640800000000831661522f575b640400000000831661521d575b640200000000831661520b575b640100000000831615614dce57680100000000b17217f802831c614dce565b68010000000162e42ff102831c6151ec565b680100000002c5c85fe302831c6151df565b6801000000058b90bfce02831c6151d2565b68010000000b17217fbb02831c6151c5565b6801000000162e42fff002831c6151b8565b68010000002c5c8601cc02831c6151ab565b680100000058b90c0b4902831c61519e565b658000000000008316615377575b654000000000008316615365575b652000000000008316615353575b651000000000008316615341575b65080000000000831661532f575b65040000000000831661531d575b65020000000000831661530b575b65010000000000831615614dc1576801000000b17218355102831c614dc1565b680100000162e430e5a202831c6152eb565b6801000002c5c863b73f02831c6152dd565b68010000058b90cf1e6e02831c6152cf565b680100000b1721bcfc9a02831c6152c1565b68010000162e43f4f83102831c6152b3565b680100002c5c89d5ec6d02831c6152a5565b6801000058b91b5bc9ae02831c615297565b6680000000000000831661547f575b6640000000000000831661546d575b6620000000000000831661545b575b66100000000000008316615449575b66080000000000008316615437575b66040000000000008316615425575b66020000000000008316615413575b6601000000000000831615614db35768010000b17255775c0402831c614db3565b6801000162e525ee054702831c6153f2565b68010002c5cc37da949202831c6153e3565b680100058ba01fb9f96d02831c6153d4565b6801000b175effdc76ba02831c6153c5565b680100162f3904051fa102831c6153b6565b6801002c605e2e8cec5002831c6153a7565b68010058c86da1c09ea202831c615398565b678000000000000000831661558f575b674000000000000000831661557d575b672000000000000000831661556b575b6710000000000000008316615559575b6708000000000000008316615547575b6704000000000000008316615535575b6702000000000000008316615523575b670100000000000000831615614da457680100b1afa5abcbed6102831c614da4565b68010163da9fb33356d802831c615501565b680102c9a3e778060ee702831c6154f1565b6801059b0d31585743ae02831c6154e1565b68010b5586cf9890f62a02831c6154d1565b6801172b83c7d517adce02831c6154c1565b6801306fe0a31b7152df02831c6154b1565b5077b504f333f9de6484800000000000000000000000000000006154a1565b602490604051907f0360d0280000000000000000000000000000000000000000000000000000000082526004820152fd5b9091906000198382098382029182808310920391808303921461567d57670de0b6b3a7640000908183101561564657947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b906156cd57508051156156a357805190602001fd5b60046040517f1425ea42000000000000000000000000000000000000000000000000000000008152fd5b81511580615718575b6156de575090565b6024906001600160a01b03604051917f9996b315000000000000000000000000000000000000000000000000000000008352166004820152fd5b50803b156156d656fea164736f6c6343000817000a"; + bytes public constant BYTECODE_LOCKUP_LINEAR = + hex"60a034620003b757601f19906001600160401b0390601f6200496b3881900382810186168401919085831185841017620002d0578085926040948552833981010312620003b75781516001600160a01b038082169490929091859003620003b757602080940151928316809303620003b7576200007b620003bc565b93601c85527f5361626c696572205632204c6f636b7570204c696e656172204e46540000000081860152620000af620003bc565b96601188527029a0a116ab1916a627a1a5aaa816a624a760791b82890152306080528551848111620002d0576001968754908882811c92168015620003ac575b85831014620002af57818684931162000356575b508490868311600114620002f257600092620002e6575b5050600019600383901b1c191690871b1786555b8751938411620002d0576002548681811c91168015620002c5575b83821014620002af5783811162000263575b5081928411600114620001f65750508192939495600092620001ea575b5050600019600383901b1c191690831b176002555b60018060a01b03198381600054161760005560085416176008556040519160007fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a360075561458e9081620003dd8239608051816139100152f35b01519050388062000178565b839291921696600260005282600020926000905b8982106200024b575050838697989695961062000231575b505050811b016002556200018d565b015160001960f88460031b161c1916905538808062000222565b8088859682949686015181550195019301906200020a565b6002600052826000208480870160051c820192858810620002a5575b0160051c019087905b828110620002985750506200015b565b6000815501879062000288565b925081926200027f565b634e487b7160e01b600052602260045260246000fd5b90607f169062000149565b634e487b7160e01b600052604160045260246000fd5b0151905038806200011a565b90848a94169184600052866000209260005b888282106200033f575050841162000325575b505050811b0186556200012e565b015160001960f88460031b161c1916905538808062000317565b8385015186558d9790950194938401930162000304565b90915088600052846000208680850160051c820192878610620003a2575b918b91869594930160051c01915b8281106200039257505062000103565b600081558594508b910162000382565b9250819262000374565b91607f1691620000ef565b600080fd5b60408051919082016001600160401b03811183821017620002d05760405256fe608080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a714612f2757508063027b674414612f0457806306fdde0314612e3f578063081812fc14612e20578063095ea7b314612d275780631400ecec14612c875780631c1cdd4c14612c225780631e99d56914612c0457806323b872dd14612bec57806340e58ee51461296e578063425d30dd1461291d57806342842e0e146128cd57806342966c68146126f257806344267570146126cb5780634857501f146126555780634869e12d1461261a5780634cc55e111461218a57806353b157271461206b5780636352211e1461203b5780636d0cee751461203b57806370a0823114611fcb57806375829def14611f38578063780a82c814611eeb5780637cad6cd114611df15780637de6b1db14611bca5780638659c27014611879578063894e9a0d146115915780638f69b993146114f55780639067b677146114a557806395d89b4114611396578063a22cb465146112d9578063a80fc07114611287578063ab167ccc14611138578063ad35efd4146110d6578063b256456914611085578063b88d4fde14610ff8578063b8a3be6614610fc3578063b971302a14610f74578063bc2be1be14610f24578063c156a11d14610a77578063c87b56dd1461095b578063cc364f4814610890578063d4dbd20b1461083e578063d511609f146107f2578063d975dfed146107a6578063e985e9c514610751578063ea5ead1914610729578063eac8f5b8146106d7578063f590c17614610675578063f851a4401461064f5763fdd46d601461025257600080fd5b3461064c57606036600319011261064c576004359061026f613056565b916102786131b3565b92610281613906565b818352600960209181835260ff600160408720015460a81c16156106355783855281835260ff600160408720015460a01c1661061d576001600160a01b03958682169283156105f3576001600160801b03938483169081156105db57878952600387528960408a2054169283821415806105cb575b6105a75761030389614079565b87811684116105755750888a5280885260408a20968360028d8a541699015460801c0181811161056157988b9c8b9c9a937f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d936103958e96859f8f6040816103909360029352878a5220019182906001600160801b036001600160801b031983549260801b169116179055565b6134aa565b906103b1818684015116928260408183511692015116906131ed565b161115610532575b848c528252600160408c20015416946103d3818a886140a4565b604051908152a48033141580610528575b6104ba575b8333141590816104af575b816104a4575b5061042e575b837ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce78688604051908152a180f35b823b156104a057604051636fd110e960e01b8152600481018790523360248201526001600160a01b039290921660448301526001600160801b031660648201529082908290608490829084905af1610488575b8080610400565b610491906130d2565b61049c578238610481565b8280fd5b8380fd5b9050831415386103fa565b843b151591506103f4565b803b1561052457604051636fd110e960e01b8152600481018890523360248201526001600160a01b03841660448201526001600160801b03831660648201528590818160848183875af1610510575b50506103e9565b610519906130d2565b610524578438610509565b8480fd5b50803b15156103e4565b848c5280835260408c2060018101600160a01b60ff60a01b1982541617905560ff60f01b1981541690556103b9565b60248c634e487b7160e01b81526011600452fd5b60405163287ecaef60e21b8152600481018b90526001600160801b038781166024830152919091166044820152606490fd5b606489836040519163b34359d360e01b835260048301523360248301526044820152fd5b506105d589613962565b156102f6565b6024886040519063d2aabcd960e01b82526004820152fd5b60046040517fc61a0e9e000000000000000000000000000000000000000000000000000000008152fd5b60248460405190634a5541ef60e01b82526004820152fd5b6024846040519062b8e7e760e51b82526004820152fd5b80fd5b503461064c578060031936011261064c576001600160a01b036020915416604051908152f35b503461064c57602036600319011261064c57600435808252600960205260ff600160408420015460a81c16156106c057816040916020935260098352205460f81c6040519015158152f35b6024906040519062b8e7e760e51b82526004820152fd5b503461064c57602036600319011261064c57600435808252600960205260ff600160408420015460a81c16156106c05760016040836001600160a01b0393602095526009855220015416604051908152f35b503461064c57604036600319011261064c5760043590610747613056565b9161027881614079565b503461064c57604036600319011261064c5761076b613040565b6040610775613056565b926001600160a01b0380931681526006602052209116600052602052602060ff604060002054166040519015158152f35b503461064c57602036600319011261064c5760ff6001604060043593848152600960205220015460a81c16156106c0576107e1602091614079565b6001600160801b0360405191168152f35b503461064c57602036600319011261064c57600435808252600960205260ff600160408420015460a81c16156106c057604082600292602094526009845220015460801c604051908152f35b503461064c57602036600319011261064c57600435808252600960205260ff600160408420015460a81c16156106c05760036040836001600160801b0393602095526009855220015416604051908152f35b503461064c576020908160031936011261064c57600435916108b061348b565b508282526009815260ff600160408420015460a81c16156109445760609282526009815264ffffffffff9182604082205460a01c1692600a835260408181842054169260098552205460c81c16916040519361090b85613103565b8452830152604082015261094260405180926040908164ffffffffff91828151168552826020820151166020860152015116910152565bf35b6024836040519062b8e7e760e51b82526004820152fd5b503461064c57602080600319360112610a675760043561097a8161365f565b50826001600160a01b0360085416916044604051809481937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa928315610a6b5780936109ea575b50506109e660405192828493845283019061301b565b0390f35b909192503d8082843e6109fd8184613175565b8201918381840312610a675780519067ffffffffffffffff821161049c570182601f82011215610a6757805191610a3383613197565b93610a416040519586613175565b83855285848401011161064c575090610a5f91848085019101612ff8565b9038806109d0565b5080fd5b604051903d90823e3d90fd5b503461064c57604036600319011261064c57600435610a94613056565b610a9c613906565b81835260099060209082825260ff600160408720015460a81c161561063557838552600382526001600160a01b03918260408720541693843303610f0557610ae386614079565b906001600160801b039081831680158015610b83575b50505050505081811615610b6b5783610b11916137c1565b90811680610b315760248460405190637e27328960e01b82526004820152fd5b8203610b3b578380f35b6040516364283d7b60e01b81526001600160a01b0392831660048201526024810193909352166044820152606490fd5b60248560405190633250574960e11b82526004820152fd5b610b8b613906565b898b5282865260ff600160408d20015460a81c1615610eee57898b5282865260ff600160408d20015460a01c16610ed65788156105f357610ebe57888a52600385528660408b205416918289141580610eae575b610e8a57610bec8a614079565b8481168311610e585750898b5280865260408b20938260028a87541696015460801c01818111610e445790610c538d9796959493928d8952838a52610390600260408b20019182906001600160801b036001600160801b031983549260801b169116179055565b90610c6f818a84015116928260408183511692015116906131ed565b161115610e15575b8a86528652888a7f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d888b600160408b2001541694610cb68186886140a4565b604051908152a48033141580610e0b575b610da1575b813314159081610d96575b81610d8b575b50610d1a575b5050507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce790604051868152a1388080808080610af9565b803b1561049c57604051636fd110e960e01b8152600481018990523360248201526001600160a01b03881660448201526001600160801b0392909216606483015282908290608490829084905af1610d73575b80610ce3565b610d7c906130d2565b610d87578538610d6d565b8580fd5b905081141538610cdd565b823b15159150610cd7565b803b156104a057604051636fd110e960e01b8152600481018a90523360248201526001600160a01b03891660448201526001600160801b03841660648201528490818160848183875af1610df7575b5050610ccc565b610e00906130d2565b6104a0578338610df0565b50803b1515610cc7565b8a86528087526040862060018101600160a01b60ff60a01b1982541617905560ff60f01b198154169055610c77565b60248d634e487b7160e01b81526011600452fd5b60405163287ecaef60e21b8152600481018c90526001600160801b038781166024830152919091166044820152606490fd5b60648a8a6040519163b34359d360e01b835260048301523360248301526044820152fd5b50610eb88a613962565b15610bdf565b6024896040519063d2aabcd960e01b82526004820152fd5b60248a60405190634a5541ef60e01b82526004820152fd5b60248a6040519062b8e7e760e51b82526004820152fd5b60405163216caf0d60e01b815260048101879052336024820152604490fd5b503461064c57602036600319011261064c57600435808252600960205260ff600160408420015460a81c16156106c05760408264ffffffffff926020945260098452205460a01c16604051908152f35b503461064c57602036600319011261064c57600435808252600960205260ff600160408420015460a81c16156106c0576040826001600160a01b03926020945260098452205416604051908152f35b503461064c57602036600319011261064c5760ff6001604060209360043581526009855220015460a81c166040519015158152f35b503461064c57608036600319011261064c57611012613040565b61101a613056565b906064359067ffffffffffffffff82116104a057366023830112156104a0578160040135928461104985613197565b936110576040519586613175565b8585523660248783010111610a675785611082966024602093018388013785010152604435916134f2565b80f35b503461064c57602036600319011261064c57600435808252600960205260ff600160408420015460a81c16156106c057600160408360ff93602095526009855220015460b01c166040519015158152f35b503461064c57602036600319011261064c57600435808252600960205260ff600160408420015460a81c16156106c05761110f9061373a565b60405190600581101561112457602092508152f35b602483634e487b7160e01b81526021600452fd5b503461064c5761014036600319011261064c57611153613906565b61115b61348b565b9064ffffffffff804216808452816111716134de565b16156112805781806111816134de565b8301165b16602085015260e43590828216820361127b5701166040830152600435916001600160a01b039182841680940361127b576024359083821680920361127b57604435906001600160801b03821680920361127b576064359085821680920361064c57506084359182151580930361127b5760a4359384151580950361127b5760405197611211896130e6565b8852602088015260408701526060860152608085015260a084015260c083015260406101031936011261127b576040519161124b83613159565b61010435918216820361127b57826112739260209452610124358482015260e08201526139cb565b604051908152f35b600080fd5b8183611185565b503461064c57602036600319011261064c57600435808252600960205260ff600160408420015460a81c16156106c05760026040836001600160801b0393602095526009855220015416604051908152f35b503461064c57604036600319011261064c576112f3613040565b6024359081151580920361127b576001600160a01b03169081156113655733835260066020526040832082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a380f35b602482604051907f5b08ba180000000000000000000000000000000000000000000000000000000082526004820152fd5b503461064c578060031936011261064c5760405190806002549160018360011c926001851694851561149b575b60209586861081146114875785885287949392918790821561146557505060011461140b575b50506113f792500383613175565b6109e660405192828493845283019061301b565b90859250600282527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace5b85831061144d5750506113f7935082010138806113e9565b80548389018501528794508693909201918101611435565b92509350506113f794915060ff191682840152151560051b82010138806113e9565b602483634e487b7160e01b81526022600452fd5b93607f16936113c3565b503461064c57602036600319011261064c57600435808252600960205260ff600160408420015460a81c16156106c05760408264ffffffffff926020945260098452205460c81c16604051908152f35b503461064c57602036600319011261064c57600435808252600960205260ff600160408420015460a81c16156106c05761152e9061373a565b906005821015908161156f5760028314918215611583575b821561155a575b6020836040519015158152f35b90915061156f5750600460209114388061154d565b80634e487b7160e01b602492526021600452fd5b506003831491506000611546565b503461064c57602036600319011261064c57806101406040516115b38161311f565b8281528260208201528260408201528260608201528260808201528260a08201528260c08201528260e0820152826101008201526115ef61348b565b61012082015201526004358152600960205260ff600160408320015460a81c1615611861576004358152600960205260408120906116bd6002604051936116358561313c565b80546001600160a01b038116865264ffffffffff8160a01c16602087015264ffffffffff8160c81c16604087015260ff8160f01c161515606087015260f81c1515608086015260ff60018201546001600160a01b03811660a0880152818160a01c16151560c0880152818160a81c16151560e088015260b01c161515610100860152016134aa565b6101208301526116ce60043561373a565b600581101561184d576101406101a093600264ffffffffff9314611842575b6101208101518360406001600160a01b0360a085015116966004358152600a6020522054169084604084015116606084015115159661010085015115159160c086015115159060e08701511515926001600160a01b038851169a60808b60208b015116990151151590604051996117638b61311f565b8d8b5260208b015260408a01526060890152608088015260a087015260c086015260e0850152610100840152610120830152828201526040519384528260208201511660208501526040810151151560408501526060810151151560608501526001600160a01b0360808201511660808501528260a08201511660a085015260c0810151151560c085015260e0810151151560e0850152610100810151151561010085015261012081015160406001600160801b0391828151166101208801528260208201511685880152015116610160850152015116610180820152f35b8360608201526116ed565b602482634e487b7160e01b81526021600452fd5b602460405162b8e7e760e51b81526004356004820152fd5b503461064c57602080600319360112610a675760043567ffffffffffffffff811161049c576118ac9036906004016130a1565b91906118b6613906565b83925b8084106118c4578480f35b6118cf848284613465565b35936118d9613906565b848652600980855260ff90600190828260408b20015460a81c1615611bb357878952808752604089208281015460a01c8416156119285760248960405190634a5541ef60e01b82526004820152fd5b9790919293949596975460f81c611b9b576119598160005260096020526001600160a01b0360406000205416331490565b15611b7b5761196781613682565b818a5282895261197c600260408c20016134aa565b906001600160801b0395868351168783161015611b6357838c52848b5260408c205460f01c1615611b4b5791818a6119cd85898f9a9998966119c38c9983879351166131ed565b95015116906131ed565b8386528482527f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa5060408720916040835499600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8c161785558b83169a8b15611b32575b60038096019c88169c8d6001600160801b03198254161790556001600160a01b0392838092169b8c9789522054169889965260408d2001541694611a778b85886140a4565b604080518881526001600160801b0392831660208201529290911690820152606090a47ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce78a604051838152a1813b611adb575b5050505050506001019291906118b9565b813b15610d8757856084928195604051978896879563c6f5ed0f60e01b875260048701526024860152604485015260648401525af1611b1e575b80808080611aca565b611b27906130d2565b610524578438611b15565b818601600160a01b60ff60a01b19825416179055611a32565b602483604051906339c6dc7360e21b82526004820152fd5b602484604051906322cad1af60e11b82526004820152fd5b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b6024906040519063fe19f19f60e01b82526004820152fd5b6024886040519062b8e7e760e51b82526004820152fd5b503461064c57602080600319360112610a675760043590611be9613906565b8183526009815260ff600160408520015460a81c1615611dda57611c0c8261373a565b6005811015611dc65760048103611c355760248360405190634a5541ef60e01b82526004820152fd5b60038103611c55576024836040519063fe19f19f60e01b82526004820152fd5b600214611dae57611c7c8260005260096020526001600160a01b0360406000205416331490565b15611d8f578183526009815260ff604084205460f01c1615611d7757818352600981526040832060ff60f01b19815416905582604051837f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f8380a2600383526001600160a01b03604083205416803b611d1f575b5050507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce791604051908152a180f35b803b1561049c57816024818580947f450154640000000000000000000000000000000000000000000000000000000083528960048401525af1611d63575b80611cf0565b611d6c906130d2565b61049c578238611d5d565b602482604051906339c6dc7360e21b82526004820152fd5b60405163216caf0d60e01b815260048101839052336024820152604490fd5b602482604051906322cad1af60e11b82526004820152fd5b602484634e487b7160e01b81526021600452fd5b6024826040519062b8e7e760e51b82526004820152fd5b503461064c57602036600319011261064c576004356001600160a01b039081811680910361049c5781835416338103611ec2575060085491816001600160a01b03198416176008556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a26007546000198101908111611eae5760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a180f35b602482634e487b7160e01b81526011600452fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b503461064c57602036600319011261064c57600435808252600960205260ff600160408420015460a81c16156106c05760408264ffffffffff9260209452600a8452205416604051908152f35b503461064c57602036600319011261064c57611f52613040565b9080546001600160a01b0380821693338503611fa4576001600160a01b03199394501691829116178255337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808380a380f35b6040516331b339a960e21b81526001600160a01b0386166004820152336024820152604490fd5b503461064c57602036600319011261064c576001600160a01b03611fed613040565b16801561200a578160409160209352600483522054604051908152f35b602482604051907f89c62b640000000000000000000000000000000000000000000000000000000082526004820152fd5b503461064c57602036600319011261064c57602061205a60043561365f565b6001600160a01b0360405191168152f35b503461064c5761016036600319011261064c57612086613906565b60405190612093826130e6565b61209b613040565b82526120a5613056565b60208301526120b26131b3565b60408301526001600160a01b03906064358281168103610a67576060840152608435801515810361127b57608084015260a435801515810361127b5760a084015260603660c319011261064c575060405161210c81613103565b64ffffffffff60c435818116810361127b57825260e435818116810361127b57602083015261010435908116810361127b57604082015260c083015260406101231936011261127b576040519161216283613159565b61012435918216820361127b57826112739260209452610144358482015260e08201526139cb565b503461064c57604036600319011261064c5767ffffffffffffffff60043581811161049c576121bd9036906004016130a1565b90916024359081116104a0576121d79036906004016130a1565b6121df613906565b8083036125e357845b8381106121f3578580f35b6121fe818587613465565b359061220b818688613465565b35875260036020526001600160a01b0360408820541661222c828587613465565b35906001600160801b038216820361127b57612246613906565b838952600960205260ff600160408b20015460a81c161561063557838952600960205260ff600160408b20015460a01c1661061d5780156105f3576001600160801b038216156125cb5783895260036020526001600160a01b0360408a2054169182821415806125bb575b612597576122be85614079565b6001600160801b0381166001600160801b038316116125675750848a52600960205260408a20926001600160a01b038454169360026001600160801b03841691015460801c016001600160801b038111610561579061234f8c959493928887526009602052610390600260408920019182906001600160801b036001600160801b031983549260801b169116179055565b6001600160801b0361237381602084015116928260408183511692015116906131ed565b161115612536575b86855260096020526001600160a01b036001604087200154166123a86001600160801b03841685836140a4565b83887f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d60206040516001600160801b0388168152a4803314158061252c575b6124c2575b8333141590816124b7575b816124ac575b5061243a575b505050507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce76020600193604051908152a1016121e8565b823b156104a057604051636fd110e960e01b8152600481018790523360248201526001600160a01b039290921660448301526001600160801b031660648201529082908290608490829084905af1612494575b8080612403565b61249d906130d2565b6124a857863861248d565b8680fd5b9050831415386123fd565b843b151591506123f7565b803b1561052457604051636fd110e960e01b8152600481018890523360248201526001600160a01b03841660448201526001600160801b03831660648201528590818160848183875af1612518575b50506123ec565b612521906130d2565b610524578438612511565b50803b15156123e7565b86855260096020526040852060018101600160a01b60ff60a01b1982541617905560ff60f01b19815416905561237b565b60405163287ecaef60e21b8152600481018790526001600160801b03928316602482015291166044820152606490fd5b606485836040519163b34359d360e01b835260048301523360248301526044820152fd5b506125c585613962565b156122b1565b6024846040519063d2aabcd960e01b82526004820152fd5b82604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b503461064c57602036600319011261064c5760ff6001604060043593848152600960205220015460a81c16156106c0576107e1602091614100565b503461064c57602036600319011261064c5760043590818152600960205260ff600160408320015460a81c1615611dda57806126908361373a565b92600584101561184d576002602094036126b1575b50506040519015158152f35b815260098352604090205460f01c60ff16905038806126a5565b503461064c578060031936011261064c5760206001600160a01b0360085416604051908152f35b503461064c57602080600319360112610a675760043590612711613906565b8183526009815260ff600160408520015460a81c1615611dda578183526009815260ff600160408520015460a01c161561289c5761274e82613962565b15611d8f5781600052600381526001600160a01b0380604060002054166009835260ff60016040600020015460b01c16159081612892575b508061288a575b612872577ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce790836000526003835260406000205416918215928315612837575b846000526003825260406000206001600160a01b03198154169055846000604051927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a4848152a161281f575080f35b60249060405190637e27328960e01b82526004820152fd5b61285885600052600560205260406000206001600160a01b03198154169055565b8060005260048252604060002060001981540190556127cd565b60248360405190630da9b01360e01b82526004820152fd5b50600061278d565b9050151538612786565b602482604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b503461064c576128dc3661306c565b60405191602083019383851067ffffffffffffffff86111761290757611082946040528584526134f2565b634e487b7160e01b600052604160045260246000fd5b503461064c57602036600319011261064c57600435808252600960205260ff600160408420015460a81c16156106c057600160408360ff93602095526009855220015460a01c166040519015158152f35b503461064c576020908160031936011261064c576004359061298e613906565b81815260099283815260ff600160408420015460a81c16156109445782825283815260408220600181015460a01c60ff16156129dc5760248460405190634a5541ef60e01b82526004820152fd5b9284935460f81c611b9b57612a078160005260096020526001600160a01b0360406000205416331490565b15611b7b57612a1581613682565b93818452808352612a2b600260408620016134aa565b916001600160801b0393848451168588161015611dae5781865282815260ff604087205460f01c1615611d7757612a79878683612a6f8a9b838a9c9b9c51166131ed565b97015116906131ed565b908286528381526040862091825494600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff87161784556003898316948515612bd2575b01988716988981546001600160801b0319161790556001600160a01b038096168097600385528760408b205416978893865260408b20600101541693612b058c84876140a4565b604080518981526001600160801b03938416602082015292909116908201528060608101037f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa5091a4604051908382527ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce791a1823b612b81578480f35b823b15610524576084928591604051978896879563c6f5ed0f60e01b875260048701526024860152604485015260648401525af1612bc3575b81818080808480f35b612bcc906130d2565b81612bba565b60018101600160a01b60ff60a01b19825416179055612abe565b503461064c57611082612bfe3661306c565b9161321c565b503461064c578060031936011261064c576020600754604051908152f35b503461064c57602036600319011261064c57600435808252600960205260ff600160408420015460a81c16156106c057612c5b9061373a565b90600582101561156f5760208215838115612c7c575b506040519015158152f35b600191501482612c71565b503461064c57602036600319011261064c5760043590818152600960205260ff600160408320015460a81c1615611dda57602091604082828152600985522060ff815460f01c1680612d15575b612cec575b50506001600160801b0360405191168152f35b612d0e92506001600160801b036002612d089201541691613682565b906131ed565b3880612cd9565b5060ff600182015460a01c1615612cd4565b503461064c57604036600319011261064c57612d41613040565b602435612d4d8161365f565b33151580612e0d575b80612de3575b612db35781906001600160a01b03809416938491167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258680a48252600560205260408220906001600160a01b031982541617905580f35b60246040517fa9fbf51f000000000000000000000000000000000000000000000000000000008152336004820152fd5b506001600160a01b038116845260066020526040842033855260205260ff60408520541615612d5c565b50336001600160a01b0382161415612d56565b503461064c57602036600319011261064c57602061205a6004356131c9565b503461064c578060031936011261064c576040519080600191600154928360011c9260018516948515612efa575b602095868610811461148757858852879493929187908215611465575050600114612ea05750506113f792500383613175565b90859250600182527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b858310612ee25750506113f7935082010138806113e9565b80548389018501528794508693909201918101612eca565b93607f1693612e6d565b503461064c578060031936011261064c57602060405167016345785d8a00008152f35b905034610a67576020366003190112610a67576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361049c57602092507f80ac58cd000000000000000000000000000000000000000000000000000000008114908115612fce575b8115612fa4575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501438612f9d565b7f5b5e139f0000000000000000000000000000000000000000000000000000000081149150612f96565b60005b83811061300b5750506000910152565b8181015183820152602001612ffb565b9060209161303481518092818552858086019101612ff8565b601f01601f1916010190565b600435906001600160a01b038216820361127b57565b602435906001600160a01b038216820361127b57565b606090600319011261127b576001600160a01b0390600435828116810361127b5791602435908116810361127b579060443590565b9181601f8401121561127b5782359167ffffffffffffffff831161127b576020808501948460051b01011161127b57565b67ffffffffffffffff811161290757604052565b610100810190811067ffffffffffffffff82111761290757604052565b6060810190811067ffffffffffffffff82111761290757604052565b610160810190811067ffffffffffffffff82111761290757604052565b610140810190811067ffffffffffffffff82111761290757604052565b6040810190811067ffffffffffffffff82111761290757604052565b90601f8019910116810190811067ffffffffffffffff82111761290757604052565b67ffffffffffffffff811161290757601f01601f191660200190565b604435906001600160801b038216820361127b57565b6131d28161365f565b5060005260056020526001600160a01b036040600020541690565b6001600160801b03918216908216039190821161320657565b634e487b7160e01b600052601160045260246000fd5b906001600160a01b03809116801561344d57600091848352602091600383526040928284862054166009825260ff6001868820015460b01c16159081613443575b508061343b575b613424578685526003815282848620541694873315159384613374575b7ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce794508761333c575b808352600484528683206001815401905581835260038452868320816001600160a01b0319825416179055877fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef88519480a4878152a18316820361330e5750505050565b516364283d7b60e01b81526001600160a01b0392831660048201526024810193909352166044820152606490fd5b61335d82600052600560205260406000206001600160a01b03198154169055565b8783526004845286832080546000190190556132aa565b919293809150906133e3575b1561338e5790878392613281565b8488876133ab576024915190637e27328960e01b82526004820152fd5b90517f177e802f0000000000000000000000000000000000000000000000000000000081523360048201526024810191909152604490fd5b503386148015613408575b806133805750878252600583523384868420541614613380565b5085825260068352848220338352835260ff85832054166133ee565b602487855190630da9b01360e01b82526004820152fd5b506001613264565b905015153861325d565b6024604051633250574960e11b815260006004820152fd5b91908110156134755760051b0190565b634e487b7160e01b600052603260045260246000fd5b6040519061349882613103565b60006040838281528260208201520152565b906040516134b781613103565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b60c43564ffffffffff8116810361127b5790565b91906134ff82828561321c565b803b61350c575b50505050565b6135686001600160a01b03809216946040519384937f150b7a020000000000000000000000000000000000000000000000000000000096878652336004870152166024850152604484015260806064840152608483019061301b565b03906020816000938185885af1908290826135fe575b50506135b5578261358d614049565b80519190826135ae5760248260405190633250574960e11b82526004820152fd5b9050602001fd5b7fffffffff0000000000000000000000000000000000000000000000000000000016036135e6575038808080613506565b60249060405190633250574960e11b82526004820152fd5b909192506020813d602011613657575b8161361b60209383613175565b81010312610a675751907fffffffff000000000000000000000000000000000000000000000000000000008216820361064c575090388061357e565b3d915061360e565b8060005260036020526001600160a01b036040600020541690811561281f575090565b600090808252600a60205264ffffffffff918260408220541642106137345760096020526040812092835490808260c81c16918242101561371e576136d39394955060a01c168091039042036142c3565b9082815260096020526001600160801b03926136f98460026040852001541680946143a3565b9283116137065750501690565b60029350604092508152600960205220015460801c90565b505050505060026001600160801b039101541690565b91505090565b806000526009602052604060002060ff600182015460a01c16600014613761575050600490565b805460f81c6137ba575460a01c64ffffffffff1642106137b45761378481613682565b9060005260096020526001600160801b0380600260406000200154169116106000146137af57600190565b600290565b50600090565b5050600390565b916000828152602090600382526001600160a01b036040958187842054166009855260ff6001898620015460b01c161590816138fc575b50806138f1575b6138da579480967ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79596828552600386527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef848387205416948592836138a2575b16928361388c575b84875260038852808720846001600160a01b0319825416179055519580a4948152a1565b8387526004885280872060018154019055613868565b6138c386600052600560205260406000206001600160a01b03198154169055565b838852600489528488208054600019019055613860565b602486885190630da9b01360e01b82526004820152fd5b5081811615156137ff565b90501515386137f8565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361393857565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b60009080825260036020526001600160a01b0380604084205416928333149384156139a7575b5050821561399557505090565b9091506139a233926131c9565b161490565b60ff9294509060409181526006602052818120338252602052205416913880613988565b906139ec6001600160801b03604084015116602060e085015101519061417b565b916001600160801b0383511660c0820151901561401f5764ffffffffff81511615613ff55764ffffffffff81511690604081019164ffffffffff8351169081811015613fb5575050602081019064ffffffffff8251169081151580613fa3575b613f6257505064ffffffffff90511664ffffffffff8251169081811015613f2257505064ffffffffff8042169151169081811015613ee2575050600754926001600160801b0381511660405190613aa282613103565b815260006020820152600060408201526001600160a01b036060840151169060c08401519164ffffffffff604084015116906080860151151560a087015115159264ffffffffff6001600160a01b0389511696511660405196613b048861313c565b87526020870152604086015260608501526000608085015260a0840152600060c0840152600160e08401526101008301526101208201528460005260096020526040600020906001600160a01b0381511678ffffffffff0000000000000000000000000000000000000000602083015160a01b16907dffffffffff00000000000000000000000000000000000000000000000000604084015160c81b167eff0000000000000000000000000000000000000000000000000000000000006060850151151560f01b16917fff000000000000000000000000000000000000000000000000000000000000006080860151151560f81b1693171717178255600182016001600160a01b0360a08301511681549074ff000000000000000000000000000000000000000060c0850151151560a01b1675ff00000000000000000000000000000000000000000060e0860151151560a81b16917fffffffffffffffffff000000000000000000000000000000000000000000000076ff00000000000000000000000000000000000000000000610100880151151560b01b1694161717171790556001600160801b03604060036101206002860194015194613cfc84875116956001600160801b03199687825416178155856020890151166001600160801b036001600160801b031983549260801b169116179055565b01930151169082541617905564ffffffffff602060c084015101511680613ec4575b50600184016007556001600160a01b03602083015116801561344d57613d4c856001600160a01b03926137c1565b16613e9357613d776001600160a01b036060840151166001600160801b038351169030903390614254565b6001600160801b0360208201511680613e64575b506001600160a01b038251167f44cb432df42caa86b7ec73644ab8aec922bc44c71c98fc330addc75b88adbc7c610140866001600160a01b0360208701511694613e5b6001600160a01b03606089015116976080810151151560a08201511515906001600160801b0360206001600160a01b0360e060c087015196015151169660405198895233828a01528281511660408a01520151166060870152608086015260a085015260c08401906040908164ffffffffff91828151168552826020820151166020860152015116910152565b610120820152a4565b613e8d906001600160a01b036060850151166001600160a01b0360e08601515116903390614254565b38613d8b565b60246040517f73c6ac6e00000000000000000000000000000000000000000000000000000000815260006004820152fd5b600a60205260406000209064ffffffffff1982541617905538613d1e565b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f9fee269100000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b516040517fb39831ea00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b508164ffffffffff8251161015613a4c565b6040517f5057f08400000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b60046040517f62201b50000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b3d15614074573d9061405a82613197565b916140686040519384613175565b82523d6000602084013e565b606090565b6140a19061408681614100565b90600052600960205260026040600020015460801c906131ed565b90565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000060208201526001600160a01b039290921660248301526044808301939093529181526140fe916140f9606483613175565b614452565b565b80600052600960205261411960026040600020016134aa565b816000526009602052604060002060ff600182015460a01c1660001461414c57506001600160801b039150602001511690565b5460f81c61415e57506140a190613682565b6140a191506001600160801b0360408183511692015116906131ed565b9190916040519061418b82613159565b600091828152826020820152936001600160801b03928383169182156142355767016345785d8a00008082116141fe57506141c78591846143a3565b16602087019281845211156141ea575090826141e5925116906131ed565b168252565b80634e487b7160e01b602492526001600452fd5b60449250604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b509394505050506040519061424982613159565b808252602082015290565b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff841117612907576140fe92604052614452565b670de0b6b3a764000091600019838309928083029283808610950394808603951461437f578285101561434357908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b50508092501561438d570490565b634e487b7160e01b600052601260045260246000fd5b9091906000198382098382029182808310920391808303921461444157670de0b6b3a7640000908183101561440a57947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b6001600160a01b03169061447d600080836020829551910182875af1614476614049565b90846144ee565b9081519182151592836144c6575b5050506144955750565b602490604051907f5274afe70000000000000000000000000000000000000000000000000000000082526004820152fd5b819293509060209181010312610a6757602001519081159182150361064c575038808061448b565b9061452d575080511561450357805190602001fd5b60046040517f1425ea42000000000000000000000000000000000000000000000000000000008152fd5b81511580614578575b61453e575090565b6024906001600160a01b03604051917f9996b315000000000000000000000000000000000000000000000000000000008352166004820152fd5b50803b1561453656fea164736f6c6343000817000a"; + bytes public constant BYTECODE_LOCKUP_TRANCHED = + hex"60c034620003dc576001600160401b0390601f601f1962004d983881900383810183168501919086831186841017620002f557808692606094604052833981010312620003dc5782516001600160a01b038082169590929091869003620003dc5760209485810151938416809403620003dc57604001519362000081620003e1565b95601e87527f5361626c696572205632204c6f636b7570205472616e63686564204e4654000081880152620000b5620003e1565b9060118252705341422d56322d4c4f434b55502d54524160781b81830152306080528751858111620002f5576001988954908a82811c92168015620003d1575b84831014620002d45781868493116200037b575b50839086831160011462000317576000926200030b575b5050600019600383901b1c191690891b1788555b8151948511620002f557600254938885811c95168015620002ea575b82861014620002d457848487961162000277575b50819385116001146200020d57505060009262000201575b5050600019600383901b1c191690841b176002555b60018060a01b03198481600054161760005560085416176008556040519260007fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a360a052600755614996908162000402823960805181613da3015260a051818181612e810152613e430152f35b0151905038806200017c565b88959392919316600260005283600020936000905b8282106200025d575050841162000243575b505050811b0160025562000191565b015160001960f88460031b161c1916905538808062000234565b8484015186558a9790950194938401939081019062000222565b9091929394506002600052826000208580880160051c820192858910620002ca575b9188978c9297969594930160051c01915b828110620002ba57505062000164565b600081558897508b9101620002aa565b9250819262000299565b634e487b7160e01b600052602260045260246000fd5b94607f169462000150565b634e487b7160e01b600052604160045260246000fd5b01519050388062000120565b90878c94169184600052856000209260005b878282106200036457505084116200034a575b505050811b01885562000134565b015160001960f88460031b161c191690553880806200033c565b8385015186558f9790950194938401930162000329565b9091508a600052836000208680850160051c820192868610620003c7575b918d91869594930160051c01915b828110620003b757505062000109565b600081558594508d9101620003a7565b9250819262000399565b91607f1691620000f5565b600080fd5b60408051919082016001600160401b03811183821017620002f55760405256fe608080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a7146131df57508063027b6744146131bc57806306fdde03146130f7578063081812fc146130d8578063095ea7b314612fdf5780631400ecec14612f3f5780631c1cdd4c14612eda5780631e99d56914612ebc57806323b872dd14612ea45780632fe4304114612e6957806332fbe22b14612d1157806340e58ee514612a73578063425d30dd14612a2257806342842e0e146129e857806342966c681461280d57806344267570146127e65780634857501f146127705780634869e12d146127355780634cc55e11146122b95780636352211e146122895780636d0cee751461228957806370a082311461221957806375829def146121865780637cad6cd11461208c5780637de6b1db14611e655780637f5799f914611e0a5780638659c27014611ab0578063894e9a0d1461175b578063897f362b146114ab5780638f69b9931461140f5780639067b677146113bf57806395d89b41146112b0578063a22cb465146111f3578063a80fc071146111a1578063ad35efd41461113f578063b2564569146110ee578063b88d4fde14611061578063b8a3be661461102c578063b971302a14610fdd578063bc2be1be14610f8d578063c156a11d14610af6578063c87b56dd146109da578063cc364f4814610942578063d4dbd20b146108f0578063d511609f146108a4578063d975dfed14610858578063e985e9c514610803578063ea5ead1914610721578063eac8f5b8146106cf578063f590c1761461066d578063f851a440146106475763fdd46d601461025d57600080fd5b34610644576060366003190112610644576004359061027a61330e565b91604435926001600160801b038085169182860361063f5761029a613d99565b83855260099560209387855260ff600160408920015460a81c16156106285785875287855260ff600160408920015460a01c16610610576001600160a01b039081841680156105e65781156105ce57878952600387528260408a2054169283821415806105be575b61059a5761030f89614546565b8781168411610568575097899a888b999a83809d5282825260408b209988828c54169b6002015460801c9061034391614571565b858d5284845260408d20600201908282549160801b6fffffffffffffffffffffffffffffffff19169116178155610379906138b5565b90808483015116918180825116916040015116610395916134f6565b161115927f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d93610539575b848c528252600160408c20015416946103da818a886146d6565b604051908152a4803314158061052f575b6104c1575b8333141590816104b6575b816104ab575b50610435575b837ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce78688604051908152a180f35b823b156104a757604051636fd110e960e01b8152600481018790523360248201526001600160a01b039290921660448301526001600160801b031660648201529082908290608490829084905af161048f575b8080610407565b61049890613417565b6104a3578238610488565b8280fd5b8380fd5b905083141538610401565b843b151591506103fb565b803b1561052b57604051636fd110e960e01b8152600481018890523360248201526001600160a01b03841660448201526001600160801b03831660648201528590818160848183875af1610517575b50506103f0565b61052090613417565b61052b578438610510565b8480fd5b50803b15156103eb565b848c5280835260408c2060018101600160a01b60ff60a01b1982541617905560ff60f01b1981541690556103c0565b60405163287ecaef60e21b8152600481018b90526001600160801b038781166024830152919091166044820152606490fd5b606489836040519163b34359d360e01b835260048301523360248301526044820152fd5b506105c8896144ad565b15610302565b6024886040519063d2aabcd960e01b82526004820152fd5b60046040517fc61a0e9e000000000000000000000000000000000000000000000000000000008152fd5b60248660405190634a5541ef60e01b82526004820152fd5b6024866040519062b8e7e760e51b82526004820152fd5b600080fd5b80fd5b50346106445780600319360112610644576001600160a01b036020915416604051908152f35b503461064457602036600319011261064457600435808252600960205260ff600160408420015460a81c16156106b857816040916020935260098352205460f81c6040519015158152f35b6024906040519062b8e7e760e51b82526004820152fd5b503461064457602036600319011261064457600435808252600960205260ff600160408420015460a81c16156106b85760016040836001600160a01b0393602095526009855220015416604051908152f35b5034610644576040366003190112610644576004359061073f61330e565b9161074981614546565b92610752613d99565b81835260099360209185835260ff600160408720015460a81c16156107ec5783855285835260ff600160408720015460a01c166107d4576001600160a01b03918282169283156105e6576001600160801b03938483169081156105ce57878952600387528260408a2054169283821415806105be5761059a5761030f89614546565b60248460405190634a5541ef60e01b82526004820152fd5b6024846040519062b8e7e760e51b82526004820152fd5b50346106445760403660031901126106445761081d6132f8565b604061082761330e565b926001600160a01b0380931681526006602052209116600052602052602060ff604060002054166040519015158152f35b50346106445760203660031901126106445760ff6001604060043593848152600960205220015460a81c16156106b857610893602091614546565b6001600160801b0360405191168152f35b503461064457602036600319011261064457600435808252600960205260ff600160408420015460a81c16156106b857604082600292602094526009845220015460801c604051908152f35b503461064457602036600319011261064457600435808252600960205260ff600160408420015460a81c16156106b85760036040836001600160801b0393602095526009855220015416604051908152f35b5034610644576020366003190112610644576004356000602060405161096781613464565b8281520152808252600960205260ff600160408420015460a81c16156106b857604082819281526009602052205464ffffffffff8251916109a783613464565b818160a01c16835260c81c1660208201526109d8825180926020908164ffffffffff91828151168552015116910152565bf35b503461064457602080600319360112610ae6576004356109f981613a77565b50826001600160a01b0360085416916044604051809481937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa928315610aea578093610a69575b5050610a656040519282849384528301906132d3565b0390f35b909192503d8082843e610a7c8184613480565b8201918381840312610ae65780519067ffffffffffffffff82116104a3570182601f82011215610ae657805191610ab2836134a2565b93610ac06040519586613480565b838552858484010111610644575090610ade918480850191016132b0565b903880610a4f565b5080fd5b604051903d90823e3d90fd5b503461064457604036600319011261064457600435610b1361330e565b610b1b613d99565b81835260099060209082825260ff600160408720015460a81c16156107ec57838552600382526001600160a01b03918260408720541693843303610f6e57610b6286614546565b906001600160801b039081831680158015610c02575b50505050505081811615610bea5783610b9091613c54565b90811680610bb05760248460405190637e27328960e01b82526004820152fd5b8203610bba578380f35b6040516364283d7b60e01b81526001600160a01b0392831660048201526024810193909352166044820152606490fd5b60248560405190633250574960e11b82526004820152fd5b610c0a613d99565b898b5282865260ff600160408d20015460a81c1615610f5757898b5282865260ff600160408d20015460a01c16610f3f5788156105e657610f2757888a52600385528660408b205416918289141580610f17575b610ef357610c6b8a614546565b8481168311610ec15750908a949392918a86528087526040862093610cd0610c9e8760028d89541698015460801c614571565b8d8952838a52600260408a200190836fffffffffffffffffffffffffffffffff1983549260801b1691161781556138b5565b90610cec818a84015116928260408183511692015116906134f6565b161115610e92575b8a86528652888a7f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d888b600160408b2001541694610d338186886146d6565b604051908152a48033141580610e88575b610e1e575b813314159081610e13575b81610e08575b50610d97575b5050507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce790604051868152a1388080808080610b78565b803b156104a357604051636fd110e960e01b8152600481018990523360248201526001600160a01b03881660448201526001600160801b0392909216606483015282908290608490829084905af1610df0575b80610d60565b610df990613417565b610e04578538610dea565b8580fd5b905081141538610d5a565b823b15159150610d54565b803b156104a757604051636fd110e960e01b8152600481018a90523360248201526001600160a01b03891660448201526001600160801b03841660648201528490818160848183875af1610e74575b5050610d49565b610e7d90613417565b6104a7578338610e6d565b50803b1515610d44565b8a86528087526040862060018101600160a01b60ff60a01b1982541617905560ff60f01b198154169055610cf4565b60405163287ecaef60e21b8152600481018c90526001600160801b038781166024830152919091166044820152606490fd5b60648a8a6040519163b34359d360e01b835260048301523360248301526044820152fd5b50610f218a6144ad565b15610c5e565b6024896040519063d2aabcd960e01b82526004820152fd5b60248a60405190634a5541ef60e01b82526004820152fd5b60248a6040519062b8e7e760e51b82526004820152fd5b60405163216caf0d60e01b815260048101879052336024820152604490fd5b503461064457602036600319011261064457600435808252600960205260ff600160408420015460a81c16156106b85760408264ffffffffff926020945260098452205460a01c16604051908152f35b503461064457602036600319011261064457600435808252600960205260ff600160408420015460a81c16156106b8576040826001600160a01b03926020945260098452205416604051908152f35b50346106445760203660031901126106445760ff6001604060209360043581526009855220015460a81c166040519015158152f35b50346106445760803660031901126106445761107b6132f8565b61108361330e565b906064359067ffffffffffffffff82116104a757366023830112156104a757816004013592846110b2856134a2565b936110c06040519586613480565b8585523660248783010111610ae657856110eb9660246020930183880137850101526044359161390a565b80f35b503461064457602036600319011261064457600435808252600960205260ff600160408420015460a81c16156106b857600160408360ff93602095526009855220015460b01c166040519015158152f35b503461064457602036600319011261064457600435808252600960205260ff600160408420015460a81c16156106b85761117890613bcd565b60405190600581101561118d57602092508152f35b602483634e487b7160e01b81526021600452fd5b503461064457602036600319011261064457600435808252600960205260ff600160408420015460a81c16156106b85760026040836001600160801b0393602095526009855220015416604051908152f35b50346106445760403660031901126106445761120d6132f8565b6024359081151580920361063f576001600160a01b031690811561127f5733835260066020526040832082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a380f35b602482604051907f5b08ba180000000000000000000000000000000000000000000000000000000082526004820152fd5b503461064457806003193601126106445760405190806002549160018360011c92600185169485156113b5575b60209586861081146113a15785885287949392918790821561137f575050600114611325575b505061131192500383613480565b610a656040519282849384528301906132d3565b90859250600282527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace5b85831061136757505061131193508201013880611303565b8054838901850152879450869390920191810161134f565b925093505061131194915060ff191682840152151560051b8201013880611303565b602483634e487b7160e01b81526022600452fd5b93607f16936112dd565b503461064457602036600319011261064457600435808252600960205260ff600160408420015460a81c16156106b85760408264ffffffffff926020945260098452205460c81c16604051908152f35b503461064457602036600319011261064457600435808252600960205260ff600160408420015460a81c16156106b85761144890613bcd565b9060058210159081611489576002831491821561149d575b8215611474575b6020836040519015158152f35b90915061148957506004602091143880611467565b80634e487b7160e01b602492526021600452fd5b506003831491506000611460565b5034610644576020906003198281360112610ae6576004359167ffffffffffffffff91828411610ae65761012084360391820112610ae6576114eb613d99565b60c48401359060221901811215610ae65783016004810135928311610ae65760248101908360061b80360383136104a75760249061152886613780565b956115366040519788613480565b8652878601920101913683116104a757905b86838310611743575050505081519061156082613780565b9261156e6040519485613480565b828452601f1961157d84613780565b0186835b82811061171f5750505064ffffffffff804216936001600160801b0392836115a882613a9a565b51511683808b6115b785613a9a565b51015116880116604051916115cb83613464565b82528a8201526115da88613a9a565b526115e487613a9a565b5060019260015b8381106116b6575050505050611603856004016138e9565b91611610602487016138e9565b9161161d60448801613823565b6064880135926001600160a01b039081851680950361064457509288959261166e9895926116a3989561165560846116ae9d016138fd565b948161166360a48c016138fd565b976040519d8e6133fa565b168c52168c8b0152166040890152606088015215156080870152151560a086015260c085015260e084015260e43691016137ce565b610100820152613df5565b604051908152f35b8089838d8180826116db8d6116cc8e9a8d613aa7565b51511696600019890190613aa7565b51015116916116ea868a613aa7565b510151160116604051916116fd83613464565b82528d82015261170d828c613aa7565b52611718818b613aa7565b50016115eb565b60405161172b81613464565b60008152600083820152828289010152018790611581565b6040916117503685613798565b815201910190611548565b503461064457602036600319011261064457606061014060405161177e8161342b565b83815283602082015283604082015283838201528360808201528360a08201528360c08201528360e0820152836101008201526040516117bd81613448565b84815284602082015284604082015261012082015201526004358152600960205260ff600160408320015460a81c1615611a985760043581526009602052604081209060405191610140830183811067ffffffffffffffff821117611a82576118ae9160029160405280546001600160a01b038116865264ffffffffff8160a01c16602087015264ffffffffff8160c81c16604087015260ff8160f01c161515606087015260f81c1515608086015260ff60018201546001600160a01b03811660a0880152818160a01c16151560c0880152818160a81c16151560e088015260b01c161515610100860152016138b5565b6101208301526118bf600435613bcd565b6005811015611a6e5761014092600261198b9214611a63575b6101208101516001600160a01b0360a08301511664ffffffffff60408401511694606084015115159061010085015115159260c086015115159160e08701511515936001600160a01b03885116996080604064ffffffffff60208c015116946004358152600a602052209901511515926040519b6119558d61342b565b8c5260208c015260408b015260608a0152608089015260a088015260c087015260e0860152610100850152610120840152613837565b82820152610a65604051928392602084526001600160a01b03815116602085015264ffffffffff602082015116604085015264ffffffffff60408201511660608501526060810151151560808501526080810151151560a08501526001600160a01b0360a08201511660c085015260c0810151151560e085015260e08101511515610100850152610100810151151561012085015261012081015160406001600160801b039182815116858801528260208201511661016088015201511661018085015201516101a0808401526101c083019061339e565b8260608201526118d8565b602482634e487b7160e01b81526021600452fd5b634e487b7160e01b600052604160045260246000fd5b602460405162b8e7e760e51b81526004356004820152fd5b503461064457602080600319360112610ae65760043567ffffffffffffffff81116104a357611ae390369060040161336d565b9190611aed613d99565b83925b808410611afb578480f35b611b068482846137fd565b3593611b10613d99565b848652600980855260ff90600190828260408b20015460a81c1615611df357878952808752604089208281015460a01c841615611b5f5760248960405190634a5541ef60e01b82526004820152fd5b9790919293949596975460f81c611ddb57611b908160005260096020526001600160a01b0360406000205416331490565b15611dbb57611b9e81613abb565b818a52828952611bb3600260408c20016138b5565b906001600160801b0395868351168783161015611da357838c52848b5260408c205460f01c1615611d8b5791818a611c0485898f9a999896611bfa8c9983879351166134f6565b95015116906134f6565b8386528482527f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa5060408720916040835499600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8c161785558b83169a8b15611d72575b60038096019c88169c8d6fffffffffffffffffffffffffffffffff198254161790556001600160a01b0392838092169b8c9789522054169889965260408d2001541694611cb78b85886146d6565b604080518881526001600160801b0392831660208201529290911690820152606090a47ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce78a604051838152a1813b611d1b575b505050505050600101929190611af0565b813b15610e0457856084928195604051978896879563c6f5ed0f60e01b875260048701526024860152604485015260648401525af1611d5e575b80808080611d0a565b611d6790613417565b61052b578438611d55565b818601600160a01b60ff60a01b19825416179055611c69565b602483604051906339c6dc7360e21b82526004820152fd5b602484604051906322cad1af60e11b82526004820152fd5b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b6024906040519063fe19f19f60e01b82526004820152fd5b6024886040519062b8e7e760e51b82526004820152fd5b503461064457602036600319011261064457600435808252600960205260ff600160408420015460a81c16156106b857604082611e5192610a659452600a60205220613837565b60405191829160208352602083019061339e565b503461064457602080600319360112610ae65760043590611e84613d99565b8183526009815260ff600160408520015460a81c161561207557611ea782613bcd565b60058110156120615760048103611ed05760248360405190634a5541ef60e01b82526004820152fd5b60038103611ef0576024836040519063fe19f19f60e01b82526004820152fd5b60021461204957611f178260005260096020526001600160a01b0360406000205416331490565b1561202a578183526009815260ff604084205460f01c161561201257818352600981526040832060ff60f01b19815416905582604051837f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f8380a2600383526001600160a01b03604083205416803b611fba575b5050507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce791604051908152a180f35b803b156104a357816024818580947f450154640000000000000000000000000000000000000000000000000000000083528960048401525af1611ffe575b80611f8b565b61200790613417565b6104a3578238611ff8565b602482604051906339c6dc7360e21b82526004820152fd5b60405163216caf0d60e01b815260048101839052336024820152604490fd5b602482604051906322cad1af60e11b82526004820152fd5b602484634e487b7160e01b81526021600452fd5b6024826040519062b8e7e760e51b82526004820152fd5b5034610644576020366003190112610644576004356001600160a01b03908181168091036104a3578183541633810361215d575060085491816001600160a01b03198416176008556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a260075460001981019081116121495760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a180f35b602482634e487b7160e01b81526011600452fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b5034610644576020366003190112610644576121a06132f8565b9080546001600160a01b03808216933385036121f2576001600160a01b03199394501691829116178255337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808380a380f35b6040516331b339a960e21b81526001600160a01b0386166004820152336024820152604490fd5b5034610644576020366003190112610644576001600160a01b0361223b6132f8565b168015612258578160409160209352600483522054604051908152f35b602482604051907f89c62b640000000000000000000000000000000000000000000000000000000082526004820152fd5b50346106445760203660031901126106445760206122a8600435613a77565b6001600160a01b0360405191168152f35b50346106445760403660031901126106445767ffffffffffffffff6004358181116104a3576122ec90369060040161336d565b90916024359081116104a75761230690369060040161336d565b61230e613d99565b8083036126fe57845b838110612322578580f35b61232d8185876137fd565b359061233a8186886137fd565b35875260036020526001600160a01b0360408820541661236361235e8386886137fd565b613823565b9061236c613d99565b838952600960205260ff600160408b20015460a81c16156107ec57838952600960205260ff600160408b20015460a01c166107d45780156105e6576001600160801b038216156126e65783895260036020526001600160a01b0360408a2054169182821415806126d6575b6126b2576123e485614546565b6001600160801b0381166001600160801b038316116126825750908992918584526009602052604084209261246a6001600160a01b03855416946002809101546001600160801b036fffffffffffffffffffffffffffffffff1961244c87608094851c614571565b938c8b52600960205260408b2001938454931b1691161781556138b5565b6001600160801b0361248e81602084015116928260408183511692015116906134f6565b161115612651575b86855260096020526001600160a01b036001604087200154166124c36001600160801b03841685836146d6565b83887f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d60206040516001600160801b0388168152a48033141580612647575b6125dd575b8333141590816125d2575b816125c7575b50612555575b505050507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce76020600193604051908152a101612317565b823b156104a757604051636fd110e960e01b8152600481018790523360248201526001600160a01b039290921660448301526001600160801b031660648201529082908290608490829084905af16125af575b808061251e565b6125b890613417565b6125c35786386125a8565b8680fd5b905083141538612518565b843b15159150612512565b803b1561052b57604051636fd110e960e01b8152600481018890523360248201526001600160a01b03841660448201526001600160801b03831660648201528590818160848183875af1612633575b5050612507565b61263c90613417565b61052b57843861262c565b50803b1515612502565b86855260096020526040852060018101600160a01b60ff60a01b1982541617905560ff60f01b198154169055612496565b60405163287ecaef60e21b8152600481018790526001600160801b03928316602482015291166044820152606490fd5b606485836040519163b34359d360e01b835260048301523360248301526044820152fd5b506126e0856144ad565b156123d7565b6024846040519063d2aabcd960e01b82526004820152fd5b82604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b50346106445760203660031901126106445760ff6001604060043593848152600960205220015460a81c16156106b857610893602091614730565b50346106445760203660031901126106445760043590818152600960205260ff600160408320015460a81c161561207557806127ab83613bcd565b926005841015611a6e576002602094036127cc575b50506040519015158152f35b815260098352604090205460f01c60ff16905038806127c0565b503461064457806003193601126106445760206001600160a01b0360085416604051908152f35b503461064457602080600319360112610ae6576004359061282c613d99565b8183526009815260ff600160408520015460a81c1615612075578183526009815260ff600160408520015460a01c16156129b757612869826144ad565b1561202a5781600052600381526001600160a01b0380604060002054166009835260ff60016040600020015460b01c161590816129ad575b50806129a5575b61298d577ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce790836000526003835260406000205416918215928315612952575b846000526003825260406000206001600160a01b03198154169055846000604051927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a4848152a161293a575080f35b60249060405190637e27328960e01b82526004820152fd5b61297385600052600560205260406000206001600160a01b03198154169055565b8060005260048252604060002060001981540190556128e8565b60248360405190630da9b01360e01b82526004820152fd5b5060006128a8565b90501515386128a1565b602482604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b5034610644576129f736613338565b60405191602083019383851067ffffffffffffffff861117611a82576110eb9460405285845261390a565b503461064457602036600319011261064457600435808252600960205260ff600160408420015460a81c16156106b857600160408360ff93602095526009855220015460a01c166040519015158152f35b503461064457602090816003193601126106445760043590612a93613d99565b81815260099283815260ff600160408420015460a81c1615612cfa5782825283815260408220600181015460a01c60ff1615612ae15760248460405190634a5541ef60e01b82526004820152fd5b9284935460f81c611ddb57612b0c8160005260096020526001600160a01b0360406000205416331490565b15611dbb57612b1a81613abb565b93818452808352612b30600260408620016138b5565b916001600160801b03938484511685881610156120495781865282815260ff604087205460f01c161561201257612b7e878683612b748a9b838a9c9b9c51166134f6565b97015116906134f6565b908286528381526040862091825494600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff87161784556003898316948515612ce0575b01988716988981546fffffffffffffffffffffffffffffffff19161790556001600160a01b038096168097600385528760408b205416978893865260408b20600101541693612c138c84876146d6565b604080518981526001600160801b03938416602082015292909116908201528060608101037f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa5091a4604051908382527ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce791a1823b612c8f578480f35b823b1561052b576084928591604051978896879563c6f5ed0f60e01b875260048701526024860152604485015260648401525af1612cd1575b81818080808480f35b612cda90613417565b81612cc8565b60018101600160a01b60ff60a01b19825416179055612bc3565b6024836040519062b8e7e760e51b82526004820152fd5b5034610644576003199060203683018113610ae6576004359167ffffffffffffffff93848411610ae65761014090843603011261064457612d50613d99565b60405193612d5d856133fa565b612d6984600401613324565b8552612d7760248501613324565b6020860152612d88604485016134be565b604086015260648401356001600160a01b03811681036104a3576060860152612db3608485016133ed565b6080860152612dc460a485016133ed565b60a0860152612dd560c4850161376e565b60c086015260e4840135908111610ae65783019136602384011215610ae6576004830135612e0281613780565b93612e106040519586613480565b8185526024602086019260061b820101933685116106445750602401905b838210612e505760206116ae886116a3898960e08401526101043691016137ce565b82604091612e5e3685613798565b815201910190612e2e565b503461064457806003193601126106445760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b5034610644576110eb612eb636613338565b91613525565b50346106445780600319360112610644576020600754604051908152f35b503461064457602036600319011261064457600435808252600960205260ff600160408420015460a81c16156106b857612f1390613bcd565b9060058210156114895760208215838115612f34575b506040519015158152f35b600191501482612f29565b50346106445760203660031901126106445760043590818152600960205260ff600160408320015460a81c161561207557602091604082828152600985522060ff815460f01c1680612fcd575b612fa4575b50506001600160801b0360405191168152f35b612fc692506001600160801b036002612fc09201541691613abb565b906134f6565b3880612f91565b5060ff600182015460a01c1615612f8c565b503461064457604036600319011261064457612ff96132f8565b60243561300581613a77565b331515806130c5575b8061309b575b61306b5781906001600160a01b03809416938491167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258680a48252600560205260408220906001600160a01b031982541617905580f35b60246040517fa9fbf51f000000000000000000000000000000000000000000000000000000008152336004820152fd5b506001600160a01b038116845260066020526040842033855260205260ff60408520541615613014565b50336001600160a01b038216141561300e565b50346106445760203660031901126106445760206122a86004356134d2565b50346106445780600319360112610644576040519080600191600154928360011c92600185169485156131b2575b60209586861081146113a15785885287949392918790821561137f57505060011461315857505061131192500383613480565b90859250600182527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b85831061319a57505061131193508201013880611303565b80548389018501528794508693909201918101613182565b93607f1693613125565b5034610644578060031936011261064457602060405167016345785d8a00008152f35b905034610ae6576020366003190112610ae6576004357fffffffff0000000000000000000000000000000000000000000000000000000081168091036104a357602092507f80ac58cd000000000000000000000000000000000000000000000000000000008114908115613286575b811561325c575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501438613255565b7f5b5e139f000000000000000000000000000000000000000000000000000000008114915061324e565b60005b8381106132c35750506000910152565b81810151838201526020016132b3565b906020916132ec815180928185528580860191016132b0565b601f01601f1916010190565b600435906001600160a01b038216820361063f57565b602435906001600160a01b038216820361063f57565b35906001600160a01b038216820361063f57565b606090600319011261063f576001600160a01b0390600435828116810361063f5791602435908116810361063f579060443590565b9181601f8401121561063f5782359167ffffffffffffffff831161063f576020808501948460051b01011161063f57565b90815180825260208080930193019160005b8281106133be575050505090565b835180516001600160801b0316865282015164ffffffffff1685830152604090940193928101926001016133b0565b3590811515820361063f57565b610120810190811067ffffffffffffffff821117611a8257604052565b67ffffffffffffffff8111611a8257604052565b610160810190811067ffffffffffffffff821117611a8257604052565b6060810190811067ffffffffffffffff821117611a8257604052565b6040810190811067ffffffffffffffff821117611a8257604052565b90601f8019910116810190811067ffffffffffffffff821117611a8257604052565b67ffffffffffffffff8111611a8257601f01601f191660200190565b35906001600160801b038216820361063f57565b6134db81613a77565b5060005260056020526001600160a01b036040600020541690565b6001600160801b03918216908216039190821161350f57565b634e487b7160e01b600052601160045260246000fd5b906001600160a01b03809116801561375657600091848352602091600383526040928284862054166009825260ff6001868820015460b01c1615908161374c575b5080613744575b61372d57868552600381528284862054169487331515938461367d575b7ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7945087613645575b808352600484528683206001815401905581835260038452868320816001600160a01b0319825416179055877fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef88519480a4878152a1831682036136175750505050565b516364283d7b60e01b81526001600160a01b0392831660048201526024810193909352166044820152606490fd5b61366682600052600560205260406000206001600160a01b03198154169055565b8783526004845286832080546000190190556135b3565b919293809150906136ec575b15613697579087839261358a565b8488876136b4576024915190637e27328960e01b82526004820152fd5b90517f177e802f0000000000000000000000000000000000000000000000000000000081523360048201526024810191909152604490fd5b503386148015613711575b806136895750878252600583523384868420541614613689565b5085825260068352848220338352835260ff85832054166136f7565b602487855190630da9b01360e01b82526004820152fd5b50600161356d565b9050151538613566565b6024604051633250574960e11b815260006004820152fd5b359064ffffffffff8216820361063f57565b67ffffffffffffffff8111611a825760051b60200190565b919082604091031261063f576040516137b081613464565b60206137c98183956137c1816134be565b85520161376e565b910152565b919082604091031261063f576040516137e681613464565b60208082946137f481613324565b84520135910152565b919081101561380d5760051b0190565b634e487b7160e01b600052603260045260246000fd5b356001600160801b038116810361063f5790565b90815461384381613780565b926040936138546040519182613480565b82815280946020809201926000526020600020906000935b85851061387b57505050505050565b6001848192845161388b81613464565b64ffffffffff87546001600160801b038116835260801c168382015281520193019401939161386c565b906040516138c281613448565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b356001600160a01b038116810361063f5790565b35801515810361063f5790565b9190613917828285613525565b803b613924575b50505050565b6139806001600160a01b03809216946040519384937f150b7a02000000000000000000000000000000000000000000000000000000009687865233600487015216602485015260448401526080606484015260848301906132d3565b03906020816000938185885af190829082613a16575b50506139cd57826139a5614516565b80519190826139c65760248260405190633250574960e11b82526004820152fd5b9050602001fd5b7fffffffff0000000000000000000000000000000000000000000000000000000016036139fe57503880808061391e565b60249060405190633250574960e11b82526004820152fd5b909192506020813d602011613a6f575b81613a3360209383613480565b81010312610ae65751907fffffffff00000000000000000000000000000000000000000000000000000000821682036106445750903880613996565b3d9150613a26565b8060005260036020526001600160a01b036040600020541690811561293a575090565b80511561380d5760200190565b805182101561380d5760209160051b010190565b64ffffffffff80421691600090808252602091600a602052613adf60408220613837565b9185856020613aed86613a9a565b5101511611613bc45781526009602052604081208585825460c81c161115613bae57506001600160801b039485613b2384613a9a565b5151169583519260019360011015613b9a5750949392919084602060408501510151169581866001985b161115613b5e575050505050505090565b909181879881613b728798999a8598613aa7565b5151160116970191868087613b878689613aa7565b5101511697829392919796959498613b4d565b80634e487b7160e01b602492526032600452fd5b600201546001600160801b031695945050505050565b50935050505090565b806000526009602052604060002060ff600182015460a01c16600014613bf4575050600490565b805460f81c613c4d575460a01c64ffffffffff164210613c4757613c1781613abb565b9060005260096020526001600160801b038060026040600020015416911610600014613c4257600190565b600290565b50600090565b5050600390565b916000828152602090600382526001600160a01b036040958187842054166009855260ff6001898620015460b01c16159081613d8f575b5080613d84575b613d6d579480967ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79596828552600386527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84838720541694859283613d35575b169283613d1f575b84875260038852808720846001600160a01b0319825416179055519580a4948152a1565b8387526004885280872060018154019055613cfb565b613d5686600052600560205260406000206001600160a01b03198154169055565b838852600489528488208054600019019055613cf3565b602486885190630da9b01360e01b82526004820152fd5b508181161515613c92565b9050151538613c8b565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003613dcb57565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b90613e176001600160801b03604084015116602061010085015101519061458c565b6001600160801b0381511660e084015164ffffffffff60c08601511682156144835781518015614459577f00000000000000000000000000000000000000000000000000000000000000008111614428575064ffffffffff6020613e7a84613a9a565b510151168110156143d15750600090819082815184905b808210614340575050505064ffffffffff421664ffffffffff82168110156143005750506001600160801b03168082036142c9575050600754928360005260096020526040600020916001600160801b0381511660028401906fffffffffffffffffffffffffffffffff198254161790556001600160a01b036060830151166001840154750100000000000000000000000000000000000000000060808501511515918654937fffffffffffffffffff0000ff000000000000000000000000000000000000000076ff0000000000000000000000000000000000000000000060a0890151151560b01b16921617171760018601556001600160a01b0384511678ffffffffff000000000000000000000000000000000000000060c086015160a01b169060e0860151937fff000000000000000000000000000000000000000000000000000000000000007eff0000000000000000000000000000000000000000000000000000000000007dffffffffff00000000000000000000000000000000000000000000000000602061402d8951996000198b0190613aa7565b51015160c81b169560f01b16911617171717845560005b818110614224575050600185016007556001600160a01b0360208301511680156137565761407a866001600160a01b0392613c54565b166141f3576140a56001600160a01b036060840151166001600160801b038351169030903390614665565b6001600160801b03602082015116806141c3575b507ffeb1cb9ce021c8bd5fb1eb836e6284c68866fa32d1d844238de19955238f807660206001600160a01b03845116926001600160a01b038286015116946001600160a01b03606082015116966141b861419960808401511515928c60a086015115156001600160a01b0361010060e089015194549864ffffffffff6040519a6141428c613464565b818160a01c168c5260c81c168c8b015201515116956001600160801b036040519a8b9a610140958c5233828d01528281511660408d015201511660608a0152608089015260a08801528060c088015286019061339e565b9260e08501906020908164ffffffffff91828151168552015116910152565b6101208301520390a4565b6141ed906001600160a01b036060850151166001600160a01b036101008601515116903390614665565b386140b9565b60246040517f73c6ac6e00000000000000000000000000000000000000000000000000000000815260006004820152fd5b86600052600a6020526040600020906142418160e0870151613aa7565b51825468010000000000000000811015611a82576001810180855581101561380d57600193600052602060002001906001600160801b038151167fffffffffffffffffffffff00000000000000000000000000000000000000000074ffffffffff000000000000000000000000000000006020855494015160801b1692161717905501614044565b60449250604051917f6375ff1300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b9193509193614364906001600160801b0361435b8588613aa7565b51511690614571565b9364ffffffffff8060206143788685613aa7565b5101511694168085111561439457506001849301909291613e91565b8385606492604051927fd97494c6000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b64ffffffffff60206143e284613a9a565b5101516040517ff1fb2cc500000000000000000000000000000000000000000000000000000000815264ffffffffff938416600482015291169091166024820152604490fd5b602490604051907f73627f740000000000000000000000000000000000000000000000000000000082526004820152fd5b60046040517f7ea4ccdf000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b60009080825260036020526001600160a01b0380604084205416928333149384156144f2575b505082156144e057505090565b9091506144ed33926134d2565b161490565b60ff92945090604091815260066020528181203382526020522054169138806144d3565b3d15614541573d90614527826134a2565b916145356040519384613480565b82523d6000602084013e565b606090565b61456e9061455381614730565b90600052600960205260026040600020015460801c906134f6565b90565b9190916001600160801b038080941691160191821161350f57565b9190916040519061459c82613464565b600091828152826020820152936001600160801b03928383169182156146465767016345785d8a000080821161460f57506145d8859184614847565b16602087019281845211156145fb575090826145f6925116906134f6565b168252565b80634e487b7160e01b602492526001600452fd5b60449250604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b509394505050506040519061465a82613464565b808252602082015290565b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff841117611a82576146d4926040526147ab565b565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000060208201526001600160a01b039290921660248301526044808301939093529181526146d49161472b606483613480565b6147ab565b80600052600960205261474960026040600020016138b5565b816000526009602052604060002060ff600182015460a01c1660001461477c57506001600160801b039150602001511690565b5460f81c61478e575061456e90613abb565b61456e91506001600160801b0360408183511692015116906134f6565b6001600160a01b0316906147d6600080836020829551910182875af16147cf614516565b90846148f6565b90815191821515928361481f575b5050506147ee5750565b602490604051907f5274afe70000000000000000000000000000000000000000000000000000000082526004820152fd5b819293509060209181010312610ae657602001519081159182150361064457503880806147e4565b909190600019838209838202918280831092039180830392146148e557670de0b6b3a764000090818310156148ae57947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b90614935575080511561490b57805190602001fd5b60046040517f1425ea42000000000000000000000000000000000000000000000000000000008152fd5b81511580614980575b614946575090565b6024906001600160a01b03604051917f9996b315000000000000000000000000000000000000000000000000000000008352166004820152fd5b50803b1561493e56fea164736f6c6343000817000a"; + bytes public constant BYTECODE_NFT_DESCRIPTOR = + hex"6080806040523461001757615f2090816200001d8239f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c63e9dc63751461002757600080fd5b346143a65760403660031901126143a6576001600160a01b0360043516600435036143a6576100566080614951565b60006080819052606060a081905260c082905260e0819052610120819052610140819052610160819052610180919091526101a0526004356001600160a01b03166101008190526100a690614a61565b61012052610100516040517feac8f5b80000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa9081156143b3576000916148c0575b506001600160a01b03610117911680608052614c30565b60a052610100516040517fa80fc0710000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa80156143b3576fffffffffffffffffffffffffffffffff916000916148a1575b501660c052610100516040517fad35efd40000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa80156143b357600090614864575b6101e59150614d7d565b61014052610100516040517f4869e12d0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa9081156143b357600091614835575b5060c0516fffffffffffffffffffffffffffffffff16801561481f576fffffffffffffffffffffffffffffffff61271081930216041661010060800152610287600435614e79565b6101206080015260405160208101904682526bffffffffffffffffffffffff1960043560601b1660408201526024356054820152605481526102c88161496e565b519020610405602963ffffffff6103156102ee8261016861ffff8860101c16061661570a565b91601e604660ff61030b8460146050848d60081c1606011661570a565b981606011661570a565b6040519485927f68736c28000000000000000000000000000000000000000000000000000000006020850152610355815180926020602488019101614909565b83017f2c000000000000000000000000000000000000000000000000000000000000006024820152610391825180936020602585019101614909565b7f252c000000000000000000000000000000000000000000000000000000000000602583830101526103cf8351809460206027868601019101614909565b01017f252900000000000000000000000000000000000000000000000000000000000060278201520360098101845201826149fa565b61043d6fffffffffffffffffffffffffffffffff6040608001511660ff6104366001600160a01b0360805116615091565b16906151fa565b6104516001600160a01b0360805116614a61565b60a051610100516040517fbc2be1be0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa80156143b357602491600091614800575b5060206001600160a01b03608080015116604051938480927f9067b677000000000000000000000000000000000000000000000000000000008252823560048301525afa80156143b357610513926000916147d1575b5064ffffffffff8091169116615545565b610120516101805190929161059d602161053a6064610533818706615a17565b950461570a565b6040519481610553879351809260208087019101614909565b82016105688251809360208085019101614909565b017f250000000000000000000000000000000000000000000000000000000000000060208201520360018101855201836149fa565b610100608001519260c060800151956101206080015197604051996105c18b614951565b8a5260208a015260408901526060880152608087015260a086015260c085015260e0840152610100830152610120820152604051806101c081011067ffffffffffffffff6101c083011117614402576101c0810160405260608152600060208201526000604082015260608082015260006080820152606060a0820152600060c0820152600060e08201526060610100820152600061012082015260006101408201526060610160820152600061018082015260006101a082015260a082015161069160c0840151845190615b23565b9061097861015c604051926106a5846149de565b600884527f50726f677265737300000000000000000000000000000000000000000000000060208501526106e86040516106de8161498a565b60008152866159eb565b156147c9576090945b6106fa8661570a565b916040519586938493661e339034b21e9160c91b6020860152610946835195869261072c846027840160208901614909565b6d11103334b6361e9111b33333111f60911b602785840101526c1e3932b1ba103bb4b23a341e9160991b603585840101526107738551809660206042888701019101614909565b7f22206865696768743d22313030222066696c6c2d6f7061636974793d222e3033828501860160428101919091527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e882015286519661087991889160f990910190602001614909565b661e17ba32bc3a1f60c91b8285018601870160f98101919091527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b61014082015287519761091491899161015190910190602001614909565b661e17ba32bc3a1f60c91b6101518888888887010101010152602061015888888885519c8d9701010101019101614909565b631e17b39f60e11b90860190910190910190910190910161015881019190915281900361013c810190915201826149fa565b6101008301526101208201526028610100830151604051906109998261498a565b60008252610c3f61015c604051926109b0846149de565b600684527f537461747573000000000000000000000000000000000000000000000000000060208501526109e384615e1f565b6109ec82615e9d565b808211156147c15750945b610a0287870161570a565b91604051958693661e339034b21e9160c91b60208601528151610a2c816027880160208601614909565b85016d11103334b6361e9111b33333111f60911b60278201526c1e3932b1ba103bb4b23a341e9160991b6035820152610a6f825180936020604285019101614909565b017f22206865696768743d22313030222066696c6c2d6f7061636974793d222e303360428201527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e8820152610b6b82518093602060f985019101614909565b01661e17ba32bc3a1f60c91b60f98201527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b610140820152610bfa82518093602061015185019101614909565b01661e17ba32bc3a1f60c91b610151820152610c2182518093602061015885019101614909565b01631e17b39f60e11b6101588201520361013c8101845201826149fa565b610160840152016101808201526028602083015160405190610c608261498a565b60008252610caa61015c60405192610c77846149de565b600684527f416d6f756e74000000000000000000000000000000000000000000000000000060208501526109e384615e1f565b8352016020820152610fe560808301516030604051610cc88161498a565b60008152610f6f61015c60405194610cdf866149de565b600886527f4475726174696f6e0000000000000000000000000000000000000000000000006020870152610d1286615e1f565b610d1b82615e9d565b808211156147b95750935b610d326028860161570a565b91604051978893661e339034b21e9160c91b60208601528151610d5c816027880160208601614909565b85016d11103334b6361e9111b33333111f60911b60278201526c1e3932b1ba103bb4b23a341e9160991b6035820152610d9f825180936020604285019101614909565b017f22206865696768743d22313030222066696c6c2d6f7061636974793d222e303360428201527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e8820152610e9b82518093602060f985019101614909565b01661e17ba32bc3a1f60c91b60f98201527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b610140820152610f2a82518093602061015185019101614909565b01661e17ba32bc3a1f60c91b610151820152610f5182518093602061015885019101614909565b01631e17b39f60e11b6101588201520361013c8101865201846149fa565b8260a08601526028810160c0860152602085015190610120860151809161018088015192839185010101605881016080890152605719906103e8030160011c8061014089015201601081016101a088015201602081016040870152010160e0840152610100830151610160840151845191615190565b6060820152604051908161010081011067ffffffffffffffff6101008401111761440257610100820160405260c782527f3c726563742077696474683d223130302522206865696768743d22313030252260208301527f2066696c7465723d2275726c28234e6f69736529222f3e3c7265637420783d2260408301527f37302220793d223730222077696474683d2238363022206865696768743d223860608301527f3630222066696c6c3d2223666666222066696c6c2d6f7061636974793d222e3060808301527f33222072783d223435222072793d22343522207374726f6b653d22236666662260a08301527f207374726f6b652d6f7061636974793d222e3122207374726f6b652d7769647460c08301527f683d2234222f3e0000000000000000000000000000000000000000000000000060e08301528251916101008401519160608101519460405161113b816149a6565b603381527f3c636972636c652069643d22476c6f772220723d22353030222066696c6c3d2260208201527f75726c282352616469616c476c6f7729222f3e0000000000000000000000000060408201526040519661119888614951565b61011c88527f3c66696c7465722069643d224e6f697365223e3c6665466c6f6f6420783d223060208901527f2220793d2230222077696474683d223130302522206865696768743d2231303060408901527f252220666c6f6f642d636f6c6f723d2268736c283233302c3231252c3131252960608901527f2220666c6f6f642d6f7061636974793d22312220726573756c743d22666c6f6f60808901527f6446696c6c222f3e3c666554757262756c656e6365206261736546726571756560a08901527f6e63793d222e3422206e756d4f6374617665733d22332220726573756c743d2260c08901527f4e6f6973652220747970653d226672616374616c4e6f697365222f3e3c66654260e08901527f6c656e6420696e3d224e6f6973652220696e323d22666c6f6f6446696c6c22206101008901527f6d6f64653d22736f66742d6c69676874222f3e3c2f66696c7465723e0000000061012089015260405197886103a081011067ffffffffffffffff6103a08b011117614402576103a0890160405261037b89527f3c706174682069643d224c6f676f222066696c6c3d2223666666222066696c6c60208a01527f2d6f7061636974793d222e312220643d226d3133332e3535392c3132342e303360408a01527f34632d2e3031332c322e3431322d312e3035392c342e3834382d322e3932332c60608a01527f362e3430322d322e3535382c312e3831392d352e3136382c332e3433392d372e60808a01527f3838382c342e3939362d31342e34342c382e3236322d33312e3034372c31322e60a08a01527f3536352d34372e3637342c31322e3536392d382e3835382e3033362d31372e3860c08a01527f33382d312e3237322d32362e3332382d332e3636332d392e3830362d322e373660e08a01527f362d31392e3038372d372e3131332d32372e3536322d31322e3737382d31332e6101008a01527f3834322d382e3032352c392e3436382d32382e3630362c31362e3135332d33356101208a01527f2e323635683063322e3033352d312e3833382c342e3235322d332e3534362c366101408a01527f2e3436332d352e323234683063362e3432392d352e3635352c31362e3231382d6101608a01527f322e3833352c32302e3335382c342e31372c342e3134332c352e3035372c382e6101808a01527f3831362c392e3634392c31332e39322c31332e373334682e30333763352e37336101a08a01527f362c362e3436312c31352e3335372d322e3235332c392e33382d382e34382c306101c08a01527f2c302d332e3531352d332e3531352d332e3531352d332e3531352d31312e34396101e08a01527f2d31312e3437382d35322e3635362d35322e3636342d36342e3833372d36342e6102008a01527f3833376c2e3034392d2e303337632d312e3732352d312e3630362d322e3731396102208a01527f2d332e3834372d322e3735312d362e3230346830632d2e3034362d322e3337356102408a01527f2c312e3036322d342e3538322c322e3732362d362e32323968306c2e3138352d6102608a01527f2e3134386830632e3039392d2e3036322c2e3232322d2e3134382c2e33372d2e6102808a01527f323539683063322e30362d312e3336322c332e3935312d322e3632312c362e306102a08a01527f34342d332e3834324335372e3736332d332e3437332c39372e37362d322e33346102c08a01527f312c3132382e3633372c31382e3333326331362e3637312c392e3934362d32366102e08a01527f2e3334342c35342e3831332d33382e3635312c34302e3139392d362e3239392d6103008a01527f362e3039362d31382e3036332d31372e3734332d31392e3636382d31382e38316103208a01527f312d362e3031362d342e3034372d31332e3036312c342e3737362d372e3735326103408a01527f2c392e3735316c36382e3235342c36382e33373163312e3732342c312e3630316103608a01527f2c322e3731342c332e38342c322e3733382c362e3139325a222f3e00000000006103808a0152604051978860a081011067ffffffffffffffff60a08b01111761440257611c76611cd79160a08b0160405260758b527f3c706174682069643d22466c6f6174696e6754657874222066696c6c3d226e6f60208c01527f6e652220643d224d31323520343568373530733830203020383020383076373560408c01527f307330203830202d3830203830682d373530732d38302030202d3830202d383060608c01527f762d3735307330202d3830203830202d3830222f3e000000000000000000000060808c015261182d615aea565b906040517f3c72616469616c4772616469656e742069643d2252616469616c476c6f77223e6020820152611cd260d87f3c73746f70206f66667365743d223025222073746f702d636f6c6f723d22000093846040850152805161195f60b886602085019361189f81605e840187614909565b8101997f222073746f702d6f7061636974793d222e36222f3e0000000000000000000000605e8c01527f3c73746f70206f66667365743d2231303025222073746f702d636f6c6f723d229a8b6073820152611904825180936020609385019101614909565b017f222073746f702d6f7061636974793d2230222f3e00000000000000000000000060938201527f3c2f72616469616c4772616469656e743e00000000000000000000000000000060a78201520360988101885201866149fa565b611967615aea565b90604051967f3c6c696e6561724772616469656e742069643d2253616e64546f70222078313d60208901527f223025222079313d223025223e000000000000000000000000000000000000006040890152604d88015282516119cd81606b8a0184614909565b8701917f222f3e00000000000000000000000000000000000000000000000000000000009283606b82015289606e820152611a12825180936020608e85019101614909565b019082608e830152611a5660a2897f3c2f6c696e6561724772616469656e743e0000000000000000000000000000009485609182015203608281018b5201896149fa565b611b9c610108611a64615aea565b6040519b8c917f3c6c696e6561724772616469656e742069643d2253616e64426f74746f6d222060208401527f78313d2231303025222079313d2231303025223e00000000000000000000000060408401527f3c73746f70206f66667365743d22313025222073746f702d636f6c6f723d22006054840152611af0815180926020607387019101614909565b8201908760738301526076820152875190611b0f826096830188614909565b018660968201527f3c616e696d617465206174747269627574654e616d653d22783122206475723d60998201527f2236732220726570656174436f756e743d22696e646566696e6974652220766160b98201527f6c7565733d223330253b3630253b313230253b3630253b3330253b222f3e000060d98201528560f78201520360e881018c52018a6149fa565b611ba4615aea565b906040519a8b957f3c6c696e6561724772616469656e742069643d22486f7572676c61737353747260208801527f6f6b6522206772616469656e745472616e73666f726d3d22726f74617465283960408801527f302922206772616469656e74556e6974733d227573657253706163654f6e557360608801527f65223e000000000000000000000000000000000000000000000000000000000060808801527f3c73746f70206f66667365743d22353025222073746f702d636f6c6f723d2200608388015251809260a2880190614909565b84018360a28201527f3c73746f70206f66667365743d22383025222073746f702d636f6c6f723d220060a5820152611cb882518093602060c485019101614909565b019160c483015260c78201520360b88101875201856149fa565b615190565b92611ce9611ce3614d0b565b896159eb565b97881561479e575b50604051611cfe816149c2565b609081527f3c7061746820643d224d2035302c3336302061203330302c333030203020312c60208201527f31203630302c302061203330302c333030203020312c31202d3630302c30222060408201527f66696c6c3d2223666666222066696c6c2d6f7061636974793d222e303222207360608201527f74726f6b653d2275726c2823486f7572676c6173735374726f6b65292220737460808201527f726f6b652d77696474683d2234222f3e0000000000000000000000000000000060a082015260405193846102c081011067ffffffffffffffff6102c087011117614402576102c0850160405261029885527f3c7061746820643d226d3536362c3136312e323031762d35332e39323463302d60208601527f31392e3338322d32322e3531332d33372e3536332d36332e3339382d35312e3160408601527f39382d34302e3735362d31332e3539322d39342e3934362d32312e3037392d3160608601527f35322e3538372d32312e303739732d3131312e3833382c372e3438372d31353260808601527f2e3630322c32312e303739632d34302e3839332c31332e3633362d36332e343160a08601527f332c33312e3831362d36332e3431332c35312e3139387635332e39323463302c60c08601527f31372e3138312c31372e3730342c33332e3432372c35302e3232332c34362e3360e08601527f3934763238342e383039632d33322e3531392c31322e39362d35302e3232332c6101008601527f32392e3230362d35302e3232332c34362e3339347635332e39323463302c31396101208601527f2e3338322c32322e35322c33372e3536332c36332e3431332c35312e3139382c6101408601527f34302e3736332c31332e3539322c39342e3935342c32312e3037392c3135322e6101608601527f3630322c32312e303739733131312e3833312d372e3438372c3135322e3538376101808601527f2d32312e3037396334302e3838362d31332e3633362c36332e3339382d33312e6101a08601527f3831362c36332e3339382d35312e313938762d35332e39323463302d31372e316101c08601527f39362d31372e3730342d33332e3433352d35302e3232332d34362e34303156326101e08601527f30372e3630336333322e3531392d31322e3936372c35302e3232332d32392e326102008601527f30362c35302e3232332d34362e3430315a6d2d3334372e3436322c35372e37396102208601527f336c3133302e3935392c3133312e3032372d3133302e3935392c3133312e30316102408601527f33563231382e3939345a6d3236322e3932342e303232763236322e3031386c2d6102608601527f3133302e3933372d3133312e3030362c3133302e3933372d3133312e3031335a6102808601527f222066696c6c3d2223313631383232223e3c2f706174683e00000000000000006102a0860152896000146145795760405161212c8161498a565b60008152995b1561441857604051806101e081011067ffffffffffffffff6101e083011117614402576101e081016040526101b181527f3c7061746820643d226d3438312e34362c3438312e35347638312e3031632d3260208201527f2e33352e37372d342e38322c312e35312d372e33392c322e32332d33302e332c60408201527f382e35342d37342e36352c31332e39322d3132342e30362c31332e39322d353360608201527f2e362c302d3130312e32342d362e33332d3133312e34372d31362e3136762d3860808201527f316c34362e332d34362e3331683137302e33336c34362e32392c34362e33315a60a08201527f222066696c6c3d2275726c282353616e64426f74746f6d29222f3e3c7061746860c08201527f20643d226d3433352e31372c3433352e323363302c312e31372d2e34362c322e60e08201527f33322d312e33332c332e34342d372e31312c392e30382d34312e39332c31352e6101008201527f39382d38332e38312c31352e3938732d37362e372d362e392d38332e38322d316101208201527f352e3938632d2e38372d312e31322d312e33332d322e32372d312e33332d332e6101408201527f3434762d2e30346c382e33342d382e33352e30312d2e30316331332e37322d366101608201527f2e35312c34322e39352d31312e30322c37362e382d31312e30327336322e39376101808201527f2c342e34392c37362e37322c31316c382e34322c382e34325a222066696c6c3d6101a08201527f2275726c282353616e64546f7029222f3e0000000000000000000000000000006101c0820152995b60405196876107e081011067ffffffffffffffff6107e08a01111761440257613b3f9c612dfa6036602d9960819f97631e17b39f60e11b8d7f3c2f646566733e000000000000000000000000000000000000000000000000009a612ecb9f6107e0016040526107a782527f3c672066696c6c3d226e6f6e6522207374726f6b653d2275726c2823486f757260208301527f676c6173735374726f6b652922207374726f6b652d6c696e656361703d22726f60408301527f756e6422207374726f6b652d6d697465726c696d69743d22313022207374726f60608301527f6b652d77696474683d2234223e3c7061746820643d226d3536352e3634312c3160808301527f30372e323863302c392e3533372d352e35362c31382e3632392d31352e36373660a08301527f2c32362e393733682d2e303233632d392e3230342c372e3539362d32322e313960c08301527f342c31342e3536322d33382e3139372c32302e3539322d33392e3530342c313460e08301527f2e3933362d39372e3332352c32342e3335352d3136312e3733332c32342e33356101008301527f352d39302e34382c302d3136372e3934382d31382e3538322d3139392e3935336101208301527f2d34342e393438682d2e303233632d31302e3131352d382e3334342d31352e366101408301527f37362d31372e3433372d31352e3637362d32362e3937332c302d33392e3733356101608301527f2c39362e3535342d37312e3932312c3231352e3635322d37312e3932317332316101808301527f352e3632392c33322e3138352c3231352e3632392c37312e3932315a222f3e3c6101a08301527f7061746820643d226d3133342e33362c3136312e32303363302c33392e3733356101c08301527f2c39362e3535342c37312e3932312c3231352e3635322c37312e3932317332316101e08301527f352e3632392d33322e3138362c3231352e3632392d37312e393231222f3e3c6c6102008301527f696e652078313d223133342e3336222079313d223136312e323033222078323d6102208301527f223133342e3336222079323d223130372e3238222f3e3c6c696e652078313d226102408301527f3536352e3634222079313d223136312e323033222078323d223536352e3634226102608301527f2079323d223130372e3238222f3e3c6c696e652078313d223138342e353834226102808301527f2079313d223230362e383233222078323d223138342e353835222079323d22356102a08301527f33372e353739222f3e3c6c696e652078313d223231382e313831222079313d226102c08301527f3231382e313138222078323d223231382e313831222079323d223536322e35336102e08301527f37222f3e3c6c696e652078313d223438312e383138222079313d223231382e316103008301527f3432222078323d223438312e383139222079323d223536322e343238222f3e3c6103208301527f6c696e652078313d223531352e343135222079313d223230372e3335322220786103408301527f323d223531352e343136222079323d223533372e353739222f3e3c70617468206103608301527f643d226d3138342e35382c3533372e353863302c352e34352c342e32372c31306103808301527f2e36352c31322e30332c31352e3432682e303263352e35312c332e33392c31326103a08301527f2e37392c362e35352c32312e35352c392e34322c33302e32312c392e392c37386103c08301527f2e30322c31362e32382c3133312e38332c31362e32382c34392e34312c302c396103e08301527f332e37362d352e33382c3132342e30362d31332e39322c322e372d2e37362c356104008301527f2e32392d312e35342c372e37352d322e33352c382e37372d322e38372c31362e6104208301527f30352d362e30342c32312e35362d392e3433683063372e37362d342e37372c316104408301527f322e30342d392e39372c31322e30342d31352e3432222f3e3c7061746820643d6104608301527f226d3138342e3538322c3439322e363536632d33312e3335342c31322e3438356104808301527f2d35302e3232332c32382e35382d35302e3232332c34362e3134322c302c392e6104a08301527f3533362c352e3536342c31382e3632372c31352e3637372c32362e393639682e6104c08301527f30323263382e3530332c372e3030352c32302e3231332c31332e3436332c33346104e08301527f2e3532342c31392e3135392c392e3939392c332e3939312c32312e3236392c376105008301527f2e3630392c33332e3539372c31302e3738382c33362e34352c392e3430372c386105208301527f322e3138312c31352e3030322c3133312e3833352c31352e3030327339352e336105408301527f36332d352e3539352c3133312e3830372d31352e3030326331302e3834372d326105608301527f2e37392c32302e3836372d352e3932362c32392e3932342d392e3334392c312e6105808301527f3234342d2e3436372c322e3437332d2e3934322c332e3637332d312e3432342c6105a08301527f31342e3332362d352e3639362c32362e3033352d31322e3136312c33342e35326105c08301527f342d31392e313733682e3032326331302e3131342d382e3334322c31352e36376105e08301527f372d31372e3433332c31352e3637372d32362e3936392c302d31372e3536322d6106008301527f31382e3836392d33332e3636352d35302e3232332d34362e3135222f3e3c70616106208301527f746820643d226d3133342e33362c3539322e373263302c33392e3733352c39366106408301527f2e3535342c37312e3932312c3231352e3635322c37312e393231733231352e366106608301527f32392d33322e3138362c3231352e3632392d37312e393231222f3e3c6c696e656106808301527f2078313d223133342e3336222079313d223539322e3732222078323d223133346106a08301527f2e3336222079323d223533382e373937222f3e3c6c696e652078313d223536356106c08301527f2e3634222079313d223539322e3732222078323d223536352e3634222079323d6106e08301527f223533382e373937222f3e3c706f6c796c696e6520706f696e74733d223438316107008301527f2e383232203438312e393031203438312e373938203438312e383737203438316107208301527f2e373735203438312e383534203335302e303135203335302e303236203231386107408301527f2e313835203231382e313239222f3e3c706f6c796c696e6520706f696e74733d6107608301527f223231382e313835203438312e393031203231382e323331203438312e3835346107808301527f203335302e303135203335302e303236203438312e383232203231382e3135326107a08301527f222f3e3c2f673e000000000000000000000000000000000000000000000000006107c0830152604051998a957f3c672069643d22486f7572676c617373223e00000000000000000000000000006020880152603295612d968151809260208a8c019101614909565b8701612dab8251809360208a85019101614909565b01612dbf8251809360208985019101614909565b01612dd38251809360208885019101614909565b01612de78251809360208785019101614909565b01918201520360168101865201846149fa565b6040519e8f9788977f3c646566733e000000000000000000000000000000000000000000000000000060208a0152612e3f6026998260208c9451948593019101614909565b8901612e548251809360208c85019101614909565b01612e688251809360208b85019101614909565b01612e7c8251809360208a85019101614909565b01612e908251809360208985019101614909565b01612ea48251809360208885019101614909565b01612eb88251809360208785019101614909565b019182015203600d8101895201876149fa565b61375e604c60e0830151610120840151936134ba6130ed6060604084015193015196612ef78186615d63565b946130e861012b604051612f0a816149de565b600581527f2d3130302500000000000000000000000000000000000000000000000000000060208201526040519889917f3c74657874506174682073746172744f66667365743d220000000000000000006020840152612f74815180926020603787019101614909565b7f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666683820160378101919091527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e0000000000000000006101098201528251926130b891849161012090910190602001614909565b6a1e17ba32bc3a2830ba341f60a91b90830190910161012081019190915281900361010b810190915201876149fa565b615d63565b956132cc61012b604051613100816149de565b600281527f30250000000000000000000000000000000000000000000000000000000000006020820152604051998a917f3c74657874506174682073746172744f66667365743d22000000000000000000602084015261316a815180926020603787019101614909565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e0000000000000000006101098201526132a782518093602061012085019101614909565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b81018a5201886149fa565b6132d68184615dcb565b926134b561012b6040516132e9816149de565b600481527f2d3530250000000000000000000000000000000000000000000000000000000060208201526040519687917f3c74657874506174682073746172744f66667365743d220000000000000000006020840152613353815180926020603787019101614909565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e00000000000000000061010982015261349082518093602061012085019101614909565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b8101875201856149fa565b615dcb565b9061369961012b6040516134cd816149de565b600381527f353025000000000000000000000000000000000000000000000000000000000060208201526040519485917f3c74657874506174682073746172744f66667365743d220000000000000000006020840152613537815180926020603787019101614909565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e00000000000000000061010982015261367482518093602061012085019101614909565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b8101855201836149fa565b6040519586937f3c7465787420746578742d72656e646572696e673d226f7074696d697a65537060208601527f656564223e00000000000000000000000000000000000000000000000000000060408601526136ff815180926020604589019101614909565b8401613715825180936020604585019101614909565b0161372a825180936020604585019101614909565b0161373f825180936020604585019101614909565b01661e17ba32bc3a1f60c91b604582015203602c8101845201826149fa565b613a3e61019a6101408401516101a08501519061379f61379961379361378d60e060408b01519a01519461570a565b9461570a565b9761570a565b9161570a565b956040519687937f3c75736520687265663d2223476c6f77222066696c6c2d6f7061636974793d2260208601527f2e39222f3e00000000000000000000000000000000000000000000000000000060408601527f3c75736520687265663d2223476c6f772220783d22313030302220793d22313060458601527f3030222066696c6c2d6f7061636974793d222e39222f3e00000000000000000060658601527f3c75736520687265663d22234c6f676f2220783d223137302220793d22313730607c8601527f22207472616e73666f726d3d227363616c65282e3629222f3e3c757365206872609c8601527f65663d2223486f7572676c6173732220783d223135302220793d22393022207460bc8601527f72616e73666f726d3d22726f746174652831302922207472616e73666f726d2d60dc8601527f6f726967696e3d2235303020353030222f3e000000000000000000000000000060fc8601527f3c75736520687265663d222350726f67726573732220783d220000000000000061010e8601526101279061393a815180926020858a019101614909565b8501937f2220793d22373930222f3e00000000000000000000000000000000000000000080948180948801527f3c75736520687265663d22235374617475732220783d22000000000000000000610132880152610149966139a48251809360208b85019101614909565b01958601527f3c75736520687265663d2223416d6f756e742220783d2200000000000000000061015486015261016b946139e78251809360208985019101614909565b01938401527f3c75736520687265663d22234475726174696f6e2220783d220000000000000061017684015261018f92613a2a8251809360208785019101614909565b01918201520361017a8101855201836149fa565b6040519586937f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323060208601527f30302f737667222077696474683d223130303022206865696768743d2231303060408601527f30222076696577426f783d2230203020313030302031303030223e00000000006060860152613aca815180926020607b89019101614909565b8401613ae0825180936020607b85019101614909565b01613af5825180936020607b85019101614909565b01613b0a825180936020607b85019101614909565b017f3c2f7376673e0000000000000000000000000000000000000000000000000000607b8201520360618101845201826149fa565b6101605260a051610100516040517fb971302a0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa9081156143b3576000916143bf575b506089613bab613ccd92614a61565b9260c0608001516040519485927f5b7b2274726169745f74797065223a224173736574222c2276616c7565223a226020850152613bf2815180926020604088019101614909565b8301907f227d2c7b2274726169745f74797065223a2253656e646572222c2276616c756560408301527f223a22000000000000000000000000000000000000000000000000000000000091826060820152613c57825180936020606385019101614909565b01907f227d2c7b2274726169745f74797065223a22537461747573222c2276616c756560638301526083820152613c98825180936020608685019101614909565b017f227d5d000000000000000000000000000000000000000000000000000000000060868201520360698101845201826149fa565b6101a05160a051610120516080519193929091613cf2906001600160a01b0316614a61565b91613cfe60243561570a565b92602460206001600160a01b03608080015116604051928380927fb2564569000000000000000000000000000000000000000000000000000000008252823560048301525afa9081156143b357600091614369575b50936142dd9661406560e361426c966094966142769a9661417b9a6000146142e157604051613d81816149c2565b609b81527fe29aa0efb88f205741524e494e473a205472616e7366657272696e672074686560208201527f204e4654206d616b657320746865206e6577206f776e6572207468652072656360408201527f697069656e74206f66207468652073747265616d2e205468652066756e64732060608201527f617265206e6f74206175746f6d61746963616c6c792077697468647261776e2060808201527f666f72207468652070726576696f757320726563697069656e742e000000000060a0820152915b60405197889461400160208701997f54686973204e465420726570726573656e74732061207061796d656e742073748b527f7265616d20696e2061205361626c696572205632200000000000000000000000604089015282516020840190613eb18160558c0184614909565b8901947f20636f6e74726163742e20546865206f776e6572206f662074686973204e465460558701527f2063616e207769746864726177207468652073747265616d656420617373657460758701527f732c207768696368206172652064656e6f6d696e6174656420696e2000000000609587015282516020840196613f3b8260b183018a614909565b017f2e5c6e5c6e2d2053747265616d2049443a20000000000000000000000000000060b1820152613f7682518093602060c385019101614909565b01613faf7f5c6e2d2000000000000000000000000000000000000000000000000000000000958660c384015251809360c7840190614909565b01947f20416464726573733a2000000000000000000000000000000000000000000000958660c7820152613fed82518093602060d185019101614909565b019260d184015251809360d5840190614909565b019060d582015261401c82518093602060df85019101614909565b017f5c6e5c6e0000000000000000000000000000000000000000000000000000000060df8201526140568251809360208785019101614909565b010360c38101855201836149fa565b6101a051906141d661407860243561570a565b916140f7602d604051809560208201976a029b0b13634b2b9102b19160ad1b89526140ad815180926020602b87019101614909565b82017f2023000000000000000000000000000000000000000000000000000000000000602b8201526140e88251809360208785019101614909565b0103600d8101865201846149fa565b610160516141049061585b565b94604051998a977f7b2261747472696275746573223a00000000000000000000000000000000000060208a0152614145815180926020602e8d019101614909565b8801917f2c226465736372697074696f6e223a2200000000000000000000000000000000602e840152518093603e840190614909565b01917f222c2265787465726e616c5f75726c223a2268747470733a2f2f7361626c6965603e8401527f722e636f6d222c226e616d65223a220000000000000000000000000000000000605e840152518093606d840190614909565b017f222c22696d616765223a22646174613a696d6167652f7376672b786d6c3b6261606d8201527f736536342c000000000000000000000000000000000000000000000000000000608d820152614237825180936020609285019101614909565b017f227d00000000000000000000000000000000000000000000000000000000000060928201520360748101845201826149fa565b60e081905261585b565b6142c9603d60405180937f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000060208301526142b98151809260208686019101614909565b810103601d8101845201826149fa565b60405191829160208352602083019061492c565b0390f35b6040516142ed8161496e565b605b81527fe29d95494e464f3a2054686973204e4654206973206e6f6e2d7472616e73666560208201527f7261626c652e2049742063616e6e6f7420626520736f6c64206f72207472616e60408201527f7366657272656420746f20616e6f74686572206163636f756e742e0000000000606082015291613e45565b90506020959195813d6020116143ab575b81614387602093836149fa565b810103126143a657519384151585036143a657909490936142dd613d53565b600080fd5b3d915061437a565b6040513d6000823e3d90fd5b90506020813d6020116143fa575b816143da602093836149fa565b810103126143a657516001600160a01b03811681036143a6576089613b9c565b3d91506143cd565b634e487b7160e01b600052604160045260246000fd5b6040518061012081011067ffffffffffffffff6101208301111761440257610120810160405260f881527f3c7061746820643d226d3438312e34362c3530342e3130317635382e3434396360208201527f2d322e33352e37372d342e38322c312e35312d372e33392c322e32332d33302e60408201527f332c382e35342d37342e36352c31332e39322d3132342e30362c31332e39322d60608201527f35332e362c302d3130312e32342d362e33332d3133312e34372d31362e31367660808201527f2d35382e343339683236322e39325a222066696c6c3d2275726c282353616e6460a08201527f426f74746f6d29222f3e3c656c6c697073652063783d22333530222063793d2260c08201527f3530342e313031222072783d223133312e343632222072793d2232382e31303860e08201527f222066696c6c3d2275726c282353616e64546f7029222f3e00000000000000006101008201529961237f565b604051806101c081011067ffffffffffffffff6101c083011117614402576101c0810160405261019981527f3c706f6c79676f6e20706f696e74733d22333530203335302e3032362034313560208201527f2e3033203238342e39373820323835203238342e39373820333530203335302e60408201527f303236222066696c6c3d2275726c282353616e64426f74746f6d29222f3e3c7060608201527f61746820643d226d3431362e3334312c3238312e39373563302c2e3931342d2e60808201527f3335342c312e3830392d312e3033352c322e36382d352e3534322c372e30373660a08201527f2d33322e3636312c31322e34352d36352e32382c31322e34352d33322e36323460c08201527f2c302d35392e3733382d352e3337342d36352e32382d31322e34352d2e36383160e08201527f2d2e3837322d312e3033352d312e3736372d312e3033352d322e36382c302d2e6101008201527f3931342e3335342d312e3830382c312e3033352d322e3637362c352e3534322d6101208201527f372e3037362c33322e3635362d31322e34352c36352e32382d31322e34352c336101408201527f322e3631392c302c35392e3733382c352e3337342c36352e32382c31322e34356101608201527f2e3638312e3836372c312e3033352c312e3736322c312e3033352c322e3637366101808201527f5a222066696c6c3d2275726c282353616e64546f7029222f3e000000000000006101a082015299612132565b6147b29198506147ac614d44565b906159eb565b9638611cf1565b905093610d26565b9050946109f7565b60d0946106f1565b6147f3915060203d6020116147f9575b6147eb81836149fa565b810190614a44565b38610502565b503d6147e1565b614819915060203d6020116147f9576147eb81836149fa565b386104ac565b634e487b7160e01b600052601260045260246000fd5b614857915060203d60201161485d575b61484f81836149fa565b810190614a1c565b3861023f565b503d614845565b506020813d602011614899575b8161487e602093836149fa565b810103126143a6575160058110156143a6576101e5906101db565b3d9150614871565b6148ba915060203d60201161485d5761484f81836149fa565b38610181565b90506020813d602011614901575b816148db602093836149fa565b810103126143a657516001600160a01b03811681036143a6576001600160a01b03610100565b3d91506148ce565b60005b83811061491c5750506000910152565b818101518382015260200161490c565b9060209161494581518092818552858086019101614909565b601f01601f1916010190565b610140810190811067ffffffffffffffff82111761440257604052565b6080810190811067ffffffffffffffff82111761440257604052565b6020810190811067ffffffffffffffff82111761440257604052565b6060810190811067ffffffffffffffff82111761440257604052565b60c0810190811067ffffffffffffffff82111761440257604052565b6040810190811067ffffffffffffffff82111761440257604052565b90601f8019910116810190811067ffffffffffffffff82111761440257604052565b908160209103126143a657516fffffffffffffffffffffffffffffffff811681036143a65790565b908160209103126143a6575164ffffffffff811681036143a65790565b6001600160a01b03168060405191614a78836149a6565b602a8352602083016040368237835115614b6c5760309053825160019060011015614b6c57607860218501536029905b808211614af1575050614ab9575090565b604490604051907fe22e27eb000000000000000000000000000000000000000000000000000000008252600482015260146024820152fd5b9091600f81166010811015614b57577f3031323334353637383961626364656600000000000000000000000000000000901a614b2d84876159da565b5360041c918015614b42576000190190614aa8565b60246000634e487b7160e01b81526011600452fd5b60246000634e487b7160e01b81526032600452fd5b634e487b7160e01b600052603260045260246000fd5b67ffffffffffffffff811161440257601f01601f191660200190565b3d15614bc9573d90614baf82614b82565b91614bbd60405193846149fa565b82523d6000602084013e565b606090565b6020818303126143a65780519067ffffffffffffffff82116143a6570181601f820112156143a6578051614c0181614b82565b92614c0f60405194856149fa565b818452602082840101116143a657614c2d9160208085019101614909565b90565b6000809160405160208101906395d89b4160e01b825260048152614c53816149de565b51915afa614c5f614b9e565b90158015614cff575b614cc55780602080614c7f93518301019101614bce565b601e815111600014614c2d5750604051614c98816149de565b600b81527f4c6f6e672053796d626f6c000000000000000000000000000000000000000000602082015290565b50604051614cd2816149de565b600581527f4552433230000000000000000000000000000000000000000000000000000000602082015290565b50604081511115614c68565b60405190614d18826149de565b600782527f536574746c6564000000000000000000000000000000000000000000000000006020830152565b60405190614d51826149de565b600882527f4465706c657465640000000000000000000000000000000000000000000000006020830152565b6005811015614e635760048103614d975750614c2d614d44565b60038103614dd95750604051614dac816149de565b600881527f43616e63656c6564000000000000000000000000000000000000000000000000602082015290565b60018103614e1b5750604051614dee816149de565b600981527f53747265616d696e670000000000000000000000000000000000000000000000602082015290565b600203614e2a57614c2d614d0b565b604051614e36816149de565b600781527f50656e64696e6700000000000000000000000000000000000000000000000000602082015290565b634e487b7160e01b600052602160045260246000fd5b6001600160a01b031660408051916395d89b4160e01b8352600083600481845afa92831561508657600093615063575b50815192614eb6846149de565b60118452614eeb6020947f5341422d56322d4c4f434b55502d4c494e00000000000000000000000000000086820152826159eb565b15614f295750507f4c6f636b7570204c696e65617200000000000000000000000000000000000000905191614f1f836149de565b600d835282015290565b614f668351614f37816149de565b601181527f5341422d56322d4c4f434b55502d44594e00000000000000000000000000000086820152826159eb565b15614fa45750507f4c6f636b75702044796e616d6963000000000000000000000000000000000000905191614f9a836149de565b600e835282015290565b614fe18351614fb2816149de565b601181527f5341422d56322d4c4f434b55502d54524100000000000000000000000000000086820152826159eb565b1561501f5750507f4c6f636b7570205472616e636865640000000000000000000000000000000000905191615015836149de565b600f835282015290565b61505f9083519384937f814a8a2e00000000000000000000000000000000000000000000000000000000855260048501526024840152604483019061492c565b0390fd5b61507f91933d8091833e61507781836149fa565b810190614bce565b9138614ea9565b82513d6000823e3d90fd5b60405160208101907f313ce567000000000000000000000000000000000000000000000000000000008252600481526150c9816149de565b6000928392839251915afa6150dc614b9e565b9080615113575b1561510f5760208180518101031261510b57602001519060ff82168203615108575090565b80fd5b5080fd5b5090565b5060208151146150e3565b6040519061512b826149de565b600482527f2667743b000000000000000000000000000000000000000000000000000000006020830152565b60405190615164826149de565b600482527f266c743b000000000000000000000000000000000000000000000000000000006020830152565b906151f89294936040519586926020946151b281518092888089019101614909565b84016151c682518093888085019101614909565b016151d982518093878085019101614909565b016151ec82518093868085019101614909565b010380855201836149fa565b565b801561550a57600091806154e5575090505b600190808281101561527657505050615223615157565b614c2d602260405183615240829551809260208086019101614909565b81017f203100000000000000000000000000000000000000000000000000000000000060208201520360028101845201826149fa565b66038d7ea4c6800011156154885760409081519060a0820182811067ffffffffffffffff821117614402578084526152ad8161498a565b6000815282528251906152bf826149de565b8482526020917f4b00000000000000000000000000000000000000000000000000000000000000838201528284015283516152f9816149de565b8581527f4d0000000000000000000000000000000000000000000000000000000000000083820152848401528351615330816149de565b8581527f42000000000000000000000000000000000000000000000000000000000000008382015260608401528351615368816149de565b8581527f5400000000000000000000000000000000000000000000000000000000000000838201526080840152600091856000965b61545c575b508451946153af866149de565b600790600787527f2623383830353b0000000000000000000000000000000000000000000000000083880152519560005b828110615449575050505061542a615430917f2000000000000000000000000000000000000000000000000000000000000000602787015260088652615425866149de565b61570a565b91615a17565b916005851015614b6c57614c2d9460051b015192615190565b81810184015188820185015283016153e0565b9591926103e89081851061547f57508680916064600a870406950493019661539d565b939296506153a2565b505061549261511e565b614c2d6028604051836154af829551809260208086019101614909565b81017f203939392e39395400000000000000000000000000000000000000000000000060208201520360088101845201826149fa565b600a0a9182156154f657500461520c565b80634e487b7160e01b602492526012600452fd5b5050604051615518816149de565b600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b62015180910304806155ad575061555a615157565b614c2d602660405183615577829551809260208086019101614909565b81017f203120446179000000000000000000000000000000000000000000000000000060208201520360068101845201826149fa565b61270f811161567c576001810361563957614c2d60206156016040516155d2816149de565b600481527f2044617900000000000000000000000000000000000000000000000000000000838201529361570a565b60405193816156198693518092868087019101614909565b820161562d82518093868085019101614909565b010380845201826149fa565b614c2d602061560160405161564d816149de565b600581527f2044617973000000000000000000000000000000000000000000000000000000838201529361570a565b5061568561511e565b614c2d602a604051836156a2829551809260208086019101614909565b81017f2039393939204461797300000000000000000000000000000000000000000000602082015203600a8101845201826149fa565b906156e282614b82565b6156ef60405191826149fa565b8281528092615700601f1991614b82565b0190602036910137565b806000917a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008082101561584d575b506d04ee2d6d415b85acef81000000008083101561583e575b50662386f26fc100008083101561582f575b506305f5e10080831015615820575b5061271080831015615811575b506064821015615801575b600a809210156157f7575b6001908160216157a2600187016156d8565b95860101905b6157b4575b5050505090565b600019019083907f30313233343536373839616263646566000000000000000000000000000000008282061a8353049182156157f2579190826157a8565b6157ad565b9160010191615790565b9190606460029104910191615785565b6004919392049101913861577a565b6008919392049101913861576d565b6010919392049101913861575e565b6020919392049101913861574c565b604093508104915038615733565b8051156159c65760405161586e816149a6565b604081527f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f6040820152815191600292600281018091116159b05760038091047f3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811681036159b05761590d906002959492951b6156d8565b936020850193839284518501935b84811061595d57505050505060039051068060011461594a5760021461593f575090565b603d90600019015390565b50603d9081600019820153600119015390565b8360049197929394959701918251600190603f9082828260121c16880101518453828282600c1c16880101518385015382828260061c16880101518885015316850101518682015301959392919061591b565b634e487b7160e01b600052601160045260246000fd5b506040516159d38161498a565b6000815290565b908151811015614b6c570160200190565b9081518151908181149384615a01575050505090565b60209293945082012092012014388080806157ad565b80615a2957506040516159d38161498a565b600a811015615a8e57615a3b9061570a565b614c2d602260405180937f2e300000000000000000000000000000000000000000000000000000000000006020830152615a7e8151809260208686019101614909565b81010360028101845201826149fa565b615a979061570a565b614c2d602160405180937f2e000000000000000000000000000000000000000000000000000000000000006020830152615ada8151809260208686019101614909565b81010360018101845201826149fa565b60405190615af7826149de565b601082527f68736c283233302c3231252c31312529000000000000000000000000000000006020830152565b8015615d5557615b31615aea565b906127109081039081116159b057614c2d91615b4f6101369261570a565b6040519485927f3c672066696c6c3d226e6f6e65223e000000000000000000000000000000000060208501527f3c636972636c652063783d22313636222063793d2235302220723d2232322220602f8501527f7374726f6b653d22000000000000000000000000000000000000000000000000604f850152615bdb815180926020605788019101614909565b83017f22207374726f6b652d77696474683d223130222f3e000000000000000000000060578201527f3c636972636c652063783d22313636222063793d2235302220706174684c656e606c8201527f6774683d2231303030302220723d22323222207374726f6b653d220000000000608c820152615c6382518093602060a785019101614909565b017f22207374726f6b652d6461736861727261793d22313030303022207374726f6b60a78201527f652d646173686f66667365743d2200000000000000000000000000000000000060c7820152615cc482518093602060d585019101614909565b017f22207374726f6b652d6c696e656361703d22726f756e6422207374726f6b652d60d58201527f77696474683d223522207472616e73666f726d3d22726f74617465282d39302960f58201527f22207472616e73666f726d2d6f726967696e3d22313636203530222f3e000000610115820152631e17b39f60e11b610132820152036101168101845201826149fa565b50506040516159d38161498a565b60306151f8919392936040519481615d85879351809260208087019101614909565b820164010714051160dd1b60208201526a029b0b13634b2b9102b19160ad1b6025820152615dbc8251809360208785019101614909565b010360108101855201836149fa565b60256151f8919392936040519481615ded879351809260208087019101614909565b820164010714051160dd1b6020820152615e108251809360208785019101614909565b010360058101855201836149fa565b60009080518015615e9557906000916000915b818310615e4457505050600d02900390565b909193603b60f81b7fff00000000000000000000000000000000000000000000000000000000000000615e7787856159da565b511614615e8d575b600d01936001019190615e32565b849350615e7f565b505050600090565b60009080518015615e9557906000916000915b818310615ec25750505060041b900390565b909193603b60f81b7fff00000000000000000000000000000000000000000000000000000000000000615ef587856159da565b511614615f0b575b601001936001019190615eb0565b849350615efd56fea164736f6c6343000817000a"; + + /*////////////////////////////////////////////////////////////////////////// + DEPLOYERS + //////////////////////////////////////////////////////////////////////////*/ + + /// @notice Deploys {SablierV2LockupDynamic} from precompiled bytecode, passing a default value for the + /// `maxSegmentCount` parameter. + /// @dev Notes: + /// - A default value is passed for `maxSegmentCount`. + /// - A dummy {SablierV2NFTDescriptor} is deployed so that the user does not have to provide one. + function deployLockupDynamic(address initialAdmin) public returns (ISablierV2LockupDynamic lockupDynamic) { + uint256 maxSegmentCount = MAX_COUNT; + lockupDynamic = deployLockupDynamic(initialAdmin, maxSegmentCount); + } + + /// @notice Deploys {SablierV2LockupDynamic} from precompiled bytecode. + /// @dev A dummy {SablierV2NFTDescriptor} is deployed so that the user does not have to provide one. + function deployLockupDynamic( + address initialAdmin, + uint256 maxSegmentCount + ) + public + returns (ISablierV2LockupDynamic lockupDynamic) + { + ISablierV2NFTDescriptor nftDescriptor = new SablierV2NFTDescriptor(); + lockupDynamic = deployLockupDynamic(initialAdmin, nftDescriptor, maxSegmentCount); + } + + /// @notice Deploys {SablierV2LockupDynamic} from precompiled bytecode. + /// @dev A default value is passed for `maxSegmentCount`. + function deployLockupDynamic( + address initialAdmin, + ISablierV2NFTDescriptor nftDescriptor + ) + public + returns (ISablierV2LockupDynamic lockupDynamic) + { + lockupDynamic = deployLockupDynamic(initialAdmin, nftDescriptor, MAX_COUNT); + } + + /// @notice Deploys {SablierV2LockupDynamic} from precompiled bytecode. + function deployLockupDynamic( + address initialAdmin, + ISablierV2NFTDescriptor nftDescriptor, + uint256 maxSegmentCount + ) + public + returns (ISablierV2LockupDynamic lockupDynamic) + { + bytes memory creationBytecode = + bytes.concat(BYTECODE_LOCKUP_DYNAMIC, abi.encode(initialAdmin, nftDescriptor, maxSegmentCount)); + assembly { + lockupDynamic := create(0, add(creationBytecode, 0x20), mload(creationBytecode)) + } + require( + address(lockupDynamic) != address(0), "Sablier V2 Precompiles: deployment failed for LockupDynamic contract" + ); + } + + /// @notice Deploys {SablierV2LockupLinear} from precompiled bytecode. + /// @dev A dummy {SablierV2NFTDescriptor} is deployed so that the user does not have to provide one. + function deployLockupLinear(address initialAdmin) public returns (ISablierV2LockupLinear lockupLinear) { + ISablierV2NFTDescriptor nftDescriptor = new SablierV2NFTDescriptor(); + lockupLinear = deployLockupLinear(initialAdmin, nftDescriptor); + } + + /// @notice Deploys {SablierV2LockupLinear} from precompiled bytecode. + function deployLockupLinear( + address initialAdmin, + ISablierV2NFTDescriptor nftDescriptor + ) + public + returns (ISablierV2LockupLinear lockupLinear) + { + bytes memory creationBytecode = bytes.concat(BYTECODE_LOCKUP_LINEAR, abi.encode(initialAdmin, nftDescriptor)); + assembly { + lockupLinear := create(0, add(creationBytecode, 0x20), mload(creationBytecode)) + } + require( + address(lockupLinear) != address(0), "Sablier V2 Precompiles: deployment failed for LockupLinear contract" + ); + } + + /// @notice Deploys {SablierV2LockupTranched} from precompiled bytecode, passing a default value for the + /// `maxTrancheCount` parameter. + /// @dev Notes: + /// - A default value is passed for `maxTrancheCount`. + /// - A dummy {SablierV2NFTDescriptor} is deployed so that the user does not have to provide one. + function deployLockupTranched(address initialAdmin) public returns (ISablierV2LockupTranched lockupTranched) { + uint256 maxTrancheCount = MAX_COUNT; + lockupTranched = deployLockupTranched(initialAdmin, maxTrancheCount); + } + + /// @notice Deploys {SablierV2LockupTranched} from precompiled bytecode. + /// @dev A dummy {SablierV2NFTDescriptor} is deployed so that the user does not have to provide one. + function deployLockupTranched( + address initialAdmin, + uint256 maxTrancheCount + ) + public + returns (ISablierV2LockupTranched lockupTranched) + { + ISablierV2NFTDescriptor nftDescriptor = new SablierV2NFTDescriptor(); + lockupTranched = deployLockupTranched(initialAdmin, nftDescriptor, maxTrancheCount); + } + + /// @notice Deploys {SablierV2LockupTranched} from precompiled bytecode. + /// @dev A default value is passed for `maxTrancheCount`. + function deployLockupTranched( + address initialAdmin, + ISablierV2NFTDescriptor nftDescriptor + ) + public + returns (ISablierV2LockupTranched lockupTranched) + { + lockupTranched = deployLockupTranched(initialAdmin, nftDescriptor, MAX_COUNT); + } + + /// @notice Deploys {SablierV2LockupTranched} from precompiled bytecode. + function deployLockupTranched( + address initialAdmin, + ISablierV2NFTDescriptor nftDescriptor, + uint256 maxTrancheCount + ) + public + returns (ISablierV2LockupTranched lockupTranched) + { + bytes memory creationBytecode = + bytes.concat(BYTECODE_LOCKUP_TRANCHED, abi.encode(initialAdmin, nftDescriptor, maxTrancheCount)); + assembly { + lockupTranched := create(0, add(creationBytecode, 0x20), mload(creationBytecode)) + } + require( + address(lockupTranched) != address(0), + "Sablier V2 Precompiles: deployment failed for LockupTranched contract" + ); + } + + /// @notice Deploys {SablierV2NFTDescriptor} from precompiled bytecode. + function deployNFTDescriptor() public returns (ISablierV2NFTDescriptor nftDescriptor) { + bytes memory bytecode = BYTECODE_NFT_DESCRIPTOR; + assembly { + nftDescriptor := create(0, add(bytecode, 0x20), mload(bytecode)) + } + require( + address(nftDescriptor) != address(0), "Sablier V2 Precompiles: deployment failed for NFTDescriptor contract" + ); + } + + /// @notice Deploys all V2 Core contracts in the following order: + /// + /// 1. {SablierV2NFTDescriptor} + /// 2. {SablierV2LockupDynamic} + /// 3. {SablierV2LockupLinear} + /// 4. {SablierV2LockupTranched} + function deployCore(address initialAdmin) + public + returns ( + ISablierV2LockupDynamic lockupDynamic, + ISablierV2LockupLinear lockupLinear, + ISablierV2LockupTranched lockupTranched, + ISablierV2NFTDescriptor nftDescriptor + ) + { + nftDescriptor = deployNFTDescriptor(); + lockupDynamic = deployLockupDynamic(initialAdmin); + lockupLinear = deployLockupLinear(initialAdmin); + lockupTranched = deployLockupTranched(initialAdmin); + } +} + + /// @notice Using precompiles, deploys the Sablier V2 core contracts in the following order: /// /// 1. {SablierV2NFTDescriptor} @@ -26,6 +217,6 @@ contract DeployCorePrecompiles is BaseScript { ISablierV2NFTDescriptor nftDescriptor ) { - // (lockupDynamic, lockupLinear, lockupTranched, nftDescriptor) = new Precompiles().deployCore(initialAdmin); + (lockupDynamic, lockupLinear, lockupTranched, nftDescriptor) = new Precompiles().deployCore(initialAdmin); } }