diff --git a/package.json b/package.json index afc3616ee8..9de3ed3842 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,7 @@ "integration:prerequisite": "ts-node packages/server/tests/helpers/prerequisite.ts" }, "dependencies": { + "@hashgraph/hedera-local": "^1.2.0", "@open-rpc/schema-utils-js": "^1.16.1", "@types/find-config": "^1.0.1", "keyv-file": "^0.2.0", diff --git a/packages/server/package.json b/packages/server/package.json index 8fd7007118..4be173a9cf 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -20,7 +20,7 @@ "pino-pretty": "^7.6.1" }, "devDependencies": { - "@hashgraph/hedera-local": "^1.2.0", + "@hashgraph/hedera-local": "^1.1.0", "@hashgraph/sdk": "^2.18.0", "@koa/cors": "^3.1.0", "@types/chai": "^4.3.0", diff --git a/packages/server/tests/acceptance/htsPrecompile.spec.ts b/packages/server/tests/acceptance/htsPrecompile.spec.ts index f8234f6c0a..5e42a30292 100644 --- a/packages/server/tests/acceptance/htsPrecompile.spec.ts +++ b/packages/server/tests/acceptance/htsPrecompile.spec.ts @@ -33,7 +33,7 @@ import BaseHTSJson from '../contracts/BaseHTS.json'; describe('HTS Precompile Acceptance Tests', async function () { this.timeout(240 * 1000); // 240 seconds - const { servicesNode, relay } = global; + const { servicesNode, mirrorNode, relay } = global; const TX_SUCCESS_CODE = 22; const TOKEN_NAME = 'tokenName'; @@ -216,7 +216,7 @@ describe('HTS Precompile Acceptance Tests', async function () { }); }); - describe('HTS Precompile Get Token Info Tests', async function() { + xdescribe('HTS Precompile Get Token Info Tests', async function() { it('should be able to get fungible token info', async () => { const tx = await baseHTSContract.getFungibleTokenInfoPublic(HTSTokenContractAddress); @@ -252,7 +252,7 @@ describe('HTS Precompile Acceptance Tests', async function () { }); }); - describe('HTS Precompile Freeze/Unfreeze Tests', async function() { + xdescribe('HTS Precompile Freeze/Unfreeze Tests', async function() { async function checkTokenFrozen(contractOwner, tokenAddress, expectedValue: boolean) { const txBefore = await contractOwner.isFrozenPublic(tokenAddress, accounts[0].wallet.address, { gasLimit: 1_000_000 }); const txBeforeReceipt = await txBefore.wait(); @@ -357,7 +357,7 @@ describe('HTS Precompile Acceptance Tests', async function () { }); }); - describe('HTS Precompile Pause/Unpause Tests', async function() { + xdescribe('HTS Precompile Pause/Unpause Tests', async function() { it('should be able to pause fungible token', async () => { const txTokenInfoBefore = await baseHTSContract.getTokenInfoPublic(HTSTokenContractAddress); @@ -510,7 +510,7 @@ describe('HTS Precompile Acceptance Tests', async function () { }); }); - describe('HTS Precompile KYC Tests', async function() { + xdescribe('HTS Precompile KYC Tests', async function() { async function checkKyc(contractOwner, tokenAddress, accountAddress, expectedValue: boolean) { const tx = await contractOwner.isKycPublic(tokenAddress, accountAddress, { gasLimit: 1_000_000 }); const responseCodeIsKyc = (await tx.wait()).events.filter(e => e.event === 'ResponseCode')[0].args.responseCode; @@ -566,7 +566,7 @@ describe('HTS Precompile Acceptance Tests', async function () { }); }); - describe('HTS Precompile Custom Fees Tests', async function() { + xdescribe('HTS Precompile Custom Fees Tests', async function() { it('should be able to get a custom token fees', async function() { const baseHTSContract = new ethers.Contract(BaseHTSContractAddress, BaseHTSJson.abi, accounts[0].wallet); @@ -586,6 +586,102 @@ describe('HTS Precompile Acceptance Tests', async function () { }); }); + describe('HTS Precompile Token Expiry Info Tests', async function() { + const AUTO_RENEW_PERIOD = 8000000; + const NEW_AUTO_RENEW_PERIOD = 7999900; + const AUTO_RENEW_SECOND = 0; + + //Expiry Info auto renew account returns account id from type - 0x000000000000000000000000000000000000048C + //We expect account to be evm address, but because we can't compute one address for the other, we have to make a mirror node query to get expiry info auto renew evm address + async function mirrorNodeAddressReq(address){ + const accountEvmAddress = await mirrorNode.get(`/accounts/${address}?transactiontype=cryptotransfer`); + return accountEvmAddress.evm_address; + } + + it('should be able to get and update fungible token expiry info', async function() { + //get current epoch + auto renew period , which result to expiry info second + const epoch = parseInt((Date.now()/1000 + NEW_AUTO_RENEW_PERIOD).toFixed(0)); + + // get current expiry info + const getTokenExpiryInfoTxBefore = await baseHTSContract.getTokenExpiryInfoPublic(HTSTokenContractAddress); + const responseCode = (await getTokenExpiryInfoTxBefore.wait()).events.filter(e => e.event === 'ResponseCode')[0].args.responseCode; + const tokenExpiryInfoBefore = (await getTokenExpiryInfoTxBefore.wait()).events.filter(e => e.event === 'TokenExpiryInfo')[0].args.expiryInfo; + + const renewAccountEvmAddress = await mirrorNodeAddressReq(tokenExpiryInfoBefore.autoRenewAccount); + + expect(responseCode).to.equal(TX_SUCCESS_CODE); + expect(tokenExpiryInfoBefore.autoRenewPeriod).to.equal(AUTO_RENEW_PERIOD); + expect(renewAccountEvmAddress).to.equal(`0x${accounts[0].address}`); + + const expiryInfo = { + second: AUTO_RENEW_SECOND, + autoRenewAccount: `${BaseHTSContractAddress}`, + autoRenewPeriod: NEW_AUTO_RENEW_PERIOD + }; + // update expiry info + const updateTokenExpiryInfoTx = (await baseHTSContract.updateTokenExpiryInfoPublic(HTSTokenContractAddress, expiryInfo, { gasLimit: 1_000_000 })); + const updateExpiryInfoResponseCode = (await updateTokenExpiryInfoTx.wait()).events.filter(e => e.event === 'ResponseCode')[0].args.responseCode; + + // get updated expiryInfo + const getTokenExpiryInfoTxAfter = (await baseHTSContract.getTokenExpiryInfoPublic(HTSTokenContractAddress)); + const getExpiryInfoResponseCode = (await getTokenExpiryInfoTxAfter.wait()).events.filter(e => e.event === 'ResponseCode')[0].args.responseCode; + const tokenExpiryInfoAfter = (await getTokenExpiryInfoTxAfter.wait()).events.filter(e => e.event === 'TokenExpiryInfo')[0].args.expiryInfo; + + const newRenewAccountEvmAddress = await mirrorNodeAddressReq(tokenExpiryInfoAfter.autoRenewAccount); + const expectedRenewAddress = `0x${BaseHTSContractAddress.substring(2).toUpperCase()}`; + + expect(updateExpiryInfoResponseCode).to.equal(TX_SUCCESS_CODE); + expect(getExpiryInfoResponseCode).to.equal(TX_SUCCESS_CODE); + expect(tokenExpiryInfoAfter.autoRenewPeriod).to.equal(expiryInfo.autoRenewPeriod); + expect(newRenewAccountEvmAddress).to.equal(expectedRenewAddress); + + //use close to with delta 200 seconds, because we don't know the exact second it was set to expiry + expect(tokenExpiryInfoAfter.second).to.be.closeTo(epoch, 200); + }); + + it('should be able to get and update non fungible token expiry info', async function() { + //get current epoch + auto renew period , which result to expiry info second + const epoch = parseInt((Date.now()/1000 + NEW_AUTO_RENEW_PERIOD).toFixed(0)); + // get current expiry info + const getTokenExpiryInfoTxBefore = (await baseHTSContract.getTokenExpiryInfoPublic(NftHTSTokenContractAddress)); + const responseCode = (await getTokenExpiryInfoTxBefore.wait()).events.filter(e => e.event === 'ResponseCode')[0].args.responseCode; + const tokenExpiryInfoBefore = (await getTokenExpiryInfoTxBefore.wait()).events.filter(e => e.event === 'TokenExpiryInfo')[0].args.expiryInfo; + + //Expiry Info auto renew account returns account id from type - 0x000000000000000000000000000000000000048C + //We expect account to be evm address, but because we can't compute one address for the other, we have to make a mirror node query to get expiry info auto renew evm address + const renewAccountEvmAddress = await mirrorNodeAddressReq(tokenExpiryInfoBefore.autoRenewAccount); + + expect(responseCode).to.equal(TX_SUCCESS_CODE); + expect(tokenExpiryInfoBefore.autoRenewPeriod).to.equal(8000000); + expect(renewAccountEvmAddress).to.equal(`0x${accounts[0].address}`); + + // update expiry info + const expiryInfo = { + second: AUTO_RENEW_SECOND, + autoRenewAccount: BaseHTSContractAddress, + autoRenewPeriod: NEW_AUTO_RENEW_PERIOD + } + const updateTokenExpiryInfoTx = (await baseHTSContract.updateTokenExpiryInfoPublic(NftHTSTokenContractAddress, expiryInfo, { gasLimit: 1_000_000 })); + const updateExpiryInfoResponseCode = (await updateTokenExpiryInfoTx.wait()).events.filter(e => e.event === 'ResponseCode')[0].args.responseCode; + + // get updated expiryInfo + const getTokenExpiryInfoTxAfter = (await baseHTSContract.getTokenExpiryInfoPublic(NftHTSTokenContractAddress)); + const getExpiryInfoResponseCode = (await getTokenExpiryInfoTxAfter.wait()).events.filter(e => e.event === 'ResponseCode')[0].args.responseCode; + const tokenExpiryInfoAfter = (await getTokenExpiryInfoTxAfter.wait()).events.filter(e => e.event === 'TokenExpiryInfo')[0].args.expiryInfo; + + const newRenewAccountEvmAddress = await mirrorNodeAddressReq(tokenExpiryInfoAfter.autoRenewAccount); + const expectedRenewAddress = `0x${BaseHTSContractAddress.substring(2).toUpperCase()}`; + + expect(updateExpiryInfoResponseCode).to.equal(TX_SUCCESS_CODE); + expect(getExpiryInfoResponseCode).to.equal(TX_SUCCESS_CODE); + expect(tokenExpiryInfoAfter.autoRenewPeriod).to.equal(expiryInfo.autoRenewPeriod); + expect(newRenewAccountEvmAddress).to.equal(expectedRenewAddress); + + //use close to with delta 200 seconds, because we don't know the exact second it was set to expiry + expect(tokenExpiryInfoAfter.second).to.be.closeTo(epoch, 200); + }); + }); + describe('HTS Precompile Delete Token Tests', async function() { it('should be able to delete a token', async function() { const createdTokenAddress = await createHTSToken(); diff --git a/packages/server/tests/acceptance/index.spec.ts b/packages/server/tests/acceptance/index.spec.ts index ff93a913be..694acd6fc9 100644 --- a/packages/server/tests/acceptance/index.spec.ts +++ b/packages/server/tests/acceptance/index.spec.ts @@ -72,8 +72,7 @@ describe('RPC Server Acceptance Tests', function () { logger.info(`OPERATOR_ID_MAIN: ${process.env.OPERATOR_ID_MAIN}`); logger.info(`MIRROR_NODE_URL: ${process.env.MIRROR_NODE_URL}`); logger.info(`E2E_RELAY_HOST: ${process.env.E2E_RELAY_HOST}`); - - + if (USE_LOCAL_NODE === 'true') { runLocalHederaNetwork(); } @@ -95,7 +94,7 @@ describe('RPC Server Acceptance Tests', function () { if (USE_LOCAL_NODE === 'true') { // stop local-node logger.info('Shutdown local node'); - shell.exec('npx hedera stop'); + shell.exec('hedera stop'); } // stop relay @@ -116,14 +115,23 @@ describe('RPC Server Acceptance Tests', function () { function runLocalHederaNetwork() { // set env variables for docker images until local-node is updated - process.env['NETWORK_NODE_IMAGE_TAG'] = '0.30.0-alpha.0'; - process.env['HAVEGED_IMAGE_TAG'] = '0.30.0-alpha.0'; - process.env['MIRROR_IMAGE_TAG'] = '0.64.0'; + process.env['NETWORK_NODE_IMAGE_TAG'] = '0.30.0-alpha.1'; + process.env['HAVEGED_IMAGE_TAG'] = '0.30.0-alpha.1'; + process.env['MIRROR_IMAGE_TAG'] = '0.64.0-beta2'; + logger.trace(`Docker container versions, services: ${process.env['NETWORK_NODE_IMAGE_TAG']}, mirror: ${process.env['MIRROR_IMAGE_TAG']}`); // start local-node + + logger.debug('Installing local node...'); + shell.exec(`npm install @hashgraph/hedera-local && hedera stop`); + + logger.debug('Turning on compression...'); + shell.exec(`echo 'hedera.recordStream.compressFilesOnCreation=true' >> node_modules/@hashgraph/hedera-local/compose-network/network-node/data/config/bootstrap.properties`); + shell.exec(`sed -i 's/ STREAM_EXTENSION: "rcd"/ STREAM_EXTENSION: "rcd.gz"/' node_modules/@hashgraph/hedera-local/docker-compose.yml`); + logger.debug('Start local node'); - shell.exec('npx hedera restart'); + shell.exec(`hedera start -d`); logger.trace('Hedera Hashgraph local node env started'); } diff --git a/packages/server/tests/contracts/BaseHTS.json b/packages/server/tests/contracts/BaseHTS.json index a51074eabb..6f278cf47b 100644 --- a/packages/server/tests/contracts/BaseHTS.json +++ b/packages/server/tests/contracts/BaseHTS.json @@ -833,6 +833,36 @@ "name": "TokenDefaultKycStatus", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "components": [ + { + "internalType": "uint32", + "name": "second", + "type": "uint32" + }, + { + "internalType": "address", + "name": "autoRenewAccount", + "type": "address" + }, + { + "internalType": "uint32", + "name": "autoRenewPeriod", + "type": "uint32" + } + ], + "indexed": false, + "internalType": "struct IHederaTokenService.Expiry", + "name": "expiryInfo", + "type": "tuple" + } + ], + "name": "TokenExpiryInfo", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -2149,6 +2179,88 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + } + ], + "name": "getTokenExpiryInfo", + "outputs": [ + { + "internalType": "int256", + "name": "responseCode", + "type": "int256" + }, + { + "components": [ + { + "internalType": "uint32", + "name": "second", + "type": "uint32" + }, + { + "internalType": "address", + "name": "autoRenewAccount", + "type": "address" + }, + { + "internalType": "uint32", + "name": "autoRenewPeriod", + "type": "uint32" + } + ], + "internalType": "struct IHederaTokenService.Expiry", + "name": "expiryInfo", + "type": "tuple" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + } + ], + "name": "getTokenExpiryInfoPublic", + "outputs": [ + { + "internalType": "int256", + "name": "responseCode", + "type": "int256" + }, + { + "components": [ + { + "internalType": "uint32", + "name": "second", + "type": "uint32" + }, + { + "internalType": "address", + "name": "autoRenewAccount", + "type": "address" + }, + { + "internalType": "uint32", + "name": "autoRenewPeriod", + "type": "uint32" + } + ], + "internalType": "struct IHederaTokenService.Expiry", + "name": "expiryInfo", + "type": "tuple" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -2880,6 +2992,88 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "components": [ + { + "internalType": "uint32", + "name": "second", + "type": "uint32" + }, + { + "internalType": "address", + "name": "autoRenewAccount", + "type": "address" + }, + { + "internalType": "uint32", + "name": "autoRenewPeriod", + "type": "uint32" + } + ], + "internalType": "struct IHederaTokenService.Expiry", + "name": "expiryInfo", + "type": "tuple" + } + ], + "name": "updateTokenExpiryInfo", + "outputs": [ + { + "internalType": "int256", + "name": "responseCode", + "type": "int256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "components": [ + { + "internalType": "uint32", + "name": "second", + "type": "uint32" + }, + { + "internalType": "address", + "name": "autoRenewAccount", + "type": "address" + }, + { + "internalType": "uint32", + "name": "autoRenewPeriod", + "type": "uint32" + } + ], + "internalType": "struct IHederaTokenService.Expiry", + "name": "expiryInfo", + "type": "tuple" + } + ], + "name": "updateTokenExpiryInfoPublic", + "outputs": [ + { + "internalType": "int256", + "name": "responseCode", + "type": "int256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -2939,8 +3133,8 @@ "type": "function" } ], - "bytecode": "0x60c06040526009608081905268746f6b656e4e616d6560b81b60a09081526200002c9160019190620000cb565b5060408051808201909152600b8082526a1d1bdad95b94de5b589bdb60aa1b60209092019182526200006191600291620000cb565b50604080518082019091526004808252636d656d6f60e01b60209092019182526200008f91600391620000cb565b506103e860048190556005805463ffffffff1916909117905560086006556007805460ff19169055348015620000c457600080fd5b50620001ae565b828054620000d99062000171565b90600052602060002090601f016020900481019282620000fd576000855562000148565b82601f106200011857805160ff191683800117855562000148565b8280016001018555821562000148579182015b82811115620001485782518255916020019190600101906200012b565b50620001569291506200015a565b5090565b5b808211156200015657600081556001016200015b565b600181811c908216806200018657607f821691505b60208210811415620001a857634e487b7160e01b600052602260045260246000fd5b50919050565b6155cf80620001be6000396000f3fe60806040526004361061026a5760003560e01c80637d3e5da811610153578063d85f74c1116100cb578063f4a01e5b1161007f578063f848fec411610064578063f848fec41461075a578063f9e978bd1461077a578063fdc8321e1461079a57600080fd5b8063f4a01e5b1461071a578063f7be34251461073a57600080fd5b8063f25b1200116100b0578063f25b1200146106ac578063f2c31ff4146106cc578063f2f38a74146106ec57600080fd5b8063d85f74c114610679578063d92ac2481461068c57600080fd5b80638f8d7f9911610122578063a345f7bd11610107578063a345f7bd146105ff578063a3ad5b551461061f578063af99c6331461065957600080fd5b80638f8d7f99146105bf5780639604ca65146105df57600080fd5b80637d3e5da81461053d5780638070905f1461055d57806386f88d881461058c5780638ba74da0146105ac57600080fd5b80634ba67035116101e65780635b9076b7116101b55780636a4dde211161019a5780636a4dde21146104dd5780636da6b1f0146104fd5780637c41ad2c1461051d57600080fd5b80635b9076b71461047f57806369837dc2146104af57600080fd5b80634ba67035146103dc5780634cbdb37b146103fc57806356af84031461042a5780635a5e6c311461044a57600080fd5b80632d73bb2e1161023d5780633b3bff0f116102225780633b3bff0f146103875780633eed2c39146103a75780634b5c6687146103c757600080fd5b80632d73bb2e146103475780632eecbca31461036757600080fd5b80630fd2601e1461026f57806313c05dd8146102a757806319db44b6146102dc5780632b256ec814610319575b600080fd5b34801561027b57600080fd5b5061028f61028a366004613821565b6107ba565b60405160079190910b81526020015b60405180910390f35b3480156102b357600080fd5b506102c76102c236600461385a565b61087e565b6040805192835290151560208301520161029e565b3480156102e857600080fd5b506102fc6102f73660046138a5565b6108fc565b604080519283526001600160a01b0390911660208301520161029e565b34801561032557600080fd5b506103396103343660046138d1565b610980565b60405190815260200161029e565b34801561035357600080fd5b50610339610362366004613821565b610a6c565b34801561037357600080fd5b5061028f610382366004613821565b610ab1565b34801561039357600080fd5b506103396103a23660046138d1565b610ae8565b3480156103b357600080fd5b506102c76103c23660046138d1565b610bc2565b6103da6103d53660046138d1565b610c3c565b005b3480156103e857600080fd5b506103396103f73660046138fd565b610ffc565b34801561040857600080fd5b5061041c610417366004613959565b611048565b60405161029e929190613e7f565b34801561043657600080fd5b50610339610445366004613fb9565b6110be565b34801561045657600080fd5b5061046a61046536600461385a565b611108565b6040805192835260208301919091520161029e565b34801561048b57600080fd5b5061049f61049a3660046138d1565b611179565b60405161029e949392919061407f565b3480156104bb57600080fd5b506104cf6104ca3660046138d1565b61120b565b60405161029e9291906140fb565b3480156104e957600080fd5b506102c76104f8366004613821565b611280565b34801561050957600080fd5b506103396105183660046138fd565b6112f7565b34801561052957600080fd5b506103396105383660046138d1565b611305565b34801561054957600080fd5b50610339610558366004613821565b611333565b34801561056957600080fd5b5061057d610578366004614152565b61133f565b60405161029e9392919061429b565b34801561059857600080fd5b506102c76105a73660046138d1565b6113c7565b6103da6105ba366004613821565b611438565b3480156105cb57600080fd5b5061028f6105da366004613821565b6118ca565b3480156105eb57600080fd5b506103396105fa3660046142cd565b6119ad565b34801561060b57600080fd5b5061033961061a3660046138d1565b6119e2565b34801561062b57600080fd5b5061063f61063a366004613821565b611a28565b6040805160079390930b835290151560208301520161029e565b34801561066557600080fd5b5061028f610674366004613821565b611b1a565b6103da6106873660046138d1565b611b50565b34801561069857600080fd5b506103396106a7366004614354565b611ee8565b3480156106b857600080fd5b506103396106c73660046143a2565b611ef5565b3480156106d857600080fd5b5061063f6106e7366004613821565b611f02565b3480156106f857600080fd5b5061070c6107073660046138d1565b611fef565b60405161029e9291906143e2565b34801561072657600080fd5b50610339610735366004613821565b612064565b34801561074657600080fd5b506103396107553660046138d1565b612070565b34801561076657600080fd5b506103396107753660046143fb565b612153565b34801561078657600080fd5b506103da61079536600461443c565b612160565b3480156107a657600080fd5b506103396107b5366004614459565b6121ad565b604051638f8d7f9960e01b81526001600160a01b038084166004830152821660248201526000903090638f8d7f99906044015b602060405180830381600087803b15801561080757600080fd5b505af115801561081b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061083f91906144a4565b604051600782900b815290915060008051602061557a8339815191529060200160405180910390a1600781900b60161461087857600080fd5b92915050565b60008061088c858585612384565b604051828152919350915060008051602061557a8339815191529060200160405180910390a1601682146108bf57600080fd5b60405181151581527e1c2e72360171244b3bb8cc8ddd767820edf37138ad6f129fb3574b407c307d906020015b60405180910390a1935093915050565b6000806109098484612483565b604051828152919350915060008051602061557a8339815191529060200160405180910390a16016821461093c57600080fd5b6040516001600160a01b03821681527fc2c78c7c31baf14949e75c51df12be56edb9af523cf82839c2869bbcf13b3ecb906020015b60405180910390a19250929050565b604051631f106b4b60e21b81526001600160a01b03821660048201526000903090637c41ad2c90602401602060405180830381600087803b1580156109c457600080fd5b505af11580156109d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109fc91906144c1565b905060008051602061557a83398151915281604051610a1d91815260200190565b60405180910390a160168114610a3257600080fd5b604051600181527f0c9c765845f4d139956bb8fc8decb2eec6093c9c608b809641b16054b29f0e13906020015b60405180910390a1919050565b6000610a788383612563565b60070b905060008051602061557a83398151915281604051610a9c91815260200190565b60405180910390a16016811461087857600080fd5b60405163af99c63360e01b81526001600160a01b03808416600483015282166024820152600090309063af99c633906044016107ed565b6040516001600160a01b03821660248201526000908190819061016790633b3bff0f60e01b906044015b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051610b5091906144da565b6000604051808303816000865af19150503d8060008114610b8d576040519150601f19603f3d011682016040523d82523d6000602084013e610b92565b606091505b509150915081610ba3576015610bb7565b80806020019051810190610bb79190614508565b60030b949350505050565b600080610bce836125b2565b604051828152919350915060008051602061557a8339815191529060200160405180910390a160168214610c0157600080fd5b60405181151581527f6b7f3306751292f85ab4161ee2b0ac16dfc8ded13e6446ce6bd859d0a2f4c78e906020015b60405180910390a1915091565b60408051600480825260a08201909252600091816020015b610c5c613693565b815260200190600190039081610c54579050509050610c8f600060066001604051806020016040528060008152506126af565b81600081518110610ca257610ca2614523565b6020026020010181905250610cc8600180604051806020016040528060008152506126e6565b81600181518110610cdb57610cdb614523565b6020026020010181905250610d0260026001604051806020016040528060008152506126e6565b81600281518110610d1557610d15614523565b6020026020010181905250610d3c60036001604051806020016040528060008152506126e6565b81600381518110610d4f57610d4f614523565b602002602001018190525060006040518060600160405280600063ffffffff168152602001846001600160a01b03168152602001627a120063ffffffff168152509050600060405180610120016040528060018054610dad90614539565b80601f0160208091040260200160405190810160405280929190818152602001828054610dd990614539565b8015610e265780601f10610dfb57610100808354040283529160200191610e26565b820191906000526020600020905b815481529060010190602001808311610e0957829003601f168201915b5050505050815260200160028054610e3d90614539565b80601f0160208091040260200160405190810160405280929190818152602001828054610e6990614539565b8015610eb65780601f10610e8b57610100808354040283529160200191610eb6565b820191906000526020600020905b815481529060010190602001808311610e9957829003601f168201915b50505050508152602001856001600160a01b0316815260200160038054610edc90614539565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0890614539565b8015610f555780601f10610f2a57610100808354040283529160200191610f55565b820191906000526020600020905b815481529060010190602001808311610f3857829003601f168201915b50505091835250506001602082015260055463ffffffff16604082015260075460ff16151560608201526080810185905260a0018390526004546006549192506000918291610fa69185919061271b565b909250905060168214610fb857600080fd5b6040516001600160a01b03821681527f7bb17726df1f3adee8aa00ba8e8bc5d6f182af3bbf77604639cb7f008dd3b4ed9060200160405180910390a1505050505050565b600061100a85858585612849565b905060008051602061557a8339815191528160405161102b91815260200190565b60405180910390a16016811461104057600080fd5b949350505050565b60006110526136f0565b61105c8484612959565b604051828152919350915060008051602061557a8339815191529060200160405180910390a16016821461108f57600080fd5b7fa516f81c528634d0fc1e993bba1d227231b4bd6d1beb72d33b056a6199c0f988816040516109719190614574565b60006110cb848484612a4c565b905060008051602061557a833981519152816040516110ec91815260200190565b60405180910390a16016811461110157600080fd5b9392505050565b600080611116858585612b2c565b604051828152919350915060008051602061557a8339815191529060200160405180910390a16016821461114957600080fd5b6040518181527f25b6684a7e8fe1b676e9c39c8dd65034fbafea906d3bdfd97bf748b7b55e14c8906020016108ec565b6000606080606061118985612c18565b604051600785900b81529397509195509350915060008051602061557a8339815191529060200160405180910390a1600784900b6016146111c957600080fd5b7f2efc8334b040613a552197fe34283d6ca2909c8ffae393e128424931f20c69b38383836040516111fc93929190614587565b60405180910390a19193509193565b600061121561372b565b61121e83612d18565b604051828152919350915060008051602061557a8339815191529060200160405180910390a16016821461125157600080fd5b7f476a9a9b28e2717d55288b2ae3c48a72aac52b11f8bd855017c9d41d9fc1896481604051610c2f91906145c0565b60008061128d8484612e01565b60405160079290920b8083529350915060008051602061557a8339815191529060200160405180910390a1601682146112c557600080fd5b60405181151581527f59800d968fcce138300a0019410b4b75041610d65b3cdc5f31656b03ed14912e90602001610971565b600061100a85858585612e52565b6040516001600160a01b03821660248201526000908190819061016790631f106b4b60e21b90604401610b12565b6000610a788383612eb3565b600080606061134f868686612f02565b604051838152929550909350915060008051602061557a8339815191529060200160405180910390a16016831461138557600080fd5b7feff23992f47b3c101679f8b4dc9d3e242c903909dba4a453f2b2341ad463b0e282826040516113b69291906145d3565b60405180910390a193509350939050565b6000806113d383613000565b604051828152919350915060008051602061557a8339815191529060200160405180910390a16016821461140657600080fd5b60405181151581527f9ee19e13dfa1ba8db2502e15ff56dbecdeb0e0473323fb195473ce648030a2cd90602001610c2f565b604080516001808252818301909252600091816020015b611457613693565b81526020019060019003908161144f5790505090506114896000806001604051806020016040528060008152506126af565b8160008151811061149c5761149c614523565b602002602001018190525060006040518060600160405280600063ffffffff168152602001856001600160a01b03168152602001627a120063ffffffff1681525090506000604051806101200160405280600180546114fa90614539565b80601f016020809104026020016040519081016040528092919081815260200182805461152690614539565b80156115735780601f1061154857610100808354040283529160200191611573565b820191906000526020600020905b81548152906001019060200180831161155657829003601f168201915b505050505081526020016002805461158a90614539565b80601f01602080910402602001604051908101604052809291908181526020018280546115b690614539565b80156116035780601f106115d857610100808354040283529160200191611603565b820191906000526020600020905b8154815290600101906020018083116115e657829003601f168201915b50505050508152602001866001600160a01b031681526020016003805461162990614539565b80601f016020809104026020016040519081016040528092919081815260200182805461165590614539565b80156116a25780601f10611677576101008083540402835291602001916116a2565b820191906000526020600020905b81548152906001019060200180831161168557829003601f168201915b505050918352505060016020820181905260055463ffffffff166040808401919091526000606084018190526080840188905260a09093018690528051828152808201909152929350909190816020015b6040805160a0810182526000808252602080830182905292820181905260608201819052608082015282526000199092019101816116f35750506040805160a081018252600181526001600160a01b0388811660208301526000928201839052606082018390528916608082015282519293509183919061177657611776614523565b6020908102919091010152604080516001808252818301909252600091816020015b6040805160c08101825260008082526020808301829052928201819052606082018190526080820181905260a082015282526000199092019101816117985750506040805160c0810182526004815260056020820152600a91810191909152601e60608201526000608082018190526001600160a01b038a1660a08301528251929350909183919061182c5761182c614523565b602002602001018190525060008061184b856004546006548787613049565b9150915060008051602061557a8339815191528260405161186e91815260200190565b60405180910390a16016821461188357600080fd5b6040516001600160a01b03821681527f7bb17726df1f3adee8aa00ba8e8bc5d6f182af3bbf77604639cb7f008dd3b4ed9060200160405180910390a1505050505050505050565b6040516001600160a01b038381166024830152821660448201526000908190819061016790638f8d7f9960e01b906064015b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905161193a91906144da565b6000604051808303816000865af19150503d8060008114611977576040519150601f19603f3d011682016040523d82523d6000602084013e61197c565b606091505b50915091508161198d5760156119a1565b808060200190518101906119a19190614508565b60030b95945050505050565b60006119c16119bc83856146a5565b61317d565b905060008051602061557a83398151915281604051610a9c91815260200190565b60006119ed826131a7565b905060008051602061557a83398151915281604051611a0e91815260200190565b60405180910390a160168114611a2357600080fd5b919050565b604051633cb0c7fd60e21b81526001600160a01b038084166004830152821660248201526000908190309063f2c31ff4906044016040805180830381600087803b158015611a7557600080fd5b505af1158015611a89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aad919061481d565b604051600783900b8152919350915060008051602061557a8339815191529060200160405180910390a1600782900b601614611ae857600080fd5b60405181151581527fd24dda6928587354b65aa1a18c2eaf249bef7e5bafd2a71fac71d286f76f957f90602001610971565b6040516001600160a01b03838116602483015282166044820152600090819081906101679063af99c63360e01b906064016118fc565b60408051600580825260c08201909252600091816020015b611b70613693565b815260200190600190039081611b68579050509050611ba3600060066001604051806020016040528060008152506126af565b81600081518110611bb657611bb6614523565b6020026020010181905250611bdc600180604051806020016040528060008152506126e6565b81600181518110611bef57611bef614523565b6020026020010181905250611c1660026001604051806020016040528060008152506126e6565b81600281518110611c2957611c29614523565b6020026020010181905250611c5060046001604051806020016040528060008152506126e6565b81600381518110611c6357611c63614523565b6020026020010181905250611c8a60036001604051806020016040528060008152506126e6565b81600481518110611c9d57611c9d614523565b602002602001018190525060006040518060600160405280600063ffffffff168152602001846001600160a01b03168152602001627a120063ffffffff168152509050600060405180610120016040528060018054611cfb90614539565b80601f0160208091040260200160405190810160405280929190818152602001828054611d2790614539565b8015611d745780601f10611d4957610100808354040283529160200191611d74565b820191906000526020600020905b815481529060010190602001808311611d5757829003601f168201915b5050505050815260200160028054611d8b90614539565b80601f0160208091040260200160405190810160405280929190818152602001828054611db790614539565b8015611e045780601f10611dd957610100808354040283529160200191611e04565b820191906000526020600020905b815481529060010190602001808311611de757829003601f168201915b50505050508152602001856001600160a01b0316815260200160038054611e2a90614539565b80601f0160208091040260200160405190810160405280929190818152602001828054611e5690614539565b8015611ea35780601f10611e7857610100808354040283529160200191611ea3565b820191906000526020600020905b815481529060010190602001808311611e8657829003601f168201915b50505091835250506001602082015260055463ffffffff16604082015260075460ff16151560608201526080810185905260a0018390529050600080610fa6836131ee565b60006110cb8484846132d8565b60006110cb848484613333565b6040516001600160a01b0383811660248301528216604482015260009081908190819061016790633cb0c7fd60e21b906064015b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051611f7491906144da565b6000604051808303816000865af19150503d8060008114611fb1576040519150601f19603f3d011682016040523d82523d6000602084013e611fb6565b606091505b509150915081611fc95760156000611fdd565b80806020019051810190611fdd919061484c565b60039190910b97909650945050505050565b6000611ff961374b565b6120028361338a565b604051828152919350915060008051602061557a8339815191529060200160405180910390a16016821461203557600080fd5b7f528c7dcea75f0c9e110a038e50647cd6a70ac06d331399b77dd9a80f903ebc1681604051610c2f9190614878565b60006119c18383613473565b604051633b3bff0f60e01b81526001600160a01b03821660048201526000903090633b3bff0f90602401602060405180830381600087803b1580156120b457600080fd5b505af11580156120c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120ec91906144c1565b905060008051602061557a8339815191528160405161210d91815260200190565b60405180910390a16016811461212257600080fd5b604051600181527f319ab7084208e4afa38c6e6ff7aea9587439f2e4700746f4c7d425fea17426d290602001610a5f565b60006110cb8484846134c2565b6007805460ff191682151590811790915560405160ff909116151581527f457c3a16a0ebdc38e3675609957ca3fcc4490e220bd15d85d34f58e2e145cb089060200160405180910390a150565b604080516000808252602082019092528190816121f2565b60408051606081018252600080825260208083018290529282015282526000199092019101816121c55790505b50905060006040518060400160405280336001600160a01b031681526020018561221b9061488b565b600790810b9091526040805180820182526001600160a01b038a1681529187900b602083015280516002808252606082019092529293509091600091816020015b604080518082019091526000808252602082015281526020019060019003908161225c579050509050828160008151811061229957612299614523565b602002602001018190525081816001815181106122b8576122b8614523565b602090810291909101810191909152604080516060810182526001600160a01b038a16815291820183905281810186905280516001808252818301909252600091816020015b61232b604051806060016040528060006001600160a01b0316815260200160608152602001606081525090565b8152602001906001900390816122fe579050509050818160008151811061235457612354614523565b60200260200101819052506123688161317d565b96506016871461237757600080fd5b5050505050509392505050565b604080516001600160a01b0385811660248301528481166044830152831660648083019190915282518083039091018152608490910182526020810180516001600160e01b03167ff49f40db00000000000000000000000000000000000000000000000000000000179052905160009182918291829161016791612407916144da565b6000604051808303816000865af19150503d8060008114612444576040519150601f19603f3d011682016040523d82523d6000602084013e612449565b606091505b50915091508161245c5760156000612470565b80806020019051810190612470919061484c565b60039190910b9890975095505050505050565b604080516001600160a01b0384166024820152604480820184905282518083039091018152606490910182526020810180516001600160e01b03167f098f2366000000000000000000000000000000000000000000000000000000001790529051600091829182918291610167916124fa916144da565b6000604051808303816000865af19150503d8060008114612537576040519150601f19603f3d011682016040523d82523d6000602084013e61253c565b606091505b50915091508161254f5760156000611fdd565b80806020019051810190611fdd91906148c1565b6040516001600160a01b0383811660248301528216604482015260009081908190610167907f52f9138700000000000000000000000000000000000000000000000000000000906064016118fc565b6040516001600160a01b0382166024820152600090819081908190610167907fa7daa18d00000000000000000000000000000000000000000000000000000000906044015b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905161263591906144da565b6000604051808303816000865af19150503d8060008114612672576040519150601f19603f3d011682016040523d82523d6000602084013e612677565b606091505b50915091508161268a576015600061269e565b8080602001905181019061269e919061484c565b60039190910b969095509350505050565b6126b7613693565b60405180604001604052806126cc8787613518565b81526020016126db8585613531565b905295945050505050565b6126ee613693565b604051806040016040528061270286613601565b81526020016127118585613531565b9052949350505050565b600080848061010001516000015163ffffffff16600014801561274b57506101008101516040015163ffffffff16155b15612761576101008101516276a7006040909101525b6000806101676001600160a01b031634637812a04b60e01b8a8a8a60405160240161278e939291906148ed565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516127cc91906144da565b60006040518083038185875af1925050503d8060008114612809576040519150601f19603f3d011682016040523d82523d6000602084013e61280e565b606091505b5091509150816128215760156000612835565b8080602001905181019061283591906148c1565b60039190910b999098509650505050505050565b6040516001600160a01b038581166024830152848116604483015283166064820152600782900b608482015260009081908190610167907feca36917000000000000000000000000000000000000000000000000000000009060a4015b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516128e491906144da565b6000604051808303816000865af19150503d8060008114612921576040519150601f19603f3d011682016040523d82523d6000602084013e612926565b606091505b50915091508161293757601561294b565b8080602001905181019061294b9190614508565b60030b979650505050505050565b60006129636136f0565b604080516001600160a01b0386166024820152600785900b60448083019190915282518083039091018152606490910182526020810180516001600160e01b03167f287e1da80000000000000000000000000000000000000000000000000000000017905290516000918291610167916129dc916144da565b6000604051808303816000865af19150503d8060008114612a19576040519150601f19603f3d011682016040523d82523d6000602084013e612a1e565b606091505b5091509150612a2b6136f0565b82612a3857601581612470565b818060200190518101906124709190614fe2565b60008060006101676001600160a01b031663f7f38e2660e01b878787604051602401612a7a939291906150ca565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051612ab891906144da565b6000604051808303816000865af19150503d8060008114612af5576040519150601f19603f3d011682016040523d82523d6000602084013e612afa565b606091505b509150915081612b0b576015612b1f565b80806020019051810190612b1f9190614508565b60030b9695505050505050565b604080516001600160a01b0385811660248301528481166044830152831660648083019190915282518083039091018152608490910182526020810180516001600160e01b03167f927da10500000000000000000000000000000000000000000000000000000000179052905160009182918291829161016791612baf916144da565b6000604051808303816000865af19150503d8060008114612bec576040519150601f19603f3d011682016040523d82523d6000602084013e612bf1565b606091505b509150915081612c045760156000612470565b8080602001905181019061247091906150f6565b604080516001600160a01b03831660248083019190915282518083039091018152604490910182526020810180516001600160e01b03167fae7611a0000000000000000000000000000000000000000000000000000000001790529051600091606091829182918591829161016791612c90916144da565b6000604051808303816000865af19150503d8060008114612ccd576040519150601f19603f3d011682016040523d82523d6000602084013e612cd2565b606091505b5091509150606080606084612ceb576015838383612cff565b83806020019051810190612cff9190615122565b60039390930b9d919c509a509098509650505050505050565b6000612d2261372b565b604080516001600160a01b03851660248083019190915282518083039091018152604490910182526020810180516001600160e01b03167f3f28a19b000000000000000000000000000000000000000000000000000000001790529051600091829161016791612d91916144da565b6000604051808303816000865af19150503d8060008114612dce576040519150601f19603f3d011682016040523d82523d6000602084013e612dd3565b606091505b5091509150612de061372b565b82612ded57601581611fdd565b81806020019051810190611fdd91906151bb565b6040516001600160a01b03838116602483015282166044820152600090819081908190610167907f46de0fb10000000000000000000000000000000000000000000000000000000090606401611f36565b6040516001600160a01b038581166024830152848116604483015283166064820152600782900b608482015260009081908190610167907f5cfc9011000000000000000000000000000000000000000000000000000000009060a4016128a6565b6040516001600160a01b0383811660248301528216604482015260009081908190610167907f5b8f858400000000000000000000000000000000000000000000000000000000906064016118fc565b60008060606000806101676001600160a01b031663278e0b8860e01b898989604051602401612f3393929190615267565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051612f7191906144da565b6000604051808303816000865af19150503d8060008114612fae576040519150601f19603f3d011682016040523d82523d6000602084013e612fb3565b606091505b509150915081612fd6576040805160008082526020820190925260159190612fea565b80806020019051810190612fea91906152eb565b60039290920b9a90995090975095505050505050565b6040516001600160a01b0382166024820152600090819081908190610167907f335e04c100000000000000000000000000000000000000000000000000000000906044016125f7565b600080868061010001516000015163ffffffff16600014801561307957506101008101516040015163ffffffff16155b1561308f576101008101516276a7006040909101525b6000806101676001600160a01b031634634c381ae760e01b8c8c8c8c8c6040516024016130c095949392919061539c565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516130fe91906144da565b60006040518083038185875af1925050503d806000811461313b576040519150601f19603f3d011682016040523d82523d6000602084013e613140565b606091505b5091509150816131535760156000613167565b8080602001905181019061316791906148c1565b60039190910b9b909a5098505050505050505050565b60008060006101676001600160a01b031663189a554c60e01b85604051602401610b129190615442565b6040516001600160a01b038216602482015260009081908190610167907ff069f7120000000000000000000000000000000000000000000000000000000090604401610b12565b600080828061010001516000015163ffffffff16600014801561321e57506101008101516040015163ffffffff16155b15613234576101008101516276a7006040909101525b6000806101676001600160a01b031634639dc711e060e01b8860405160240161325d9190615518565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905161329b91906144da565b60006040518083038185875af1925050503d8060008114612537576040519150601f19603f3d011682016040523d82523d6000602084013e61253c565b6040516001600160a01b0384811660248301528316604482015263ffffffff8216606482015260009081908190610167907f9790686d0000000000000000000000000000000000000000000000000000000090608401612a7a565b6040516001600160a01b03848116602483015283166044820152811515606482015260009081908190610167907f367605ca0000000000000000000000000000000000000000000000000000000090608401612a7a565b600061339461374b565b604080516001600160a01b03851660248083019190915282518083039091018152604490910182526020810180516001600160e01b03167f1f69565f000000000000000000000000000000000000000000000000000000001790529051600091829161016791613403916144da565b6000604051808303816000865af19150503d8060008114613440576040519150601f19603f3d011682016040523d82523d6000602084013e613445565b606091505b509150915061345261374b565b8261345f57601581611fdd565b81806020019051810190611fdd919061552b565b6040516001600160a01b0383811660248301528216604482015260009081908190610167907f49146bde00000000000000000000000000000000000000000000000000000000906064016118fc565b6040516001600160a01b038481166024830152831660448201526064810182905260009081908190610167907fe1f21c670000000000000000000000000000000000000000000000000000000090608401612a7a565b6000600160ff84161b9050600160ff83161b8117611101565b6135776040518060a0016040528060001515815260200160006001600160a01b03168152602001606081526020016060815260200160006001600160a01b031681525090565b8260ff166001141561358c5760018152610878565b8260ff16600214156135ae576000546001600160a01b03166020820152610878565b8260ff16600314156135c65760408101829052610878565b8260ff16600414156135de5760608101829052610878565b8260ff1660051415610878576000546001600160a01b0316608082015292915050565b600060ff821661361357506001919050565b8160ff166001141561362757506002919050565b8160ff166002141561363b57506004919050565b8160ff166003141561364f57506008919050565b8160ff166004141561366357506010919050565b8160ff166005141561367757506020919050565b8160ff166006141561368b57506040919050565b506000919050565b6040518060400160405280600081526020016136eb6040518060a0016040528060001515815260200160006001600160a01b03168152602001606081526020016060815260200160006001600160a01b031681525090565b905290565b6040518060c0016040528061370361374b565b8152600060208201819052604082018190526060808301829052608083015260a09091015290565b604051806040016040528061373e61374b565b8152600060209091015290565b60408051610240810182526060610120820181815261014083018290526000610160840181905261018084018390526101a084018190526101c084018190526101e0840181905261020084018390528451928301855280835260208301819052938201939093526102208201529081908152602001600067ffffffffffffffff168152602001600015158152602001600015158152602001600015158152602001606081526020016060815260200160608152602001606081525090565b6001600160a01b038116811461381e57600080fd5b50565b6000806040838503121561383457600080fd5b823561383f81613809565b9150602083013561384f81613809565b809150509250929050565b60008060006060848603121561386f57600080fd5b833561387a81613809565b9250602084013561388a81613809565b9150604084013561389a81613809565b809150509250925092565b600080604083850312156138b857600080fd5b82356138c381613809565b946020939093013593505050565b6000602082840312156138e357600080fd5b813561110181613809565b8060070b811461381e57600080fd5b6000806000806080858703121561391357600080fd5b843561391e81613809565b9350602085013561392e81613809565b9250604085013561393e81613809565b9150606085013561394e816138ee565b939692955090935050565b6000806040838503121561396c57600080fd5b823561397781613809565b9150602083013561384f816138ee565b60005b838110156139a257818101518382015260200161398a565b838111156139b1576000848401525b50505050565b600081518084526139cf816020860160208601613987565b601f01601f19169290920160200192915050565b600081518084526020808501808196508360051b8101915082860160005b85811015613a9a5782840389528151604081518652868201519150808787015281511515818701528682015160606001600160a01b03808316828a015283850151935060a09250608083818b0152613a5c60e08b01866139b7565b928601518a8403603f1901858c0152929450613a7885846139b7565b9501511660c09890980197909752505098850198935090840190600101613a01565b5091979650505050505050565b60006101608251818552613abd828601826139b7565b91505060208301518482036020860152613ad782826139b7565b9150506040830151613af460408601826001600160a01b03169052565b5060608301518482036060860152613b0c82826139b7565b9150506080830151613b22608086018215159052565b5060a0830151613b3a60a086018263ffffffff169052565b5060c0830151613b4e60c086018215159052565b5060e083015184820360e0860152613b6682826139e3565b61010085810151805163ffffffff9081168984015260208201516001600160a01b03166101208a015260408201511661014089015291935091505090949350505050565b600081518084526020808501945080840160005b83811015613c1a578151805163ffffffff168852838101516001600160a01b03908116858a01526040808301511515908a01526060808301511515908a0152608091820151169088015260a09096019590820190600101613bbe565b509495945050505050565b600081518084526020808501945080840160005b83811015613c1a578151805163ffffffff9081168952848201518116858a01526040808301518216908a01526060808301519091169089015260808082015115159089015260a0908101516001600160a01b03169088015260c09096019590820190600101613c39565b600081518084526020808501945080840160005b83811015613c1a578151805163ffffffff9081168952848201518116858a0152604080830151909116908901526060808201516001600160a01b03908116918a01919091526080808301511515908a015260a091820151169088015260c09096019590820190600101613cb7565b60006101208251818552613d3b82860182613aa7565b9150506020830151613d59602086018267ffffffffffffffff169052565b506040830151613d6d604086018215159052565b506060830151613d81606086018215159052565b506080830151613d95608086018215159052565b5060a083015184820360a0860152613dad8282613baa565b91505060c083015184820360c0860152613dc78282613c25565b91505060e083015184820360e0860152613de18282613ca3565b9150506101008084015185830382870152613dfc83826139b7565b9695505050505050565b6000815160c08452613e1b60c0850182613d25565b9050602083015160070b602085015260408301516001600160a01b038082166040870152606085015160070b6060870152608085015191508583036080870152613e6583836139b7565b92508060a08601511660a087015250508091505092915050565b8281526040602082015260006110406040830184613e06565b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715613ed157613ed1613e98565b60405290565b6040805190810167ffffffffffffffff81118282101715613ed157613ed1613e98565b60405160a0810167ffffffffffffffff81118282101715613ed157613ed1613e98565b604051610120810167ffffffffffffffff81118282101715613ed157613ed1613e98565b60405160c0810167ffffffffffffffff81118282101715613ed157613ed1613e98565b604051601f8201601f1916810167ffffffffffffffff81118282101715613f8d57613f8d613e98565b604052919050565b600067ffffffffffffffff821115613faf57613faf613e98565b5060051b60200190565b600080600060608486031215613fce57600080fd5b8335613fd981613809565b9250602084810135613fea81613809565b9250604085013567ffffffffffffffff81111561400657600080fd5b8501601f8101871361401757600080fd5b803561402a61402582613f95565b613f64565b81815260059190911b8201830190838101908983111561404957600080fd5b928401925b82841015614070578335614061816138ee565b8252928401929084019061404e565b80955050505050509250925092565b8460070b815260806020820152600061409b6080830186613baa565b82810360408401526140ad8186613c25565b905082810360608401526140c18185613ca3565b979650505050505050565b60008151604084526140e16040850182613d25565b60209384015163ffffffff16949093019390935250919050565b82815260406020820152600061104060408301846140cc565b67ffffffffffffffff8116811461381e57600080fd5b600067ffffffffffffffff82111561414457614144613e98565b50601f01601f191660200190565b60008060006060848603121561416757600080fd5b833561417281613809565b925060208481013561418381614114565b925060408581013567ffffffffffffffff808211156141a157600080fd5b818801915088601f8301126141b557600080fd5b81356141c361402582613f95565b81815260059190911b8301850190858101908b8311156141e257600080fd5b8685015b83811015614256578035858111156141fe5760008081fd5b8601603f81018e136142105760008081fd5b888101356142206140258261412a565b8181528f8a8385010111156142355760008081fd5b818a84018c83013760009181018b01919091528452509187019187016141e6565b50809750505050505050509250925092565b600081518084526020808501945080840160005b83811015613c1a57815160070b8752958201959082019060010161427c565b83815267ffffffffffffffff831660208201526060604082015260006142c46060830184614268565b95945050505050565b600080602083850312156142e057600080fd5b823567ffffffffffffffff808211156142f857600080fd5b818501915085601f83011261430c57600080fd5b81358181111561431b57600080fd5b8660208260051b850101111561433057600080fd5b60209290920196919550909350505050565b63ffffffff8116811461381e57600080fd5b60008060006060848603121561436957600080fd5b833561437481613809565b9250602084013561438481613809565b9150604084013561389a81614342565b801515811461381e57600080fd5b6000806000606084860312156143b757600080fd5b83356143c281613809565b925060208401356143d281613809565b9150604084013561389a81614394565b8281526040602082015260006110406040830184613d25565b60008060006060848603121561441057600080fd5b833561441b81613809565b9250602084013561442b81613809565b929592945050506040919091013590565b60006020828403121561444e57600080fd5b813561110181614394565b60008060006060848603121561446e57600080fd5b833561447981613809565b9250602084013561448981613809565b9150604084013561389a816138ee565b8051611a23816138ee565b6000602082840312156144b657600080fd5b8151611101816138ee565b6000602082840312156144d357600080fd5b5051919050565b600082516144ec818460208701613987565b9190910192915050565b8051600381900b8114611a2357600080fd5b60006020828403121561451a57600080fd5b611101826144f6565b634e487b7160e01b600052603260045260246000fd5b600181811c9082168061454d57607f821691505b6020821081141561456e57634e487b7160e01b600052602260045260246000fd5b50919050565b6020815260006111016020830184613e06565b60608152600061459a6060830186613baa565b82810360208401526145ac8186613c25565b90508281036040840152613dfc8185613ca3565b60208152600061110160208301846140cc565b67ffffffffffffffff831681526040602082015260006110406040830184614268565b600082601f83011261460757600080fd5b8135602061461761402583613f95565b8281526060928302850182019282820191908785111561463657600080fd5b8387015b858110156146985781818a0312156146525760008081fd5b61465a613eae565b813561466581613809565b81528186013561467481613809565b81870152604082810135614687816138ee565b90820152845292840192810161463a565b5090979650505050505050565b60006146b361402584613f95565b80848252602080830192508560051b8501368111156146d157600080fd5b855b8181101561480657803567ffffffffffffffff808211156146f45760008081fd5b81890191506060823603121561470a5760008081fd5b614712613eae565b823561471d81613809565b815282860135828111156147315760008081fd5b830136601f8201126147435760008081fd5b803561475161402582613f95565b81815260069190911b820188019088810190368311156147715760008081fd5b928901925b828410156147c7576040843603121561478f5760008081fd5b614797613ed7565b84356147a281613809565b8152848b01356147b1816138ee565b818c015282526040939093019290890190614776565b848a015250604091505083810135838111156147e35760008081fd5b6147ef368287016145f6565b9183019190915250875250509382019382016146d3565b50919695505050505050565b8051611a2381614394565b6000806040838503121561483057600080fd5b825161483b816138ee565b602084015190925061384f81614394565b6000806040838503121561485f57600080fd5b614868836144f6565b9150602083015161384f81614394565b6020815260006111016020830184613d25565b60008160070b677fffffffffffffff198114156148b857634e487b7160e01b600052601160045260246000fd5b60000392915050565b600080604083850312156148d457600080fd5b6148dd836144f6565b9150602083015161384f81613809565b6060815260006149006060830186613aa7565b60208301949094525060400152919050565b600082601f83011261492357600080fd5b81516149316140258261412a565b81815284602083860101111561494657600080fd5b611040826020830160208701613987565b8051611a2381613809565b8051611a2381614342565b600082601f83011261497e57600080fd5b8151602061498e61402583613f95565b82815260059290921b840181019181810190868411156149ad57600080fd5b8286015b84811015614ac357805167ffffffffffffffff808211156149d157600080fd5b908801906040601f19838c0381018213156149eb57600080fd5b6149f3613ed7565b8885015181528285015184811115614a0a57600080fd5b949094019360a0858e0383011215614a225760008081fd5b614a2a613efa565b915088850151614a3981614394565b825284830151614a4881613809565b828a015260608581015185811115614a605760008081fd5b614a6e8f8c838a0101614912565b8585015250608093508386015185811115614a895760008081fd5b614a978f8c838a0101614912565b828501525050614aa960a08601614957565b9282019290925281880152855250509183019183016149b1565b509695505050505050565b600060608284031215614ae057600080fd5b614ae8613eae565b90508151614af581614342565b81526020820151614b0581613809565b60208201526040820151614b1881614342565b604082015292915050565b60006101608284031215614b3657600080fd5b614b3e613f1d565b9050815167ffffffffffffffff80821115614b5857600080fd5b614b6485838601614912565b83526020840151915080821115614b7a57600080fd5b614b8685838601614912565b6020840152614b9760408501614957565b60408401526060840151915080821115614bb057600080fd5b614bbc85838601614912565b6060840152614bcd60808501614812565b6080840152614bde60a08501614962565b60a0840152614bef60c08501614812565b60c084015260e0840151915080821115614c0857600080fd5b50614c158482850161496d565b60e083015250610100614c2a84828501614ace565b9082015292915050565b8051611a2381614114565b600082601f830112614c5057600080fd5b81516020614c6061402583613f95565b82815260a09283028501820192828201919087851115614c7f57600080fd5b8387015b858110156146985781818a031215614c9b5760008081fd5b614ca3613efa565b8151614cae81614342565b815281860151614cbd81613809565b81870152604082810151614cd081614394565b90820152606082810151614ce381614394565b90820152608082810151614cf681613809565b908201528452928401928101614c83565b600082601f830112614d1857600080fd5b81516020614d2861402583613f95565b82815260c09283028501820192828201919087851115614d4757600080fd5b8387015b858110156146985781818a031215614d635760008081fd5b614d6b613f41565b8151614d7681614342565b815281860151614d8581614342565b81870152604082810151614d9881614342565b90820152606082810151614dab81614342565b90820152608082810151614dbe81614394565b9082015260a082810151614dd181613809565b908201528452928401928101614d4b565b600082601f830112614df357600080fd5b81516020614e0361402583613f95565b82815260c09283028501820192828201919087851115614e2257600080fd5b8387015b858110156146985781818a031215614e3e5760008081fd5b614e46613f41565b8151614e5181614342565b815281860151614e6081614342565b81870152604082810151614e7381614342565b90820152606082810151614e8681613809565b90820152608082810151614e9981614394565b9082015260a082810151614eac81613809565b908201528452928401928101614e26565b60006101208284031215614ed057600080fd5b614ed8613f1d565b9050815167ffffffffffffffff80821115614ef257600080fd5b614efe85838601614b23565b8352614f0c60208501614c34565b6020840152614f1d60408501614812565b6040840152614f2e60608501614812565b6060840152614f3f60808501614812565b608084015260a0840151915080821115614f5857600080fd5b614f6485838601614c3f565b60a084015260c0840151915080821115614f7d57600080fd5b614f8985838601614d07565b60c084015260e0840151915080821115614fa257600080fd5b614fae85838601614de2565b60e084015261010091508184015181811115614fc957600080fd5b614fd586828701614912565b8385015250505092915050565b60008060408385031215614ff557600080fd5b614ffe836144f6565b9150602083015167ffffffffffffffff8082111561501b57600080fd5b9084019060c0828703121561502f57600080fd5b615037613f41565b82518281111561504657600080fd5b61505288828601614ebd565b82525061506160208401614499565b602082015261507260408401614957565b604082015261508360608401614499565b606082015260808301518281111561509a57600080fd5b6150a688828601614912565b6080830152506150b860a08401614957565b60a08201528093505050509250929050565b60006001600160a01b038086168352808516602084015250606060408301526142c46060830184614268565b6000806040838503121561510957600080fd5b615112836144f6565b9150602083015190509250929050565b6000806000806080858703121561513857600080fd5b615141856144f6565b9350602085015167ffffffffffffffff8082111561515e57600080fd5b61516a88838901614c3f565b9450604087015191508082111561518057600080fd5b61518c88838901614d07565b935060608701519150808211156151a257600080fd5b506151af87828801614de2565b91505092959194509250565b600080604083850312156151ce57600080fd5b6151d7836144f6565b9150602083015167ffffffffffffffff808211156151f457600080fd5b908401906040828703121561520857600080fd5b60405160408101818110838211171561522357615223613e98565b60405282518281111561523557600080fd5b61524188828601614ebd565b8252506020830151925061525483614342565b8260208201528093505050509250929050565b6000606082016001600160a01b0386168352602067ffffffffffffffff8616818501526060604085015281855180845260808601915060808160051b870101935082870160005b828110156152dc57607f198887030184526152ca8683516139b7565b955092840192908401906001016152ae565b50939998505050505050505050565b60008060006060848603121561530057600080fd5b615309846144f6565b925060208085015161531a81614114565b604086015190935067ffffffffffffffff81111561533757600080fd5b8501601f8101871361534857600080fd5b805161535661402582613f95565b81815260059190911b8201830190838101908983111561537557600080fd5b928401925b8284101561407057835161538d816138ee565b8252928401929084019061537a565b60a0815260006153af60a0830188613aa7565b86602084015285604084015282810360608401526153cd8186613baa565b905082810360808401526153e18185613c25565b98975050505050505050565b600081518084526020808501945080840160005b83811015613c1a57815180516001600160a01b03908116895284820151168489015260409081015160070b9088015260609096019590820190600101615401565b60006020808301818452808551808352604092508286019150828160051b8701018488016000805b8481101561550957898403603f19018652825180516001600160a01b0390811686528982015160608b880181905281519088018190526080880192918c01919086905b808210156154db5783518051841686528e015160070b8e860152938c0193928d0192600191909101906154ad565b5050505090880151858203868a0152906154f581836153ed565b978a0197955050509187019160010161546a565b50919998505050505050505050565b6020815260006111016020830184613aa7565b6000806040838503121561553e57600080fd5b615547836144f6565b9150602083015167ffffffffffffffff81111561556357600080fd5b61556f85828601614ebd565b915050925092905056fe90a5cf4cffe88b4edbb041cfc7a8a812c48a5ec30b84640fb37690875168e3aaa264697066735822122048acc77d734b58ea3eb0262b70aca55f09225cf92f7c758301a62026b696973364736f6c63430008090033", - "deployedBytecode": "0x60806040526004361061026a5760003560e01c80637d3e5da811610153578063d85f74c1116100cb578063f4a01e5b1161007f578063f848fec411610064578063f848fec41461075a578063f9e978bd1461077a578063fdc8321e1461079a57600080fd5b8063f4a01e5b1461071a578063f7be34251461073a57600080fd5b8063f25b1200116100b0578063f25b1200146106ac578063f2c31ff4146106cc578063f2f38a74146106ec57600080fd5b8063d85f74c114610679578063d92ac2481461068c57600080fd5b80638f8d7f9911610122578063a345f7bd11610107578063a345f7bd146105ff578063a3ad5b551461061f578063af99c6331461065957600080fd5b80638f8d7f99146105bf5780639604ca65146105df57600080fd5b80637d3e5da81461053d5780638070905f1461055d57806386f88d881461058c5780638ba74da0146105ac57600080fd5b80634ba67035116101e65780635b9076b7116101b55780636a4dde211161019a5780636a4dde21146104dd5780636da6b1f0146104fd5780637c41ad2c1461051d57600080fd5b80635b9076b71461047f57806369837dc2146104af57600080fd5b80634ba67035146103dc5780634cbdb37b146103fc57806356af84031461042a5780635a5e6c311461044a57600080fd5b80632d73bb2e1161023d5780633b3bff0f116102225780633b3bff0f146103875780633eed2c39146103a75780634b5c6687146103c757600080fd5b80632d73bb2e146103475780632eecbca31461036757600080fd5b80630fd2601e1461026f57806313c05dd8146102a757806319db44b6146102dc5780632b256ec814610319575b600080fd5b34801561027b57600080fd5b5061028f61028a366004613821565b6107ba565b60405160079190910b81526020015b60405180910390f35b3480156102b357600080fd5b506102c76102c236600461385a565b61087e565b6040805192835290151560208301520161029e565b3480156102e857600080fd5b506102fc6102f73660046138a5565b6108fc565b604080519283526001600160a01b0390911660208301520161029e565b34801561032557600080fd5b506103396103343660046138d1565b610980565b60405190815260200161029e565b34801561035357600080fd5b50610339610362366004613821565b610a6c565b34801561037357600080fd5b5061028f610382366004613821565b610ab1565b34801561039357600080fd5b506103396103a23660046138d1565b610ae8565b3480156103b357600080fd5b506102c76103c23660046138d1565b610bc2565b6103da6103d53660046138d1565b610c3c565b005b3480156103e857600080fd5b506103396103f73660046138fd565b610ffc565b34801561040857600080fd5b5061041c610417366004613959565b611048565b60405161029e929190613e7f565b34801561043657600080fd5b50610339610445366004613fb9565b6110be565b34801561045657600080fd5b5061046a61046536600461385a565b611108565b6040805192835260208301919091520161029e565b34801561048b57600080fd5b5061049f61049a3660046138d1565b611179565b60405161029e949392919061407f565b3480156104bb57600080fd5b506104cf6104ca3660046138d1565b61120b565b60405161029e9291906140fb565b3480156104e957600080fd5b506102c76104f8366004613821565b611280565b34801561050957600080fd5b506103396105183660046138fd565b6112f7565b34801561052957600080fd5b506103396105383660046138d1565b611305565b34801561054957600080fd5b50610339610558366004613821565b611333565b34801561056957600080fd5b5061057d610578366004614152565b61133f565b60405161029e9392919061429b565b34801561059857600080fd5b506102c76105a73660046138d1565b6113c7565b6103da6105ba366004613821565b611438565b3480156105cb57600080fd5b5061028f6105da366004613821565b6118ca565b3480156105eb57600080fd5b506103396105fa3660046142cd565b6119ad565b34801561060b57600080fd5b5061033961061a3660046138d1565b6119e2565b34801561062b57600080fd5b5061063f61063a366004613821565b611a28565b6040805160079390930b835290151560208301520161029e565b34801561066557600080fd5b5061028f610674366004613821565b611b1a565b6103da6106873660046138d1565b611b50565b34801561069857600080fd5b506103396106a7366004614354565b611ee8565b3480156106b857600080fd5b506103396106c73660046143a2565b611ef5565b3480156106d857600080fd5b5061063f6106e7366004613821565b611f02565b3480156106f857600080fd5b5061070c6107073660046138d1565b611fef565b60405161029e9291906143e2565b34801561072657600080fd5b50610339610735366004613821565b612064565b34801561074657600080fd5b506103396107553660046138d1565b612070565b34801561076657600080fd5b506103396107753660046143fb565b612153565b34801561078657600080fd5b506103da61079536600461443c565b612160565b3480156107a657600080fd5b506103396107b5366004614459565b6121ad565b604051638f8d7f9960e01b81526001600160a01b038084166004830152821660248201526000903090638f8d7f99906044015b602060405180830381600087803b15801561080757600080fd5b505af115801561081b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061083f91906144a4565b604051600782900b815290915060008051602061557a8339815191529060200160405180910390a1600781900b60161461087857600080fd5b92915050565b60008061088c858585612384565b604051828152919350915060008051602061557a8339815191529060200160405180910390a1601682146108bf57600080fd5b60405181151581527e1c2e72360171244b3bb8cc8ddd767820edf37138ad6f129fb3574b407c307d906020015b60405180910390a1935093915050565b6000806109098484612483565b604051828152919350915060008051602061557a8339815191529060200160405180910390a16016821461093c57600080fd5b6040516001600160a01b03821681527fc2c78c7c31baf14949e75c51df12be56edb9af523cf82839c2869bbcf13b3ecb906020015b60405180910390a19250929050565b604051631f106b4b60e21b81526001600160a01b03821660048201526000903090637c41ad2c90602401602060405180830381600087803b1580156109c457600080fd5b505af11580156109d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109fc91906144c1565b905060008051602061557a83398151915281604051610a1d91815260200190565b60405180910390a160168114610a3257600080fd5b604051600181527f0c9c765845f4d139956bb8fc8decb2eec6093c9c608b809641b16054b29f0e13906020015b60405180910390a1919050565b6000610a788383612563565b60070b905060008051602061557a83398151915281604051610a9c91815260200190565b60405180910390a16016811461087857600080fd5b60405163af99c63360e01b81526001600160a01b03808416600483015282166024820152600090309063af99c633906044016107ed565b6040516001600160a01b03821660248201526000908190819061016790633b3bff0f60e01b906044015b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051610b5091906144da565b6000604051808303816000865af19150503d8060008114610b8d576040519150601f19603f3d011682016040523d82523d6000602084013e610b92565b606091505b509150915081610ba3576015610bb7565b80806020019051810190610bb79190614508565b60030b949350505050565b600080610bce836125b2565b604051828152919350915060008051602061557a8339815191529060200160405180910390a160168214610c0157600080fd5b60405181151581527f6b7f3306751292f85ab4161ee2b0ac16dfc8ded13e6446ce6bd859d0a2f4c78e906020015b60405180910390a1915091565b60408051600480825260a08201909252600091816020015b610c5c613693565b815260200190600190039081610c54579050509050610c8f600060066001604051806020016040528060008152506126af565b81600081518110610ca257610ca2614523565b6020026020010181905250610cc8600180604051806020016040528060008152506126e6565b81600181518110610cdb57610cdb614523565b6020026020010181905250610d0260026001604051806020016040528060008152506126e6565b81600281518110610d1557610d15614523565b6020026020010181905250610d3c60036001604051806020016040528060008152506126e6565b81600381518110610d4f57610d4f614523565b602002602001018190525060006040518060600160405280600063ffffffff168152602001846001600160a01b03168152602001627a120063ffffffff168152509050600060405180610120016040528060018054610dad90614539565b80601f0160208091040260200160405190810160405280929190818152602001828054610dd990614539565b8015610e265780601f10610dfb57610100808354040283529160200191610e26565b820191906000526020600020905b815481529060010190602001808311610e0957829003601f168201915b5050505050815260200160028054610e3d90614539565b80601f0160208091040260200160405190810160405280929190818152602001828054610e6990614539565b8015610eb65780601f10610e8b57610100808354040283529160200191610eb6565b820191906000526020600020905b815481529060010190602001808311610e9957829003601f168201915b50505050508152602001856001600160a01b0316815260200160038054610edc90614539565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0890614539565b8015610f555780601f10610f2a57610100808354040283529160200191610f55565b820191906000526020600020905b815481529060010190602001808311610f3857829003601f168201915b50505091835250506001602082015260055463ffffffff16604082015260075460ff16151560608201526080810185905260a0018390526004546006549192506000918291610fa69185919061271b565b909250905060168214610fb857600080fd5b6040516001600160a01b03821681527f7bb17726df1f3adee8aa00ba8e8bc5d6f182af3bbf77604639cb7f008dd3b4ed9060200160405180910390a1505050505050565b600061100a85858585612849565b905060008051602061557a8339815191528160405161102b91815260200190565b60405180910390a16016811461104057600080fd5b949350505050565b60006110526136f0565b61105c8484612959565b604051828152919350915060008051602061557a8339815191529060200160405180910390a16016821461108f57600080fd5b7fa516f81c528634d0fc1e993bba1d227231b4bd6d1beb72d33b056a6199c0f988816040516109719190614574565b60006110cb848484612a4c565b905060008051602061557a833981519152816040516110ec91815260200190565b60405180910390a16016811461110157600080fd5b9392505050565b600080611116858585612b2c565b604051828152919350915060008051602061557a8339815191529060200160405180910390a16016821461114957600080fd5b6040518181527f25b6684a7e8fe1b676e9c39c8dd65034fbafea906d3bdfd97bf748b7b55e14c8906020016108ec565b6000606080606061118985612c18565b604051600785900b81529397509195509350915060008051602061557a8339815191529060200160405180910390a1600784900b6016146111c957600080fd5b7f2efc8334b040613a552197fe34283d6ca2909c8ffae393e128424931f20c69b38383836040516111fc93929190614587565b60405180910390a19193509193565b600061121561372b565b61121e83612d18565b604051828152919350915060008051602061557a8339815191529060200160405180910390a16016821461125157600080fd5b7f476a9a9b28e2717d55288b2ae3c48a72aac52b11f8bd855017c9d41d9fc1896481604051610c2f91906145c0565b60008061128d8484612e01565b60405160079290920b8083529350915060008051602061557a8339815191529060200160405180910390a1601682146112c557600080fd5b60405181151581527f59800d968fcce138300a0019410b4b75041610d65b3cdc5f31656b03ed14912e90602001610971565b600061100a85858585612e52565b6040516001600160a01b03821660248201526000908190819061016790631f106b4b60e21b90604401610b12565b6000610a788383612eb3565b600080606061134f868686612f02565b604051838152929550909350915060008051602061557a8339815191529060200160405180910390a16016831461138557600080fd5b7feff23992f47b3c101679f8b4dc9d3e242c903909dba4a453f2b2341ad463b0e282826040516113b69291906145d3565b60405180910390a193509350939050565b6000806113d383613000565b604051828152919350915060008051602061557a8339815191529060200160405180910390a16016821461140657600080fd5b60405181151581527f9ee19e13dfa1ba8db2502e15ff56dbecdeb0e0473323fb195473ce648030a2cd90602001610c2f565b604080516001808252818301909252600091816020015b611457613693565b81526020019060019003908161144f5790505090506114896000806001604051806020016040528060008152506126af565b8160008151811061149c5761149c614523565b602002602001018190525060006040518060600160405280600063ffffffff168152602001856001600160a01b03168152602001627a120063ffffffff1681525090506000604051806101200160405280600180546114fa90614539565b80601f016020809104026020016040519081016040528092919081815260200182805461152690614539565b80156115735780601f1061154857610100808354040283529160200191611573565b820191906000526020600020905b81548152906001019060200180831161155657829003601f168201915b505050505081526020016002805461158a90614539565b80601f01602080910402602001604051908101604052809291908181526020018280546115b690614539565b80156116035780601f106115d857610100808354040283529160200191611603565b820191906000526020600020905b8154815290600101906020018083116115e657829003601f168201915b50505050508152602001866001600160a01b031681526020016003805461162990614539565b80601f016020809104026020016040519081016040528092919081815260200182805461165590614539565b80156116a25780601f10611677576101008083540402835291602001916116a2565b820191906000526020600020905b81548152906001019060200180831161168557829003601f168201915b505050918352505060016020820181905260055463ffffffff166040808401919091526000606084018190526080840188905260a09093018690528051828152808201909152929350909190816020015b6040805160a0810182526000808252602080830182905292820181905260608201819052608082015282526000199092019101816116f35750506040805160a081018252600181526001600160a01b0388811660208301526000928201839052606082018390528916608082015282519293509183919061177657611776614523565b6020908102919091010152604080516001808252818301909252600091816020015b6040805160c08101825260008082526020808301829052928201819052606082018190526080820181905260a082015282526000199092019101816117985750506040805160c0810182526004815260056020820152600a91810191909152601e60608201526000608082018190526001600160a01b038a1660a08301528251929350909183919061182c5761182c614523565b602002602001018190525060008061184b856004546006548787613049565b9150915060008051602061557a8339815191528260405161186e91815260200190565b60405180910390a16016821461188357600080fd5b6040516001600160a01b03821681527f7bb17726df1f3adee8aa00ba8e8bc5d6f182af3bbf77604639cb7f008dd3b4ed9060200160405180910390a1505050505050505050565b6040516001600160a01b038381166024830152821660448201526000908190819061016790638f8d7f9960e01b906064015b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905161193a91906144da565b6000604051808303816000865af19150503d8060008114611977576040519150601f19603f3d011682016040523d82523d6000602084013e61197c565b606091505b50915091508161198d5760156119a1565b808060200190518101906119a19190614508565b60030b95945050505050565b60006119c16119bc83856146a5565b61317d565b905060008051602061557a83398151915281604051610a9c91815260200190565b60006119ed826131a7565b905060008051602061557a83398151915281604051611a0e91815260200190565b60405180910390a160168114611a2357600080fd5b919050565b604051633cb0c7fd60e21b81526001600160a01b038084166004830152821660248201526000908190309063f2c31ff4906044016040805180830381600087803b158015611a7557600080fd5b505af1158015611a89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aad919061481d565b604051600783900b8152919350915060008051602061557a8339815191529060200160405180910390a1600782900b601614611ae857600080fd5b60405181151581527fd24dda6928587354b65aa1a18c2eaf249bef7e5bafd2a71fac71d286f76f957f90602001610971565b6040516001600160a01b03838116602483015282166044820152600090819081906101679063af99c63360e01b906064016118fc565b60408051600580825260c08201909252600091816020015b611b70613693565b815260200190600190039081611b68579050509050611ba3600060066001604051806020016040528060008152506126af565b81600081518110611bb657611bb6614523565b6020026020010181905250611bdc600180604051806020016040528060008152506126e6565b81600181518110611bef57611bef614523565b6020026020010181905250611c1660026001604051806020016040528060008152506126e6565b81600281518110611c2957611c29614523565b6020026020010181905250611c5060046001604051806020016040528060008152506126e6565b81600381518110611c6357611c63614523565b6020026020010181905250611c8a60036001604051806020016040528060008152506126e6565b81600481518110611c9d57611c9d614523565b602002602001018190525060006040518060600160405280600063ffffffff168152602001846001600160a01b03168152602001627a120063ffffffff168152509050600060405180610120016040528060018054611cfb90614539565b80601f0160208091040260200160405190810160405280929190818152602001828054611d2790614539565b8015611d745780601f10611d4957610100808354040283529160200191611d74565b820191906000526020600020905b815481529060010190602001808311611d5757829003601f168201915b5050505050815260200160028054611d8b90614539565b80601f0160208091040260200160405190810160405280929190818152602001828054611db790614539565b8015611e045780601f10611dd957610100808354040283529160200191611e04565b820191906000526020600020905b815481529060010190602001808311611de757829003601f168201915b50505050508152602001856001600160a01b0316815260200160038054611e2a90614539565b80601f0160208091040260200160405190810160405280929190818152602001828054611e5690614539565b8015611ea35780601f10611e7857610100808354040283529160200191611ea3565b820191906000526020600020905b815481529060010190602001808311611e8657829003601f168201915b50505091835250506001602082015260055463ffffffff16604082015260075460ff16151560608201526080810185905260a0018390529050600080610fa6836131ee565b60006110cb8484846132d8565b60006110cb848484613333565b6040516001600160a01b0383811660248301528216604482015260009081908190819061016790633cb0c7fd60e21b906064015b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051611f7491906144da565b6000604051808303816000865af19150503d8060008114611fb1576040519150601f19603f3d011682016040523d82523d6000602084013e611fb6565b606091505b509150915081611fc95760156000611fdd565b80806020019051810190611fdd919061484c565b60039190910b97909650945050505050565b6000611ff961374b565b6120028361338a565b604051828152919350915060008051602061557a8339815191529060200160405180910390a16016821461203557600080fd5b7f528c7dcea75f0c9e110a038e50647cd6a70ac06d331399b77dd9a80f903ebc1681604051610c2f9190614878565b60006119c18383613473565b604051633b3bff0f60e01b81526001600160a01b03821660048201526000903090633b3bff0f90602401602060405180830381600087803b1580156120b457600080fd5b505af11580156120c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120ec91906144c1565b905060008051602061557a8339815191528160405161210d91815260200190565b60405180910390a16016811461212257600080fd5b604051600181527f319ab7084208e4afa38c6e6ff7aea9587439f2e4700746f4c7d425fea17426d290602001610a5f565b60006110cb8484846134c2565b6007805460ff191682151590811790915560405160ff909116151581527f457c3a16a0ebdc38e3675609957ca3fcc4490e220bd15d85d34f58e2e145cb089060200160405180910390a150565b604080516000808252602082019092528190816121f2565b60408051606081018252600080825260208083018290529282015282526000199092019101816121c55790505b50905060006040518060400160405280336001600160a01b031681526020018561221b9061488b565b600790810b9091526040805180820182526001600160a01b038a1681529187900b602083015280516002808252606082019092529293509091600091816020015b604080518082019091526000808252602082015281526020019060019003908161225c579050509050828160008151811061229957612299614523565b602002602001018190525081816001815181106122b8576122b8614523565b602090810291909101810191909152604080516060810182526001600160a01b038a16815291820183905281810186905280516001808252818301909252600091816020015b61232b604051806060016040528060006001600160a01b0316815260200160608152602001606081525090565b8152602001906001900390816122fe579050509050818160008151811061235457612354614523565b60200260200101819052506123688161317d565b96506016871461237757600080fd5b5050505050509392505050565b604080516001600160a01b0385811660248301528481166044830152831660648083019190915282518083039091018152608490910182526020810180516001600160e01b03167ff49f40db00000000000000000000000000000000000000000000000000000000179052905160009182918291829161016791612407916144da565b6000604051808303816000865af19150503d8060008114612444576040519150601f19603f3d011682016040523d82523d6000602084013e612449565b606091505b50915091508161245c5760156000612470565b80806020019051810190612470919061484c565b60039190910b9890975095505050505050565b604080516001600160a01b0384166024820152604480820184905282518083039091018152606490910182526020810180516001600160e01b03167f098f2366000000000000000000000000000000000000000000000000000000001790529051600091829182918291610167916124fa916144da565b6000604051808303816000865af19150503d8060008114612537576040519150601f19603f3d011682016040523d82523d6000602084013e61253c565b606091505b50915091508161254f5760156000611fdd565b80806020019051810190611fdd91906148c1565b6040516001600160a01b0383811660248301528216604482015260009081908190610167907f52f9138700000000000000000000000000000000000000000000000000000000906064016118fc565b6040516001600160a01b0382166024820152600090819081908190610167907fa7daa18d00000000000000000000000000000000000000000000000000000000906044015b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905161263591906144da565b6000604051808303816000865af19150503d8060008114612672576040519150601f19603f3d011682016040523d82523d6000602084013e612677565b606091505b50915091508161268a576015600061269e565b8080602001905181019061269e919061484c565b60039190910b969095509350505050565b6126b7613693565b60405180604001604052806126cc8787613518565b81526020016126db8585613531565b905295945050505050565b6126ee613693565b604051806040016040528061270286613601565b81526020016127118585613531565b9052949350505050565b600080848061010001516000015163ffffffff16600014801561274b57506101008101516040015163ffffffff16155b15612761576101008101516276a7006040909101525b6000806101676001600160a01b031634637812a04b60e01b8a8a8a60405160240161278e939291906148ed565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516127cc91906144da565b60006040518083038185875af1925050503d8060008114612809576040519150601f19603f3d011682016040523d82523d6000602084013e61280e565b606091505b5091509150816128215760156000612835565b8080602001905181019061283591906148c1565b60039190910b999098509650505050505050565b6040516001600160a01b038581166024830152848116604483015283166064820152600782900b608482015260009081908190610167907feca36917000000000000000000000000000000000000000000000000000000009060a4015b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516128e491906144da565b6000604051808303816000865af19150503d8060008114612921576040519150601f19603f3d011682016040523d82523d6000602084013e612926565b606091505b50915091508161293757601561294b565b8080602001905181019061294b9190614508565b60030b979650505050505050565b60006129636136f0565b604080516001600160a01b0386166024820152600785900b60448083019190915282518083039091018152606490910182526020810180516001600160e01b03167f287e1da80000000000000000000000000000000000000000000000000000000017905290516000918291610167916129dc916144da565b6000604051808303816000865af19150503d8060008114612a19576040519150601f19603f3d011682016040523d82523d6000602084013e612a1e565b606091505b5091509150612a2b6136f0565b82612a3857601581612470565b818060200190518101906124709190614fe2565b60008060006101676001600160a01b031663f7f38e2660e01b878787604051602401612a7a939291906150ca565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051612ab891906144da565b6000604051808303816000865af19150503d8060008114612af5576040519150601f19603f3d011682016040523d82523d6000602084013e612afa565b606091505b509150915081612b0b576015612b1f565b80806020019051810190612b1f9190614508565b60030b9695505050505050565b604080516001600160a01b0385811660248301528481166044830152831660648083019190915282518083039091018152608490910182526020810180516001600160e01b03167f927da10500000000000000000000000000000000000000000000000000000000179052905160009182918291829161016791612baf916144da565b6000604051808303816000865af19150503d8060008114612bec576040519150601f19603f3d011682016040523d82523d6000602084013e612bf1565b606091505b509150915081612c045760156000612470565b8080602001905181019061247091906150f6565b604080516001600160a01b03831660248083019190915282518083039091018152604490910182526020810180516001600160e01b03167fae7611a0000000000000000000000000000000000000000000000000000000001790529051600091606091829182918591829161016791612c90916144da565b6000604051808303816000865af19150503d8060008114612ccd576040519150601f19603f3d011682016040523d82523d6000602084013e612cd2565b606091505b5091509150606080606084612ceb576015838383612cff565b83806020019051810190612cff9190615122565b60039390930b9d919c509a509098509650505050505050565b6000612d2261372b565b604080516001600160a01b03851660248083019190915282518083039091018152604490910182526020810180516001600160e01b03167f3f28a19b000000000000000000000000000000000000000000000000000000001790529051600091829161016791612d91916144da565b6000604051808303816000865af19150503d8060008114612dce576040519150601f19603f3d011682016040523d82523d6000602084013e612dd3565b606091505b5091509150612de061372b565b82612ded57601581611fdd565b81806020019051810190611fdd91906151bb565b6040516001600160a01b03838116602483015282166044820152600090819081908190610167907f46de0fb10000000000000000000000000000000000000000000000000000000090606401611f36565b6040516001600160a01b038581166024830152848116604483015283166064820152600782900b608482015260009081908190610167907f5cfc9011000000000000000000000000000000000000000000000000000000009060a4016128a6565b6040516001600160a01b0383811660248301528216604482015260009081908190610167907f5b8f858400000000000000000000000000000000000000000000000000000000906064016118fc565b60008060606000806101676001600160a01b031663278e0b8860e01b898989604051602401612f3393929190615267565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051612f7191906144da565b6000604051808303816000865af19150503d8060008114612fae576040519150601f19603f3d011682016040523d82523d6000602084013e612fb3565b606091505b509150915081612fd6576040805160008082526020820190925260159190612fea565b80806020019051810190612fea91906152eb565b60039290920b9a90995090975095505050505050565b6040516001600160a01b0382166024820152600090819081908190610167907f335e04c100000000000000000000000000000000000000000000000000000000906044016125f7565b600080868061010001516000015163ffffffff16600014801561307957506101008101516040015163ffffffff16155b1561308f576101008101516276a7006040909101525b6000806101676001600160a01b031634634c381ae760e01b8c8c8c8c8c6040516024016130c095949392919061539c565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516130fe91906144da565b60006040518083038185875af1925050503d806000811461313b576040519150601f19603f3d011682016040523d82523d6000602084013e613140565b606091505b5091509150816131535760156000613167565b8080602001905181019061316791906148c1565b60039190910b9b909a5098505050505050505050565b60008060006101676001600160a01b031663189a554c60e01b85604051602401610b129190615442565b6040516001600160a01b038216602482015260009081908190610167907ff069f7120000000000000000000000000000000000000000000000000000000090604401610b12565b600080828061010001516000015163ffffffff16600014801561321e57506101008101516040015163ffffffff16155b15613234576101008101516276a7006040909101525b6000806101676001600160a01b031634639dc711e060e01b8860405160240161325d9190615518565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905161329b91906144da565b60006040518083038185875af1925050503d8060008114612537576040519150601f19603f3d011682016040523d82523d6000602084013e61253c565b6040516001600160a01b0384811660248301528316604482015263ffffffff8216606482015260009081908190610167907f9790686d0000000000000000000000000000000000000000000000000000000090608401612a7a565b6040516001600160a01b03848116602483015283166044820152811515606482015260009081908190610167907f367605ca0000000000000000000000000000000000000000000000000000000090608401612a7a565b600061339461374b565b604080516001600160a01b03851660248083019190915282518083039091018152604490910182526020810180516001600160e01b03167f1f69565f000000000000000000000000000000000000000000000000000000001790529051600091829161016791613403916144da565b6000604051808303816000865af19150503d8060008114613440576040519150601f19603f3d011682016040523d82523d6000602084013e613445565b606091505b509150915061345261374b565b8261345f57601581611fdd565b81806020019051810190611fdd919061552b565b6040516001600160a01b0383811660248301528216604482015260009081908190610167907f49146bde00000000000000000000000000000000000000000000000000000000906064016118fc565b6040516001600160a01b038481166024830152831660448201526064810182905260009081908190610167907fe1f21c670000000000000000000000000000000000000000000000000000000090608401612a7a565b6000600160ff84161b9050600160ff83161b8117611101565b6135776040518060a0016040528060001515815260200160006001600160a01b03168152602001606081526020016060815260200160006001600160a01b031681525090565b8260ff166001141561358c5760018152610878565b8260ff16600214156135ae576000546001600160a01b03166020820152610878565b8260ff16600314156135c65760408101829052610878565b8260ff16600414156135de5760608101829052610878565b8260ff1660051415610878576000546001600160a01b0316608082015292915050565b600060ff821661361357506001919050565b8160ff166001141561362757506002919050565b8160ff166002141561363b57506004919050565b8160ff166003141561364f57506008919050565b8160ff166004141561366357506010919050565b8160ff166005141561367757506020919050565b8160ff166006141561368b57506040919050565b506000919050565b6040518060400160405280600081526020016136eb6040518060a0016040528060001515815260200160006001600160a01b03168152602001606081526020016060815260200160006001600160a01b031681525090565b905290565b6040518060c0016040528061370361374b565b8152600060208201819052604082018190526060808301829052608083015260a09091015290565b604051806040016040528061373e61374b565b8152600060209091015290565b60408051610240810182526060610120820181815261014083018290526000610160840181905261018084018390526101a084018190526101c084018190526101e0840181905261020084018390528451928301855280835260208301819052938201939093526102208201529081908152602001600067ffffffffffffffff168152602001600015158152602001600015158152602001600015158152602001606081526020016060815260200160608152602001606081525090565b6001600160a01b038116811461381e57600080fd5b50565b6000806040838503121561383457600080fd5b823561383f81613809565b9150602083013561384f81613809565b809150509250929050565b60008060006060848603121561386f57600080fd5b833561387a81613809565b9250602084013561388a81613809565b9150604084013561389a81613809565b809150509250925092565b600080604083850312156138b857600080fd5b82356138c381613809565b946020939093013593505050565b6000602082840312156138e357600080fd5b813561110181613809565b8060070b811461381e57600080fd5b6000806000806080858703121561391357600080fd5b843561391e81613809565b9350602085013561392e81613809565b9250604085013561393e81613809565b9150606085013561394e816138ee565b939692955090935050565b6000806040838503121561396c57600080fd5b823561397781613809565b9150602083013561384f816138ee565b60005b838110156139a257818101518382015260200161398a565b838111156139b1576000848401525b50505050565b600081518084526139cf816020860160208601613987565b601f01601f19169290920160200192915050565b600081518084526020808501808196508360051b8101915082860160005b85811015613a9a5782840389528151604081518652868201519150808787015281511515818701528682015160606001600160a01b03808316828a015283850151935060a09250608083818b0152613a5c60e08b01866139b7565b928601518a8403603f1901858c0152929450613a7885846139b7565b9501511660c09890980197909752505098850198935090840190600101613a01565b5091979650505050505050565b60006101608251818552613abd828601826139b7565b91505060208301518482036020860152613ad782826139b7565b9150506040830151613af460408601826001600160a01b03169052565b5060608301518482036060860152613b0c82826139b7565b9150506080830151613b22608086018215159052565b5060a0830151613b3a60a086018263ffffffff169052565b5060c0830151613b4e60c086018215159052565b5060e083015184820360e0860152613b6682826139e3565b61010085810151805163ffffffff9081168984015260208201516001600160a01b03166101208a015260408201511661014089015291935091505090949350505050565b600081518084526020808501945080840160005b83811015613c1a578151805163ffffffff168852838101516001600160a01b03908116858a01526040808301511515908a01526060808301511515908a0152608091820151169088015260a09096019590820190600101613bbe565b509495945050505050565b600081518084526020808501945080840160005b83811015613c1a578151805163ffffffff9081168952848201518116858a01526040808301518216908a01526060808301519091169089015260808082015115159089015260a0908101516001600160a01b03169088015260c09096019590820190600101613c39565b600081518084526020808501945080840160005b83811015613c1a578151805163ffffffff9081168952848201518116858a0152604080830151909116908901526060808201516001600160a01b03908116918a01919091526080808301511515908a015260a091820151169088015260c09096019590820190600101613cb7565b60006101208251818552613d3b82860182613aa7565b9150506020830151613d59602086018267ffffffffffffffff169052565b506040830151613d6d604086018215159052565b506060830151613d81606086018215159052565b506080830151613d95608086018215159052565b5060a083015184820360a0860152613dad8282613baa565b91505060c083015184820360c0860152613dc78282613c25565b91505060e083015184820360e0860152613de18282613ca3565b9150506101008084015185830382870152613dfc83826139b7565b9695505050505050565b6000815160c08452613e1b60c0850182613d25565b9050602083015160070b602085015260408301516001600160a01b038082166040870152606085015160070b6060870152608085015191508583036080870152613e6583836139b7565b92508060a08601511660a087015250508091505092915050565b8281526040602082015260006110406040830184613e06565b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715613ed157613ed1613e98565b60405290565b6040805190810167ffffffffffffffff81118282101715613ed157613ed1613e98565b60405160a0810167ffffffffffffffff81118282101715613ed157613ed1613e98565b604051610120810167ffffffffffffffff81118282101715613ed157613ed1613e98565b60405160c0810167ffffffffffffffff81118282101715613ed157613ed1613e98565b604051601f8201601f1916810167ffffffffffffffff81118282101715613f8d57613f8d613e98565b604052919050565b600067ffffffffffffffff821115613faf57613faf613e98565b5060051b60200190565b600080600060608486031215613fce57600080fd5b8335613fd981613809565b9250602084810135613fea81613809565b9250604085013567ffffffffffffffff81111561400657600080fd5b8501601f8101871361401757600080fd5b803561402a61402582613f95565b613f64565b81815260059190911b8201830190838101908983111561404957600080fd5b928401925b82841015614070578335614061816138ee565b8252928401929084019061404e565b80955050505050509250925092565b8460070b815260806020820152600061409b6080830186613baa565b82810360408401526140ad8186613c25565b905082810360608401526140c18185613ca3565b979650505050505050565b60008151604084526140e16040850182613d25565b60209384015163ffffffff16949093019390935250919050565b82815260406020820152600061104060408301846140cc565b67ffffffffffffffff8116811461381e57600080fd5b600067ffffffffffffffff82111561414457614144613e98565b50601f01601f191660200190565b60008060006060848603121561416757600080fd5b833561417281613809565b925060208481013561418381614114565b925060408581013567ffffffffffffffff808211156141a157600080fd5b818801915088601f8301126141b557600080fd5b81356141c361402582613f95565b81815260059190911b8301850190858101908b8311156141e257600080fd5b8685015b83811015614256578035858111156141fe5760008081fd5b8601603f81018e136142105760008081fd5b888101356142206140258261412a565b8181528f8a8385010111156142355760008081fd5b818a84018c83013760009181018b01919091528452509187019187016141e6565b50809750505050505050509250925092565b600081518084526020808501945080840160005b83811015613c1a57815160070b8752958201959082019060010161427c565b83815267ffffffffffffffff831660208201526060604082015260006142c46060830184614268565b95945050505050565b600080602083850312156142e057600080fd5b823567ffffffffffffffff808211156142f857600080fd5b818501915085601f83011261430c57600080fd5b81358181111561431b57600080fd5b8660208260051b850101111561433057600080fd5b60209290920196919550909350505050565b63ffffffff8116811461381e57600080fd5b60008060006060848603121561436957600080fd5b833561437481613809565b9250602084013561438481613809565b9150604084013561389a81614342565b801515811461381e57600080fd5b6000806000606084860312156143b757600080fd5b83356143c281613809565b925060208401356143d281613809565b9150604084013561389a81614394565b8281526040602082015260006110406040830184613d25565b60008060006060848603121561441057600080fd5b833561441b81613809565b9250602084013561442b81613809565b929592945050506040919091013590565b60006020828403121561444e57600080fd5b813561110181614394565b60008060006060848603121561446e57600080fd5b833561447981613809565b9250602084013561448981613809565b9150604084013561389a816138ee565b8051611a23816138ee565b6000602082840312156144b657600080fd5b8151611101816138ee565b6000602082840312156144d357600080fd5b5051919050565b600082516144ec818460208701613987565b9190910192915050565b8051600381900b8114611a2357600080fd5b60006020828403121561451a57600080fd5b611101826144f6565b634e487b7160e01b600052603260045260246000fd5b600181811c9082168061454d57607f821691505b6020821081141561456e57634e487b7160e01b600052602260045260246000fd5b50919050565b6020815260006111016020830184613e06565b60608152600061459a6060830186613baa565b82810360208401526145ac8186613c25565b90508281036040840152613dfc8185613ca3565b60208152600061110160208301846140cc565b67ffffffffffffffff831681526040602082015260006110406040830184614268565b600082601f83011261460757600080fd5b8135602061461761402583613f95565b8281526060928302850182019282820191908785111561463657600080fd5b8387015b858110156146985781818a0312156146525760008081fd5b61465a613eae565b813561466581613809565b81528186013561467481613809565b81870152604082810135614687816138ee565b90820152845292840192810161463a565b5090979650505050505050565b60006146b361402584613f95565b80848252602080830192508560051b8501368111156146d157600080fd5b855b8181101561480657803567ffffffffffffffff808211156146f45760008081fd5b81890191506060823603121561470a5760008081fd5b614712613eae565b823561471d81613809565b815282860135828111156147315760008081fd5b830136601f8201126147435760008081fd5b803561475161402582613f95565b81815260069190911b820188019088810190368311156147715760008081fd5b928901925b828410156147c7576040843603121561478f5760008081fd5b614797613ed7565b84356147a281613809565b8152848b01356147b1816138ee565b818c015282526040939093019290890190614776565b848a015250604091505083810135838111156147e35760008081fd5b6147ef368287016145f6565b9183019190915250875250509382019382016146d3565b50919695505050505050565b8051611a2381614394565b6000806040838503121561483057600080fd5b825161483b816138ee565b602084015190925061384f81614394565b6000806040838503121561485f57600080fd5b614868836144f6565b9150602083015161384f81614394565b6020815260006111016020830184613d25565b60008160070b677fffffffffffffff198114156148b857634e487b7160e01b600052601160045260246000fd5b60000392915050565b600080604083850312156148d457600080fd5b6148dd836144f6565b9150602083015161384f81613809565b6060815260006149006060830186613aa7565b60208301949094525060400152919050565b600082601f83011261492357600080fd5b81516149316140258261412a565b81815284602083860101111561494657600080fd5b611040826020830160208701613987565b8051611a2381613809565b8051611a2381614342565b600082601f83011261497e57600080fd5b8151602061498e61402583613f95565b82815260059290921b840181019181810190868411156149ad57600080fd5b8286015b84811015614ac357805167ffffffffffffffff808211156149d157600080fd5b908801906040601f19838c0381018213156149eb57600080fd5b6149f3613ed7565b8885015181528285015184811115614a0a57600080fd5b949094019360a0858e0383011215614a225760008081fd5b614a2a613efa565b915088850151614a3981614394565b825284830151614a4881613809565b828a015260608581015185811115614a605760008081fd5b614a6e8f8c838a0101614912565b8585015250608093508386015185811115614a895760008081fd5b614a978f8c838a0101614912565b828501525050614aa960a08601614957565b9282019290925281880152855250509183019183016149b1565b509695505050505050565b600060608284031215614ae057600080fd5b614ae8613eae565b90508151614af581614342565b81526020820151614b0581613809565b60208201526040820151614b1881614342565b604082015292915050565b60006101608284031215614b3657600080fd5b614b3e613f1d565b9050815167ffffffffffffffff80821115614b5857600080fd5b614b6485838601614912565b83526020840151915080821115614b7a57600080fd5b614b8685838601614912565b6020840152614b9760408501614957565b60408401526060840151915080821115614bb057600080fd5b614bbc85838601614912565b6060840152614bcd60808501614812565b6080840152614bde60a08501614962565b60a0840152614bef60c08501614812565b60c084015260e0840151915080821115614c0857600080fd5b50614c158482850161496d565b60e083015250610100614c2a84828501614ace565b9082015292915050565b8051611a2381614114565b600082601f830112614c5057600080fd5b81516020614c6061402583613f95565b82815260a09283028501820192828201919087851115614c7f57600080fd5b8387015b858110156146985781818a031215614c9b5760008081fd5b614ca3613efa565b8151614cae81614342565b815281860151614cbd81613809565b81870152604082810151614cd081614394565b90820152606082810151614ce381614394565b90820152608082810151614cf681613809565b908201528452928401928101614c83565b600082601f830112614d1857600080fd5b81516020614d2861402583613f95565b82815260c09283028501820192828201919087851115614d4757600080fd5b8387015b858110156146985781818a031215614d635760008081fd5b614d6b613f41565b8151614d7681614342565b815281860151614d8581614342565b81870152604082810151614d9881614342565b90820152606082810151614dab81614342565b90820152608082810151614dbe81614394565b9082015260a082810151614dd181613809565b908201528452928401928101614d4b565b600082601f830112614df357600080fd5b81516020614e0361402583613f95565b82815260c09283028501820192828201919087851115614e2257600080fd5b8387015b858110156146985781818a031215614e3e5760008081fd5b614e46613f41565b8151614e5181614342565b815281860151614e6081614342565b81870152604082810151614e7381614342565b90820152606082810151614e8681613809565b90820152608082810151614e9981614394565b9082015260a082810151614eac81613809565b908201528452928401928101614e26565b60006101208284031215614ed057600080fd5b614ed8613f1d565b9050815167ffffffffffffffff80821115614ef257600080fd5b614efe85838601614b23565b8352614f0c60208501614c34565b6020840152614f1d60408501614812565b6040840152614f2e60608501614812565b6060840152614f3f60808501614812565b608084015260a0840151915080821115614f5857600080fd5b614f6485838601614c3f565b60a084015260c0840151915080821115614f7d57600080fd5b614f8985838601614d07565b60c084015260e0840151915080821115614fa257600080fd5b614fae85838601614de2565b60e084015261010091508184015181811115614fc957600080fd5b614fd586828701614912565b8385015250505092915050565b60008060408385031215614ff557600080fd5b614ffe836144f6565b9150602083015167ffffffffffffffff8082111561501b57600080fd5b9084019060c0828703121561502f57600080fd5b615037613f41565b82518281111561504657600080fd5b61505288828601614ebd565b82525061506160208401614499565b602082015261507260408401614957565b604082015261508360608401614499565b606082015260808301518281111561509a57600080fd5b6150a688828601614912565b6080830152506150b860a08401614957565b60a08201528093505050509250929050565b60006001600160a01b038086168352808516602084015250606060408301526142c46060830184614268565b6000806040838503121561510957600080fd5b615112836144f6565b9150602083015190509250929050565b6000806000806080858703121561513857600080fd5b615141856144f6565b9350602085015167ffffffffffffffff8082111561515e57600080fd5b61516a88838901614c3f565b9450604087015191508082111561518057600080fd5b61518c88838901614d07565b935060608701519150808211156151a257600080fd5b506151af87828801614de2565b91505092959194509250565b600080604083850312156151ce57600080fd5b6151d7836144f6565b9150602083015167ffffffffffffffff808211156151f457600080fd5b908401906040828703121561520857600080fd5b60405160408101818110838211171561522357615223613e98565b60405282518281111561523557600080fd5b61524188828601614ebd565b8252506020830151925061525483614342565b8260208201528093505050509250929050565b6000606082016001600160a01b0386168352602067ffffffffffffffff8616818501526060604085015281855180845260808601915060808160051b870101935082870160005b828110156152dc57607f198887030184526152ca8683516139b7565b955092840192908401906001016152ae565b50939998505050505050505050565b60008060006060848603121561530057600080fd5b615309846144f6565b925060208085015161531a81614114565b604086015190935067ffffffffffffffff81111561533757600080fd5b8501601f8101871361534857600080fd5b805161535661402582613f95565b81815260059190911b8201830190838101908983111561537557600080fd5b928401925b8284101561407057835161538d816138ee565b8252928401929084019061537a565b60a0815260006153af60a0830188613aa7565b86602084015285604084015282810360608401526153cd8186613baa565b905082810360808401526153e18185613c25565b98975050505050505050565b600081518084526020808501945080840160005b83811015613c1a57815180516001600160a01b03908116895284820151168489015260409081015160070b9088015260609096019590820190600101615401565b60006020808301818452808551808352604092508286019150828160051b8701018488016000805b8481101561550957898403603f19018652825180516001600160a01b0390811686528982015160608b880181905281519088018190526080880192918c01919086905b808210156154db5783518051841686528e015160070b8e860152938c0193928d0192600191909101906154ad565b5050505090880151858203868a0152906154f581836153ed565b978a0197955050509187019160010161546a565b50919998505050505050505050565b6020815260006111016020830184613aa7565b6000806040838503121561553e57600080fd5b615547836144f6565b9150602083015167ffffffffffffffff81111561556357600080fd5b61556f85828601614ebd565b915050925092905056fe90a5cf4cffe88b4edbb041cfc7a8a812c48a5ec30b84640fb37690875168e3aaa264697066735822122048acc77d734b58ea3eb0262b70aca55f09225cf92f7c758301a62026b696973364736f6c63430008090033", + "bytecode": "0x60c06040526009608081905268746f6b656e4e616d6560b81b60a09081526200002c9160019190620000cb565b5060408051808201909152600b8082526a1d1bdad95b94de5b589bdb60aa1b60209092019182526200006191600291620000cb565b50604080518082019091526004808252636d656d6f60e01b60209092019182526200008f91600391620000cb565b506103e860048190556005805463ffffffff1916909117905560086006556007805460ff19169055348015620000c457600080fd5b50620001ae565b828054620000d99062000171565b90600052602060002090601f016020900481019282620000fd576000855562000148565b82601f106200011857805160ff191683800117855562000148565b8280016001018555821562000148579182015b82811115620001485782518255916020019190600101906200012b565b50620001569291506200015a565b5090565b5b808211156200015657600081556001016200015b565b600181811c908216806200018657607f821691505b60208210811415620001a857634e487b7160e01b600052602260045260246000fd5b50919050565b615af180620001be6000396000f3fe6080604052600436106102c65760003560e01c80638070905f11610179578063d85f74c1116100d6578063f2f38a741161008a578063f848fec411610064578063f848fec414610844578063f9e978bd14610864578063fdc8321e1461088457600080fd5b8063f2f38a74146107d6578063f4a01e5b14610804578063f7be34251461082457600080fd5b8063eee55ac8116100bb578063eee55ac814610776578063f25b120014610796578063f2c31ff4146107b657600080fd5b8063d85f74c114610743578063d92ac2481461075657600080fd5b8063a345f7bd1161012d578063af99c63311610112578063af99c633146106d5578063c0b19b6d146106f5578063d614cdb81461072357600080fd5b8063a345f7bd1461067b578063a3ad5b551461069b57600080fd5b80638ba74da01161015e5780638ba74da0146106285780638f8d7f991461063b5780639604ca651461065b57600080fd5b80638070905f146105d957806386f88d881461060857600080fd5b80634cbdb37b1161022757806369837dc2116101db5780636da6b1f0116101c05780636da6b1f0146105795780637c41ad2c146105995780637d3e5da8146105b957600080fd5b806369837dc21461052b5780636a4dde211461055957600080fd5b8063593d6e821161020c578063593d6e82146104a65780635a5e6c31146104c65780635b9076b7146104fb57600080fd5b80634cbdb37b1461045857806356af84031461048657600080fd5b80632eecbca31161027e5780633eed2c39116102635780633eed2c39146104035780634b5c6687146104235780634ba670351461043857600080fd5b80632eecbca3146103c35780633b3bff0f146103e357600080fd5b806319db44b6116102af57806319db44b6146103385780632b256ec8146103755780632d73bb2e146103a357600080fd5b80630fd2601e146102cb57806313c05dd814610303575b600080fd5b3480156102d757600080fd5b506102eb6102e6366004613bbd565b6108a4565b60405160079190910b81526020015b60405180910390f35b34801561030f57600080fd5b5061032361031e366004613bf6565b610968565b604080519283529015156020830152016102fa565b34801561034457600080fd5b50610358610353366004613c41565b6109e6565b604080519283526001600160a01b039091166020830152016102fa565b34801561038157600080fd5b50610395610390366004613c6d565b610a6a565b6040519081526020016102fa565b3480156103af57600080fd5b506103956103be366004613bbd565b610b56565b3480156103cf57600080fd5b506102eb6103de366004613bbd565b610b9b565b3480156103ef57600080fd5b506103956103fe366004613c6d565b610bd2565b34801561040f57600080fd5b5061032361041e366004613c6d565b610cac565b610436610431366004613c6d565b610d26565b005b34801561044457600080fd5b50610395610453366004613c99565b6110e6565b34801561046457600080fd5b50610478610473366004613cf5565b611132565b6040516102fa92919061421b565b34801561049257600080fd5b506103956104a1366004614355565b6111a8565b3480156104b257600080fd5b506103956104c136600461442d565b6111f2565b3480156104d257600080fd5b506104e66104e1366004613bf6565b6112cf565b604080519283526020830191909152016102fa565b34801561050757600080fd5b5061051b610516366004613c6d565b611340565b6040516102fa94939291906144aa565b34801561053757600080fd5b5061054b610546366004613c6d565b6113d2565b6040516102fa929190614526565b34801561056557600080fd5b50610323610574366004613bbd565b611447565b34801561058557600080fd5b50610395610594366004613c99565b6114be565b3480156105a557600080fd5b506103956105b4366004613c6d565b6114cc565b3480156105c557600080fd5b506103956105d4366004613bbd565b6114fa565b3480156105e557600080fd5b506105f96105f436600461457d565b611506565b6040516102fa939291906146c6565b34801561061457600080fd5b50610323610623366004613c6d565b61158e565b610436610636366004613bbd565b6115ff565b34801561064757600080fd5b506102eb610656366004613bbd565b611a91565b34801561066757600080fd5b506103956106763660046146f8565b611ac7565b34801561068757600080fd5b50610395610696366004613c6d565b611afc565b3480156106a757600080fd5b506106bb6106b6366004613bbd565b611b42565b6040805160079390930b83529015156020830152016102fa565b3480156106e157600080fd5b506102eb6106f0366004613bbd565b611c34565b34801561070157600080fd5b50610715610710366004613c6d565b611c6a565b6040516102fa92919061476d565b34801561072f57600080fd5b5061071561073e366004613c6d565b611d61565b610436610751366004613c6d565b611e6b565b34801561076257600080fd5b506103956107713660046147a7565b612203565b34801561078257600080fd5b5061039561079136600461442d565b612210565b3480156107a257600080fd5b506103956107b13660046147f5565b6122a3565b3480156107c257600080fd5b506106bb6107d1366004613bbd565b6122b0565b3480156107e257600080fd5b506107f66107f1366004613c6d565b61238b565b6040516102fa929190614835565b34801561081057600080fd5b5061039561081f366004613bbd565b612400565b34801561083057600080fd5b5061039561083f366004613c6d565b61240c565b34801561085057600080fd5b5061039561085f36600461484e565b6124ef565b34801561087057600080fd5b5061043661087f36600461488f565b6124fc565b34801561089057600080fd5b5061039561089f3660046148ac565b612549565b604051638f8d7f9960e01b81526001600160a01b038084166004830152821660248201526000903090638f8d7f99906044015b602060405180830381600087803b1580156108f157600080fd5b505af1158015610905573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061092991906148f7565b604051600782900b8152909150600080516020615a9c8339815191529060200160405180910390a1600781900b60161461096257600080fd5b92915050565b600080610976858585612720565b6040518281529193509150600080516020615a9c8339815191529060200160405180910390a1601682146109a957600080fd5b60405181151581527e1c2e72360171244b3bb8cc8ddd767820edf37138ad6f129fb3574b407c307d906020015b60405180910390a1935093915050565b6000806109f3848461281f565b6040518281529193509150600080516020615a9c8339815191529060200160405180910390a160168214610a2657600080fd5b6040516001600160a01b03821681527fc2c78c7c31baf14949e75c51df12be56edb9af523cf82839c2869bbcf13b3ecb906020015b60405180910390a19250929050565b604051631f106b4b60e21b81526001600160a01b03821660048201526000903090637c41ad2c90602401602060405180830381600087803b158015610aae57600080fd5b505af1158015610ac2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae69190614914565b9050600080516020615a9c83398151915281604051610b0791815260200190565b60405180910390a160168114610b1c57600080fd5b604051600181527f0c9c765845f4d139956bb8fc8decb2eec6093c9c608b809641b16054b29f0e13906020015b60405180910390a1919050565b6000610b6283836128ff565b60070b9050600080516020615a9c83398151915281604051610b8691815260200190565b60405180910390a16016811461096257600080fd5b60405163af99c63360e01b81526001600160a01b03808416600483015282166024820152600090309063af99c633906044016108d7565b6040516001600160a01b03821660248201526000908190819061016790633b3bff0f60e01b906044015b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051610c3a919061492d565b6000604051808303816000865af19150503d8060008114610c77576040519150601f19603f3d011682016040523d82523d6000602084013e610c7c565b606091505b509150915081610c8d576015610ca1565b80806020019051810190610ca1919061495b565b60030b949350505050565b600080610cb88361294e565b6040518281529193509150600080516020615a9c8339815191529060200160405180910390a160168214610ceb57600080fd5b60405181151581527f6b7f3306751292f85ab4161ee2b0ac16dfc8ded13e6446ce6bd859d0a2f4c78e906020015b60405180910390a1915091565b60408051600480825260a08201909252600091816020015b610d46613a2f565b815260200190600190039081610d3e579050509050610d7960006006600160405180602001604052806000815250612a4b565b81600081518110610d8c57610d8c614976565b6020026020010181905250610db260018060405180602001604052806000815250612a82565b81600181518110610dc557610dc5614976565b6020026020010181905250610dec6002600160405180602001604052806000815250612a82565b81600281518110610dff57610dff614976565b6020026020010181905250610e266003600160405180602001604052806000815250612a82565b81600381518110610e3957610e39614976565b602002602001018190525060006040518060600160405280600063ffffffff168152602001846001600160a01b03168152602001627a120063ffffffff168152509050600060405180610120016040528060018054610e979061498c565b80601f0160208091040260200160405190810160405280929190818152602001828054610ec39061498c565b8015610f105780601f10610ee557610100808354040283529160200191610f10565b820191906000526020600020905b815481529060010190602001808311610ef357829003601f168201915b5050505050815260200160028054610f279061498c565b80601f0160208091040260200160405190810160405280929190818152602001828054610f539061498c565b8015610fa05780601f10610f7557610100808354040283529160200191610fa0565b820191906000526020600020905b815481529060010190602001808311610f8357829003601f168201915b50505050508152602001856001600160a01b0316815260200160038054610fc69061498c565b80601f0160208091040260200160405190810160405280929190818152602001828054610ff29061498c565b801561103f5780601f106110145761010080835404028352916020019161103f565b820191906000526020600020905b81548152906001019060200180831161102257829003601f168201915b50505091835250506001602082015260055463ffffffff16604082015260075460ff16151560608201526080810185905260a001839052600454600654919250600091829161109091859190612ab7565b9092509050601682146110a257600080fd5b6040516001600160a01b03821681527f7bb17726df1f3adee8aa00ba8e8bc5d6f182af3bbf77604639cb7f008dd3b4ed9060200160405180910390a1505050505050565b60006110f485858585612be5565b9050600080516020615a9c8339815191528160405161111591815260200190565b60405180910390a16016811461112a57600080fd5b949350505050565b600061113c613a8c565b6111468484612cf5565b6040518281529193509150600080516020615a9c8339815191529060200160405180910390a16016821461117957600080fd5b7fa516f81c528634d0fc1e993bba1d227231b4bd6d1beb72d33b056a6199c0f98881604051610a5b91906149c7565b60006111b5848484612de8565b9050600080516020615a9c833981519152816040516111d691815260200190565b60405180910390a1601681146111eb57600080fd5b9392505050565b60008060006101676001600160a01b031663593d6e8260e01b868660405160240161121e9291906149da565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905161125c919061492d565b6000604051808303816000865af19150503d8060008114611299576040519150601f19603f3d011682016040523d82523d6000602084013e61129e565b606091505b5091509150816112af5760156112c3565b808060200190518101906112c3919061495b565b60030b95945050505050565b6000806112dd858585612ec8565b6040518281529193509150600080516020615a9c8339815191529060200160405180910390a16016821461131057600080fd5b6040518181527f25b6684a7e8fe1b676e9c39c8dd65034fbafea906d3bdfd97bf748b7b55e14c8906020016109d6565b6000606080606061135085612fb4565b604051600785900b815293975091955093509150600080516020615a9c8339815191529060200160405180910390a1600784900b60161461139057600080fd5b7f2efc8334b040613a552197fe34283d6ca2909c8ffae393e128424931f20c69b38383836040516113c393929190614a1d565b60405180910390a19193509193565b60006113dc613ac7565b6113e5836130b4565b6040518281529193509150600080516020615a9c8339815191529060200160405180910390a16016821461141857600080fd5b7f476a9a9b28e2717d55288b2ae3c48a72aac52b11f8bd855017c9d41d9fc1896481604051610d199190614a56565b600080611454848461319d565b60405160079290920b80835293509150600080516020615a9c8339815191529060200160405180910390a16016821461148c57600080fd5b60405181151581527f59800d968fcce138300a0019410b4b75041610d65b3cdc5f31656b03ed14912e90602001610a5b565b60006110f4858585856131ee565b6040516001600160a01b03821660248201526000908190819061016790631f106b4b60e21b90604401610bfc565b6000610b62838361324f565b600080606061151686868661329e565b6040518381529295509093509150600080516020615a9c8339815191529060200160405180910390a16016831461154c57600080fd5b7feff23992f47b3c101679f8b4dc9d3e242c903909dba4a453f2b2341ad463b0e2828260405161157d929190614a69565b60405180910390a193509350939050565b60008061159a8361339c565b6040518281529193509150600080516020615a9c8339815191529060200160405180910390a1601682146115cd57600080fd5b60405181151581527f9ee19e13dfa1ba8db2502e15ff56dbecdeb0e0473323fb195473ce648030a2cd90602001610d19565b604080516001808252818301909252600091816020015b61161e613a2f565b815260200190600190039081611616579050509050611650600080600160405180602001604052806000815250612a4b565b8160008151811061166357611663614976565b602002602001018190525060006040518060600160405280600063ffffffff168152602001856001600160a01b03168152602001627a120063ffffffff1681525090506000604051806101200160405280600180546116c19061498c565b80601f01602080910402602001604051908101604052809291908181526020018280546116ed9061498c565b801561173a5780601f1061170f5761010080835404028352916020019161173a565b820191906000526020600020905b81548152906001019060200180831161171d57829003601f168201915b50505050508152602001600280546117519061498c565b80601f016020809104026020016040519081016040528092919081815260200182805461177d9061498c565b80156117ca5780601f1061179f576101008083540402835291602001916117ca565b820191906000526020600020905b8154815290600101906020018083116117ad57829003601f168201915b50505050508152602001866001600160a01b03168152602001600380546117f09061498c565b80601f016020809104026020016040519081016040528092919081815260200182805461181c9061498c565b80156118695780601f1061183e57610100808354040283529160200191611869565b820191906000526020600020905b81548152906001019060200180831161184c57829003601f168201915b505050918352505060016020820181905260055463ffffffff166040808401919091526000606084018190526080840188905260a09093018690528051828152808201909152929350909190816020015b6040805160a0810182526000808252602080830182905292820181905260608201819052608082015282526000199092019101816118ba5750506040805160a081018252600181526001600160a01b0388811660208301526000928201839052606082018390528916608082015282519293509183919061193d5761193d614976565b6020908102919091010152604080516001808252818301909252600091816020015b6040805160c08101825260008082526020808301829052928201819052606082018190526080820181905260a0820152825260001990920191018161195f5750506040805160c0810182526004815260056020820152600a91810191909152601e60608201526000608082018190526001600160a01b038a1660a0830152825192935090918391906119f3576119f3614976565b6020026020010181905250600080611a128560045460065487876133e5565b91509150600080516020615a9c83398151915282604051611a3591815260200190565b60405180910390a160168214611a4a57600080fd5b6040516001600160a01b03821681527f7bb17726df1f3adee8aa00ba8e8bc5d6f182af3bbf77604639cb7f008dd3b4ed9060200160405180910390a1505050505050505050565b6040516001600160a01b038381166024830152821660448201526000908190819061016790638f8d7f9960e01b9060640161121e565b6000611adb611ad68385614b3b565b613519565b9050600080516020615a9c83398151915281604051610b8691815260200190565b6000611b0782613543565b9050600080516020615a9c83398151915281604051611b2891815260200190565b60405180910390a160168114611b3d57600080fd5b919050565b604051633cb0c7fd60e21b81526001600160a01b038084166004830152821660248201526000908190309063f2c31ff4906044016040805180830381600087803b158015611b8f57600080fd5b505af1158015611ba3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc79190614cb3565b604051600783900b81529193509150600080516020615a9c8339815191529060200160405180910390a1600782900b601614611c0257600080fd5b60405181151581527fd24dda6928587354b65aa1a18c2eaf249bef7e5bafd2a71fac71d286f76f957f90602001610a5b565b6040516001600160a01b03838116602483015282166044820152600090819081906101679063af99c63360e01b9060640161121e565b60408051606081018252600080825260208201819052918101829052604051631ac299b760e31b81526001600160a01b0384166004820152309063d614cdb890602401608060405180830381600087803b158015611cc757600080fd5b505af1158015611cdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cff9190614d4d565b6040518281529193509150600080516020615a9c8339815191529060200160405180910390a160168214611d3257600080fd5b7fa0a16bf9db2c17796faeca5af5aaeef8523f9d4c350c512cb00062ad89604f8881604051610d199190614d7a565b604080516060810182526000808252602080830182905282840182905283516001600160a01b038616602480830191909152855180830390910181526044909101855290810180516001600160e01b0316631ac299b760e31b179052925190928391829161016791611dd3919061492d565b6000604051808303816000865af19150503d8060008114611e10576040519150601f19603f3d011682016040523d82523d6000602084013e611e15565b606091505b506040805160608101825260008082526020820181905291810191909152919350915082611e4557601581611e59565b81806020019051810190611e599190614dae565b60039190910b97909650945050505050565b60408051600580825260c08201909252600091816020015b611e8b613a2f565b815260200190600190039081611e83579050509050611ebe60006006600160405180602001604052806000815250612a4b565b81600081518110611ed157611ed1614976565b6020026020010181905250611ef760018060405180602001604052806000815250612a82565b81600181518110611f0a57611f0a614976565b6020026020010181905250611f316002600160405180602001604052806000815250612a82565b81600281518110611f4457611f44614976565b6020026020010181905250611f6b6004600160405180602001604052806000815250612a82565b81600381518110611f7e57611f7e614976565b6020026020010181905250611fa56003600160405180602001604052806000815250612a82565b81600481518110611fb857611fb8614976565b602002602001018190525060006040518060600160405280600063ffffffff168152602001846001600160a01b03168152602001627a120063ffffffff1681525090506000604051806101200160405280600180546120169061498c565b80601f01602080910402602001604051908101604052809291908181526020018280546120429061498c565b801561208f5780601f106120645761010080835404028352916020019161208f565b820191906000526020600020905b81548152906001019060200180831161207257829003601f168201915b50505050508152602001600280546120a69061498c565b80601f01602080910402602001604051908101604052809291908181526020018280546120d29061498c565b801561211f5780601f106120f45761010080835404028352916020019161211f565b820191906000526020600020905b81548152906001019060200180831161210257829003601f168201915b50505050508152602001856001600160a01b03168152602001600380546121459061498c565b80601f01602080910402602001604051908101604052809291908181526020018280546121719061498c565b80156121be5780601f10612193576101008083540402835291602001916121be565b820191906000526020600020905b8154815290600101906020018083116121a157829003601f168201915b50505091835250506001602082015260055463ffffffff16604082015260075460ff16151560608201526080810185905260a00183905290506000806110908361358a565b60006111b5848484613674565b6040517f593d6e82000000000000000000000000000000000000000000000000000000008152600090309063593d6e829061225190869086906004016149da565b602060405180830381600087803b15801561226b57600080fd5b505af115801561227f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611adb9190614914565b60006111b58484846136cf565b6040516001600160a01b0383811660248301528216604482015260009081908190819061016790633cb0c7fd60e21b906064015b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051612322919061492d565b6000604051808303816000865af19150503d806000811461235f576040519150601f19603f3d011682016040523d82523d6000602084013e612364565b606091505b5091509150816123775760156000611e59565b80806020019051810190611e599190614dd9565b6000612395613ae7565b61239e83613726565b6040518281529193509150600080516020615a9c8339815191529060200160405180910390a1601682146123d157600080fd5b7f528c7dcea75f0c9e110a038e50647cd6a70ac06d331399b77dd9a80f903ebc1681604051610d199190614e05565b6000611adb838361380f565b604051633b3bff0f60e01b81526001600160a01b03821660048201526000903090633b3bff0f90602401602060405180830381600087803b15801561245057600080fd5b505af1158015612464573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124889190614914565b9050600080516020615a9c833981519152816040516124a991815260200190565b60405180910390a1601681146124be57600080fd5b604051600181527f319ab7084208e4afa38c6e6ff7aea9587439f2e4700746f4c7d425fea17426d290602001610b49565b60006111b584848461385e565b6007805460ff191682151590811790915560405160ff909116151581527f457c3a16a0ebdc38e3675609957ca3fcc4490e220bd15d85d34f58e2e145cb089060200160405180910390a150565b6040805160008082526020820190925281908161258e565b60408051606081018252600080825260208083018290529282015282526000199092019101816125615790505b50905060006040518060400160405280336001600160a01b03168152602001856125b790614e18565b600790810b9091526040805180820182526001600160a01b038a1681529187900b602083015280516002808252606082019092529293509091600091816020015b60408051808201909152600080825260208201528152602001906001900390816125f8579050509050828160008151811061263557612635614976565b6020026020010181905250818160018151811061265457612654614976565b602090810291909101810191909152604080516060810182526001600160a01b038a16815291820183905281810186905280516001808252818301909252600091816020015b6126c7604051806060016040528060006001600160a01b0316815260200160608152602001606081525090565b81526020019060019003908161269a57905050905081816000815181106126f0576126f0614976565b602002602001018190525061270481613519565b96506016871461271357600080fd5b5050505050509392505050565b604080516001600160a01b0385811660248301528481166044830152831660648083019190915282518083039091018152608490910182526020810180516001600160e01b03167ff49f40db000000000000000000000000000000000000000000000000000000001790529051600091829182918291610167916127a39161492d565b6000604051808303816000865af19150503d80600081146127e0576040519150601f19603f3d011682016040523d82523d6000602084013e6127e5565b606091505b5091509150816127f8576015600061280c565b8080602001905181019061280c9190614dd9565b60039190910b9890975095505050505050565b604080516001600160a01b0384166024820152604480820184905282518083039091018152606490910182526020810180516001600160e01b03167f098f2366000000000000000000000000000000000000000000000000000000001790529051600091829182918291610167916128969161492d565b6000604051808303816000865af19150503d80600081146128d3576040519150601f19603f3d011682016040523d82523d6000602084013e6128d8565b606091505b5091509150816128eb5760156000611e59565b80806020019051810190611e599190614e4e565b6040516001600160a01b0383811660248301528216604482015260009081908190610167907f52f91387000000000000000000000000000000000000000000000000000000009060640161121e565b6040516001600160a01b0382166024820152600090819081908190610167907fa7daa18d00000000000000000000000000000000000000000000000000000000906044015b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516129d1919061492d565b6000604051808303816000865af19150503d8060008114612a0e576040519150601f19603f3d011682016040523d82523d6000602084013e612a13565b606091505b509150915081612a265760156000612a3a565b80806020019051810190612a3a9190614dd9565b60039190910b969095509350505050565b612a53613a2f565b6040518060400160405280612a6887876138b4565b8152602001612a7785856138cd565b905295945050505050565b612a8a613a2f565b6040518060400160405280612a9e8661399d565b8152602001612aad85856138cd565b9052949350505050565b600080848061010001516000015163ffffffff166000148015612ae757506101008101516040015163ffffffff16155b15612afd576101008101516276a7006040909101525b6000806101676001600160a01b031634637812a04b60e01b8a8a8a604051602401612b2a93929190614e7a565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051612b68919061492d565b60006040518083038185875af1925050503d8060008114612ba5576040519150601f19603f3d011682016040523d82523d6000602084013e612baa565b606091505b509150915081612bbd5760156000612bd1565b80806020019051810190612bd19190614e4e565b60039190910b999098509650505050505050565b6040516001600160a01b038581166024830152848116604483015283166064820152600782900b608482015260009081908190610167907feca36917000000000000000000000000000000000000000000000000000000009060a4015b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051612c80919061492d565b6000604051808303816000865af19150503d8060008114612cbd576040519150601f19603f3d011682016040523d82523d6000602084013e612cc2565b606091505b509150915081612cd3576015612ce7565b80806020019051810190612ce7919061495b565b60030b979650505050505050565b6000612cff613a8c565b604080516001600160a01b0386166024820152600785900b60448083019190915282518083039091018152606490910182526020810180516001600160e01b03167f287e1da8000000000000000000000000000000000000000000000000000000001790529051600091829161016791612d789161492d565b6000604051808303816000865af19150503d8060008114612db5576040519150601f19603f3d011682016040523d82523d6000602084013e612dba565b606091505b5091509150612dc7613a8c565b82612dd45760158161280c565b8180602001905181019061280c9190615504565b60008060006101676001600160a01b031663f7f38e2660e01b878787604051602401612e16939291906155ec565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051612e54919061492d565b6000604051808303816000865af19150503d8060008114612e91576040519150601f19603f3d011682016040523d82523d6000602084013e612e96565b606091505b509150915081612ea7576015612ebb565b80806020019051810190612ebb919061495b565b60030b9695505050505050565b604080516001600160a01b0385811660248301528481166044830152831660648083019190915282518083039091018152608490910182526020810180516001600160e01b03167f927da10500000000000000000000000000000000000000000000000000000000179052905160009182918291829161016791612f4b9161492d565b6000604051808303816000865af19150503d8060008114612f88576040519150601f19603f3d011682016040523d82523d6000602084013e612f8d565b606091505b509150915081612fa0576015600061280c565b8080602001905181019061280c9190615618565b604080516001600160a01b03831660248083019190915282518083039091018152604490910182526020810180516001600160e01b03167fae7611a000000000000000000000000000000000000000000000000000000000179052905160009160609182918291859182916101679161302c9161492d565b6000604051808303816000865af19150503d8060008114613069576040519150601f19603f3d011682016040523d82523d6000602084013e61306e565b606091505b509150915060608060608461308757601583838361309b565b8380602001905181019061309b9190615644565b60039390930b9d919c509a509098509650505050505050565b60006130be613ac7565b604080516001600160a01b03851660248083019190915282518083039091018152604490910182526020810180516001600160e01b03167f3f28a19b00000000000000000000000000000000000000000000000000000000179052905160009182916101679161312d9161492d565b6000604051808303816000865af19150503d806000811461316a576040519150601f19603f3d011682016040523d82523d6000602084013e61316f565b606091505b509150915061317c613ac7565b8261318957601581611e59565b81806020019051810190611e5991906156dd565b6040516001600160a01b03838116602483015282166044820152600090819081908190610167907f46de0fb100000000000000000000000000000000000000000000000000000000906064016122e4565b6040516001600160a01b038581166024830152848116604483015283166064820152600782900b608482015260009081908190610167907f5cfc9011000000000000000000000000000000000000000000000000000000009060a401612c42565b6040516001600160a01b0383811660248301528216604482015260009081908190610167907f5b8f8584000000000000000000000000000000000000000000000000000000009060640161121e565b60008060606000806101676001600160a01b031663278e0b8860e01b8989896040516024016132cf93929190615789565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905161330d919061492d565b6000604051808303816000865af19150503d806000811461334a576040519150601f19603f3d011682016040523d82523d6000602084013e61334f565b606091505b509150915081613372576040805160008082526020820190925260159190613386565b80806020019051810190613386919061580d565b60039290920b9a90995090975095505050505050565b6040516001600160a01b0382166024820152600090819081908190610167907f335e04c10000000000000000000000000000000000000000000000000000000090604401612993565b600080868061010001516000015163ffffffff16600014801561341557506101008101516040015163ffffffff16155b1561342b576101008101516276a7006040909101525b6000806101676001600160a01b031634634c381ae760e01b8c8c8c8c8c60405160240161345c9594939291906158be565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905161349a919061492d565b60006040518083038185875af1925050503d80600081146134d7576040519150601f19603f3d011682016040523d82523d6000602084013e6134dc565b606091505b5091509150816134ef5760156000613503565b808060200190518101906135039190614e4e565b60039190910b9b909a5098505050505050505050565b60008060006101676001600160a01b031663189a554c60e01b85604051602401610bfc9190615964565b6040516001600160a01b038216602482015260009081908190610167907ff069f7120000000000000000000000000000000000000000000000000000000090604401610bfc565b600080828061010001516000015163ffffffff1660001480156135ba57506101008101516040015163ffffffff16155b156135d0576101008101516276a7006040909101525b6000806101676001600160a01b031634639dc711e060e01b886040516024016135f99190615a3a565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051613637919061492d565b60006040518083038185875af1925050503d80600081146128d3576040519150601f19603f3d011682016040523d82523d6000602084013e6128d8565b6040516001600160a01b0384811660248301528316604482015263ffffffff8216606482015260009081908190610167907f9790686d0000000000000000000000000000000000000000000000000000000090608401612e16565b6040516001600160a01b03848116602483015283166044820152811515606482015260009081908190610167907f367605ca0000000000000000000000000000000000000000000000000000000090608401612e16565b6000613730613ae7565b604080516001600160a01b03851660248083019190915282518083039091018152604490910182526020810180516001600160e01b03167f1f69565f00000000000000000000000000000000000000000000000000000000179052905160009182916101679161379f9161492d565b6000604051808303816000865af19150503d80600081146137dc576040519150601f19603f3d011682016040523d82523d6000602084013e6137e1565b606091505b50915091506137ee613ae7565b826137fb57601581611e59565b81806020019051810190611e599190615a4d565b6040516001600160a01b0383811660248301528216604482015260009081908190610167907f49146bde000000000000000000000000000000000000000000000000000000009060640161121e565b6040516001600160a01b038481166024830152831660448201526064810182905260009081908190610167907fe1f21c670000000000000000000000000000000000000000000000000000000090608401612e16565b6000600160ff84161b9050600160ff83161b81176111eb565b6139136040518060a0016040528060001515815260200160006001600160a01b03168152602001606081526020016060815260200160006001600160a01b031681525090565b8260ff16600114156139285760018152610962565b8260ff166002141561394a576000546001600160a01b03166020820152610962565b8260ff16600314156139625760408101829052610962565b8260ff166004141561397a5760608101829052610962565b8260ff1660051415610962576000546001600160a01b0316608082015292915050565b600060ff82166139af57506001919050565b8160ff16600114156139c357506002919050565b8160ff16600214156139d757506004919050565b8160ff16600314156139eb57506008919050565b8160ff16600414156139ff57506010919050565b8160ff1660051415613a1357506020919050565b8160ff1660061415613a2757506040919050565b506000919050565b604051806040016040528060008152602001613a876040518060a0016040528060001515815260200160006001600160a01b03168152602001606081526020016060815260200160006001600160a01b031681525090565b905290565b6040518060c00160405280613a9f613ae7565b8152600060208201819052604082018190526060808301829052608083015260a09091015290565b6040518060400160405280613ada613ae7565b8152600060209091015290565b60408051610240810182526060610120820181815261014083018290526000610160840181905261018084018390526101a084018190526101c084018190526101e0840181905261020084018390528451928301855280835260208301819052938201939093526102208201529081908152602001600067ffffffffffffffff168152602001600015158152602001600015158152602001600015158152602001606081526020016060815260200160608152602001606081525090565b6001600160a01b0381168114613bba57600080fd5b50565b60008060408385031215613bd057600080fd5b8235613bdb81613ba5565b91506020830135613beb81613ba5565b809150509250929050565b600080600060608486031215613c0b57600080fd5b8335613c1681613ba5565b92506020840135613c2681613ba5565b91506040840135613c3681613ba5565b809150509250925092565b60008060408385031215613c5457600080fd5b8235613c5f81613ba5565b946020939093013593505050565b600060208284031215613c7f57600080fd5b81356111eb81613ba5565b8060070b8114613bba57600080fd5b60008060008060808587031215613caf57600080fd5b8435613cba81613ba5565b93506020850135613cca81613ba5565b92506040850135613cda81613ba5565b91506060850135613cea81613c8a565b939692955090935050565b60008060408385031215613d0857600080fd5b8235613d1381613ba5565b91506020830135613beb81613c8a565b60005b83811015613d3e578181015183820152602001613d26565b83811115613d4d576000848401525b50505050565b60008151808452613d6b816020860160208601613d23565b601f01601f19169290920160200192915050565b600081518084526020808501808196508360051b8101915082860160005b85811015613e365782840389528151604081518652868201519150808787015281511515818701528682015160606001600160a01b03808316828a015283850151935060a09250608083818b0152613df860e08b0186613d53565b928601518a8403603f1901858c0152929450613e148584613d53565b9501511660c09890980197909752505098850198935090840190600101613d9d565b5091979650505050505050565b60006101608251818552613e5982860182613d53565b91505060208301518482036020860152613e738282613d53565b9150506040830151613e9060408601826001600160a01b03169052565b5060608301518482036060860152613ea88282613d53565b9150506080830151613ebe608086018215159052565b5060a0830151613ed660a086018263ffffffff169052565b5060c0830151613eea60c086018215159052565b5060e083015184820360e0860152613f028282613d7f565b61010085810151805163ffffffff9081168984015260208201516001600160a01b03166101208a015260408201511661014089015291935091505090949350505050565b600081518084526020808501945080840160005b83811015613fb6578151805163ffffffff168852838101516001600160a01b03908116858a01526040808301511515908a01526060808301511515908a0152608091820151169088015260a09096019590820190600101613f5a565b509495945050505050565b600081518084526020808501945080840160005b83811015613fb6578151805163ffffffff9081168952848201518116858a01526040808301518216908a01526060808301519091169089015260808082015115159089015260a0908101516001600160a01b03169088015260c09096019590820190600101613fd5565b600081518084526020808501945080840160005b83811015613fb6578151805163ffffffff9081168952848201518116858a0152604080830151909116908901526060808201516001600160a01b03908116918a01919091526080808301511515908a015260a091820151169088015260c09096019590820190600101614053565b600061012082518185526140d782860182613e43565b91505060208301516140f5602086018267ffffffffffffffff169052565b506040830151614109604086018215159052565b50606083015161411d606086018215159052565b506080830151614131608086018215159052565b5060a083015184820360a08601526141498282613f46565b91505060c083015184820360c08601526141638282613fc1565b91505060e083015184820360e086015261417d828261403f565b91505061010080840151858303828701526141988382613d53565b9695505050505050565b6000815160c084526141b760c08501826140c1565b9050602083015160070b602085015260408301516001600160a01b038082166040870152606085015160070b60608701526080850151915085830360808701526142018383613d53565b92508060a08601511660a087015250508091505092915050565b82815260406020820152600061112a60408301846141a2565b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff8111828210171561426d5761426d614234565b60405290565b6040805190810167ffffffffffffffff8111828210171561426d5761426d614234565b60405160a0810167ffffffffffffffff8111828210171561426d5761426d614234565b604051610120810167ffffffffffffffff8111828210171561426d5761426d614234565b60405160c0810167ffffffffffffffff8111828210171561426d5761426d614234565b604051601f8201601f1916810167ffffffffffffffff8111828210171561432957614329614234565b604052919050565b600067ffffffffffffffff82111561434b5761434b614234565b5060051b60200190565b60008060006060848603121561436a57600080fd5b833561437581613ba5565b925060208481013561438681613ba5565b9250604085013567ffffffffffffffff8111156143a257600080fd5b8501601f810187136143b357600080fd5b80356143c66143c182614331565b614300565b81815260059190911b820183019083810190898311156143e557600080fd5b928401925b8284101561440c5783356143fd81613c8a565b825292840192908401906143ea565b80955050505050509250925092565b63ffffffff81168114613bba57600080fd5b600080828403608081121561444157600080fd5b833561444c81613ba5565b92506060601f198201121561446057600080fd5b5061446961424a565b60208401356144778161441b565b8152604084013561448781613ba5565b6020820152606084013561449a8161441b565b6040820152919491935090915050565b8460070b81526080602082015260006144c66080830186613f46565b82810360408401526144d88186613fc1565b905082810360608401526144ec818561403f565b979650505050505050565b600081516040845261450c60408501826140c1565b60209384015163ffffffff16949093019390935250919050565b82815260406020820152600061112a60408301846144f7565b67ffffffffffffffff81168114613bba57600080fd5b600067ffffffffffffffff82111561456f5761456f614234565b50601f01601f191660200190565b60008060006060848603121561459257600080fd5b833561459d81613ba5565b92506020848101356145ae8161453f565b925060408581013567ffffffffffffffff808211156145cc57600080fd5b818801915088601f8301126145e057600080fd5b81356145ee6143c182614331565b81815260059190911b8301850190858101908b83111561460d57600080fd5b8685015b83811015614681578035858111156146295760008081fd5b8601603f81018e1361463b5760008081fd5b8881013561464b6143c182614555565b8181528f8a8385010111156146605760008081fd5b818a84018c83013760009181018b0191909152845250918701918701614611565b50809750505050505050509250925092565b600081518084526020808501945080840160005b83811015613fb657815160070b875295820195908201906001016146a7565b83815267ffffffffffffffff831660208201526060604082015260006146ef6060830184614693565b95945050505050565b6000806020838503121561470b57600080fd5b823567ffffffffffffffff8082111561472357600080fd5b818501915085601f83011261473757600080fd5b81358181111561474657600080fd5b8660208260051b850101111561475b57600080fd5b60209290920196919550909350505050565b828152608081016111eb6020830184805163ffffffff90811683526020808301516001600160a01b03169084015260409182015116910152565b6000806000606084860312156147bc57600080fd5b83356147c781613ba5565b925060208401356147d781613ba5565b91506040840135613c368161441b565b8015158114613bba57600080fd5b60008060006060848603121561480a57600080fd5b833561481581613ba5565b9250602084013561482581613ba5565b91506040840135613c36816147e7565b82815260406020820152600061112a60408301846140c1565b60008060006060848603121561486357600080fd5b833561486e81613ba5565b9250602084013561487e81613ba5565b929592945050506040919091013590565b6000602082840312156148a157600080fd5b81356111eb816147e7565b6000806000606084860312156148c157600080fd5b83356148cc81613ba5565b925060208401356148dc81613ba5565b91506040840135613c3681613c8a565b8051611b3d81613c8a565b60006020828403121561490957600080fd5b81516111eb81613c8a565b60006020828403121561492657600080fd5b5051919050565b6000825161493f818460208701613d23565b9190910192915050565b8051600381900b8114611b3d57600080fd5b60006020828403121561496d57600080fd5b6111eb82614949565b634e487b7160e01b600052603260045260246000fd5b600181811c908216806149a057607f821691505b602082108114156149c157634e487b7160e01b600052602260045260246000fd5b50919050565b6020815260006111eb60208301846141a2565b6001600160a01b0383168152608081016111eb6020830184805163ffffffff90811683526020808301516001600160a01b03169084015260409182015116910152565b606081526000614a306060830186613f46565b8281036020840152614a428186613fc1565b90508281036040840152614198818561403f565b6020815260006111eb60208301846144f7565b67ffffffffffffffff8316815260406020820152600061112a6040830184614693565b600082601f830112614a9d57600080fd5b81356020614aad6143c183614331565b82815260609283028501820192828201919087851115614acc57600080fd5b8387015b85811015614b2e5781818a031215614ae85760008081fd5b614af061424a565b8135614afb81613ba5565b815281860135614b0a81613ba5565b81870152604082810135614b1d81613c8a565b908201528452928401928101614ad0565b5090979650505050505050565b6000614b496143c184614331565b80848252602080830192508560051b850136811115614b6757600080fd5b855b81811015614c9c57803567ffffffffffffffff80821115614b8a5760008081fd5b818901915060608236031215614ba05760008081fd5b614ba861424a565b8235614bb381613ba5565b81528286013582811115614bc75760008081fd5b830136601f820112614bd95760008081fd5b8035614be76143c182614331565b81815260069190911b82018801908881019036831115614c075760008081fd5b928901925b82841015614c5d5760408436031215614c255760008081fd5b614c2d614273565b8435614c3881613ba5565b8152848b0135614c4781613c8a565b818c015282526040939093019290890190614c0c565b848a01525060409150508381013583811115614c795760008081fd5b614c8536828701614a8c565b918301919091525087525050938201938201614b69565b50919695505050505050565b8051611b3d816147e7565b60008060408385031215614cc657600080fd5b8251614cd181613c8a565b6020840151909250613beb816147e7565b8051611b3d8161441b565b8051611b3d81613ba5565b600060608284031215614d0a57600080fd5b614d1261424a565b90508151614d1f8161441b565b81526020820151614d2f81613ba5565b60208201526040820151614d428161441b565b604082015292915050565b60008060808385031215614d6057600080fd5b82519150614d718460208501614cf8565b90509250929050565b606081016109628284805163ffffffff90811683526020808301516001600160a01b03169084015260409182015116910152565b60008060808385031215614dc157600080fd5b614dca83614949565b9150614d718460208501614cf8565b60008060408385031215614dec57600080fd5b614df583614949565b91506020830151613beb816147e7565b6020815260006111eb60208301846140c1565b60008160070b677fffffffffffffff19811415614e4557634e487b7160e01b600052601160045260246000fd5b60000392915050565b60008060408385031215614e6157600080fd5b614e6a83614949565b91506020830151613beb81613ba5565b606081526000614e8d6060830186613e43565b60208301949094525060400152919050565b600082601f830112614eb057600080fd5b8151614ebe6143c182614555565b818152846020838601011115614ed357600080fd5b61112a826020830160208701613d23565b600082601f830112614ef557600080fd5b81516020614f056143c183614331565b82815260059290921b84018101918181019086841115614f2457600080fd5b8286015b8481101561503a57805167ffffffffffffffff80821115614f4857600080fd5b908801906040601f19838c038101821315614f6257600080fd5b614f6a614273565b8885015181528285015184811115614f8157600080fd5b949094019360a0858e0383011215614f995760008081fd5b614fa1614296565b915088850151614fb0816147e7565b825284830151614fbf81613ba5565b828a015260608581015185811115614fd75760008081fd5b614fe58f8c838a0101614e9f565b85850152506080935083860151858111156150005760008081fd5b61500e8f8c838a0101614e9f565b82850152505061502060a08601614ced565b928201929092528188015285525050918301918301614f28565b509695505050505050565b6000610160828403121561505857600080fd5b6150606142b9565b9050815167ffffffffffffffff8082111561507a57600080fd5b61508685838601614e9f565b8352602084015191508082111561509c57600080fd5b6150a885838601614e9f565b60208401526150b960408501614ced565b604084015260608401519150808211156150d257600080fd5b6150de85838601614e9f565b60608401526150ef60808501614ca8565b608084015261510060a08501614ce2565b60a084015261511160c08501614ca8565b60c084015260e084015191508082111561512a57600080fd5b5061513784828501614ee4565b60e08301525061010061514c84828501614cf8565b9082015292915050565b8051611b3d8161453f565b600082601f83011261517257600080fd5b815160206151826143c183614331565b82815260a092830285018201928282019190878511156151a157600080fd5b8387015b85811015614b2e5781818a0312156151bd5760008081fd5b6151c5614296565b81516151d08161441b565b8152818601516151df81613ba5565b818701526040828101516151f2816147e7565b90820152606082810151615205816147e7565b9082015260808281015161521881613ba5565b9082015284529284019281016151a5565b600082601f83011261523a57600080fd5b8151602061524a6143c183614331565b82815260c0928302850182019282820191908785111561526957600080fd5b8387015b85811015614b2e5781818a0312156152855760008081fd5b61528d6142dd565b81516152988161441b565b8152818601516152a78161441b565b818701526040828101516152ba8161441b565b908201526060828101516152cd8161441b565b908201526080828101516152e0816147e7565b9082015260a0828101516152f381613ba5565b90820152845292840192810161526d565b600082601f83011261531557600080fd5b815160206153256143c183614331565b82815260c0928302850182019282820191908785111561534457600080fd5b8387015b85811015614b2e5781818a0312156153605760008081fd5b6153686142dd565b81516153738161441b565b8152818601516153828161441b565b818701526040828101516153958161441b565b908201526060828101516153a881613ba5565b908201526080828101516153bb816147e7565b9082015260a0828101516153ce81613ba5565b908201528452928401928101615348565b600061012082840312156153f257600080fd5b6153fa6142b9565b9050815167ffffffffffffffff8082111561541457600080fd5b61542085838601615045565b835261542e60208501615156565b602084015261543f60408501614ca8565b604084015261545060608501614ca8565b606084015261546160808501614ca8565b608084015260a084015191508082111561547a57600080fd5b61548685838601615161565b60a084015260c084015191508082111561549f57600080fd5b6154ab85838601615229565b60c084015260e08401519150808211156154c457600080fd5b6154d085838601615304565b60e0840152610100915081840151818111156154eb57600080fd5b6154f786828701614e9f565b8385015250505092915050565b6000806040838503121561551757600080fd5b61552083614949565b9150602083015167ffffffffffffffff8082111561553d57600080fd5b9084019060c0828703121561555157600080fd5b6155596142dd565b82518281111561556857600080fd5b615574888286016153df565b825250615583602084016148ec565b602082015261559460408401614ced565b60408201526155a5606084016148ec565b60608201526080830151828111156155bc57600080fd5b6155c888828601614e9f565b6080830152506155da60a08401614ced565b60a08201528093505050509250929050565b60006001600160a01b038086168352808516602084015250606060408301526146ef6060830184614693565b6000806040838503121561562b57600080fd5b61563483614949565b9150602083015190509250929050565b6000806000806080858703121561565a57600080fd5b61566385614949565b9350602085015167ffffffffffffffff8082111561568057600080fd5b61568c88838901615161565b945060408701519150808211156156a257600080fd5b6156ae88838901615229565b935060608701519150808211156156c457600080fd5b506156d187828801615304565b91505092959194509250565b600080604083850312156156f057600080fd5b6156f983614949565b9150602083015167ffffffffffffffff8082111561571657600080fd5b908401906040828703121561572a57600080fd5b60405160408101818110838211171561574557615745614234565b60405282518281111561575757600080fd5b615763888286016153df565b825250602083015192506157768361441b565b8260208201528093505050509250929050565b6000606082016001600160a01b0386168352602067ffffffffffffffff8616818501526060604085015281855180845260808601915060808160051b870101935082870160005b828110156157fe57607f198887030184526157ec868351613d53565b955092840192908401906001016157d0565b50939998505050505050505050565b60008060006060848603121561582257600080fd5b61582b84614949565b925060208085015161583c8161453f565b604086015190935067ffffffffffffffff81111561585957600080fd5b8501601f8101871361586a57600080fd5b80516158786143c182614331565b81815260059190911b8201830190838101908983111561589757600080fd5b928401925b8284101561440c5783516158af81613c8a565b8252928401929084019061589c565b60a0815260006158d160a0830188613e43565b86602084015285604084015282810360608401526158ef8186613f46565b905082810360808401526159038185613fc1565b98975050505050505050565b600081518084526020808501945080840160005b83811015613fb657815180516001600160a01b03908116895284820151168489015260409081015160070b9088015260609096019590820190600101615923565b60006020808301818452808551808352604092508286019150828160051b8701018488016000805b84811015615a2b57898403603f19018652825180516001600160a01b0390811686528982015160608b880181905281519088018190526080880192918c01919086905b808210156159fd5783518051841686528e015160070b8e860152938c0193928d0192600191909101906159cf565b5050505090880151858203868a015290615a17818361590f565b978a0197955050509187019160010161598c565b50919998505050505050505050565b6020815260006111eb6020830184613e43565b60008060408385031215615a6057600080fd5b615a6983614949565b9150602083015167ffffffffffffffff811115615a8557600080fd5b615a91858286016153df565b915050925092905056fe90a5cf4cffe88b4edbb041cfc7a8a812c48a5ec30b84640fb37690875168e3aaa26469706673582212200e78f269d9e7b70c329341bf2e8cd11c83b1b8affe71ae06bf9922e36f1a7a9764736f6c63430008090033", + "deployedBytecode": "0x6080604052600436106102c65760003560e01c80638070905f11610179578063d85f74c1116100d6578063f2f38a741161008a578063f848fec411610064578063f848fec414610844578063f9e978bd14610864578063fdc8321e1461088457600080fd5b8063f2f38a74146107d6578063f4a01e5b14610804578063f7be34251461082457600080fd5b8063eee55ac8116100bb578063eee55ac814610776578063f25b120014610796578063f2c31ff4146107b657600080fd5b8063d85f74c114610743578063d92ac2481461075657600080fd5b8063a345f7bd1161012d578063af99c63311610112578063af99c633146106d5578063c0b19b6d146106f5578063d614cdb81461072357600080fd5b8063a345f7bd1461067b578063a3ad5b551461069b57600080fd5b80638ba74da01161015e5780638ba74da0146106285780638f8d7f991461063b5780639604ca651461065b57600080fd5b80638070905f146105d957806386f88d881461060857600080fd5b80634cbdb37b1161022757806369837dc2116101db5780636da6b1f0116101c05780636da6b1f0146105795780637c41ad2c146105995780637d3e5da8146105b957600080fd5b806369837dc21461052b5780636a4dde211461055957600080fd5b8063593d6e821161020c578063593d6e82146104a65780635a5e6c31146104c65780635b9076b7146104fb57600080fd5b80634cbdb37b1461045857806356af84031461048657600080fd5b80632eecbca31161027e5780633eed2c39116102635780633eed2c39146104035780634b5c6687146104235780634ba670351461043857600080fd5b80632eecbca3146103c35780633b3bff0f146103e357600080fd5b806319db44b6116102af57806319db44b6146103385780632b256ec8146103755780632d73bb2e146103a357600080fd5b80630fd2601e146102cb57806313c05dd814610303575b600080fd5b3480156102d757600080fd5b506102eb6102e6366004613bbd565b6108a4565b60405160079190910b81526020015b60405180910390f35b34801561030f57600080fd5b5061032361031e366004613bf6565b610968565b604080519283529015156020830152016102fa565b34801561034457600080fd5b50610358610353366004613c41565b6109e6565b604080519283526001600160a01b039091166020830152016102fa565b34801561038157600080fd5b50610395610390366004613c6d565b610a6a565b6040519081526020016102fa565b3480156103af57600080fd5b506103956103be366004613bbd565b610b56565b3480156103cf57600080fd5b506102eb6103de366004613bbd565b610b9b565b3480156103ef57600080fd5b506103956103fe366004613c6d565b610bd2565b34801561040f57600080fd5b5061032361041e366004613c6d565b610cac565b610436610431366004613c6d565b610d26565b005b34801561044457600080fd5b50610395610453366004613c99565b6110e6565b34801561046457600080fd5b50610478610473366004613cf5565b611132565b6040516102fa92919061421b565b34801561049257600080fd5b506103956104a1366004614355565b6111a8565b3480156104b257600080fd5b506103956104c136600461442d565b6111f2565b3480156104d257600080fd5b506104e66104e1366004613bf6565b6112cf565b604080519283526020830191909152016102fa565b34801561050757600080fd5b5061051b610516366004613c6d565b611340565b6040516102fa94939291906144aa565b34801561053757600080fd5b5061054b610546366004613c6d565b6113d2565b6040516102fa929190614526565b34801561056557600080fd5b50610323610574366004613bbd565b611447565b34801561058557600080fd5b50610395610594366004613c99565b6114be565b3480156105a557600080fd5b506103956105b4366004613c6d565b6114cc565b3480156105c557600080fd5b506103956105d4366004613bbd565b6114fa565b3480156105e557600080fd5b506105f96105f436600461457d565b611506565b6040516102fa939291906146c6565b34801561061457600080fd5b50610323610623366004613c6d565b61158e565b610436610636366004613bbd565b6115ff565b34801561064757600080fd5b506102eb610656366004613bbd565b611a91565b34801561066757600080fd5b506103956106763660046146f8565b611ac7565b34801561068757600080fd5b50610395610696366004613c6d565b611afc565b3480156106a757600080fd5b506106bb6106b6366004613bbd565b611b42565b6040805160079390930b83529015156020830152016102fa565b3480156106e157600080fd5b506102eb6106f0366004613bbd565b611c34565b34801561070157600080fd5b50610715610710366004613c6d565b611c6a565b6040516102fa92919061476d565b34801561072f57600080fd5b5061071561073e366004613c6d565b611d61565b610436610751366004613c6d565b611e6b565b34801561076257600080fd5b506103956107713660046147a7565b612203565b34801561078257600080fd5b5061039561079136600461442d565b612210565b3480156107a257600080fd5b506103956107b13660046147f5565b6122a3565b3480156107c257600080fd5b506106bb6107d1366004613bbd565b6122b0565b3480156107e257600080fd5b506107f66107f1366004613c6d565b61238b565b6040516102fa929190614835565b34801561081057600080fd5b5061039561081f366004613bbd565b612400565b34801561083057600080fd5b5061039561083f366004613c6d565b61240c565b34801561085057600080fd5b5061039561085f36600461484e565b6124ef565b34801561087057600080fd5b5061043661087f36600461488f565b6124fc565b34801561089057600080fd5b5061039561089f3660046148ac565b612549565b604051638f8d7f9960e01b81526001600160a01b038084166004830152821660248201526000903090638f8d7f99906044015b602060405180830381600087803b1580156108f157600080fd5b505af1158015610905573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061092991906148f7565b604051600782900b8152909150600080516020615a9c8339815191529060200160405180910390a1600781900b60161461096257600080fd5b92915050565b600080610976858585612720565b6040518281529193509150600080516020615a9c8339815191529060200160405180910390a1601682146109a957600080fd5b60405181151581527e1c2e72360171244b3bb8cc8ddd767820edf37138ad6f129fb3574b407c307d906020015b60405180910390a1935093915050565b6000806109f3848461281f565b6040518281529193509150600080516020615a9c8339815191529060200160405180910390a160168214610a2657600080fd5b6040516001600160a01b03821681527fc2c78c7c31baf14949e75c51df12be56edb9af523cf82839c2869bbcf13b3ecb906020015b60405180910390a19250929050565b604051631f106b4b60e21b81526001600160a01b03821660048201526000903090637c41ad2c90602401602060405180830381600087803b158015610aae57600080fd5b505af1158015610ac2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae69190614914565b9050600080516020615a9c83398151915281604051610b0791815260200190565b60405180910390a160168114610b1c57600080fd5b604051600181527f0c9c765845f4d139956bb8fc8decb2eec6093c9c608b809641b16054b29f0e13906020015b60405180910390a1919050565b6000610b6283836128ff565b60070b9050600080516020615a9c83398151915281604051610b8691815260200190565b60405180910390a16016811461096257600080fd5b60405163af99c63360e01b81526001600160a01b03808416600483015282166024820152600090309063af99c633906044016108d7565b6040516001600160a01b03821660248201526000908190819061016790633b3bff0f60e01b906044015b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051610c3a919061492d565b6000604051808303816000865af19150503d8060008114610c77576040519150601f19603f3d011682016040523d82523d6000602084013e610c7c565b606091505b509150915081610c8d576015610ca1565b80806020019051810190610ca1919061495b565b60030b949350505050565b600080610cb88361294e565b6040518281529193509150600080516020615a9c8339815191529060200160405180910390a160168214610ceb57600080fd5b60405181151581527f6b7f3306751292f85ab4161ee2b0ac16dfc8ded13e6446ce6bd859d0a2f4c78e906020015b60405180910390a1915091565b60408051600480825260a08201909252600091816020015b610d46613a2f565b815260200190600190039081610d3e579050509050610d7960006006600160405180602001604052806000815250612a4b565b81600081518110610d8c57610d8c614976565b6020026020010181905250610db260018060405180602001604052806000815250612a82565b81600181518110610dc557610dc5614976565b6020026020010181905250610dec6002600160405180602001604052806000815250612a82565b81600281518110610dff57610dff614976565b6020026020010181905250610e266003600160405180602001604052806000815250612a82565b81600381518110610e3957610e39614976565b602002602001018190525060006040518060600160405280600063ffffffff168152602001846001600160a01b03168152602001627a120063ffffffff168152509050600060405180610120016040528060018054610e979061498c565b80601f0160208091040260200160405190810160405280929190818152602001828054610ec39061498c565b8015610f105780601f10610ee557610100808354040283529160200191610f10565b820191906000526020600020905b815481529060010190602001808311610ef357829003601f168201915b5050505050815260200160028054610f279061498c565b80601f0160208091040260200160405190810160405280929190818152602001828054610f539061498c565b8015610fa05780601f10610f7557610100808354040283529160200191610fa0565b820191906000526020600020905b815481529060010190602001808311610f8357829003601f168201915b50505050508152602001856001600160a01b0316815260200160038054610fc69061498c565b80601f0160208091040260200160405190810160405280929190818152602001828054610ff29061498c565b801561103f5780601f106110145761010080835404028352916020019161103f565b820191906000526020600020905b81548152906001019060200180831161102257829003601f168201915b50505091835250506001602082015260055463ffffffff16604082015260075460ff16151560608201526080810185905260a001839052600454600654919250600091829161109091859190612ab7565b9092509050601682146110a257600080fd5b6040516001600160a01b03821681527f7bb17726df1f3adee8aa00ba8e8bc5d6f182af3bbf77604639cb7f008dd3b4ed9060200160405180910390a1505050505050565b60006110f485858585612be5565b9050600080516020615a9c8339815191528160405161111591815260200190565b60405180910390a16016811461112a57600080fd5b949350505050565b600061113c613a8c565b6111468484612cf5565b6040518281529193509150600080516020615a9c8339815191529060200160405180910390a16016821461117957600080fd5b7fa516f81c528634d0fc1e993bba1d227231b4bd6d1beb72d33b056a6199c0f98881604051610a5b91906149c7565b60006111b5848484612de8565b9050600080516020615a9c833981519152816040516111d691815260200190565b60405180910390a1601681146111eb57600080fd5b9392505050565b60008060006101676001600160a01b031663593d6e8260e01b868660405160240161121e9291906149da565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905161125c919061492d565b6000604051808303816000865af19150503d8060008114611299576040519150601f19603f3d011682016040523d82523d6000602084013e61129e565b606091505b5091509150816112af5760156112c3565b808060200190518101906112c3919061495b565b60030b95945050505050565b6000806112dd858585612ec8565b6040518281529193509150600080516020615a9c8339815191529060200160405180910390a16016821461131057600080fd5b6040518181527f25b6684a7e8fe1b676e9c39c8dd65034fbafea906d3bdfd97bf748b7b55e14c8906020016109d6565b6000606080606061135085612fb4565b604051600785900b815293975091955093509150600080516020615a9c8339815191529060200160405180910390a1600784900b60161461139057600080fd5b7f2efc8334b040613a552197fe34283d6ca2909c8ffae393e128424931f20c69b38383836040516113c393929190614a1d565b60405180910390a19193509193565b60006113dc613ac7565b6113e5836130b4565b6040518281529193509150600080516020615a9c8339815191529060200160405180910390a16016821461141857600080fd5b7f476a9a9b28e2717d55288b2ae3c48a72aac52b11f8bd855017c9d41d9fc1896481604051610d199190614a56565b600080611454848461319d565b60405160079290920b80835293509150600080516020615a9c8339815191529060200160405180910390a16016821461148c57600080fd5b60405181151581527f59800d968fcce138300a0019410b4b75041610d65b3cdc5f31656b03ed14912e90602001610a5b565b60006110f4858585856131ee565b6040516001600160a01b03821660248201526000908190819061016790631f106b4b60e21b90604401610bfc565b6000610b62838361324f565b600080606061151686868661329e565b6040518381529295509093509150600080516020615a9c8339815191529060200160405180910390a16016831461154c57600080fd5b7feff23992f47b3c101679f8b4dc9d3e242c903909dba4a453f2b2341ad463b0e2828260405161157d929190614a69565b60405180910390a193509350939050565b60008061159a8361339c565b6040518281529193509150600080516020615a9c8339815191529060200160405180910390a1601682146115cd57600080fd5b60405181151581527f9ee19e13dfa1ba8db2502e15ff56dbecdeb0e0473323fb195473ce648030a2cd90602001610d19565b604080516001808252818301909252600091816020015b61161e613a2f565b815260200190600190039081611616579050509050611650600080600160405180602001604052806000815250612a4b565b8160008151811061166357611663614976565b602002602001018190525060006040518060600160405280600063ffffffff168152602001856001600160a01b03168152602001627a120063ffffffff1681525090506000604051806101200160405280600180546116c19061498c565b80601f01602080910402602001604051908101604052809291908181526020018280546116ed9061498c565b801561173a5780601f1061170f5761010080835404028352916020019161173a565b820191906000526020600020905b81548152906001019060200180831161171d57829003601f168201915b50505050508152602001600280546117519061498c565b80601f016020809104026020016040519081016040528092919081815260200182805461177d9061498c565b80156117ca5780601f1061179f576101008083540402835291602001916117ca565b820191906000526020600020905b8154815290600101906020018083116117ad57829003601f168201915b50505050508152602001866001600160a01b03168152602001600380546117f09061498c565b80601f016020809104026020016040519081016040528092919081815260200182805461181c9061498c565b80156118695780601f1061183e57610100808354040283529160200191611869565b820191906000526020600020905b81548152906001019060200180831161184c57829003601f168201915b505050918352505060016020820181905260055463ffffffff166040808401919091526000606084018190526080840188905260a09093018690528051828152808201909152929350909190816020015b6040805160a0810182526000808252602080830182905292820181905260608201819052608082015282526000199092019101816118ba5750506040805160a081018252600181526001600160a01b0388811660208301526000928201839052606082018390528916608082015282519293509183919061193d5761193d614976565b6020908102919091010152604080516001808252818301909252600091816020015b6040805160c08101825260008082526020808301829052928201819052606082018190526080820181905260a0820152825260001990920191018161195f5750506040805160c0810182526004815260056020820152600a91810191909152601e60608201526000608082018190526001600160a01b038a1660a0830152825192935090918391906119f3576119f3614976565b6020026020010181905250600080611a128560045460065487876133e5565b91509150600080516020615a9c83398151915282604051611a3591815260200190565b60405180910390a160168214611a4a57600080fd5b6040516001600160a01b03821681527f7bb17726df1f3adee8aa00ba8e8bc5d6f182af3bbf77604639cb7f008dd3b4ed9060200160405180910390a1505050505050505050565b6040516001600160a01b038381166024830152821660448201526000908190819061016790638f8d7f9960e01b9060640161121e565b6000611adb611ad68385614b3b565b613519565b9050600080516020615a9c83398151915281604051610b8691815260200190565b6000611b0782613543565b9050600080516020615a9c83398151915281604051611b2891815260200190565b60405180910390a160168114611b3d57600080fd5b919050565b604051633cb0c7fd60e21b81526001600160a01b038084166004830152821660248201526000908190309063f2c31ff4906044016040805180830381600087803b158015611b8f57600080fd5b505af1158015611ba3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc79190614cb3565b604051600783900b81529193509150600080516020615a9c8339815191529060200160405180910390a1600782900b601614611c0257600080fd5b60405181151581527fd24dda6928587354b65aa1a18c2eaf249bef7e5bafd2a71fac71d286f76f957f90602001610a5b565b6040516001600160a01b03838116602483015282166044820152600090819081906101679063af99c63360e01b9060640161121e565b60408051606081018252600080825260208201819052918101829052604051631ac299b760e31b81526001600160a01b0384166004820152309063d614cdb890602401608060405180830381600087803b158015611cc757600080fd5b505af1158015611cdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cff9190614d4d565b6040518281529193509150600080516020615a9c8339815191529060200160405180910390a160168214611d3257600080fd5b7fa0a16bf9db2c17796faeca5af5aaeef8523f9d4c350c512cb00062ad89604f8881604051610d199190614d7a565b604080516060810182526000808252602080830182905282840182905283516001600160a01b038616602480830191909152855180830390910181526044909101855290810180516001600160e01b0316631ac299b760e31b179052925190928391829161016791611dd3919061492d565b6000604051808303816000865af19150503d8060008114611e10576040519150601f19603f3d011682016040523d82523d6000602084013e611e15565b606091505b506040805160608101825260008082526020820181905291810191909152919350915082611e4557601581611e59565b81806020019051810190611e599190614dae565b60039190910b97909650945050505050565b60408051600580825260c08201909252600091816020015b611e8b613a2f565b815260200190600190039081611e83579050509050611ebe60006006600160405180602001604052806000815250612a4b565b81600081518110611ed157611ed1614976565b6020026020010181905250611ef760018060405180602001604052806000815250612a82565b81600181518110611f0a57611f0a614976565b6020026020010181905250611f316002600160405180602001604052806000815250612a82565b81600281518110611f4457611f44614976565b6020026020010181905250611f6b6004600160405180602001604052806000815250612a82565b81600381518110611f7e57611f7e614976565b6020026020010181905250611fa56003600160405180602001604052806000815250612a82565b81600481518110611fb857611fb8614976565b602002602001018190525060006040518060600160405280600063ffffffff168152602001846001600160a01b03168152602001627a120063ffffffff1681525090506000604051806101200160405280600180546120169061498c565b80601f01602080910402602001604051908101604052809291908181526020018280546120429061498c565b801561208f5780601f106120645761010080835404028352916020019161208f565b820191906000526020600020905b81548152906001019060200180831161207257829003601f168201915b50505050508152602001600280546120a69061498c565b80601f01602080910402602001604051908101604052809291908181526020018280546120d29061498c565b801561211f5780601f106120f45761010080835404028352916020019161211f565b820191906000526020600020905b81548152906001019060200180831161210257829003601f168201915b50505050508152602001856001600160a01b03168152602001600380546121459061498c565b80601f01602080910402602001604051908101604052809291908181526020018280546121719061498c565b80156121be5780601f10612193576101008083540402835291602001916121be565b820191906000526020600020905b8154815290600101906020018083116121a157829003601f168201915b50505091835250506001602082015260055463ffffffff16604082015260075460ff16151560608201526080810185905260a00183905290506000806110908361358a565b60006111b5848484613674565b6040517f593d6e82000000000000000000000000000000000000000000000000000000008152600090309063593d6e829061225190869086906004016149da565b602060405180830381600087803b15801561226b57600080fd5b505af115801561227f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611adb9190614914565b60006111b58484846136cf565b6040516001600160a01b0383811660248301528216604482015260009081908190819061016790633cb0c7fd60e21b906064015b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051612322919061492d565b6000604051808303816000865af19150503d806000811461235f576040519150601f19603f3d011682016040523d82523d6000602084013e612364565b606091505b5091509150816123775760156000611e59565b80806020019051810190611e599190614dd9565b6000612395613ae7565b61239e83613726565b6040518281529193509150600080516020615a9c8339815191529060200160405180910390a1601682146123d157600080fd5b7f528c7dcea75f0c9e110a038e50647cd6a70ac06d331399b77dd9a80f903ebc1681604051610d199190614e05565b6000611adb838361380f565b604051633b3bff0f60e01b81526001600160a01b03821660048201526000903090633b3bff0f90602401602060405180830381600087803b15801561245057600080fd5b505af1158015612464573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124889190614914565b9050600080516020615a9c833981519152816040516124a991815260200190565b60405180910390a1601681146124be57600080fd5b604051600181527f319ab7084208e4afa38c6e6ff7aea9587439f2e4700746f4c7d425fea17426d290602001610b49565b60006111b584848461385e565b6007805460ff191682151590811790915560405160ff909116151581527f457c3a16a0ebdc38e3675609957ca3fcc4490e220bd15d85d34f58e2e145cb089060200160405180910390a150565b6040805160008082526020820190925281908161258e565b60408051606081018252600080825260208083018290529282015282526000199092019101816125615790505b50905060006040518060400160405280336001600160a01b03168152602001856125b790614e18565b600790810b9091526040805180820182526001600160a01b038a1681529187900b602083015280516002808252606082019092529293509091600091816020015b60408051808201909152600080825260208201528152602001906001900390816125f8579050509050828160008151811061263557612635614976565b6020026020010181905250818160018151811061265457612654614976565b602090810291909101810191909152604080516060810182526001600160a01b038a16815291820183905281810186905280516001808252818301909252600091816020015b6126c7604051806060016040528060006001600160a01b0316815260200160608152602001606081525090565b81526020019060019003908161269a57905050905081816000815181106126f0576126f0614976565b602002602001018190525061270481613519565b96506016871461271357600080fd5b5050505050509392505050565b604080516001600160a01b0385811660248301528481166044830152831660648083019190915282518083039091018152608490910182526020810180516001600160e01b03167ff49f40db000000000000000000000000000000000000000000000000000000001790529051600091829182918291610167916127a39161492d565b6000604051808303816000865af19150503d80600081146127e0576040519150601f19603f3d011682016040523d82523d6000602084013e6127e5565b606091505b5091509150816127f8576015600061280c565b8080602001905181019061280c9190614dd9565b60039190910b9890975095505050505050565b604080516001600160a01b0384166024820152604480820184905282518083039091018152606490910182526020810180516001600160e01b03167f098f2366000000000000000000000000000000000000000000000000000000001790529051600091829182918291610167916128969161492d565b6000604051808303816000865af19150503d80600081146128d3576040519150601f19603f3d011682016040523d82523d6000602084013e6128d8565b606091505b5091509150816128eb5760156000611e59565b80806020019051810190611e599190614e4e565b6040516001600160a01b0383811660248301528216604482015260009081908190610167907f52f91387000000000000000000000000000000000000000000000000000000009060640161121e565b6040516001600160a01b0382166024820152600090819081908190610167907fa7daa18d00000000000000000000000000000000000000000000000000000000906044015b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516129d1919061492d565b6000604051808303816000865af19150503d8060008114612a0e576040519150601f19603f3d011682016040523d82523d6000602084013e612a13565b606091505b509150915081612a265760156000612a3a565b80806020019051810190612a3a9190614dd9565b60039190910b969095509350505050565b612a53613a2f565b6040518060400160405280612a6887876138b4565b8152602001612a7785856138cd565b905295945050505050565b612a8a613a2f565b6040518060400160405280612a9e8661399d565b8152602001612aad85856138cd565b9052949350505050565b600080848061010001516000015163ffffffff166000148015612ae757506101008101516040015163ffffffff16155b15612afd576101008101516276a7006040909101525b6000806101676001600160a01b031634637812a04b60e01b8a8a8a604051602401612b2a93929190614e7a565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051612b68919061492d565b60006040518083038185875af1925050503d8060008114612ba5576040519150601f19603f3d011682016040523d82523d6000602084013e612baa565b606091505b509150915081612bbd5760156000612bd1565b80806020019051810190612bd19190614e4e565b60039190910b999098509650505050505050565b6040516001600160a01b038581166024830152848116604483015283166064820152600782900b608482015260009081908190610167907feca36917000000000000000000000000000000000000000000000000000000009060a4015b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051612c80919061492d565b6000604051808303816000865af19150503d8060008114612cbd576040519150601f19603f3d011682016040523d82523d6000602084013e612cc2565b606091505b509150915081612cd3576015612ce7565b80806020019051810190612ce7919061495b565b60030b979650505050505050565b6000612cff613a8c565b604080516001600160a01b0386166024820152600785900b60448083019190915282518083039091018152606490910182526020810180516001600160e01b03167f287e1da8000000000000000000000000000000000000000000000000000000001790529051600091829161016791612d789161492d565b6000604051808303816000865af19150503d8060008114612db5576040519150601f19603f3d011682016040523d82523d6000602084013e612dba565b606091505b5091509150612dc7613a8c565b82612dd45760158161280c565b8180602001905181019061280c9190615504565b60008060006101676001600160a01b031663f7f38e2660e01b878787604051602401612e16939291906155ec565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051612e54919061492d565b6000604051808303816000865af19150503d8060008114612e91576040519150601f19603f3d011682016040523d82523d6000602084013e612e96565b606091505b509150915081612ea7576015612ebb565b80806020019051810190612ebb919061495b565b60030b9695505050505050565b604080516001600160a01b0385811660248301528481166044830152831660648083019190915282518083039091018152608490910182526020810180516001600160e01b03167f927da10500000000000000000000000000000000000000000000000000000000179052905160009182918291829161016791612f4b9161492d565b6000604051808303816000865af19150503d8060008114612f88576040519150601f19603f3d011682016040523d82523d6000602084013e612f8d565b606091505b509150915081612fa0576015600061280c565b8080602001905181019061280c9190615618565b604080516001600160a01b03831660248083019190915282518083039091018152604490910182526020810180516001600160e01b03167fae7611a000000000000000000000000000000000000000000000000000000000179052905160009160609182918291859182916101679161302c9161492d565b6000604051808303816000865af19150503d8060008114613069576040519150601f19603f3d011682016040523d82523d6000602084013e61306e565b606091505b509150915060608060608461308757601583838361309b565b8380602001905181019061309b9190615644565b60039390930b9d919c509a509098509650505050505050565b60006130be613ac7565b604080516001600160a01b03851660248083019190915282518083039091018152604490910182526020810180516001600160e01b03167f3f28a19b00000000000000000000000000000000000000000000000000000000179052905160009182916101679161312d9161492d565b6000604051808303816000865af19150503d806000811461316a576040519150601f19603f3d011682016040523d82523d6000602084013e61316f565b606091505b509150915061317c613ac7565b8261318957601581611e59565b81806020019051810190611e5991906156dd565b6040516001600160a01b03838116602483015282166044820152600090819081908190610167907f46de0fb100000000000000000000000000000000000000000000000000000000906064016122e4565b6040516001600160a01b038581166024830152848116604483015283166064820152600782900b608482015260009081908190610167907f5cfc9011000000000000000000000000000000000000000000000000000000009060a401612c42565b6040516001600160a01b0383811660248301528216604482015260009081908190610167907f5b8f8584000000000000000000000000000000000000000000000000000000009060640161121e565b60008060606000806101676001600160a01b031663278e0b8860e01b8989896040516024016132cf93929190615789565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905161330d919061492d565b6000604051808303816000865af19150503d806000811461334a576040519150601f19603f3d011682016040523d82523d6000602084013e61334f565b606091505b509150915081613372576040805160008082526020820190925260159190613386565b80806020019051810190613386919061580d565b60039290920b9a90995090975095505050505050565b6040516001600160a01b0382166024820152600090819081908190610167907f335e04c10000000000000000000000000000000000000000000000000000000090604401612993565b600080868061010001516000015163ffffffff16600014801561341557506101008101516040015163ffffffff16155b1561342b576101008101516276a7006040909101525b6000806101676001600160a01b031634634c381ae760e01b8c8c8c8c8c60405160240161345c9594939291906158be565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905161349a919061492d565b60006040518083038185875af1925050503d80600081146134d7576040519150601f19603f3d011682016040523d82523d6000602084013e6134dc565b606091505b5091509150816134ef5760156000613503565b808060200190518101906135039190614e4e565b60039190910b9b909a5098505050505050505050565b60008060006101676001600160a01b031663189a554c60e01b85604051602401610bfc9190615964565b6040516001600160a01b038216602482015260009081908190610167907ff069f7120000000000000000000000000000000000000000000000000000000090604401610bfc565b600080828061010001516000015163ffffffff1660001480156135ba57506101008101516040015163ffffffff16155b156135d0576101008101516276a7006040909101525b6000806101676001600160a01b031634639dc711e060e01b886040516024016135f99190615a3a565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051613637919061492d565b60006040518083038185875af1925050503d80600081146128d3576040519150601f19603f3d011682016040523d82523d6000602084013e6128d8565b6040516001600160a01b0384811660248301528316604482015263ffffffff8216606482015260009081908190610167907f9790686d0000000000000000000000000000000000000000000000000000000090608401612e16565b6040516001600160a01b03848116602483015283166044820152811515606482015260009081908190610167907f367605ca0000000000000000000000000000000000000000000000000000000090608401612e16565b6000613730613ae7565b604080516001600160a01b03851660248083019190915282518083039091018152604490910182526020810180516001600160e01b03167f1f69565f00000000000000000000000000000000000000000000000000000000179052905160009182916101679161379f9161492d565b6000604051808303816000865af19150503d80600081146137dc576040519150601f19603f3d011682016040523d82523d6000602084013e6137e1565b606091505b50915091506137ee613ae7565b826137fb57601581611e59565b81806020019051810190611e599190615a4d565b6040516001600160a01b0383811660248301528216604482015260009081908190610167907f49146bde000000000000000000000000000000000000000000000000000000009060640161121e565b6040516001600160a01b038481166024830152831660448201526064810182905260009081908190610167907fe1f21c670000000000000000000000000000000000000000000000000000000090608401612e16565b6000600160ff84161b9050600160ff83161b81176111eb565b6139136040518060a0016040528060001515815260200160006001600160a01b03168152602001606081526020016060815260200160006001600160a01b031681525090565b8260ff16600114156139285760018152610962565b8260ff166002141561394a576000546001600160a01b03166020820152610962565b8260ff16600314156139625760408101829052610962565b8260ff166004141561397a5760608101829052610962565b8260ff1660051415610962576000546001600160a01b0316608082015292915050565b600060ff82166139af57506001919050565b8160ff16600114156139c357506002919050565b8160ff16600214156139d757506004919050565b8160ff16600314156139eb57506008919050565b8160ff16600414156139ff57506010919050565b8160ff1660051415613a1357506020919050565b8160ff1660061415613a2757506040919050565b506000919050565b604051806040016040528060008152602001613a876040518060a0016040528060001515815260200160006001600160a01b03168152602001606081526020016060815260200160006001600160a01b031681525090565b905290565b6040518060c00160405280613a9f613ae7565b8152600060208201819052604082018190526060808301829052608083015260a09091015290565b6040518060400160405280613ada613ae7565b8152600060209091015290565b60408051610240810182526060610120820181815261014083018290526000610160840181905261018084018390526101a084018190526101c084018190526101e0840181905261020084018390528451928301855280835260208301819052938201939093526102208201529081908152602001600067ffffffffffffffff168152602001600015158152602001600015158152602001600015158152602001606081526020016060815260200160608152602001606081525090565b6001600160a01b0381168114613bba57600080fd5b50565b60008060408385031215613bd057600080fd5b8235613bdb81613ba5565b91506020830135613beb81613ba5565b809150509250929050565b600080600060608486031215613c0b57600080fd5b8335613c1681613ba5565b92506020840135613c2681613ba5565b91506040840135613c3681613ba5565b809150509250925092565b60008060408385031215613c5457600080fd5b8235613c5f81613ba5565b946020939093013593505050565b600060208284031215613c7f57600080fd5b81356111eb81613ba5565b8060070b8114613bba57600080fd5b60008060008060808587031215613caf57600080fd5b8435613cba81613ba5565b93506020850135613cca81613ba5565b92506040850135613cda81613ba5565b91506060850135613cea81613c8a565b939692955090935050565b60008060408385031215613d0857600080fd5b8235613d1381613ba5565b91506020830135613beb81613c8a565b60005b83811015613d3e578181015183820152602001613d26565b83811115613d4d576000848401525b50505050565b60008151808452613d6b816020860160208601613d23565b601f01601f19169290920160200192915050565b600081518084526020808501808196508360051b8101915082860160005b85811015613e365782840389528151604081518652868201519150808787015281511515818701528682015160606001600160a01b03808316828a015283850151935060a09250608083818b0152613df860e08b0186613d53565b928601518a8403603f1901858c0152929450613e148584613d53565b9501511660c09890980197909752505098850198935090840190600101613d9d565b5091979650505050505050565b60006101608251818552613e5982860182613d53565b91505060208301518482036020860152613e738282613d53565b9150506040830151613e9060408601826001600160a01b03169052565b5060608301518482036060860152613ea88282613d53565b9150506080830151613ebe608086018215159052565b5060a0830151613ed660a086018263ffffffff169052565b5060c0830151613eea60c086018215159052565b5060e083015184820360e0860152613f028282613d7f565b61010085810151805163ffffffff9081168984015260208201516001600160a01b03166101208a015260408201511661014089015291935091505090949350505050565b600081518084526020808501945080840160005b83811015613fb6578151805163ffffffff168852838101516001600160a01b03908116858a01526040808301511515908a01526060808301511515908a0152608091820151169088015260a09096019590820190600101613f5a565b509495945050505050565b600081518084526020808501945080840160005b83811015613fb6578151805163ffffffff9081168952848201518116858a01526040808301518216908a01526060808301519091169089015260808082015115159089015260a0908101516001600160a01b03169088015260c09096019590820190600101613fd5565b600081518084526020808501945080840160005b83811015613fb6578151805163ffffffff9081168952848201518116858a0152604080830151909116908901526060808201516001600160a01b03908116918a01919091526080808301511515908a015260a091820151169088015260c09096019590820190600101614053565b600061012082518185526140d782860182613e43565b91505060208301516140f5602086018267ffffffffffffffff169052565b506040830151614109604086018215159052565b50606083015161411d606086018215159052565b506080830151614131608086018215159052565b5060a083015184820360a08601526141498282613f46565b91505060c083015184820360c08601526141638282613fc1565b91505060e083015184820360e086015261417d828261403f565b91505061010080840151858303828701526141988382613d53565b9695505050505050565b6000815160c084526141b760c08501826140c1565b9050602083015160070b602085015260408301516001600160a01b038082166040870152606085015160070b60608701526080850151915085830360808701526142018383613d53565b92508060a08601511660a087015250508091505092915050565b82815260406020820152600061112a60408301846141a2565b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff8111828210171561426d5761426d614234565b60405290565b6040805190810167ffffffffffffffff8111828210171561426d5761426d614234565b60405160a0810167ffffffffffffffff8111828210171561426d5761426d614234565b604051610120810167ffffffffffffffff8111828210171561426d5761426d614234565b60405160c0810167ffffffffffffffff8111828210171561426d5761426d614234565b604051601f8201601f1916810167ffffffffffffffff8111828210171561432957614329614234565b604052919050565b600067ffffffffffffffff82111561434b5761434b614234565b5060051b60200190565b60008060006060848603121561436a57600080fd5b833561437581613ba5565b925060208481013561438681613ba5565b9250604085013567ffffffffffffffff8111156143a257600080fd5b8501601f810187136143b357600080fd5b80356143c66143c182614331565b614300565b81815260059190911b820183019083810190898311156143e557600080fd5b928401925b8284101561440c5783356143fd81613c8a565b825292840192908401906143ea565b80955050505050509250925092565b63ffffffff81168114613bba57600080fd5b600080828403608081121561444157600080fd5b833561444c81613ba5565b92506060601f198201121561446057600080fd5b5061446961424a565b60208401356144778161441b565b8152604084013561448781613ba5565b6020820152606084013561449a8161441b565b6040820152919491935090915050565b8460070b81526080602082015260006144c66080830186613f46565b82810360408401526144d88186613fc1565b905082810360608401526144ec818561403f565b979650505050505050565b600081516040845261450c60408501826140c1565b60209384015163ffffffff16949093019390935250919050565b82815260406020820152600061112a60408301846144f7565b67ffffffffffffffff81168114613bba57600080fd5b600067ffffffffffffffff82111561456f5761456f614234565b50601f01601f191660200190565b60008060006060848603121561459257600080fd5b833561459d81613ba5565b92506020848101356145ae8161453f565b925060408581013567ffffffffffffffff808211156145cc57600080fd5b818801915088601f8301126145e057600080fd5b81356145ee6143c182614331565b81815260059190911b8301850190858101908b83111561460d57600080fd5b8685015b83811015614681578035858111156146295760008081fd5b8601603f81018e1361463b5760008081fd5b8881013561464b6143c182614555565b8181528f8a8385010111156146605760008081fd5b818a84018c83013760009181018b0191909152845250918701918701614611565b50809750505050505050509250925092565b600081518084526020808501945080840160005b83811015613fb657815160070b875295820195908201906001016146a7565b83815267ffffffffffffffff831660208201526060604082015260006146ef6060830184614693565b95945050505050565b6000806020838503121561470b57600080fd5b823567ffffffffffffffff8082111561472357600080fd5b818501915085601f83011261473757600080fd5b81358181111561474657600080fd5b8660208260051b850101111561475b57600080fd5b60209290920196919550909350505050565b828152608081016111eb6020830184805163ffffffff90811683526020808301516001600160a01b03169084015260409182015116910152565b6000806000606084860312156147bc57600080fd5b83356147c781613ba5565b925060208401356147d781613ba5565b91506040840135613c368161441b565b8015158114613bba57600080fd5b60008060006060848603121561480a57600080fd5b833561481581613ba5565b9250602084013561482581613ba5565b91506040840135613c36816147e7565b82815260406020820152600061112a60408301846140c1565b60008060006060848603121561486357600080fd5b833561486e81613ba5565b9250602084013561487e81613ba5565b929592945050506040919091013590565b6000602082840312156148a157600080fd5b81356111eb816147e7565b6000806000606084860312156148c157600080fd5b83356148cc81613ba5565b925060208401356148dc81613ba5565b91506040840135613c3681613c8a565b8051611b3d81613c8a565b60006020828403121561490957600080fd5b81516111eb81613c8a565b60006020828403121561492657600080fd5b5051919050565b6000825161493f818460208701613d23565b9190910192915050565b8051600381900b8114611b3d57600080fd5b60006020828403121561496d57600080fd5b6111eb82614949565b634e487b7160e01b600052603260045260246000fd5b600181811c908216806149a057607f821691505b602082108114156149c157634e487b7160e01b600052602260045260246000fd5b50919050565b6020815260006111eb60208301846141a2565b6001600160a01b0383168152608081016111eb6020830184805163ffffffff90811683526020808301516001600160a01b03169084015260409182015116910152565b606081526000614a306060830186613f46565b8281036020840152614a428186613fc1565b90508281036040840152614198818561403f565b6020815260006111eb60208301846144f7565b67ffffffffffffffff8316815260406020820152600061112a6040830184614693565b600082601f830112614a9d57600080fd5b81356020614aad6143c183614331565b82815260609283028501820192828201919087851115614acc57600080fd5b8387015b85811015614b2e5781818a031215614ae85760008081fd5b614af061424a565b8135614afb81613ba5565b815281860135614b0a81613ba5565b81870152604082810135614b1d81613c8a565b908201528452928401928101614ad0565b5090979650505050505050565b6000614b496143c184614331565b80848252602080830192508560051b850136811115614b6757600080fd5b855b81811015614c9c57803567ffffffffffffffff80821115614b8a5760008081fd5b818901915060608236031215614ba05760008081fd5b614ba861424a565b8235614bb381613ba5565b81528286013582811115614bc75760008081fd5b830136601f820112614bd95760008081fd5b8035614be76143c182614331565b81815260069190911b82018801908881019036831115614c075760008081fd5b928901925b82841015614c5d5760408436031215614c255760008081fd5b614c2d614273565b8435614c3881613ba5565b8152848b0135614c4781613c8a565b818c015282526040939093019290890190614c0c565b848a01525060409150508381013583811115614c795760008081fd5b614c8536828701614a8c565b918301919091525087525050938201938201614b69565b50919695505050505050565b8051611b3d816147e7565b60008060408385031215614cc657600080fd5b8251614cd181613c8a565b6020840151909250613beb816147e7565b8051611b3d8161441b565b8051611b3d81613ba5565b600060608284031215614d0a57600080fd5b614d1261424a565b90508151614d1f8161441b565b81526020820151614d2f81613ba5565b60208201526040820151614d428161441b565b604082015292915050565b60008060808385031215614d6057600080fd5b82519150614d718460208501614cf8565b90509250929050565b606081016109628284805163ffffffff90811683526020808301516001600160a01b03169084015260409182015116910152565b60008060808385031215614dc157600080fd5b614dca83614949565b9150614d718460208501614cf8565b60008060408385031215614dec57600080fd5b614df583614949565b91506020830151613beb816147e7565b6020815260006111eb60208301846140c1565b60008160070b677fffffffffffffff19811415614e4557634e487b7160e01b600052601160045260246000fd5b60000392915050565b60008060408385031215614e6157600080fd5b614e6a83614949565b91506020830151613beb81613ba5565b606081526000614e8d6060830186613e43565b60208301949094525060400152919050565b600082601f830112614eb057600080fd5b8151614ebe6143c182614555565b818152846020838601011115614ed357600080fd5b61112a826020830160208701613d23565b600082601f830112614ef557600080fd5b81516020614f056143c183614331565b82815260059290921b84018101918181019086841115614f2457600080fd5b8286015b8481101561503a57805167ffffffffffffffff80821115614f4857600080fd5b908801906040601f19838c038101821315614f6257600080fd5b614f6a614273565b8885015181528285015184811115614f8157600080fd5b949094019360a0858e0383011215614f995760008081fd5b614fa1614296565b915088850151614fb0816147e7565b825284830151614fbf81613ba5565b828a015260608581015185811115614fd75760008081fd5b614fe58f8c838a0101614e9f565b85850152506080935083860151858111156150005760008081fd5b61500e8f8c838a0101614e9f565b82850152505061502060a08601614ced565b928201929092528188015285525050918301918301614f28565b509695505050505050565b6000610160828403121561505857600080fd5b6150606142b9565b9050815167ffffffffffffffff8082111561507a57600080fd5b61508685838601614e9f565b8352602084015191508082111561509c57600080fd5b6150a885838601614e9f565b60208401526150b960408501614ced565b604084015260608401519150808211156150d257600080fd5b6150de85838601614e9f565b60608401526150ef60808501614ca8565b608084015261510060a08501614ce2565b60a084015261511160c08501614ca8565b60c084015260e084015191508082111561512a57600080fd5b5061513784828501614ee4565b60e08301525061010061514c84828501614cf8565b9082015292915050565b8051611b3d8161453f565b600082601f83011261517257600080fd5b815160206151826143c183614331565b82815260a092830285018201928282019190878511156151a157600080fd5b8387015b85811015614b2e5781818a0312156151bd5760008081fd5b6151c5614296565b81516151d08161441b565b8152818601516151df81613ba5565b818701526040828101516151f2816147e7565b90820152606082810151615205816147e7565b9082015260808281015161521881613ba5565b9082015284529284019281016151a5565b600082601f83011261523a57600080fd5b8151602061524a6143c183614331565b82815260c0928302850182019282820191908785111561526957600080fd5b8387015b85811015614b2e5781818a0312156152855760008081fd5b61528d6142dd565b81516152988161441b565b8152818601516152a78161441b565b818701526040828101516152ba8161441b565b908201526060828101516152cd8161441b565b908201526080828101516152e0816147e7565b9082015260a0828101516152f381613ba5565b90820152845292840192810161526d565b600082601f83011261531557600080fd5b815160206153256143c183614331565b82815260c0928302850182019282820191908785111561534457600080fd5b8387015b85811015614b2e5781818a0312156153605760008081fd5b6153686142dd565b81516153738161441b565b8152818601516153828161441b565b818701526040828101516153958161441b565b908201526060828101516153a881613ba5565b908201526080828101516153bb816147e7565b9082015260a0828101516153ce81613ba5565b908201528452928401928101615348565b600061012082840312156153f257600080fd5b6153fa6142b9565b9050815167ffffffffffffffff8082111561541457600080fd5b61542085838601615045565b835261542e60208501615156565b602084015261543f60408501614ca8565b604084015261545060608501614ca8565b606084015261546160808501614ca8565b608084015260a084015191508082111561547a57600080fd5b61548685838601615161565b60a084015260c084015191508082111561549f57600080fd5b6154ab85838601615229565b60c084015260e08401519150808211156154c457600080fd5b6154d085838601615304565b60e0840152610100915081840151818111156154eb57600080fd5b6154f786828701614e9f565b8385015250505092915050565b6000806040838503121561551757600080fd5b61552083614949565b9150602083015167ffffffffffffffff8082111561553d57600080fd5b9084019060c0828703121561555157600080fd5b6155596142dd565b82518281111561556857600080fd5b615574888286016153df565b825250615583602084016148ec565b602082015261559460408401614ced565b60408201526155a5606084016148ec565b60608201526080830151828111156155bc57600080fd5b6155c888828601614e9f565b6080830152506155da60a08401614ced565b60a08201528093505050509250929050565b60006001600160a01b038086168352808516602084015250606060408301526146ef6060830184614693565b6000806040838503121561562b57600080fd5b61563483614949565b9150602083015190509250929050565b6000806000806080858703121561565a57600080fd5b61566385614949565b9350602085015167ffffffffffffffff8082111561568057600080fd5b61568c88838901615161565b945060408701519150808211156156a257600080fd5b6156ae88838901615229565b935060608701519150808211156156c457600080fd5b506156d187828801615304565b91505092959194509250565b600080604083850312156156f057600080fd5b6156f983614949565b9150602083015167ffffffffffffffff8082111561571657600080fd5b908401906040828703121561572a57600080fd5b60405160408101818110838211171561574557615745614234565b60405282518281111561575757600080fd5b615763888286016153df565b825250602083015192506157768361441b565b8260208201528093505050509250929050565b6000606082016001600160a01b0386168352602067ffffffffffffffff8616818501526060604085015281855180845260808601915060808160051b870101935082870160005b828110156157fe57607f198887030184526157ec868351613d53565b955092840192908401906001016157d0565b50939998505050505050505050565b60008060006060848603121561582257600080fd5b61582b84614949565b925060208085015161583c8161453f565b604086015190935067ffffffffffffffff81111561585957600080fd5b8501601f8101871361586a57600080fd5b80516158786143c182614331565b81815260059190911b8201830190838101908983111561589757600080fd5b928401925b8284101561440c5783516158af81613c8a565b8252928401929084019061589c565b60a0815260006158d160a0830188613e43565b86602084015285604084015282810360608401526158ef8186613f46565b905082810360808401526159038185613fc1565b98975050505050505050565b600081518084526020808501945080840160005b83811015613fb657815180516001600160a01b03908116895284820151168489015260409081015160070b9088015260609096019590820190600101615923565b60006020808301818452808551808352604092508286019150828160051b8701018488016000805b84811015615a2b57898403603f19018652825180516001600160a01b0390811686528982015160608b880181905281519088018190526080880192918c01919086905b808210156159fd5783518051841686528e015160070b8e860152938c0193928d0192600191909101906159cf565b5050505090880151858203868a015290615a17818361590f565b978a0197955050509187019160010161598c565b50919998505050505050505050565b6020815260006111eb6020830184613e43565b60008060408385031215615a6057600080fd5b615a6983614949565b9150602083015167ffffffffffffffff811115615a8557600080fd5b615a91858286016153df565b915050925092905056fe90a5cf4cffe88b4edbb041cfc7a8a812c48a5ec30b84640fb37690875168e3aaa26469706673582212200e78f269d9e7b70c329341bf2e8cd11c83b1b8affe71ae06bf9922e36f1a7a9764736f6c63430008090033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/packages/server/tests/contracts/BaseHTS.sol b/packages/server/tests/contracts/BaseHTS.sol index c2aec809d9..fac99e0441 100644 --- a/packages/server/tests/contracts/BaseHTS.sol +++ b/packages/server/tests/contracts/BaseHTS.sol @@ -31,6 +31,7 @@ contract BaseHTS is FeeHelper { event TokenDefaultFreezeStatus(bool defaultFreezeStatus); event TokenDefaultKycStatus(bool defaultKycStatus); event KycGranted(bool kycGranted); + event TokenExpiryInfo(IHederaTokenService.Expiry expiryInfo); function createFungibleTokenPublic( address treasury @@ -427,4 +428,26 @@ contract BaseHTS is FeeHelper { revert(); } } + + function getTokenExpiryInfoPublic(address token)external returns (int responseCode, IHederaTokenService.Expiry memory expiryInfo){ + (responseCode, expiryInfo) = this.getTokenExpiryInfo(token); + + emit ResponseCode(responseCode); + + if(responseCode != HederaResponseCodes.SUCCESS) { + revert(); + } + + emit TokenExpiryInfo(expiryInfo); + } + + function updateTokenExpiryInfoPublic(address token, IHederaTokenService.Expiry memory expiryInfo)external returns (int responseCode){ + (responseCode) = this.updateTokenExpiryInfo(token, expiryInfo); + + emit ResponseCode(responseCode); + + if(responseCode != HederaResponseCodes.SUCCESS) { + revert(); + } + } } \ No newline at end of file diff --git a/packages/server/tests/contracts/HederaTokenService.json b/packages/server/tests/contracts/HederaTokenService.json index d43a41d742..d1d1194843 100644 --- a/packages/server/tests/contracts/HederaTokenService.json +++ b/packages/server/tests/contracts/HederaTokenService.json @@ -3,6 +3,47 @@ "contractName": "HederaTokenService", "sourceName": "contracts/HederaTokenService.sol", "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + } + ], + "name": "getTokenExpiryInfo", + "outputs": [ + { + "internalType": "int256", + "name": "responseCode", + "type": "int256" + }, + { + "components": [ + { + "internalType": "uint32", + "name": "second", + "type": "uint32" + }, + { + "internalType": "address", + "name": "autoRenewAccount", + "type": "address" + }, + { + "internalType": "uint32", + "name": "autoRenewPeriod", + "type": "uint32" + } + ], + "internalType": "struct IHederaTokenService.Expiry", + "name": "expiryInfo", + "type": "tuple" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -117,6 +158,47 @@ ], "stateMutability": "nonpayable", "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "components": [ + { + "internalType": "uint32", + "name": "second", + "type": "uint32" + }, + { + "internalType": "address", + "name": "autoRenewAccount", + "type": "address" + }, + { + "internalType": "uint32", + "name": "autoRenewPeriod", + "type": "uint32" + } + ], + "internalType": "struct IHederaTokenService.Expiry", + "name": "expiryInfo", + "type": "tuple" + } + ], + "name": "updateTokenExpiryInfo", + "outputs": [ + { + "internalType": "int256", + "name": "responseCode", + "type": "int256" + } + ], + "stateMutability": "nonpayable", + "type": "function" } ], "bytecode": "0x", diff --git a/packages/server/tests/contracts/HederaTokenService.sol b/packages/server/tests/contracts/HederaTokenService.sol index 1861996c17..4b1ac1bbf3 100644 --- a/packages/server/tests/contracts/HederaTokenService.sol +++ b/packages/server/tests/contracts/HederaTokenService.sol @@ -555,4 +555,24 @@ abstract contract HederaTokenService is HederaResponseCodes { abi.encodeWithSelector(IHederaTokenService.deleteToken.selector, token)); (responseCode) = success ? abi.decode(result, (int32)) : HederaResponseCodes.UNKNOWN; } + + /// Operation to get token expiry info + /// @param token The token address + /// @return responseCode The response code for the status of the request. SUCCESS is 22. + /// @return expiryInfo The expiry info of the token + function getTokenExpiryInfo(address token) external returns (int responseCode, IHederaTokenService.Expiry memory expiryInfo){ + (bool success, bytes memory result) = precompileAddress.call( + abi.encodeWithSelector(IHederaTokenService.getTokenExpiryInfo.selector, token)); + IHederaTokenService.Expiry memory defaultExpiryInfo; + (responseCode, expiryInfo) = success ? abi.decode(result, (int32, IHederaTokenService.Expiry)) : (HederaResponseCodes.UNKNOWN, defaultExpiryInfo); + } + + /// Operation to update token expiry info + /// @param token The token address + /// @return responseCode The response code for the status of the request. SUCCESS is 22. + function updateTokenExpiryInfo(address token, IHederaTokenService.Expiry memory expiryInfo) external returns (int responseCode){ + (bool success, bytes memory result) = precompileAddress.call( + abi.encodeWithSelector(IHederaTokenService.updateTokenExpiryInfo.selector, token, expiryInfo)); + (responseCode) = success ? abi.decode(result, (int32)) : HederaResponseCodes.UNKNOWN; + } } diff --git a/packages/server/tests/contracts/IHederaTokenService.json b/packages/server/tests/contracts/IHederaTokenService.json index b39c3681ed..8226d85089 100644 --- a/packages/server/tests/contracts/IHederaTokenService.json +++ b/packages/server/tests/contracts/IHederaTokenService.json @@ -1780,6 +1780,47 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + } + ], + "name": "getTokenExpiryInfo", + "outputs": [ + { + "internalType": "int256", + "name": "responseCode", + "type": "int256" + }, + { + "components": [ + { + "internalType": "uint32", + "name": "second", + "type": "uint32" + }, + { + "internalType": "address", + "name": "autoRenewAccount", + "type": "address" + }, + { + "internalType": "uint32", + "name": "autoRenewPeriod", + "type": "uint32" + } + ], + "internalType": "struct IHederaTokenService.Expiry", + "name": "expiryInfo", + "type": "tuple" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -2446,6 +2487,47 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "components": [ + { + "internalType": "uint32", + "name": "second", + "type": "uint32" + }, + { + "internalType": "address", + "name": "autoRenewAccount", + "type": "address" + }, + { + "internalType": "uint32", + "name": "autoRenewPeriod", + "type": "uint32" + } + ], + "internalType": "struct IHederaTokenService.Expiry", + "name": "expiryInfo", + "type": "tuple" + } + ], + "name": "updateTokenExpiryInfo", + "outputs": [ + { + "internalType": "int256", + "name": "responseCode", + "type": "int256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { diff --git a/packages/server/tests/contracts/IHederaTokenService.sol b/packages/server/tests/contracts/IHederaTokenService.sol index 22317aeba8..389a5393a2 100644 --- a/packages/server/tests/contracts/IHederaTokenService.sol +++ b/packages/server/tests/contracts/IHederaTokenService.sol @@ -606,4 +606,15 @@ interface IHederaTokenService { /// @param token The token address to be deleted /// @return responseCode The response code for the status of the request. SUCCESS is 22. function deleteToken(address token) external returns (int responseCode); + + /// Operation to get token expiry info + /// @param token The token address + /// @return responseCode The response code for the status of the request. SUCCESS is 22. + /// @return expiryInfo The expiry info of the token + function getTokenExpiryInfo(address token) external returns (int responseCode, Expiry memory expiryInfo); + + /// Operation to update token expiry info + /// @param token The token address + /// @return responseCode The response code for the status of the request. SUCCESS is 22. + function updateTokenExpiryInfo(address token, Expiry memory expiryInfo) external returns (int responseCode); } diff --git a/packages/server/tests/localAcceptance.env b/packages/server/tests/localAcceptance.env index c70d4e1108..c72d5b19da 100644 --- a/packages/server/tests/localAcceptance.env +++ b/packages/server/tests/localAcceptance.env @@ -5,6 +5,7 @@ CHAIN_ID=0x128 MIRROR_NODE_URL=http://127.0.0.1:5551 LOCAL_NODE=true SERVER_PORT=7546 +RELAY_ENDPOINT='http://127.0.0.1:7546' # cypress metamask config NETWORK_NAME='local hedera' RPC_URL='http://localhost:7546'