diff --git a/.gitignore b/.gitignore index 7334e874cd..53e0fd5bd7 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,7 @@ yarn.lock lerna-debug.log yarn-error.log .turbo +*.tgz # We don't want projects created from templates to ignore their lockfiles, but we don't # want to check them in here, so we'll ignore them from the root. diff --git a/packages/account-kit/.eslintrc.json b/packages/account-kit/.eslintrc.json new file mode 100644 index 0000000000..930af95967 --- /dev/null +++ b/packages/account-kit/.eslintrc.json @@ -0,0 +1,7 @@ +{ + "extends": ["../../.eslintrc", "plugin:react/recommended", "plugin:react-hooks/recommended"], + "plugins": ["react", "react-hooks"], + "rules": { + "react/react-in-jsx-scope": "off" + } +} diff --git a/packages/account-kit/README.md b/packages/account-kit/README.md new file mode 100644 index 0000000000..7f583c0fe3 --- /dev/null +++ b/packages/account-kit/README.md @@ -0,0 +1,13 @@ +# MUD Account Kit + +UI kit to streamline signing in to MUD apps. + +## Installation + +``` +npm install @latticexyz/account-kit +``` + +## Usage + +TODO diff --git a/packages/account-kit/inline-import.d.ts b/packages/account-kit/inline-import.d.ts new file mode 100644 index 0000000000..44e7df83a8 --- /dev/null +++ b/packages/account-kit/inline-import.d.ts @@ -0,0 +1,4 @@ +declare module "*?inline" { + const content: string; + export default content; +} diff --git a/packages/account-kit/mprocs.yaml b/packages/account-kit/mprocs.yaml new file mode 100644 index 0000000000..b51507845a --- /dev/null +++ b/packages/account-kit/mprocs.yaml @@ -0,0 +1,10 @@ +procs: + client: + shell: pnpm vite dev playground + anvil: + # To hydrate `anvil-state.json`, swap the command below and then deploy a MUD world to it. + # shell: anvil --dump-state playground/anvil-state.json + shell: anvil --block-time 2 --load-state playground/anvil-state.json + mud: + cwd: ../.. + shell: pnpm run dev --filter=!@latticexyz/account-kit diff --git a/packages/account-kit/package.json b/packages/account-kit/package.json new file mode 100644 index 0000000000..c5f8ead504 --- /dev/null +++ b/packages/account-kit/package.json @@ -0,0 +1,80 @@ +{ + "name": "@latticexyz/account-kit", + "version": "2.0.4", + "description": "MUD account kit for easy user onboarding", + "repository": { + "type": "git", + "url": "https://github.com/latticexyz/mud.git", + "directory": "packages/account-kit" + }, + "license": "MIT", + "type": "module", + "exports": { + ".": "./dist/tsup/index.js", + "./internal": "./dist/tsup/internal.js", + "./bundle": "./dist/vite/bundle.js" + }, + "files": [ + "dist" + ], + "scripts": { + "build": "pnpm run build:js", + "build:js": "tsup & vite build", + "clean": "pnpm run clean:js", + "clean:js": "rimraf dist", + "dev": "tsup --watch & vite build --watch", + "playground": "mprocs", + "test": "tsc --noEmit && vitest", + "test:ci": "tsc --noEmit && vitest --run" + }, + "dependencies": { + "@latticexyz/common": "workspace:*", + "@latticexyz/config": "workspace:*", + "@latticexyz/protocol-parser": "workspace:*", + "@latticexyz/store": "workspace:*", + "@latticexyz/world": "workspace:*", + "@latticexyz/world-modules": "workspace:*", + "@radix-ui/react-dialog": "^1.0.5", + "@radix-ui/react-dropdown-menu": "^2.0.6", + "@radix-ui/react-select": "^2.0.0", + "@radix-ui/react-slot": "^1.0.2", + "@rainbow-me/rainbowkit": "^2.0.2", + "@reservoir0x/relay-sdk": "^0.4.0", + "@tanstack/react-query": "^5.28.8", + "abitype": "1.0.0", + "debug": "^4.3.4", + "execa": "^7.0.0", + "p-retry": "^5.1.2", + "permissionless": "^0.1.17", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-error-boundary": "^4.0.13", + "react-merge-refs": "^2.1.1", + "react-router-dom": "^6.11.0", + "tailwind-merge": "^1.12.0", + "usehooks-ts": "^3.0.2", + "viem": "2.9.20", + "wagmi": "^2.8.0", + "zustand": "^4.5.2" + }, + "devDependencies": { + "@types/debug": "^4.1.7", + "@types/react": "18.2.22", + "@types/react-dom": "18.2.7", + "@types/ws": "^8.5.4", + "@vitejs/plugin-react": "^4.0.0", + "autoprefixer": "^10.4.14", + "eslint-plugin-react": "7.31.11", + "eslint-plugin-react-hooks": "4.6.0", + "mprocs": "^0.6.4", + "postcss": "^8.4.23", + "tailwindcss": "^3.4.3", + "tsup": "^6.7.0", + "vite": "^4.3.6", + "vite-plugin-dts": "^3.8.3", + "vitest": "0.34.6" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/account-kit/playground/App.tsx b/packages/account-kit/playground/App.tsx new file mode 100644 index 0000000000..d0914895e4 --- /dev/null +++ b/packages/account-kit/playground/App.tsx @@ -0,0 +1,29 @@ +import { useEffect } from "react"; +import { AccountButton, useAccountModal } from "../src/exports"; +import { useLocalStorage } from "usehooks-ts"; + +export function App() { + const { openAccountModal } = useAccountModal(); + + const [openModal, setOpenModal] = useLocalStorage("mud:accountKitPlayground:openModalOnMount", false); + + useEffect(() => { + if (openModal) { + openAccountModal(); + } + }, [openAccountModal, openModal]); + + return ( +
+
+ +
+
+ +
+
+ ); +} diff --git a/packages/account-kit/playground/anvil-state.json b/packages/account-kit/playground/anvil-state.json new file mode 100644 index 0000000000..85312a7707 --- /dev/null +++ b/packages/account-kit/playground/anvil-state.json @@ -0,0 +1 @@ +{"block":{"number":"0x15","coinbase":"0x0000000000000000000000000000000000000000","timestamp":"0x662e9f07","gas_limit":"0x1c9c380","basefee":"0x5f2eae0","difficulty":"0x0","prevrandao":"0x0000000000000000000000000000000000000000000000000000000000000000","blob_excess_gas_and_price":{"excess_blob_gas":0,"blob_gasprice":1}},"accounts":{"0x0000000000000000000000000000000000000000":{"nonce":0,"balance":"0x8cd52bf4edc237","code":"0x","storage":{}},"0x14dc79964da2c08b23698b3d3cc7ca32193d9955":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x15d34aaf54267db7d7c367839aaf71a00a2c6a65":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x17ffdeff94ed0b80c493a179d4b3b09d6d71f627":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106100885760003560e01c806345ec93541161005b57806345ec93541461010a5780638d53b2081461011d578063e1af802c14610130578063ef5d6bbb1461013857600080fd5b806301ffc9a71461008d578063119df25f146100b5578063219adc2e146100e257806340554c3a146100f7575b600080fd5b6100a061009b366004611806565b61014b565b60405190151581526020015b60405180910390f35b6100bd6101e4565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100ac565b6100f56100f0366004611848565b6101f3565b005b6100f5610105366004611861565b61023b565b604051601f1936013581526020016100ac565b6100f561012b366004611861565b610268565b6100bd610286565b6100f5610146366004611861565b610290565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fb5dee1270000000000000000000000000000000000000000000000000000000014806101de57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b60006101ee6102cc565b905090565b6101fb6102fe565b6102048161036f565b61020d81610421565b61021e816102196101e4565b61046c565b61022781610527565b610238816102336101e4565b6105b2565b50565b6102436102fe565b61024c82610421565b610258826102196101e4565b6102648282600161067a565b5050565b6102706102fe565b61027c826102196101e4565b61026482826105b2565b60006101ee610771565b6102986102fe565b6102a18261036f565b6102aa82610421565b6102b6826102196101e4565b6102c0828261077b565b610258826102336101e4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcc36013560601c806102fb5750335b90565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000017ffdeff94ed0b80c493a179d4b3b09d6d71f62716300361036d576040517f9f03a02600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b7f6e730000000000000000000000000000000000000000000000000000000000007dffffffffffffffffffffffffffff000000000000000000000000000000008216178114610238577f6e73000000000000000000000000000000000000000000000000000000000000816103e383610858565b6040517f5c30fb6f000000000000000000000000000000000000000000000000000000008152600401610418939291906118fa565b60405180910390fd5b61042a81610995565b610238578061043882610858565b6040517ffbf10ce600000000000000000000000000000000000000000000000000000000815260040161041892919061193b565b73ffffffffffffffffffffffffffffffffffffffff81166104ce7f6e730000000000000000000000000000000000000000000000000000000000007dffffffffffffffffffffffffffff00000000000000000000000000000000851617610a3a565b73ffffffffffffffffffffffffffffffffffffffff1614610264576104f282610858565b816040517fd787b737000000000000000000000000000000000000000000000000000000008152600401610418929190611954565b60408051600180825281830190925260009160208083019080368337019050509050818160008151811061055d5761055d6119a2565b60209081029190910101526102647f7462776f726c640000000000000000004e616d6573706163654f776e65720000827e14010014000000000000000000000000000000000000000000000000000000610ad6565b60408051600280825260608201835260009260208301908036833701905050905082816000815181106105e7576105e76119a2565b6020026020010181815250508173ffffffffffffffffffffffffffffffffffffffff1660001b81600181518110610620576106206119a2565b60209081029190910101526106757f7462776f726c640000000000000000005265736f757263654163636573730000827e01010001000000000000000000000000000000000000000000000000000000610ad6565b505050565b60408051600280825260608201835260009260208301908036833701905050905083816000815181106106af576106af6119a2565b6020026020010181815250508273ffffffffffffffffffffffffffffffffffffffff1660001b816001815181106106e8576106e86119a2565b60200260200101818152505061076b7f7462776f726c640000000000000000005265736f75726365416363657373000060001b8260008560405160200161073691151560f81b815260010190565b60408051601f198184030181529190527e01010001000000000000000000000000000000000000000000000000000000610ddd565b50505050565b60006101ee610df9565b6040805160018082528183019092526000916020808301908036833701905050905082816000815181106107b1576107b16119a2565b6020026020010181815250506106757f7462776f726c640000000000000000004e616d6573706163654f776e6572000060001b82600085604051602001610823919060609190911b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016815260140190565b60408051601f198184030181529190527e14010014000000000000000000000000000000000000000000000000000000610ddd565b606081601081901b600061086b83610e45565b9050827fffffffffffffffffffffffffffff0000000000000000000000000000000000008316156108c6576108c17fffffffffffffffffffffffffffff0000000000000000000000000000000000008416610e5c565b6108fd565b6040518060400160405280600681526020017f3c726f6f743e00000000000000000000000000000000000000000000000000008152505b7fffffffffffffffffffffffffffffffff000000000000000000000000000000008316156109335761092e83610e5c565b61096a565b6040518060400160405280600681526020017f3c726f6f743e00000000000000000000000000000000000000000000000000008152505b60405160200161097c939291906119b8565b6040516020818303038152906040529350505050919050565b6040805160018082528183019092526000918291906020808301908036833701905050905082816000815181106109ce576109ce6119a2565b60209081029190910101526000610a267f746273746f72650000000000000000005265736f75726365496473000000000083837e01010001000000000000000000000000000000000000000000000000000000610f00565b9050610a328160f81c90565b949350505050565b604080516001808252818301909252600091829190602080830190803683370190505090508281600081518110610a7357610a736119a2565b60209081029190910101526000610acb7f7462776f726c640000000000000000004e616d6573706163654f776e6572000083837e14010014000000000000000000000000000000000000000000000000000000610f00565b60601c949350505050565b7f6f74000000000000000000000000000000000000000000000000000000000000837fffff0000000000000000000000000000000000000000000000000000000000001603610b5c57827f0e1f72f429eb97e64878619984a91e687ae91610348b9ff4216782cc96e49d0783604051610b4f9190611a82565b60405180910390a2505050565b6000610b6784610f36565b905060005b8151811015610c3a576000828281518110610b8957610b896119a2565b60200260200101519050610bb56040826affffffffffffffffffffff1916610fbf90919063ffffffff16565b15610c31576040517f9faeaf45000000000000000000000000000000000000000000000000000000008152606082901c90639faeaf4590610bfe90899089908990600401611a95565b600060405180830381600087803b158015610c1857600080fd5b505af1158015610c2c573d6000803e3d6000fd5b505050505b50600101610b6c565b50837f0e1f72f429eb97e64878619984a91e687ae91610348b9ff4216782cc96e49d0784604051610c6b9190611a82565b60405180910390a26000610c7f8585610fdd565b9050610cd8816000610c9086611033565b67ffffffffffffffff811115610ca857610ca861198c565b6040519080825280601f01601f191660200182016040528015610cd2576020820181803683370190505b50611056565b6000610ce38461106c565b1115610d04576000610cf586866110a9565b9050610d028160206110ff565b505b60005b8251811015610dd5576000838281518110610d2457610d246119a2565b60200260200101519050610d506080826affffffffffffffffffffff1916610fbf90919063ffffffff16565b15610dcc576040517f83b5c95b000000000000000000000000000000000000000000000000000000008152606082901c906383b5c95b90610d99908a908a908a90600401611a95565b600060405180830381600087803b158015610db357600080fd5b505af1158015610dc7573d6000803e3d6000fd5b505050505b50600101610d07565b505050505050565b610df28585610dec848761113c565b85611175565b5050505050565b7f629a4c26e296b22a8e0856e9f6ecb2d1008d7e00081111962cd175fa7488e1755460009073ffffffffffffffffffffffffffffffffffffffff1680610e40573391505090565b919050565b6000610e5360706010611ad4565b9190911b919050565b606060005b6010811015610ec1577fffffffffffffffffffffffffffffffff000000000000000000000000000000008316600882021b7fff000000000000000000000000000000000000000000000000000000000000001615610ec157600101610e61565b604080517fffffffffffffffffffffffffffffffff00000000000000000000000000000000851660208201528151603090910190915281815280610a32565b6000610f2d610f0f8686610fdd565b60ff858116601b0360080285901c16610f28858761113c565b611419565b95945050505050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110610f7057610f706119a2565b60209081029190910101526000610fa87f746273746f726500000000000000000053746f7265486f6f6b73000000000000838361146a565b9050610a32610fba82600084516114a4565b611532565b60008160ff1682610fd08560581c90565b1660ff1614905092915050565b60008282604051602001610ff2929190611ae7565b60408051601f1981840301815291905280516020909101207f86425bff6b57326c7859e89024fe4f238ca327a1ae4a230180dd2f0e88aaa7d9189392505050565b6000600861104360026020611b23565b61104d9190611b36565b9190911c919050565b610675838383516110678560200190565b61154a565b6000600860018061107f60026020611b23565b6110899190611b23565b6110939190611b23565b61109d9190611b36565b8260ff911c1692915050565b600082826040516020016110be929190611ae7565b60408051601f1981840301815291905280516020909101207f14e2fcc58e58e68ec7edc30c8d50dccc3ce2714a623ec81f46b6a63922d76569189392505050565b6000602061110e83601f611ad4565b6111189190611b63565b6111229084611ad4565b90505b808310156106755760008355600183019250611125565b600080805b8360ff1681101561116d5761116360ff601b83900360080287901c1683611ad4565b9150600101611141565b509392505050565b7f6f74000000000000000000000000000000000000000000000000000000000000847fffff00000000000000000000000000000000000000000000000000000000000016036111ff57837f8c0b5119d4cec7b284c6b1b39252a03d1e2f2d7451a5895562524c113bb952be8484846040516111f293929190611b85565b60405180910390a261076b565b600061120b8585610fdd565b9050600061121886610f36565b905060005b81518110156112ed57600082828151811061123a5761123a6119a2565b602002602001015190506112666004826affffffffffffffffffffff1916610fbf90919063ffffffff16565b156112e4576040517f964f667d000000000000000000000000000000000000000000000000000000008152606082901c9063964f667d906112b1908b908b908b908b90600401611bc2565b600060405180830381600087803b1580156112cb57600080fd5b505af11580156112df573d6000803e3d6000fd5b505050505b5060010161121d565b50857f8c0b5119d4cec7b284c6b1b39252a03d1e2f2d7451a5895562524c113bb952be86868660405161132293929190611b85565b60405180910390a261133d828565ffffffffffff1685611056565b60005b815181101561141057600082828151811061135d5761135d6119a2565b602002602001015190506113896008826affffffffffffffffffffff1916610fbf90919063ffffffff16565b15611407576040517fa8ba8721000000000000000000000000000000000000000000000000000000008152606082901c9063a8ba8721906113d4908b908b908b908b90600401611bc2565b600060405180830381600087803b1580156113ee57600080fd5b505af1158015611402573d6000803e3d6000fd5b505050505b50600101611340565b50505050505050565b60006020821061143f5760208204840193506020828161143b5761143b611b4d565b0691505b508254600882021b60208290038084111561116d576001850154600882021c82179150509392505050565b6060610a3261147a858585611609565b600061149f8561148a8989611689565b9060ff166028026038011c64ffffffffff1690565b61169c565b6000818311806114b45750835182115b156114f1578383836040517f23230fa300000000000000000000000000000000000000000000000000000000815260040161041893929190611c06565b602084016114ff8482611ad4565b9050600061150d8585611b23565b6fffffffffffffffffffffffffffffffff1660809290921b9190911795945050505050565b6060600061154383601560006116bf565b9392505050565b82156115c457602083106115745760208304840193506020838161157057611570611b4d565b0692505b82156115c45760208390036000600019600885021c1990506008850281811c91508351811c90508119875416828216178755508184116115b557505061076b565b50600194909401939182900391015b5b602082106115e65780518455600190930192601f19909101906020016115c5565b811561076b576000600019600884021c8554835182191691161785555050505050565b6000838360405160200161161e929190611ae7565b604051602081830303815290604052805190602001208260f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f3b4102da22e32d82fc925482184f16c09fd4281692720b87d124aef6da48a0f1181860001c90509392505050565b600061154361169884846110a9565b5490565b60405160208101601f19603f848401011660405282825261116d8585858461173a565b606060006116cd8560801c90565b90506fffffffffffffffffffffffffffffffff851660008582816116f3576116f3611b4d565b04905060405193506020840160208202810160405281855260005b8281101561172e578451871c82529387019360209091019060010161170e565b50505050509392505050565b82156117c157602083106117645760208304840193506020838161176057611760611b4d565b0692505b82156117c15760208390036000818410156117875750600019600884021c611791565b50600019600882021c5b8554600886021b8184511682198216178452508184116117b257505061076b565b50600194909401939182900391015b5b602082106117e35783548152600190930192601f19909101906020016117c2565b811561076b576000600019600884021c8251865482191691161782525050505050565b60006020828403121561181857600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461154357600080fd5b60006020828403121561185a57600080fd5b5035919050565b6000806040838503121561187457600080fd5b82359150602083013573ffffffffffffffffffffffffffffffffffffffff8116811461189f57600080fd5b809150509250929050565b60005b838110156118c55781810151838201526020016118ad565b50506000910152565b600081518084526118e68160208601602086016118aa565b601f01601f19169290920160200192915050565b7fffff00000000000000000000000000000000000000000000000000000000000084168152826020820152606060408201526000610f2d60608301846118ce565b828152604060208201526000610a3260408301846118ce565b60408152600061196760408301856118ce565b905073ffffffffffffffffffffffffffffffffffffffff831660208301529392505050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b7fffff0000000000000000000000000000000000000000000000000000000000008416815260007f3a000000000000000000000000000000000000000000000000000000000000008060028401528451611a198160038601602089016118aa565b808401905081600382015284519150611a398260048301602088016118aa565b0160040195945050505050565b60008151808452602080850194506020840160005b83811015611a7757815187529582019590820190600101611a5b565b509495945050505050565b6020815260006115436020830184611a46565b838152606060208201526000611aae6060830185611a46565b9050826040830152949350505050565b634e487b7160e01b600052601160045260246000fd5b808201808211156101de576101de611abe565b8281526000602080830184516020860160005b82811015611b1657815184529284019290840190600101611afa565b5091979650505050505050565b818103818111156101de576101de611abe565b80820281158282048414176101de576101de611abe565b634e487b7160e01b600052601260045260246000fd5b600082611b8057634e487b7160e01b600052601260045260246000fd5b500490565b606081526000611b986060830186611a46565b65ffffffffffff851660208401528281036040840152611bb881856118ce565b9695505050505050565b848152608060208201526000611bdb6080830186611a46565b65ffffffffffff851660408401528281036060840152611bfb81856118ce565b979650505050505050565b606081526000611c1960608301866118ce565b6020830194909452506040015291905056fea164736f6c6343000818000a","storage":{}},"0x23618e81e3f5cdf7f54c3d65f7fbc0abf5b21e8f":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x4e59b44847b379578588920ca78fbf26c0b4956c":{"nonce":8,"balance":"0x0","code":"0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3","storage":{}},"0x53e5c08d82a377167069ade46d087ab753538608":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106100725760003560e01c80638fc8cf7e116100505780638fc8cf7e146100df578063ce5e8dd9146100ff578063e1af802c1461011257600080fd5b806301ffc9a714610077578063119df25f1461009f57806345ec9354146100cc575b600080fd5b61008a6100853660046106b0565b61011a565b60405190151581526020015b60405180910390f35b6100a76101b3565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610096565b604051601f193601358152602001610096565b6100f26100ed366004610745565b6101c2565b60405161009691906107ab565b6100f261010d366004610745565b6103d4565b6100a76105a8565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fb5dee1270000000000000000000000000000000000000000000000000000000014806101ad57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b60006101bd6105b2565b905090565b60606101cc6105e4565b60006101d66105a8565b90508267ffffffffffffffff8111156101f1576101f1610843565b60405190808252806020026020018201604052801561022457816020015b606081526020019060019003908161020f5790505b50915060005b838110156103cc5760008073ffffffffffffffffffffffffffffffffffffffff84168063894ecc5889898781811061026457610264610872565b905060200281019061027691906108a1565b6102849060208101906108df565b8a8a8881811061029657610296610872565b90506020028101906102a891906108a1565b602001358b8b898181106102be576102be610872565b90506020028101906102d091906108a1565b6102de906040810190610915565b6040516024016102f194939291906109a5565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660e09490941b93909317909252905161033e92506109e5565b600060405180830381855af49150503d8060008114610379576040519150601f19603f3d011682016040523d82523d6000602084013e61037e565b606091505b5091509150816103915761039181610655565b808060200190518101906103a591906109f7565b8584815181106103b7576103b7610872565b6020908102919091010152505060010161022a565b505092915050565b60606103de6105e4565b60006103e86105a8565b90508267ffffffffffffffff81111561040357610403610843565b60405190808252806020026020018201604052801561043657816020015b60608152602001906001900390816104215790505b50915060005b838110156103cc5760008073ffffffffffffffffffffffffffffffffffffffff841680633ae7af0889898781811061047657610476610872565b90506020028101906104889190610aa4565b358a8a8881811061049b5761049b610872565b90506020028101906104ad9190610aa4565b6104bb906020810190610915565b6040516024016104cd93929190610ad8565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660e09490941b93909317909252905161051a92506109e5565b600060405180830381855af49150503d8060008114610555576040519150601f19603f3d011682016040523d82523d6000602084013e61055a565b606091505b50915091508161056d5761056d81610655565b8080602001905181019061058191906109f7565b85848151811061059357610593610872565b6020908102919091010152505060010161043c565b60006101bd61065d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcc36013560601c806105e15750335b90565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000053e5c08d82a377167069ade46d087ab753538608163003610653576040517f9f03a02600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b805160208201fd5b60006101bd6000807f629a4c26e296b22a8e0856e9f6ecb2d1008d7e00081111962cd175fa7488e1755473ffffffffffffffffffffffffffffffffffffffff169050806106ab573391505090565b919050565b6000602082840312156106c257600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146106f257600080fd5b9392505050565b60008083601f84011261070b57600080fd5b50813567ffffffffffffffff81111561072357600080fd5b6020830191508360208260051b850101111561073e57600080fd5b9250929050565b6000806020838503121561075857600080fd5b823567ffffffffffffffff81111561076f57600080fd5b61077b858286016106f9565b90969095509350505050565b60005b838110156107a257818101518382015260200161078a565b50506000910152565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015610836577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845281518051808752610817818989018a8501610787565b601f01601f1916959095018601945092850192908501906001016107d2565b5092979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18336030181126108d557600080fd5b9190910192915050565b6000602082840312156108f157600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146106f257600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261094a57600080fd5b83018035915067ffffffffffffffff82111561096557600080fd5b60200191503681900382131561073e57600080fd5b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff851681528360208201526060604082015260006109db60608301848661097a565b9695505050505050565b600082516108d5818460208701610787565b600060208284031215610a0957600080fd5b815167ffffffffffffffff80821115610a2157600080fd5b818401915084601f830112610a3557600080fd5b815181811115610a4757610a47610843565b604051601f8201601f19908116603f01168101908382118183101715610a6f57610a6f610843565b81604052828152876020848701011115610a8857600080fd5b610a99836020830160208801610787565b979650505050505050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126108d557600080fd5b838152604060208201526000610af260408301848661097a565b9594505050505056fea164736f6c6343000818000a","storage":{}},"0x573802f86c51b61d7cf620952217ec6ce0537d2e":{"nonce":2,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106100365760003560e01c80630d84a1b61461003b57806368a1bfc114610077575b600080fd5b61004e610049366004610337565b61009e565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61004e7f000000000000000000000000da4e062e8c69d39d9472945232a53f579904ac4581565b600080604051806020016100b1906102fb565b6020820181038252601f19601f820116604052509050600033846040516020016100dc9291906103e8565b6040516020818303038152906040528051906020012060001c905061010182826102dd565b6040517fc4d66de800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000da4e062e8c69d39d9472945232a53f579904ac4581166004830152919450849182169063c4d66de890602401600060405180830381600087803b15801561018f57600080fd5b505af11580156101a3573d6000803e3d6000fd5b5050604080517f6e730000000000000000000000000000000000000000000000000000000000006020820152600060228201819052603082015273ffffffffffffffffffffffffffffffffffffffff8516935063ef5d6bbb92500160405160208183030381529060405261021690610455565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526004810191909152336024820152604401600060405180830381600087803b15801561026d57600080fd5b505af1158015610281573d6000803e3d6000fd5b505050508373ffffffffffffffffffffffffffffffffffffffff167f2d0f7264273924c53c23fe4b876ab0095eb681a2962abb107124ff1de7c98469836040516102cd91815260200190565b60405180910390a2505050919050565b6000818351602085016000f59050806102f557600080fd5b92915050565b61538c8061049b83390190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561034957600080fd5b813567ffffffffffffffff8082111561036157600080fd5b818401915084601f83011261037557600080fd5b81358181111561038757610387610308565b604051601f8201601f19908116603f011681019083821181831017156103af576103af610308565b816040528281528760208487010111156103c857600080fd5b826020860160208301376000928101602001929092525095945050505050565b73ffffffffffffffffffffffffffffffffffffffff831681526000602060406020840152835180604085015260005b8181101561043357858101830151858201606001528201610417565b506000606082860101526060601f19601f830116850101925050509392505050565b80516020808301519190811015610494577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8160200360031b1b821691505b5091905056fe60a060405234801561001057600080fd5b506100477f629a4c26e296b22a8e0856e9f6ecb2d1008d7e00081111962cd175fa7488e17580546001600160a01b03191630179055565b60405164191718171960d91b907fc7f5fdc8526b76f54916701bc910876243ffff2a40b0bb8d59eea8151c52c00590600090a23360805260405164191718171960d91b907f7f8f36afe3fb61c459c1a54a60b8a477eab02cc58e49f547561a40906239cb8290600090a26080516152b8620000d46000396000818161036f01526112c801526152b86000f3fe6080604052600436106101d15760003560e01c80638c364d59116100f7578063c4d66de811610095578063d9c03a0411610064578063d9c03a04146106d1578063dbbf0e21146106f1578063e228a4a314610711578063ef6ea8621461073157610266565b8063c4d66de814610651578063cc49db7e14610671578063d03edb8c14610691578063d4285dc2146106b157610266565b8063af068c9e116100d1578063af068c9e146105f1578063b047c1eb14610611578063c0a2895a14610631578063c11222291461054b57610266565b80638c364d59146105915780639f1fcf0a146105b1578063a53417ed146105d157610266565b8063390baae01161016f5780634dc77d971161013e5780634dc77d971461050b578063505a181d1461052b5780636951955d1461054b578063894ecc581461057e57610266565b8063390baae01461047b5780633a77c2c21461049b5780633ae7af08146104c9578063419b58fd146104dc57610266565b8063150f3262116101ab578063150f3262146103fb5780631e7889771461041b578063298314fb1461043b5780633708196e1461045b57610266565b806302d05d3f1461035d57806305242d2f146103ae578063114a7266146103db57610266565b366102665760408051616e7360f01b602082015260006022820181905260308201819052916102189101604051602081830303815290604052610213906143b6565b610751565b60408051616e7360f01b602082015260006022820181905260308201529192506102649101604051602081830303815290604052610255906143b6565b61025f34846143f3565b6107d2565b005b303303610299576040516327a1460b60e21b81526001600160e01b03196000351660048201526024015b60405180910390fd5b6000806102b16000356001600160e01b031916610873565b91509150816000801b036102ff576040517ffdde54e20000000000000000000000000000000000000000000000000000000081526001600160e01b0319600035166004820152602401610290565b60006103436000368080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525092508691506109439050565b9050600061035333858434610976565b9050805160208201f35b34801561036957600080fd5b506103917f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156103ba57600080fd5b506103ce6103c9366004614463565b6109a3565b6040516103a59190614519565b3480156103e757600080fd5b506102646103f636600461456e565b6109e6565b34801561040757600080fd5b5061026461041636600461456e565b610a99565b34801561042757600080fd5b506103ce6104363660046145fb565b610b44565b34801561044757600080fd5b50610264610456366004614659565b610b8e565b34801561046757600080fd5b50610264610476366004614706565b610c77565b34801561048757600080fd5b50610264610496366004614706565b610d2d565b3480156104a757600080fd5b506104bb6104b636600461479c565b610dda565b6040519081526020016103a5565b6103ce6104d736600461486c565b610deb565b3480156104e857600080fd5b506104fc6104f73660046148b3565b610e27565b6040516103a593929190614906565b34801561051757600080fd5b506103ce6105263660046149a6565b610e7c565b34801561053757600080fd5b50610264610546366004614a0f565b610e8b565b34801561055757600080fd5b507f322e302e320000000000000000000000000000000000000000000000000000006104bb565b6103ce61058c366004614a70565b610f00565b34801561059d57600080fd5b506104bb6105ac366004614463565b61105c565b3480156105bd57600080fd5b506104bb6105cc366004614ac9565b61109f565b3480156105dd57600080fd5b506104bb6105ec366004614b28565b6110ad565b3480156105fd57600080fd5b5061026461060c366004614b7f565b6110ba565b34801561061d57600080fd5b5061026461062c366004614bb9565b611136565b34801561063d57600080fd5b5061026461064c366004614c48565b6111e1565b34801561065d57600080fd5b5061026461066c366004614cd5565b61128f565b34801561067d57600080fd5b506104fc61068c366004614a0f565b6113d1565b34801561069d57600080fd5b506103ce6106ac3660046145fb565b611423565b3480156106bd57600080fd5b506104bb6106cc36600461479c565b611464565b3480156106dd57600080fd5b506102646106ec366004614463565b61146f565b3480156106fd57600080fd5b506104bb61070c366004614b28565b6114ef565b34801561071d57600080fd5b506104bb61072c36600461479c565b6114fc565b34801561073d57600080fd5b5061026461074c36600461456e565b611507565b60408051600180825281830190925260009182919060208083019080368337019050509050828160008151811061078a5761078a614cf2565b602090810291909101015260006107ca7f7462776f726c6400000000000000000042616c616e63657300000000000000008383630100080160dd1b6115b2565b949350505050565b60408051600180825281830190925260009160208083019080368337019050509050828160008151811061080857610808614cf2565b60200260200101818152505061086e7f7462776f726c6400000000000000000042616c616e636573000000000000000060001b8260008560405160200161085191815260200190565b60408051601f19818403018152919052630100080160dd1b6115df565b505050565b6040805160018082528183019092526000918291829160208083019080368337019050509050837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916816000815181106108cc576108cc614cf2565b6020908102919091010152600080806109257f7462776f726c6400000000000000000046756e6374696f6e53656c6563746f72857e240200200400000000000000000000000000000000000000000000000000006115f4565b9250925092506109368383836116fc565b9550955050505050915091565b82820160200180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1682179052825b9392505050565b606060008061098787878787611714565b915091508161099957610999816118e4565b9695505050505050565b6060610999868686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508892508791506118ec9050565b303303610a14576040516327a1460b60e21b81526001600160e01b0319600035166004820152602401610290565b610a1e8633611931565b610a918686868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020601f89018190048102820181019092528781528993509150879087908190840183828082843760009201919091525061197d92505050565b505050505050565b303303610ac7576040516327a1460b60e21b81526001600160e01b0319600035166004820152602401610290565b610ad18633611931565b610a918686868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020601f89018190048102820181019092528781528993509150879087908190840183828082843760009201919091525061199892505050565b6060610b85858585808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508792506119d3915050565b95945050505050565b303303610bbc576040516327a1460b60e21b81526001600160e01b0319600035166004820152602401610290565b610bc68833611931565b610c6d8888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020601f8c018190048102820181019092528a815292508a915089908190840183828082843760009201919091525050604080516020601f8a018190048102820181019092528881528a935091508890889081908401838280828437600092019190915250611a0d92505050565b5050505050505050565b303303610ca5576040516327a1460b60e21b81526001600160e01b0319600035166004820152602401610290565b610caf8733611931565b610d248787878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020601f8a018190048102820181019092528881528a935091508890889081908401838280828437600092019190915250889250611a23915050565b50505050505050565b303303610d5b576040516327a1460b60e21b81526001600160e01b0319600035166004820152602401610290565b610d658733611931565b610d248787878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020601f8a018190048102820181019092528881528a9350915088908890819084018382808284376000920191909152508892506115df915050565b6000610de582611a66565b92915050565b6060303303610e1b576040516327a1460b60e21b81526001600160e01b0319600035166004820152602401610290565b61096f33848434610976565b606060006060610e6c878787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506115f4915050565b9250925092509450945094915050565b60606109998686868686611aeb565b303303610eb9576040516327a1460b60e21b81526001600160e01b0319600035166004820152602401610290565b610ec38333611931565b61086e83838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611bee92505050565b6060303303610f30576040516327a1460b60e21b81526001600160e01b0319600035166004820152602401610290565b336001600160a01b03851603610f5357610f4c33848434610976565b905061096f565b6000610f5f8533611c01565b9050610f6e8186338787611cb2565b15610f8757610f7f85858534610976565b91505061096f565b6000610f94866000611c01565b9050610fa38187338888611cb2565b15610fbd57610fb486868634610976565b9250505061096f565b6000610fef616e7360f01b7dffffffffffffffffffffffffffff00000000000000000000000000000000881617611d87565b9050610ffe8188338989611cb2565b156110195761100f87878734610976565b935050505061096f565b6040517fc86745f90000000000000000000000000000000000000000000000000000000081526001600160a01b0388166004820152336024820152604401610290565b6000610999868686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508892508791506115b29050565b6000610b8585858585611e00565b60006107ca848484611e48565b3033036110e8576040516327a1460b60e21b81526001600160e01b0319600035166004820152602401610290565b60408051616e7360f01b602082015260006022820181905260308201526111289101604051602081830303815290604052611122906143b6565b33611e5e565b6111328282611eaf565b5050565b303303611164576040516327a1460b60e21b81526001600160e01b0319600035166004820152602401610290565b61116e8633611931565b610a918686868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020601f890181900481028201810190925287815289935091508790879081908401838280828437600092019190915250611f6292505050565b30330361120f576040516327a1460b60e21b81526001600160e01b0319600035166004820152602401610290565b6112198833611931565b610c6d8888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020601f89018190048102820181019092528781528b93508a9250899189908990819084018382808284376000920191909152506121fd92505050565b3033036112bd576040516327a1460b60e21b81526001600160e01b0319600035166004820152602401610290565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146113615760408051616e7360f01b6020820152600060228201819052603082015261132c9101604051602081830303815290604052611327906143b6565b612215565b336040517fd787b737000000000000000000000000000000000000000000000000000000008152600401610290929190614d08565b600061136b612352565b6001600160a01b0316146113ab576040517f15e34a4800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113b4816123b9565b6040805160008152602081019091526113ce908290611eaf565b50565b6060600060606114148686868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061245492505050565b92509250925093509350939050565b6060610b858585858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525087925061247a915050565b6000610de582612490565b30330361149d576040516327a1460b60e21b81526001600160e01b0319600035166004820152602401610290565b6114a78533611931565b6114e8858585808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508792508691506125049050565b5050505050565b60006107ca84848461255d565b6000610de58261256d565b303303611535576040516327a1460b60e21b81526001600160e01b0319600035166004820152602401610290565b61153f8633611931565b610a918686868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020601f89018190048102820181019092528781528993509150879087908190840183828082843760009201919091525061259392505050565b6000610b856115c186866125ce565b60ff858116601b0360080285901c166115da8587612624565b61265d565b6114e885856115ee8487612624565b85611f62565b6060600060606000611605856126ae565b90506116128787836126d1565b9350600061161f8661270a565b905080156116f1576116318888612747565b935066ffffffffffffff841667ffffffffffffffff811115611655576116556147b5565b6040519080825280601f01601f19166020018201604052801561167f576020820181803683370190505b5092506020830160005b828160ff1610156116ee5760006116a18b8b8461275a565b905060006116be888460ff166028026038011c64ffffffffff1690565b90506116cd82600083876127da565b6116d781856143f3565b9350505080806116e690614d33565b915050611689565b50505b505093509350939050565b600080611708856128a6565b90969095509350505050565b600060606000611723866128bb565b905060005b81518110156117f657600082828151811061174557611745614cf2565b602002602001015190506117716001826affffffffffffffffffffff191661294490919063ffffffff16565b156117ed576040517fc3323031000000000000000000000000000000000000000000000000000000008152606082901c9063c3323031906117ba908c908c908c90600401614d52565b600060405180830381600087803b1580156117d457600080fd5b505af11580156117e8573d6000803e3d6000fd5b505050505b50600101611728565b5061180387858888612962565b909350915060005b81518110156118d957600082828151811061182857611828614cf2565b602002602001015190506118546002826affffffffffffffffffffff191661294490919063ffffffff16565b156118d0576040517f973d8f99000000000000000000000000000000000000000000000000000000008152606082901c9063973d8f999061189d908c908c908c90600401614d52565b600060405180830381600087803b1580156118b757600080fd5b505af11580156118cb573d6000803e3d6000fd5b505050505b5060010161180b565b505094509492505050565b805160208201fd5b60606118f782612a7d565b8360ff1610156119145761190d85858585612a8f565b90506107ca565b61190d858561192285612a7d565b61192c9087614d7a565b6119d3565b61193b8282612abc565b6111325761194882612215565b816040517fd787b737000000000000000000000000000000000000000000000000000000008152600401610290929190614d08565b6119928484848461198d89611a66565b611a23565b50505050565b60006119a48585612747565b905060006119c1828560ff166028026038011c64ffffffffff1690565b9050610a918686868460008888612aff565b60606107ca6119e385858561275a565b6000611a08856119f38989612747565b9060ff166028026038011c64ffffffffff1690565b612f39565b6114e88585858585611a1e8b611a66565b612f5c565b611a2c81612a7d565b8360ff161015611a4857611a4385858585856115df565b6114e8565b6114e88585611a5684612a7d565b611a609087614d7a565b85612593565b60007f8b9d8c8b908d9affffffffffffffffffab9e9d939a8d000000000000000000008201611ab557507e60030220202000000000000000000000000000000000000000000000000000919050565b610de5611ae27f746273746f72650000000000000000005461626c657300000000000000000000846132a1565b6020600061265d565b606081831115611b31576040517fa8c547820000000000000000000000000000000000000000000000000000000081526004810184905260248101839052604401610290565b6000611b3d8787612747565b90506000611b5a828760ff166028026038011c64ffffffffff1690565b90508085101580611b6a57508084115b15611bc5578081861015611b8857611b83600186614d93565b611b8a565b855b6040517f7e8578d300000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610290565b6000611bd289898961275a565b9050611be18187888803612f39565b9998505050505050505050565b6111328282611bfc85611a66565b6132bd565b60408051600280825260608201835260009283929190602083019080368337019050509050836001600160a01b031660001b81600081518110611c4657611c46614cf2565b602002602001018181525050826001600160a01b031660001b81600181518110611c7257611c72614cf2565b60209081029190910101526000610b857f7462776f726c640000000000000000005573657244656c65676174696f6e436f8383630100080160dd1b6115b2565b6000611cbd866135bc565b15611cca57506001610b85565b85611cd757506000610b85565b600080611d538660008a8a8989604051602401611cf693929190614d52565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1a86b55000000000000000000000000000000000000000000000000000000000179052612962565b9150915081611d6757600092505050610b85565b80806020019051810190611d7b9190614da6565b98975050505050505050565b604080516001808252818301909252600091829190602080830190803683370190505090508281600081518110611dc057611dc0614cf2565b602090810291909101015260006107ca7f7462776f726c640000000000000000004e616d65737061636544656c656761748383630100080160dd1b6115b2565b600080611e0c83612a7d565b90508060ff168460ff161015611e345760ff848116601b0360080284901c165b9150506107ca565b611e2c8686611e438488614d7a565b61255d565b60006107ca848484611e5988611a66565b611e00565b6001600160a01b038116611e98616e7360f01b7dffffffffffffffffffffffffffff00000000000000000000000000000000851617613637565b6001600160a01b0316146111325761194882612215565b611ed9827f6fdd1c80000000000000000000000000000000000000000000000000000000006136d3565b611f4e3360008484604051602401611ef19190614519565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f7c5b03350000000000000000000000000000000000000000000000000000000017905261372e565b50611132828280519060200120600161373f565b7f6f74000000000000000000000000000000000000000000000000000000000000847fffff0000000000000000000000000000000000000000000000000000000000001603611fec57837f8c0b5119d4cec7b284c6b1b39252a03d1e2f2d7451a5895562524c113bb952be848484604051611fdf93929190614e04565b60405180910390a2611992565b6000611ff885856125ce565b9050600061200586613823565b905060005b81518110156120da57600082828151811061202757612027614cf2565b602002602001015190506120536004826affffffffffffffffffffff191661294490919063ffffffff16565b156120d1576040517f964f667d000000000000000000000000000000000000000000000000000000008152606082901c9063964f667d9061209e908b908b908b908b90600401614e37565b600060405180830381600087803b1580156120b857600080fd5b505af11580156120cc573d6000803e3d6000fd5b505050505b5060010161200a565b50857f8c0b5119d4cec7b284c6b1b39252a03d1e2f2d7451a5895562524c113bb952be86868660405161210f93929190614e04565b60405180910390a261212a828565ffffffffffff1685613895565b60005b8151811015610d2457600082828151811061214a5761214a614cf2565b602002602001015190506121766008826affffffffffffffffffffff191661294490919063ffffffff16565b156121f4576040517fa8ba8721000000000000000000000000000000000000000000000000000000008152606082901c9063a8ba8721906121c1908b908b908b908b90600401614e37565b600060405180830381600087803b1580156121db57600080fd5b505af11580156121ef573d6000803e3d6000fd5b505050505b5060010161212d565b610a918686868686866122108d8d612747565b612aff565b606081601081901b6000612228836138ab565b9050827fffffffffffffffffffffffffffff0000000000000000000000000000000000008316156122835761227e7fffffffffffffffffffffffffffff00000000000000000000000000000000000084166138c2565b6122ba565b6040518060400160405280600681526020017f3c726f6f743e00000000000000000000000000000000000000000000000000008152505b7fffffffffffffffffffffffffffffffff000000000000000000000000000000008316156122f0576122eb836138c2565b612327565b6040518060400160405280600681526020017f3c726f6f743e00000000000000000000000000000000000000000000000000008152505b60405160200161233993929190614e70565b6040516020818303038152906040529350505050919050565b6040805160008082526020820190925260006123af7f7462776f726c64000000000000000000496e69744d6f64756c6541646472657383837e14010014000000000000000000000000000000000000000000000000000000613966565b60601c9392505050565b604080516000808252602082018352606084901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000168284015282518083036034018152605483019093529091611132917f7462776f726c64000000000000000000496e69744d6f64756c65416464726573918491907e14010014000000000000000000000000000000000000000000000000000000613a1b565b60606000606061246d858561246888611a66565b6115f4565b9250925092509250925092565b60606107ca84848461248b88611a66565b6118ec565b600061249b82613ac4565b90506124a682613b56565b6124ff5781826040516020016124be91815260200190565b60408051601f19818403018152908290527f41e713ad0000000000000000000000000000000000000000000000000000000082526102909291600401614efe565b919050565b60006125108585612747565b9050600061252d828560ff166028026038011c64ffffffffff1690565b9050610a918686866125468764ffffffffff8716614d93565b604080516000815260208101909152889088612aff565b60006107ca826119f38686612747565b600061257882613bf3565b9050806124ff5781826040516020016124be91815260200190565b600061259f8585612747565b905060006125bc828560ff166028026038011c64ffffffffff1690565b9050610a918686866000858888612aff565b600082826040516020016125e3929190614f17565b60408051601f1981840301815291905280516020909101207f86425bff6b57326c7859e89024fe4f238ca327a1ae4a230180dd2f0e88aaa7d9189392505050565b600080805b8360ff168110156126555761264b60ff601b83900360080287901c16836143f3565b9150600101612629565b509392505050565b6000602082106126835760208204840193506020828161267f5761267f614f53565b0691505b508254600882021b602082900380841115612655576001850154600882021c82179150509392505050565b600060086126be60026020614d93565b6126c89190614f69565b9190911c919050565b6060816000036126f0575060408051602081019091526000815261096f565b60006126fc85856125ce565b9050610b8581600085612f39565b6000600860018061271d60026020614d93565b6127279190614d93565b6127319190614d93565b61273b9190614f69565b8260ff911c1692915050565b600061096f6127568484613c85565b5490565b6000838360405160200161276f929190614f17565b604051602081830303815290604052805190602001208260f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f3b4102da22e32d82fc925482184f16c09fd4281692720b87d124aef6da48a0f1181860001c90509392505050565b821561286157602083106128045760208304840193506020838161280057612800614f53565b0692505b82156128615760208390036000818410156128275750600019600884021c612831565b50600019600882021c5b8554600886021b818451168219821617845250818411612852575050611992565b50600194909401939182900391015b5b602082106128835783548152600190930192601f1990910190602001612862565b8115611992576000600019600884021c8251865482191691161782525050505050565b602081015160408201516000905b9050915091565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106128f5576128f5614cf2565b6020908102919091010152600061292d7f7462776f726c6400000000000000000053797374656d486f6f6b73000000000083836119d3565b90506107ca61293f8260008451613cdb565b613d69565b60008160ff16826129558560581c90565b1660ff1614905092915050565b6000606060008061297286613d7a565b90925090506001600160a01b0382166129c3578561298f87612215565b6040517ffbf10ce6000000000000000000000000000000000000000000000000000000008152600401610290929190614efe565b806129d2576129d28689611931565b8615612a1e577dffffffffffffffffffffffffffff000000000000000000000000000000008616616e7360f01b176000612a0b82610751565b9050612a1b8261025f8b846143f3565b50505b6000612a2a8760101b90565b7fffffffffffffffffffffffffffff0000000000000000000000000000000000001614612a6257612a5d88888488613e1e565b612a6e565b612a6e88888488613e96565b90999098509650505050505050565b60006008600161272760026020614d93565b6060610b85612a9e86866125ce565b612aa88486612624565b60ff868116601b0360080286901c16612f39565b6000612aef616e7360f01b7dffffffffffffffffffffffffffff0000000000000000000000000000000085161783613ef7565b8061096f575061096f8383613ef7565b7f7462000000000000000000000000000000000000000000000000000000000000877fffff0000000000000000000000000000000000000000000000000000000000001614612bbf577f74620000000000000000000000000000000000000000000000000000000000008788604051602001612b7d91815260200190565b60408051601f19818403018152908290527f31b46683000000000000000000000000000000000000000000000000000000008252610290939291600401614f80565b6000612bda828760ff166028026038011c64ffffffffff1690565b9050600083518564ffffffffff1683612bf39190614d93565b612bfd91906143f3565b9050808214158015612c1f575081612c158688614fc1565b64ffffffffff1614155b15612c6f576040517fa65010b400000000000000000000000000000000000000000000000000000000815264ffffffffff8088166004830152808716602483015283166044820152606401610290565b818664ffffffffff161115612cc0576040517f7e8578d30000000000000000000000000000000000000000000000000000000081526004810183905264ffffffffff87166024820152604401610290565b6000612ccd848984613fc0565b90506000612cda8b613823565b905060005b8151811015612da5576000828281518110612cfc57612cfc614cf2565b60200260200101519050612d286010826affffffffffffffffffffff191661294490919063ffffffff16565b15612d9c57606081901c6001600160a01b03166355eb5a288e8e8e8e8e8d8f6040518863ffffffff1660e01b8152600401612d699796959493929190614fe6565b600060405180830381600087803b158015612d8357600080fd5b505af1158015612d97573d6000803e3d6000fd5b505050505b50600101612cdf565b5064ffffffffff881660005b8a60ff168160ff161015612de457612dd8878260ff166028026038011c64ffffffffff1690565b90910190600101612db1565b508b7ffe158a7adba34e256807c8a149028d3162918713c3838afc643ce9f96716ebfd8c8c848c888d604051612e1f96959493929190615044565b60405180910390a250828414612e40576000612e3b8c8c613c85565b839055505b6000612e4d8c8c8c61275a565b9050612e61818a64ffffffffff1689613895565b5060005b8151811015612f2b576000828281518110612e8257612e82614cf2565b60200260200101519050612eae6020826affffffffffffffffffffff191661294490919063ffffffff16565b15612f2257606081901c6001600160a01b031663635845338e8e8e8e8e8a8f6040518863ffffffff1660e01b8152600401612eef9796959493929190614fe6565b600060405180830381600087803b158015612f0957600080fd5b505af1158015612f1d573d6000803e3d6000fd5b505050505b50600101612e65565b505050505050505050505050565b60405160208101601f19603f8484010116604052828252612655858585846127da565b7f6f74000000000000000000000000000000000000000000000000000000000000867fffff0000000000000000000000000000000000000000000000000000000000001603612fe857857f8dbb3a9672eebfd3773e72dd9c102393436816d832c7ba9e1e1ac8fcadcac7a986868686604051612fdb9493929190615093565b60405180910390a2610a91565b6000612ff387613823565b905060005b81518110156130cc57600082828151811061301557613015614cf2565b602002602001015190506130416001826affffffffffffffffffffff191661294490919063ffffffff16565b156130c3576040517f57066c9c000000000000000000000000000000000000000000000000000000008152606082901c906357066c9c90613090908c908c908c908c908c908c906004016150d2565b600060405180830381600087803b1580156130aa57600080fd5b505af11580156130be573d6000803e3d6000fd5b505050505b50600101612ff8565b50867f8dbb3a9672eebfd3773e72dd9c102393436816d832c7ba9e1e1ac8fcadcac7a9878787876040516131039493929190615093565b60405180910390a2600061311788886125ce565b9050600060208701905061312f82600089518461408e565b600061313a8561270a565b11156131be57600061314c8a8a613c85565b878155905060208601915060008060005b6131668861270a565b8160ff1610156131b95761317b8d8d8361275a565b92506131968a8260ff166028026038011c64ffffffffff1690565b91506131a5836000848861408e565b6131af82866143f3565b945060010161315d565b505050505b60005b83518110156132955760008482815181106131de576131de614cf2565b6020026020010151905061320a6002826affffffffffffffffffffff191661294490919063ffffffff16565b1561328c576040517f5b28cdaf000000000000000000000000000000000000000000000000000000008152606082901c90635b28cdaf90613259908e908e908e908e908e908e906004016150d2565b600060405180830381600087803b15801561327357600080fd5b505af1158015613287573d6000803e3d6000fd5b505050505b506001016131c1565b50505050505050505050565b60408051602081018490529081018290526000906060016125e3565b7f6f74000000000000000000000000000000000000000000000000000000000000837fffff000000000000000000000000000000000000000000000000000000000000160361334357827f0e1f72f429eb97e64878619984a91e687ae91610348b9ff4216782cc96e49d0783604051613336919061512b565b60405180910390a2505050565b600061334e84613823565b905060005b815181101561342157600082828151811061337057613370614cf2565b6020026020010151905061339c6040826affffffffffffffffffffff191661294490919063ffffffff16565b15613418576040517f9faeaf45000000000000000000000000000000000000000000000000000000008152606082901c90639faeaf45906133e59089908990899060040161513e565b600060405180830381600087803b1580156133ff57600080fd5b505af1158015613413573d6000803e3d6000fd5b505050505b50600101613353565b50837f0e1f72f429eb97e64878619984a91e687ae91610348b9ff4216782cc96e49d0784604051613452919061512b565b60405180910390a2600061346685856125ce565b90506134bf816000613477866126ae565b67ffffffffffffffff81111561348f5761348f6147b5565b6040519080825280601f01601f1916602001820160405280156134b9576020820181803683370190505b50613895565b60006134ca8461270a565b11156134eb5760006134dc8686613c85565b90506134e981602061414d565b505b60005b8251811015610a9157600083828151811061350b5761350b614cf2565b602002602001015190506135376080826affffffffffffffffffffff191661294490919063ffffffff16565b156135b3576040517f83b5c95b000000000000000000000000000000000000000000000000000000008152606082901c906383b5c95b90613580908a908a908a9060040161513e565b600060405180830381600087803b15801561359a57600080fd5b505af11580156135ae573d6000803e3d6000fd5b505050505b506001016134ee565b604080517f737900000000000000000000000000000000000000000000000000000000000060208201526000602282018190527f756e6c696d6974656400000000000000000000000000000000000000000000006030830152910160405160208183030381529060405261362f906143b6565b909114919050565b60408051600180825281830190925260009182919060208083019080368337019050509050828160008151811061367057613670614cf2565b602090810291909101015260006136c87f7462776f726c640000000000000000004e616d6573706163654f776e6572000083837e140100140000000000000000000000000000000000000000000000000000006115b2565b60601c949350505050565b6136dd828261418a565b611132576040517f74b5e6ff0000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526001600160e01b031982166024820152604401610290565b606060008061098787878787613e96565b604080516002808252606082018352600092602083019080368337019050509050836001600160a01b031660001b8160008151811061378057613780614cf2565b60200260200101818152505082816001815181106137a0576137a0614cf2565b6020026020010181815250506119927f7462776f726c64000000000000000000496e7374616c6c65644d6f64756c657360001b826000856040516020016137ee91151560f81b815260010190565b60408051601f198184030181529190527e010100010000000000000000000000000000000000000000000000000000006115df565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061385d5761385d614cf2565b6020908102919091010152600061292d7f746273746f726500000000000000000053746f7265486f6f6b7300000000000083836119d3565b61086e838383516138a68560200190565b61408e565b60006138b9607060106143f3565b9190911b919050565b606060005b6010811015613927577fffffffffffffffffffffffffffffffff000000000000000000000000000000008316600882021b7fff000000000000000000000000000000000000000000000000000000000000001615613927576001016138c7565b604080517fffffffffffffffffffffffffffffffff000000000000000000000000000000008516602082015281516030909101909152818152806107ca565b6000806139716141a6565b9050306001600160a01b0382160361398f57611e2c868686866115b2565b6040517f8c364d590000000000000000000000000000000000000000000000000000000081526001600160a01b03821690638c364d59906139da908990899089908990600401615167565b602060405180830381865afa1580156139f7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2c9190615196565b6000613a256141a6565b9050306001600160a01b03821603613a4957613a4486868686866115df565b610a91565b6040517f390baae00000000000000000000000000000000000000000000000000000000081526001600160a01b0382169063390baae090613a9690899089908990899089906004016151af565b600060405180830381600087803b158015613ab057600080fd5b505af1158015613295573d6000803e3d6000fd5b604080516001808252818301909252600091829190602080830190803683370190505090508281600081518110613afd57613afd614cf2565b602090810291909101015260006107ca7f746273746f72650000000000000000005461626c6573000000000000000000008360017e600302202020000000000000000000000000000000000000000000000000006115b2565b604080516001808252818301909252600091829190602080830190803683370190505090508281600081518110613b8f57613b8f614cf2565b60209081029190910101526000613be77f746273746f72650000000000000000005265736f75726365496473000000000083837e010100010000000000000000000000000000000000000000000000000000006115b2565b90506107ca8160f81c90565b604080516001808252818301909252600091829190602080830190803683370190505090508281600081518110613c2c57613c2c614cf2565b602090810291909101015260006107ca7f746273746f72650000000000000000005461626c6573000000000000000000008360027e600302202020000000000000000000000000000000000000000000000000006115b2565b60008282604051602001613c9a929190614f17565b60408051601f1981840301815291905280516020909101207f14e2fcc58e58e68ec7edc30c8d50dccc3ce2714a623ec81f46b6a63922d76569189392505050565b600081831180613ceb5750835182115b15613d28578383836040517f23230fa3000000000000000000000000000000000000000000000000000000008152600401610290939291906151f6565b60208401613d3684826143f3565b90506000613d448585614d93565b6fffffffffffffffffffffffffffffffff1660809290921b9190911795945050505050565b6060600061096f83601560006141e0565b60408051600180825281830190925260009182918291602080830190803683370190505090508381600081518110613db457613db4614cf2565b602090810291909101015260008080613e0d7f7462776f726c6400000000000000000053797374656d73000000000000000000857e150200140100000000000000000000000000000000000000000000000000006115f4565b92509250925061093683838361425b565b60006060836001600160a01b03166000613e39858989614267565b604051613e46919061521b565b60006040518083038185875af1925050503d8060008114613e83576040519150601f19603f3d011682016040523d82523d6000602084013e613e88565b606091505b509097909650945050505050565b60006060836001600160a01b0316613eaf848888614267565b604051613ebc919061521b565b600060405180830381855af49150503d8060008114613e83576040519150601f19603f3d011682016040523d82523d6000602084013e613e88565b604080516002808252606082018352600092839291906020830190803683370190505090508381600081518110613f3057613f30614cf2565b602002602001018181525050826001600160a01b031660001b81600181518110613f5c57613f5c614cf2565b60209081029190910101526000613fb47f7462776f726c640000000000000000005265736f75726365416363657373000083837e010100010000000000000000000000000000000000000000000000000000006115b2565b9050610b858160f81c90565b600064ffffffffff821115614004576040517f7149a3c100000000000000000000000000000000000000000000000000000000815260048101839052602401610290565b8366ffffffffffffff811660ff851660280260380182901c64ffffffffff16808510614036578085038201915061403e565b848103820391505b5064ffffffffff6038602860ff8816020181811b197fffffffffffffffffffffffffffffffffffffffffffffffffff000000000000009490941690921792909216918416901b1790509392505050565b821561410857602083106140b8576020830484019350602083816140b4576140b4614f53565b0692505b82156141085760208390036000600019600885021c1990506008850281811c91508351811c90508119875416828216178755508184116140f9575050611992565b50600194909401939182900391015b5b6020821061412a5780518455600190930192601f1990910190602001614109565b8115611992576000600019600884021c8554835182191691161785555050505050565b6000602061415c83601f6143f3565b6141669190615237565b61417090846143f3565b90505b8083101561086e5760008355600183019250614173565b600061419583614296565b801561096f575061096f83836142e2565b7f629a4c26e296b22a8e0856e9f6ecb2d1008d7e00081111962cd175fa7488e175546000906001600160a01b0316806124ff573391505090565b606060006141ee8560801c90565b90506fffffffffffffffffffffffffffffffff8516600085828161421457614214614f53565b04905060405193506020840160208202810160405281855260005b8281101561424f578451871c82529387019360209091019060010161422f565b50505050509392505050565b6000806117088561439a565b606083838360405160200161427e93929190615259565b60405160208183030381529060405290509392505050565b60006142c2827f01ffc9a7000000000000000000000000000000000000000000000000000000006142e2565b8015610de557506142db826001600160e01b03196142e2565b1592915050565b6040516001600160e01b031982166024820152600090819060440160408051601f19818403018152919052602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825192935060009283928392909183918a617530fa92503d91506000519050828015614383575060208210155b801561438f5750600081115b979650505050505050565b6020810151603482015160609190911c9060009060f81c6128b4565b805160208083015191908110156143d7576000198160200360031b1b821691505b50919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610de557610de56143dd565b60008083601f84011261441857600080fd5b50813567ffffffffffffffff81111561443057600080fd5b6020830191508360208260051b850101111561444b57600080fd5b9250929050565b803560ff811681146124ff57600080fd5b60008060008060006080868803121561447b57600080fd5b85359450602086013567ffffffffffffffff81111561449957600080fd5b6144a588828901614406565b90955093506144b8905060408701614452565b949793965091946060013592915050565b60005b838110156144e45781810151838201526020016144cc565b50506000910152565b600081518084526145058160208601602086016144c9565b601f01601f19169290920160200192915050565b60208152600061096f60208301846144ed565b60008083601f84011261453e57600080fd5b50813567ffffffffffffffff81111561455657600080fd5b60208301915083602082850101111561444b57600080fd5b6000806000806000806080878903121561458757600080fd5b86359550602087013567ffffffffffffffff808211156145a657600080fd5b6145b28a838b01614406565b90975095508591506145c660408a01614452565b945060608901359150808211156145dc57600080fd5b506145e989828a0161452c565b979a9699509497509295939492505050565b6000806000806060858703121561461157600080fd5b84359350602085013567ffffffffffffffff81111561462f57600080fd5b61463b87828801614406565b909450925061464e905060408601614452565b905092959194509250565b60008060008060008060008060a0898b03121561467557600080fd5b88359750602089013567ffffffffffffffff8082111561469457600080fd5b6146a08c838d01614406565b909950975060408b01359150808211156146b957600080fd5b6146c58c838d0161452c565b909750955060608b0135945060808b01359150808211156146e557600080fd5b506146f28b828c0161452c565b999c989b5096995094979396929594505050565b600080600080600080600060a0888a03121561472157600080fd5b87359650602088013567ffffffffffffffff8082111561474057600080fd5b61474c8b838c01614406565b909850965086915061476060408b01614452565b955060608a013591508082111561477657600080fd5b506147838a828b0161452c565b989b979a50959894979596608090950135949350505050565b6000602082840312156147ae57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156147f4576147f46147b5565b604052919050565b600082601f83011261480d57600080fd5b813567ffffffffffffffff811115614827576148276147b5565b61483a6020601f19601f840116016147cb565b81815284602083860101111561484f57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806040838503121561487f57600080fd5b82359150602083013567ffffffffffffffff81111561489d57600080fd5b6148a9858286016147fc565b9150509250929050565b600080600080606085870312156148c957600080fd5b84359350602085013567ffffffffffffffff8111156148e757600080fd5b6148f387828801614406565b9598909750949560400135949350505050565b60608152600061491960608301866144ed565b846020840152828103604084015261099981856144ed565b600082601f83011261494257600080fd5b8135602067ffffffffffffffff82111561495e5761495e6147b5565b8160051b61496d8282016147cb565b928352848101820192828101908785111561498757600080fd5b83870192505b8483101561438f5782358252918301919083019061498d565b600080600080600060a086880312156149be57600080fd5b85359450602086013567ffffffffffffffff8111156149dc57600080fd5b6149e888828901614931565b9450506149f760408701614452565b94979396509394606081013594506080013592915050565b600080600060408486031215614a2457600080fd5b83359250602084013567ffffffffffffffff811115614a4257600080fd5b614a4e86828701614406565b9497909650939450505050565b6001600160a01b03811681146113ce57600080fd5b600080600060608486031215614a8557600080fd5b8335614a9081614a5b565b925060208401359150604084013567ffffffffffffffff811115614ab357600080fd5b614abf868287016147fc565b9150509250925092565b60008060008060808587031215614adf57600080fd5b84359350602085013567ffffffffffffffff811115614afd57600080fd5b614b0987828801614931565b935050614b1860408601614452565b9396929550929360600135925050565b600080600060608486031215614b3d57600080fd5b83359250602084013567ffffffffffffffff811115614b5b57600080fd5b614b6786828701614931565b925050614b7660408501614452565b90509250925092565b60008060408385031215614b9257600080fd5b8235614b9d81614a5b565b9150602083013567ffffffffffffffff81111561489d57600080fd5b60008060008060008060808789031215614bd257600080fd5b86359550602087013567ffffffffffffffff80821115614bf157600080fd5b614bfd8a838b01614406565b90975095506040890135915065ffffffffffff82168214614c1d57600080fd5b909350606088013590808211156145dc57600080fd5b803564ffffffffff811681146124ff57600080fd5b60008060008060008060008060c0898b031215614c6457600080fd5b88359750602089013567ffffffffffffffff80821115614c8357600080fd5b614c8f8c838d01614406565b9099509750879150614ca360408c01614452565b9650614cb160608c01614c33565b9550614cbf60808c01614c33565b945060a08b01359150808211156146e557600080fd5b600060208284031215614ce757600080fd5b813561096f81614a5b565b634e487b7160e01b600052603260045260246000fd5b604081526000614d1b60408301856144ed565b90506001600160a01b03831660208301529392505050565b600060ff821660ff8103614d4957614d496143dd565b60010192915050565b6001600160a01b0384168152826020820152606060408201526000610b8560608301846144ed565b60ff8281168282160390811115610de557610de56143dd565b81810381811115610de557610de56143dd565b600060208284031215614db857600080fd5b8151801515811461096f57600080fd5b60008151808452602080850194506020840160005b83811015614df957815187529582019590820190600101614ddd565b509495945050505050565b606081526000614e176060830186614dc8565b65ffffffffffff85166020840152828103604084015261099981856144ed565b848152608060208201526000614e506080830186614dc8565b65ffffffffffff85166040840152828103606084015261438f81856144ed565b7fffff0000000000000000000000000000000000000000000000000000000000008416815260007f3a000000000000000000000000000000000000000000000000000000000000008060028401528451614ed18160038601602089016144c9565b808401905081600382015284519150614ef18260048301602088016144c9565b0160040195945050505050565b8281526040602082015260006107ca60408301846144ed565b8281526000602080830184516020860160005b82811015614f4657815184529284019290840190600101614f2a565b5091979650505050505050565b634e487b7160e01b600052601260045260246000fd5b8082028115828204841417610de557610de56143dd565b7fffff00000000000000000000000000000000000000000000000000000000000084168152826020820152606060408201526000610b8560608301846144ed565b64ffffffffff818116838216019080821115614fdf57614fdf6143dd565b5092915050565b87815260e060208201526000614fff60e0830189614dc8565b60ff8816604084015264ffffffffff87811660608501528616608084015260a0830185905282810360c084015261503681856144ed565b9a9950505050505050505050565b60c08152600061505760c0830189614dc8565b60ff8816602084015265ffffffffffff8716604084015264ffffffffff8616606084015284608084015282810360a0840152611be181856144ed565b6080815260006150a66080830187614dc8565b82810360208401526150b881876144ed565b9050846040840152828103606084015261438f81856144ed565b86815260c0602082015260006150eb60c0830188614dc8565b82810360408401526150fd81886144ed565b9050856060840152828103608084015261511781866144ed565b9150508260a0830152979650505050505050565b60208152600061096f6020830184614dc8565b8381526060602082015260006151576060830185614dc8565b9050826040830152949350505050565b8481526080602082015260006151806080830186614dc8565b60ff949094166040830152506060015292915050565b6000602082840312156151a857600080fd5b5051919050565b85815260a0602082015260006151c860a0830187614dc8565b60ff8616604084015282810360608401526151e381866144ed565b9150508260808301529695505050505050565b60608152600061520960608301866144ed565b60208301949094525060400152919050565b6000825161522d8184602087016144c9565b9190910192915050565b60008261525457634e487b7160e01b600052601260045260246000fd5b500490565b6000845161526b8184602089016144c9565b60609490941b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169190930190815260148101919091526034019291505056fea164736f6c6343000818000aa164736f6c6343000818000a","storage":{}},"0x70997970c51812dc3a010c7d01b50e0d17dc79c8":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x7e5029eb91279ba1485522357ab9e3391938299e":{"nonce":2,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106100725760003560e01c806345ec93541161005057806345ec9354146100e15780637c5b0335146100f4578063e1af802c1461010757600080fd5b806301ffc9a714610077578063119df25f1461009f57806313861fb5146100cc575b600080fd5b61008a61008536600461217a565b61010f565b60405190151581526020015b60405180910390f35b6100a76101f4565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610096565b6100df6100da3660046121d2565b610203565b005b604051601f193601358152602001610096565b6100df6101023660046121d2565b610235565b6100a7610542565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f6fdd1c800000000000000000000000000000000000000000000000000000000014806101a257507fffffffff0000000000000000000000000000000000000000000000000000000082167fb5dee12700000000000000000000000000000000000000000000000000000000145b806101ee57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b60006101fe61054c565b905090565b6040517fea8b184c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61025f7f0000000000000000000000007e5029eb91279ba1485522357ab9e3391938299e8261057e565b6000610269610542565b90506102736105c3565b6040517f737900000000000000000000000000000000000000000000000000000000000060208201526000602282018190527f44656c65676174696f6e00000000000000000000000000000000000000000000603083015290819073ffffffffffffffffffffffffffffffffffffffff8416908190633350b6a990603a0160405160208183030381529060405261030990612283565b604051602481019190915273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000e26e5254da185192cb3b2c4cddeab304d979e4141660448201526001606482015260840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660e09490941b9390931790925290516103a792506122cb565b600060405180830381855af49150503d80600081146103e2576040519150601f19603f3d011682016040523d82523d6000602084013e6103e7565b606091505b5091509150816103fa576103fa8161065e565b6040517f73790000000000000000000000000000000000000000000000000000000000006020820152600060228201527f44656c65676174696f6e00000000000000000000000000000000000000000000603082015273ffffffffffffffffffffffffffffffffffffffff8416908190636548a90a90603a0160405160208183030381529060405261048b90612283565b60405160240161049b91906122e7565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660e09490941b9390931790925290516104e892506122cb565b600060405180830381855af49150503d8060008114610523576040519150601f19603f3d011682016040523d82523d6000602084013e610528565b606091505b5090925090508161053c5761053c8161065e565b50505050565b60006101fe610666565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcc36013560601c8061057b5750335b90565b6105888282610670565b156105bf576040517f1401206800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b61065c7f7462000000000000000000000000000043616c6c576974685369676e617475727e200100200000000000000000000000000000000000000000000000000000007e140100610000000000000000000000000000000000000000000000000000007e2001001f00000000000000000000000000000000000000000000000000000061064f61068a565b61065761070f565b610786565b565b805160208201fd5b60006101fe610c93565b6000610683838380519060200120610cdf565b9392505050565b604080516001808252818301909252606091816020015b60608152602001906001900390816106a15790505090506040518060400160405280600681526020017f7369676e6572000000000000000000000000000000000000000000000000000081525081600081518110610701576107016123b2565b602002602001018190525090565b604080516001808252818301909252606091816020015b60608152602001906001900390816107265790505090506040518060400160405280600581526020017f6e6f6e636500000000000000000000000000000000000000000000000000000081525081600081518110610701576107016123b2565b7f7462000000000000000000000000000000000000000000000000000000000000867fffff00000000000000000000000000000000000000000000000000000000000016148015906107ff5750611bdd60f21b867fffff0000000000000000000000000000000000000000000000000000000000001614155b15610884577f7462000000000000000000000000000000000000000000000000000000000000868760405160200161083991815260200190565b60408051601f19818403018152908290527f31b4668300000000000000000000000000000000000000000000000000000000825261087b9392916004016123f4565b60405180910390fd5b61088d85610dbe565b61089884600161100d565b6108a383600061100d565b60e084901c60e885901c0160ff168251146109035760e084901c60e885901c0160ff1682516040517f0f72cb980000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161087b565b60e085901c60e886901c0160ff168151146109635760e085901c60e886901c0160ff1681516040517f7dec4c000000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161087b565b60e085901c60e886901c0160ff1660e084901c60e885901c0160ff16146109db5760e085901c60e886901c0160ff1660e084901c60e885901c0160ff166040517ff29d4d880000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161087b565b6109e4856111b2565b6109ed846111b2565b14610a3f576109fb856111b2565b610a04846111b2565b6040517f65cc0adf0000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161087b565b610a48856111e4565b610a51846111e4565b14610aa357610a5f856111e4565b610a68846111e4565b6040517fedea95870000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161087b565b60005b610aaf866111b2565b811015610b4a57610ad9610ac38583611201565b60c5811115610ad457610ad4612435565b611222565b6008601b8390030287901c60ff1614610b42576008601b8290030286901c60ff16610b07610ac38684611201565b6040517f254c7db40000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161087b565b600101610aa6565b506000610ba77f7462000000000000000000000000000000000000000000000000000000000000610b7b8960101b90565b60101c7fffff000000000000000000000000000000000000000000000000000000000000919091161790565b90506000610bbe611bdd60f21b610b7b8a60101b90565b9050610bc982611282565b80610bd85750610bd881611282565b15610c32578788604051602001610bf191815260200190565b60408051601f19818403018152908290527fdfaaf9cf00000000000000000000000000000000000000000000000000000000825261087b929160040161244b565b610c7e8888888888604051602001610c4a9190612464565b60405160208183030381529060405288604051602001610c6a9190612464565b604051602081830303815290604052611327565b610c8988600161140a565b5050505050505050565b7f629a4c26e296b22a8e0856e9f6ecb2d1008d7e00081111962cd175fa7488e1755460009073ffffffffffffffffffffffffffffffffffffffff1680610cda573391505090565b919050565b604080516002808252606082018352600092839291906020830190803683370190505090508373ffffffffffffffffffffffffffffffffffffffff1660001b81600081518110610d3157610d316123b2565b6020026020010181815250508281600181518110610d5157610d516123b2565b60209081029190910101526000610da97f7462776f726c64000000000000000000496e7374616c6c65644d6f64756c657383837e010100010000000000000000000000000000000000000000000000000000006114c8565b9050610db58160f81c90565b95945050505050565b80610df5576040517fa019e4da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610e00826111e4565b90506005811115610e47576040517f6793df62000000000000000000000000000000000000000000000000000000008152600481018290526005602482015260440161087b565b6000610e52836111b2565b90506000610e6083836124fc565b9050601c811115610ea7576040517fecd893b900000000000000000000000000000000000000000000000000000000815260048101829052601c602482015260440161087b565b6000805b83811015610f525760ff601b82900360080287901c166000819003610eff576040517f53b2dd050000000000000000000000000000000000000000000000000000000081526004810183905260240161087b565b6020811115610f3d576040517f7237f2370000000000000000000000000000000000000000000000000000000081526004810183905260240161087b565b610f4781846124fc565b925050600101610eab565b50610f5c8561159f565b8114610fa857610f6b8561159f565b6040517feba964de00000000000000000000000000000000000000000000000000000000815260048101919091526024810182905260440161087b565b825b601c8110156110055760ff601b82900360080287901c168015610ffc576040517f1d8d44db0000000000000000000000000000000000000000000000000000000081526004810183905260240161087b565b50600101610faa565b505050505050565b80158015611019575081155b1561103a5760405163d498615960e01b81526000600482015260240161087b565b6000611045836111e4565b9050600581111561106c5760405163d498615960e01b81526004810182905260240161087b565b6000611077846111b2565b9050600061108583836124fc565b9050601c8111156110ac5760405163d498615960e01b81526004810182905260240161087b565b6000805b838110156111185760006110c7610ac38984611201565b905080600003611103576040517ff44b422000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61110d81846124fc565b9250506001016110b0565b506111228661159f565b811461114d576111318661159f565b60405163d498615960e01b815260040161087b91815260200190565b825b828110156111a9576000611166610ac38984611201565b905080156111a0576040517ff44b422000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060010161114f565b50505050505050565b6000600860016111c46002602061250f565b6111ce919061250f565b6111d89190612522565b8260ff911c1692915050565b600060086001806111f76002602061250f565b6111c4919061250f565b6000601b8290036008028360ff911c1660c581111561068357610683612435565b6000808260c581111561123757611237612435565b60ff169050606181101561125157601f1660010192915050565b60618360c581111561126557611265612435565b036112735750601492915050565b50600092915050565b50919050565b6040805160018082528183019092526000918291906020808301908036833701905050905082816000815181106112bb576112bb6123b2565b602090810291909101015260006113137f746273746f72650000000000000000005265736f75726365496473000000000083837e010100010000000000000000000000000000000000000000000000000000006115c2565b905061131f8160f81c90565b949350505050565b60408051602081018790528082018690526060808201869052825180830390910181526080909101909152600061135e84846115ef565b9050600061136c858561160c565b604080516001808252818301909252919250600091906020808301908036833701905050905089816000815181106113a6576113a66123b2565b60209081029190910101526113fe7f746273746f72650000000000000000005461626c657300000000000000000000828686867e60030220202000000000000000000000000000000000000000000000000000611638565b50505050505050505050565b604080516001808252818301909252600091602080830190803683370190505090508281600081518110611440576114406123b2565b6020026020010181815250506114c37f746273746f72650000000000000000005265736f75726365496473000000000060001b8260008560405160200161148e91151560f81b815260010190565b60408051601f198184030181529190527e01010001000000000000000000000000000000000000000000000000000000611956565b505050565b6000806114d3610c93565b90503073ffffffffffffffffffffffffffffffffffffffff821603611506576114fe868686866115c2565b91505061131f565b6040517f8c364d5900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821690638c364d599061155e908990899089908990600401612575565b602060405180830381865afa15801561157b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114fe91906125a4565b600060086115af6002602061250f565b6115b99190612522565b9190911c919050565b6000610db56115d18686611972565b60ff858116601b0360080285901c166115ea85876119c8565b611a01565b8151815160009181810160389190911b1760609190911b17610683565b606082826040516020016116219291906125bd565b604051602081830303815290604052905092915050565b611bdd60f21b867fffff00000000000000000000000000000000000000000000000000000000000016036116a957857f8dbb3a9672eebfd3773e72dd9c102393436816d832c7ba9e1e1ac8fcadcac7a98686868660405161169c94939291906125ec565b60405180910390a2611005565b60006116b487611a52565b905060005b815181101561178d5760008282815181106116d6576116d66123b2565b602002602001015190506117026001826affffffffffffffffffffff1916611adb90919063ffffffff16565b15611784576040517f57066c9c000000000000000000000000000000000000000000000000000000008152606082901c906357066c9c90611751908c908c908c908c908c908c90600401612636565b600060405180830381600087803b15801561176b57600080fd5b505af115801561177f573d6000803e3d6000fd5b505050505b506001016116b9565b50867f8dbb3a9672eebfd3773e72dd9c102393436816d832c7ba9e1e1ac8fcadcac7a9878787876040516117c494939291906125ec565b60405180910390a260006117d88888611972565b905060006020870190506117f0826000895184611af9565b60006117fb856111e4565b111561187f57600061180d8a8a611bb8565b878155905060208601915060008060005b611827886111e4565b8160ff16101561187a5761183c8d8d83611c0e565b92506118578a8260ff166028026038011c64ffffffffff1690565b91506118668360008488611af9565b61187082866124fc565b945060010161181e565b505050505b60005b83518110156113fe57600084828151811061189f5761189f6123b2565b602002602001015190506118cb6002826affffffffffffffffffffff1916611adb90919063ffffffff16565b1561194d576040517f5b28cdaf000000000000000000000000000000000000000000000000000000008152606082901c90635b28cdaf9061191a908e908e908e908e908e908e90600401612636565b600060405180830381600087803b15801561193457600080fd5b505af1158015611948573d6000803e3d6000fd5b505050505b50600101611882565b61196b858561196584876119c8565b85611c8e565b5050505050565b6000828260405160200161198792919061268f565b60408051601f1981840301815291905280516020909101207f86425bff6b57326c7859e89024fe4f238ca327a1ae4a230180dd2f0e88aaa7d9189392505050565b600080805b8360ff168110156119f9576119ef60ff601b83900360080287901c16836124fc565b91506001016119cd565b509392505050565b600060208210611a2757602082048401935060208281611a2357611a236126cb565b0691505b508254600882021b6020829003808411156119f9576001850154600882021c82179150509392505050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611a8c57611a8c6123b2565b60209081029190910101526000611ac47f746273746f726500000000000000000053746f7265486f6f6b730000000000008383611f0e565b905061131f611ad68260008451611f48565b611fd6565b60008160ff1682611aec8560581c90565b1660ff1614905092915050565b8215611b735760208310611b2357602083048401935060208381611b1f57611b1f6126cb565b0692505b8215611b735760208390036000600019600885021c1990506008850281811c91508351811c9050811987541682821617875550818411611b6457505061053c565b50600194909401939182900391015b5b60208210611b955780518455600190930192601f1990910190602001611b74565b811561053c576000600019600884021c8554835182191691161785555050505050565b60008282604051602001611bcd92919061268f565b60408051601f1981840301815291905280516020909101207f14e2fcc58e58e68ec7edc30c8d50dccc3ce2714a623ec81f46b6a63922d76569189392505050565b60008383604051602001611c2392919061268f565b604051602081830303815290604052805190602001208260f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f3b4102da22e32d82fc925482184f16c09fd4281692720b87d124aef6da48a0f1181860001c90509392505050565b611bdd60f21b847fffff0000000000000000000000000000000000000000000000000000000000001603611cfd57837f8c0b5119d4cec7b284c6b1b39252a03d1e2f2d7451a5895562524c113bb952be848484604051611cf0939291906126e1565b60405180910390a261053c565b6000611d098585611972565b90506000611d1686611a52565b905060005b8151811015611deb576000828281518110611d3857611d386123b2565b60200260200101519050611d646004826affffffffffffffffffffff1916611adb90919063ffffffff16565b15611de2576040517f964f667d000000000000000000000000000000000000000000000000000000008152606082901c9063964f667d90611daf908b908b908b908b9060040161271e565b600060405180830381600087803b158015611dc957600080fd5b505af1158015611ddd573d6000803e3d6000fd5b505050505b50600101611d1b565b50857f8c0b5119d4cec7b284c6b1b39252a03d1e2f2d7451a5895562524c113bb952be868686604051611e20939291906126e1565b60405180910390a2611e3b828565ffffffffffff1685611fe7565b60005b81518110156111a9576000828281518110611e5b57611e5b6123b2565b60200260200101519050611e876008826affffffffffffffffffffff1916611adb90919063ffffffff16565b15611f05576040517fa8ba8721000000000000000000000000000000000000000000000000000000008152606082901c9063a8ba872190611ed2908b908b908b908b9060040161271e565b600060405180830381600087803b158015611eec57600080fd5b505af1158015611f00573d6000803e3d6000fd5b505050505b50600101611e3e565b606061131f611f1e858585611c0e565b6000611f4385611f2e8989611ffd565b9060ff166028026038011c64ffffffffff1690565b612010565b600081831180611f585750835182115b15611f95578383836040517f23230fa300000000000000000000000000000000000000000000000000000000815260040161087b93929190612757565b60208401611fa384826124fc565b90506000611fb1858561250f565b6fffffffffffffffffffffffffffffffff1660809290921b9190911795945050505050565b606060006106838360156000612033565b6114c383838351611ff88560200190565b611af9565b600061068361200c8484611bb8565b5490565b60405160208101601f19603f84840101166040528282526119f9858585846120ae565b606060006120418560801c90565b90506fffffffffffffffffffffffffffffffff85166000858281612067576120676126cb565b04905060405193506020840160208202810160405281855260005b828110156120a2578451871c825293870193602090910190600101612082565b50505050509392505050565b821561213557602083106120d8576020830484019350602083816120d4576120d46126cb565b0692505b82156121355760208390036000818410156120fb5750600019600884021c612105565b50600019600882021c5b8554600886021b81845116821982161784525081841161212657505061053c565b50600194909401939182900391015b5b602082106121575783548152600190930192601f1990910190602001612136565b811561053c576000600019600884021c8251865482191691161782525050505050565b60006020828403121561218c57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461068357600080fd5b634e487b7160e01b600052604160045260246000fd5b6000602082840312156121e457600080fd5b813567ffffffffffffffff808211156121fc57600080fd5b818401915084601f83011261221057600080fd5b813581811115612222576122226121bc565b604051601f8201601f19908116603f0116810190838211818310171561224a5761224a6121bc565b8160405282815287602084870101111561226357600080fd5b826020860160208301376000928101602001929092525095945050505050565b8051602080830151919081101561127c5760001960209190910360031b1b16919050565b60005b838110156122c25781810151838201526020016122aa565b50506000910152565b600082516122dd8184602087016122a7565b9190910192915050565b81815260606020820152600061235060608301602e81527f63616c6c576974685369676e617475726528616464726573732c62797465733360208201527f322c62797465732c627974657329000000000000000000000000000000000000604082015260600190565b828103604084015261131f81602e81527f63616c6c576974685369676e617475726528616464726573732c62797465733360208201527f322c62797465732c627974657329000000000000000000000000000000000000604082015260600190565b634e487b7160e01b600052603260045260246000fd5b600081518084526123e08160208601602086016122a7565b601f01601f19169290920160200192915050565b7fffff00000000000000000000000000000000000000000000000000000000000084168152826020820152606060408201526000610db560608301846123c8565b634e487b7160e01b600052602160045260246000fd5b82815260406020820152600061131f60408301846123c8565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b828110156124d9577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526124c78583516123c8565b9450928501929085019060010161248d565b5092979650505050505050565b634e487b7160e01b600052601160045260246000fd5b808201808211156101ee576101ee6124e6565b818103818111156101ee576101ee6124e6565b80820281158282048414176101ee576101ee6124e6565b60008151808452602080850194506020840160005b8381101561256a5781518752958201959082019060010161254e565b509495945050505050565b84815260806020820152600061258e6080830186612539565b60ff949094166040830152506060015292915050565b6000602082840312156125b657600080fd5b5051919050565b600083516125cf8184602088016122a7565b8351908301906125e38183602088016122a7565b01949350505050565b6080815260006125ff6080830187612539565b828103602084015261261181876123c8565b9050846040840152828103606084015261262b81856123c8565b979650505050505050565b86815260c06020820152600061264f60c0830188612539565b828103604084015261266181886123c8565b9050856060840152828103608084015261267b81866123c8565b9150508260a0830152979650505050505050565b8281526000602080830184516020860160005b828110156126be578151845292840192908401906001016126a2565b5091979650505050505050565b634e487b7160e01b600052601260045260246000fd5b6060815260006126f46060830186612539565b65ffffffffffff85166020840152828103604084015261271481856123c8565b9695505050505050565b8481526080602082015260006127376080830186612539565b65ffffffffffff85166040840152828103606084015261262b81856123c8565b60608152600061276a60608301866123c8565b6020830194909452506040015291905056fea164736f6c6343000818000a","storage":{}},"0x8d8b6b8414e1e3dcfd4168561b9be6bd3bf6ec4b":{"nonce":1,"balance":"0x0","code":"0x6080604052600436106101d15760003560e01c80638c364d59116100f7578063c4d66de811610095578063d9c03a0411610064578063d9c03a04146106d1578063dbbf0e21146106f1578063e228a4a314610711578063ef6ea8621461073157610266565b8063c4d66de814610651578063cc49db7e14610671578063d03edb8c14610691578063d4285dc2146106b157610266565b8063af068c9e116100d1578063af068c9e146105f1578063b047c1eb14610611578063c0a2895a14610631578063c11222291461054b57610266565b80638c364d59146105915780639f1fcf0a146105b1578063a53417ed146105d157610266565b8063390baae01161016f5780634dc77d971161013e5780634dc77d971461050b578063505a181d1461052b5780636951955d1461054b578063894ecc581461057e57610266565b8063390baae01461047b5780633a77c2c21461049b5780633ae7af08146104c9578063419b58fd146104dc57610266565b8063150f3262116101ab578063150f3262146103fb5780631e7889771461041b578063298314fb1461043b5780633708196e1461045b57610266565b806302d05d3f1461035d57806305242d2f146103ae578063114a7266146103db57610266565b366102665760408051616e7360f01b602082015260006022820181905260308201819052916102189101604051602081830303815290604052610213906143b6565b610751565b60408051616e7360f01b602082015260006022820181905260308201529192506102649101604051602081830303815290604052610255906143b6565b61025f34846143f3565b6107d2565b005b303303610299576040516327a1460b60e21b81526001600160e01b03196000351660048201526024015b60405180910390fd5b6000806102b16000356001600160e01b031916610873565b91509150816000801b036102ff576040517ffdde54e20000000000000000000000000000000000000000000000000000000081526001600160e01b0319600035166004820152602401610290565b60006103436000368080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525092508691506109439050565b9050600061035333858434610976565b9050805160208201f35b34801561036957600080fd5b506103917f000000000000000000000000573802f86c51b61d7cf620952217ec6ce0537d2e81565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156103ba57600080fd5b506103ce6103c9366004614463565b6109a3565b6040516103a59190614519565b3480156103e757600080fd5b506102646103f636600461456e565b6109e6565b34801561040757600080fd5b5061026461041636600461456e565b610a99565b34801561042757600080fd5b506103ce6104363660046145fb565b610b44565b34801561044757600080fd5b50610264610456366004614659565b610b8e565b34801561046757600080fd5b50610264610476366004614706565b610c77565b34801561048757600080fd5b50610264610496366004614706565b610d2d565b3480156104a757600080fd5b506104bb6104b636600461479c565b610dda565b6040519081526020016103a5565b6103ce6104d736600461486c565b610deb565b3480156104e857600080fd5b506104fc6104f73660046148b3565b610e27565b6040516103a593929190614906565b34801561051757600080fd5b506103ce6105263660046149a6565b610e7c565b34801561053757600080fd5b50610264610546366004614a0f565b610e8b565b34801561055757600080fd5b507f322e302e320000000000000000000000000000000000000000000000000000006104bb565b6103ce61058c366004614a70565b610f00565b34801561059d57600080fd5b506104bb6105ac366004614463565b61105c565b3480156105bd57600080fd5b506104bb6105cc366004614ac9565b61109f565b3480156105dd57600080fd5b506104bb6105ec366004614b28565b6110ad565b3480156105fd57600080fd5b5061026461060c366004614b7f565b6110ba565b34801561061d57600080fd5b5061026461062c366004614bb9565b611136565b34801561063d57600080fd5b5061026461064c366004614c48565b6111e1565b34801561065d57600080fd5b5061026461066c366004614cd5565b61128f565b34801561067d57600080fd5b506104fc61068c366004614a0f565b6113d1565b34801561069d57600080fd5b506103ce6106ac3660046145fb565b611423565b3480156106bd57600080fd5b506104bb6106cc36600461479c565b611464565b3480156106dd57600080fd5b506102646106ec366004614463565b61146f565b3480156106fd57600080fd5b506104bb61070c366004614b28565b6114ef565b34801561071d57600080fd5b506104bb61072c36600461479c565b6114fc565b34801561073d57600080fd5b5061026461074c36600461456e565b611507565b60408051600180825281830190925260009182919060208083019080368337019050509050828160008151811061078a5761078a614cf2565b602090810291909101015260006107ca7f7462776f726c6400000000000000000042616c616e63657300000000000000008383630100080160dd1b6115b2565b949350505050565b60408051600180825281830190925260009160208083019080368337019050509050828160008151811061080857610808614cf2565b60200260200101818152505061086e7f7462776f726c6400000000000000000042616c616e636573000000000000000060001b8260008560405160200161085191815260200190565b60408051601f19818403018152919052630100080160dd1b6115df565b505050565b6040805160018082528183019092526000918291829160208083019080368337019050509050837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916816000815181106108cc576108cc614cf2565b6020908102919091010152600080806109257f7462776f726c6400000000000000000046756e6374696f6e53656c6563746f72857e240200200400000000000000000000000000000000000000000000000000006115f4565b9250925092506109368383836116fc565b9550955050505050915091565b82820160200180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1682179052825b9392505050565b606060008061098787878787611714565b915091508161099957610999816118e4565b9695505050505050565b6060610999868686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508892508791506118ec9050565b303303610a14576040516327a1460b60e21b81526001600160e01b0319600035166004820152602401610290565b610a1e8633611931565b610a918686868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020601f89018190048102820181019092528781528993509150879087908190840183828082843760009201919091525061197d92505050565b505050505050565b303303610ac7576040516327a1460b60e21b81526001600160e01b0319600035166004820152602401610290565b610ad18633611931565b610a918686868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020601f89018190048102820181019092528781528993509150879087908190840183828082843760009201919091525061199892505050565b6060610b85858585808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508792506119d3915050565b95945050505050565b303303610bbc576040516327a1460b60e21b81526001600160e01b0319600035166004820152602401610290565b610bc68833611931565b610c6d8888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020601f8c018190048102820181019092528a815292508a915089908190840183828082843760009201919091525050604080516020601f8a018190048102820181019092528881528a935091508890889081908401838280828437600092019190915250611a0d92505050565b5050505050505050565b303303610ca5576040516327a1460b60e21b81526001600160e01b0319600035166004820152602401610290565b610caf8733611931565b610d248787878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020601f8a018190048102820181019092528881528a935091508890889081908401838280828437600092019190915250889250611a23915050565b50505050505050565b303303610d5b576040516327a1460b60e21b81526001600160e01b0319600035166004820152602401610290565b610d658733611931565b610d248787878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020601f8a018190048102820181019092528881528a9350915088908890819084018382808284376000920191909152508892506115df915050565b6000610de582611a66565b92915050565b6060303303610e1b576040516327a1460b60e21b81526001600160e01b0319600035166004820152602401610290565b61096f33848434610976565b606060006060610e6c878787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506115f4915050565b9250925092509450945094915050565b60606109998686868686611aeb565b303303610eb9576040516327a1460b60e21b81526001600160e01b0319600035166004820152602401610290565b610ec38333611931565b61086e83838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611bee92505050565b6060303303610f30576040516327a1460b60e21b81526001600160e01b0319600035166004820152602401610290565b336001600160a01b03851603610f5357610f4c33848434610976565b905061096f565b6000610f5f8533611c01565b9050610f6e8186338787611cb2565b15610f8757610f7f85858534610976565b91505061096f565b6000610f94866000611c01565b9050610fa38187338888611cb2565b15610fbd57610fb486868634610976565b9250505061096f565b6000610fef616e7360f01b7dffffffffffffffffffffffffffff00000000000000000000000000000000881617611d87565b9050610ffe8188338989611cb2565b156110195761100f87878734610976565b935050505061096f565b6040517fc86745f90000000000000000000000000000000000000000000000000000000081526001600160a01b0388166004820152336024820152604401610290565b6000610999868686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508892508791506115b29050565b6000610b8585858585611e00565b60006107ca848484611e48565b3033036110e8576040516327a1460b60e21b81526001600160e01b0319600035166004820152602401610290565b60408051616e7360f01b602082015260006022820181905260308201526111289101604051602081830303815290604052611122906143b6565b33611e5e565b6111328282611eaf565b5050565b303303611164576040516327a1460b60e21b81526001600160e01b0319600035166004820152602401610290565b61116e8633611931565b610a918686868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020601f890181900481028201810190925287815289935091508790879081908401838280828437600092019190915250611f6292505050565b30330361120f576040516327a1460b60e21b81526001600160e01b0319600035166004820152602401610290565b6112198833611931565b610c6d8888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020601f89018190048102820181019092528781528b93508a9250899189908990819084018382808284376000920191909152506121fd92505050565b3033036112bd576040516327a1460b60e21b81526001600160e01b0319600035166004820152602401610290565b336001600160a01b037f000000000000000000000000573802f86c51b61d7cf620952217ec6ce0537d2e16146113615760408051616e7360f01b6020820152600060228201819052603082015261132c9101604051602081830303815290604052611327906143b6565b612215565b336040517fd787b737000000000000000000000000000000000000000000000000000000008152600401610290929190614d08565b600061136b612352565b6001600160a01b0316146113ab576040517f15e34a4800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113b4816123b9565b6040805160008152602081019091526113ce908290611eaf565b50565b6060600060606114148686868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061245492505050565b92509250925093509350939050565b6060610b858585858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525087925061247a915050565b6000610de582612490565b30330361149d576040516327a1460b60e21b81526001600160e01b0319600035166004820152602401610290565b6114a78533611931565b6114e8858585808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508792508691506125049050565b5050505050565b60006107ca84848461255d565b6000610de58261256d565b303303611535576040516327a1460b60e21b81526001600160e01b0319600035166004820152602401610290565b61153f8633611931565b610a918686868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020601f89018190048102820181019092528781528993509150879087908190840183828082843760009201919091525061259392505050565b6000610b856115c186866125ce565b60ff858116601b0360080285901c166115da8587612624565b61265d565b6114e885856115ee8487612624565b85611f62565b6060600060606000611605856126ae565b90506116128787836126d1565b9350600061161f8661270a565b905080156116f1576116318888612747565b935066ffffffffffffff841667ffffffffffffffff811115611655576116556147b5565b6040519080825280601f01601f19166020018201604052801561167f576020820181803683370190505b5092506020830160005b828160ff1610156116ee5760006116a18b8b8461275a565b905060006116be888460ff166028026038011c64ffffffffff1690565b90506116cd82600083876127da565b6116d781856143f3565b9350505080806116e690614d33565b915050611689565b50505b505093509350939050565b600080611708856128a6565b90969095509350505050565b600060606000611723866128bb565b905060005b81518110156117f657600082828151811061174557611745614cf2565b602002602001015190506117716001826affffffffffffffffffffff191661294490919063ffffffff16565b156117ed576040517fc3323031000000000000000000000000000000000000000000000000000000008152606082901c9063c3323031906117ba908c908c908c90600401614d52565b600060405180830381600087803b1580156117d457600080fd5b505af11580156117e8573d6000803e3d6000fd5b505050505b50600101611728565b5061180387858888612962565b909350915060005b81518110156118d957600082828151811061182857611828614cf2565b602002602001015190506118546002826affffffffffffffffffffff191661294490919063ffffffff16565b156118d0576040517f973d8f99000000000000000000000000000000000000000000000000000000008152606082901c9063973d8f999061189d908c908c908c90600401614d52565b600060405180830381600087803b1580156118b757600080fd5b505af11580156118cb573d6000803e3d6000fd5b505050505b5060010161180b565b505094509492505050565b805160208201fd5b60606118f782612a7d565b8360ff1610156119145761190d85858585612a8f565b90506107ca565b61190d858561192285612a7d565b61192c9087614d7a565b6119d3565b61193b8282612abc565b6111325761194882612215565b816040517fd787b737000000000000000000000000000000000000000000000000000000008152600401610290929190614d08565b6119928484848461198d89611a66565b611a23565b50505050565b60006119a48585612747565b905060006119c1828560ff166028026038011c64ffffffffff1690565b9050610a918686868460008888612aff565b60606107ca6119e385858561275a565b6000611a08856119f38989612747565b9060ff166028026038011c64ffffffffff1690565b612f39565b6114e88585858585611a1e8b611a66565b612f5c565b611a2c81612a7d565b8360ff161015611a4857611a4385858585856115df565b6114e8565b6114e88585611a5684612a7d565b611a609087614d7a565b85612593565b60007f8b9d8c8b908d9affffffffffffffffffab9e9d939a8d000000000000000000008201611ab557507e60030220202000000000000000000000000000000000000000000000000000919050565b610de5611ae27f746273746f72650000000000000000005461626c657300000000000000000000846132a1565b6020600061265d565b606081831115611b31576040517fa8c547820000000000000000000000000000000000000000000000000000000081526004810184905260248101839052604401610290565b6000611b3d8787612747565b90506000611b5a828760ff166028026038011c64ffffffffff1690565b90508085101580611b6a57508084115b15611bc5578081861015611b8857611b83600186614d93565b611b8a565b855b6040517f7e8578d300000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610290565b6000611bd289898961275a565b9050611be18187888803612f39565b9998505050505050505050565b6111328282611bfc85611a66565b6132bd565b60408051600280825260608201835260009283929190602083019080368337019050509050836001600160a01b031660001b81600081518110611c4657611c46614cf2565b602002602001018181525050826001600160a01b031660001b81600181518110611c7257611c72614cf2565b60209081029190910101526000610b857f7462776f726c640000000000000000005573657244656c65676174696f6e436f8383630100080160dd1b6115b2565b6000611cbd866135bc565b15611cca57506001610b85565b85611cd757506000610b85565b600080611d538660008a8a8989604051602401611cf693929190614d52565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1a86b55000000000000000000000000000000000000000000000000000000000179052612962565b9150915081611d6757600092505050610b85565b80806020019051810190611d7b9190614da6565b98975050505050505050565b604080516001808252818301909252600091829190602080830190803683370190505090508281600081518110611dc057611dc0614cf2565b602090810291909101015260006107ca7f7462776f726c640000000000000000004e616d65737061636544656c656761748383630100080160dd1b6115b2565b600080611e0c83612a7d565b90508060ff168460ff161015611e345760ff848116601b0360080284901c165b9150506107ca565b611e2c8686611e438488614d7a565b61255d565b60006107ca848484611e5988611a66565b611e00565b6001600160a01b038116611e98616e7360f01b7dffffffffffffffffffffffffffff00000000000000000000000000000000851617613637565b6001600160a01b0316146111325761194882612215565b611ed9827f6fdd1c80000000000000000000000000000000000000000000000000000000006136d3565b611f4e3360008484604051602401611ef19190614519565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f7c5b03350000000000000000000000000000000000000000000000000000000017905261372e565b50611132828280519060200120600161373f565b7f6f74000000000000000000000000000000000000000000000000000000000000847fffff0000000000000000000000000000000000000000000000000000000000001603611fec57837f8c0b5119d4cec7b284c6b1b39252a03d1e2f2d7451a5895562524c113bb952be848484604051611fdf93929190614e04565b60405180910390a2611992565b6000611ff885856125ce565b9050600061200586613823565b905060005b81518110156120da57600082828151811061202757612027614cf2565b602002602001015190506120536004826affffffffffffffffffffff191661294490919063ffffffff16565b156120d1576040517f964f667d000000000000000000000000000000000000000000000000000000008152606082901c9063964f667d9061209e908b908b908b908b90600401614e37565b600060405180830381600087803b1580156120b857600080fd5b505af11580156120cc573d6000803e3d6000fd5b505050505b5060010161200a565b50857f8c0b5119d4cec7b284c6b1b39252a03d1e2f2d7451a5895562524c113bb952be86868660405161210f93929190614e04565b60405180910390a261212a828565ffffffffffff1685613895565b60005b8151811015610d2457600082828151811061214a5761214a614cf2565b602002602001015190506121766008826affffffffffffffffffffff191661294490919063ffffffff16565b156121f4576040517fa8ba8721000000000000000000000000000000000000000000000000000000008152606082901c9063a8ba8721906121c1908b908b908b908b90600401614e37565b600060405180830381600087803b1580156121db57600080fd5b505af11580156121ef573d6000803e3d6000fd5b505050505b5060010161212d565b610a918686868686866122108d8d612747565b612aff565b606081601081901b6000612228836138ab565b9050827fffffffffffffffffffffffffffff0000000000000000000000000000000000008316156122835761227e7fffffffffffffffffffffffffffff00000000000000000000000000000000000084166138c2565b6122ba565b6040518060400160405280600681526020017f3c726f6f743e00000000000000000000000000000000000000000000000000008152505b7fffffffffffffffffffffffffffffffff000000000000000000000000000000008316156122f0576122eb836138c2565b612327565b6040518060400160405280600681526020017f3c726f6f743e00000000000000000000000000000000000000000000000000008152505b60405160200161233993929190614e70565b6040516020818303038152906040529350505050919050565b6040805160008082526020820190925260006123af7f7462776f726c64000000000000000000496e69744d6f64756c6541646472657383837e14010014000000000000000000000000000000000000000000000000000000613966565b60601c9392505050565b604080516000808252602082018352606084901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000168284015282518083036034018152605483019093529091611132917f7462776f726c64000000000000000000496e69744d6f64756c65416464726573918491907e14010014000000000000000000000000000000000000000000000000000000613a1b565b60606000606061246d858561246888611a66565b6115f4565b9250925092509250925092565b60606107ca84848461248b88611a66565b6118ec565b600061249b82613ac4565b90506124a682613b56565b6124ff5781826040516020016124be91815260200190565b60408051601f19818403018152908290527f41e713ad0000000000000000000000000000000000000000000000000000000082526102909291600401614efe565b919050565b60006125108585612747565b9050600061252d828560ff166028026038011c64ffffffffff1690565b9050610a918686866125468764ffffffffff8716614d93565b604080516000815260208101909152889088612aff565b60006107ca826119f38686612747565b600061257882613bf3565b9050806124ff5781826040516020016124be91815260200190565b600061259f8585612747565b905060006125bc828560ff166028026038011c64ffffffffff1690565b9050610a918686866000858888612aff565b600082826040516020016125e3929190614f17565b60408051601f1981840301815291905280516020909101207f86425bff6b57326c7859e89024fe4f238ca327a1ae4a230180dd2f0e88aaa7d9189392505050565b600080805b8360ff168110156126555761264b60ff601b83900360080287901c16836143f3565b9150600101612629565b509392505050565b6000602082106126835760208204840193506020828161267f5761267f614f53565b0691505b508254600882021b602082900380841115612655576001850154600882021c82179150509392505050565b600060086126be60026020614d93565b6126c89190614f69565b9190911c919050565b6060816000036126f0575060408051602081019091526000815261096f565b60006126fc85856125ce565b9050610b8581600085612f39565b6000600860018061271d60026020614d93565b6127279190614d93565b6127319190614d93565b61273b9190614f69565b8260ff911c1692915050565b600061096f6127568484613c85565b5490565b6000838360405160200161276f929190614f17565b604051602081830303815290604052805190602001208260f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f3b4102da22e32d82fc925482184f16c09fd4281692720b87d124aef6da48a0f1181860001c90509392505050565b821561286157602083106128045760208304840193506020838161280057612800614f53565b0692505b82156128615760208390036000818410156128275750600019600884021c612831565b50600019600882021c5b8554600886021b818451168219821617845250818411612852575050611992565b50600194909401939182900391015b5b602082106128835783548152600190930192601f1990910190602001612862565b8115611992576000600019600884021c8251865482191691161782525050505050565b602081015160408201516000905b9050915091565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106128f5576128f5614cf2565b6020908102919091010152600061292d7f7462776f726c6400000000000000000053797374656d486f6f6b73000000000083836119d3565b90506107ca61293f8260008451613cdb565b613d69565b60008160ff16826129558560581c90565b1660ff1614905092915050565b6000606060008061297286613d7a565b90925090506001600160a01b0382166129c3578561298f87612215565b6040517ffbf10ce6000000000000000000000000000000000000000000000000000000008152600401610290929190614efe565b806129d2576129d28689611931565b8615612a1e577dffffffffffffffffffffffffffff000000000000000000000000000000008616616e7360f01b176000612a0b82610751565b9050612a1b8261025f8b846143f3565b50505b6000612a2a8760101b90565b7fffffffffffffffffffffffffffff0000000000000000000000000000000000001614612a6257612a5d88888488613e1e565b612a6e565b612a6e88888488613e96565b90999098509650505050505050565b60006008600161272760026020614d93565b6060610b85612a9e86866125ce565b612aa88486612624565b60ff868116601b0360080286901c16612f39565b6000612aef616e7360f01b7dffffffffffffffffffffffffffff0000000000000000000000000000000085161783613ef7565b8061096f575061096f8383613ef7565b7f7462000000000000000000000000000000000000000000000000000000000000877fffff0000000000000000000000000000000000000000000000000000000000001614612bbf577f74620000000000000000000000000000000000000000000000000000000000008788604051602001612b7d91815260200190565b60408051601f19818403018152908290527f31b46683000000000000000000000000000000000000000000000000000000008252610290939291600401614f80565b6000612bda828760ff166028026038011c64ffffffffff1690565b9050600083518564ffffffffff1683612bf39190614d93565b612bfd91906143f3565b9050808214158015612c1f575081612c158688614fc1565b64ffffffffff1614155b15612c6f576040517fa65010b400000000000000000000000000000000000000000000000000000000815264ffffffffff8088166004830152808716602483015283166044820152606401610290565b818664ffffffffff161115612cc0576040517f7e8578d30000000000000000000000000000000000000000000000000000000081526004810183905264ffffffffff87166024820152604401610290565b6000612ccd848984613fc0565b90506000612cda8b613823565b905060005b8151811015612da5576000828281518110612cfc57612cfc614cf2565b60200260200101519050612d286010826affffffffffffffffffffff191661294490919063ffffffff16565b15612d9c57606081901c6001600160a01b03166355eb5a288e8e8e8e8e8d8f6040518863ffffffff1660e01b8152600401612d699796959493929190614fe6565b600060405180830381600087803b158015612d8357600080fd5b505af1158015612d97573d6000803e3d6000fd5b505050505b50600101612cdf565b5064ffffffffff881660005b8a60ff168160ff161015612de457612dd8878260ff166028026038011c64ffffffffff1690565b90910190600101612db1565b508b7ffe158a7adba34e256807c8a149028d3162918713c3838afc643ce9f96716ebfd8c8c848c888d604051612e1f96959493929190615044565b60405180910390a250828414612e40576000612e3b8c8c613c85565b839055505b6000612e4d8c8c8c61275a565b9050612e61818a64ffffffffff1689613895565b5060005b8151811015612f2b576000828281518110612e8257612e82614cf2565b60200260200101519050612eae6020826affffffffffffffffffffff191661294490919063ffffffff16565b15612f2257606081901c6001600160a01b031663635845338e8e8e8e8e8a8f6040518863ffffffff1660e01b8152600401612eef9796959493929190614fe6565b600060405180830381600087803b158015612f0957600080fd5b505af1158015612f1d573d6000803e3d6000fd5b505050505b50600101612e65565b505050505050505050505050565b60405160208101601f19603f8484010116604052828252612655858585846127da565b7f6f74000000000000000000000000000000000000000000000000000000000000867fffff0000000000000000000000000000000000000000000000000000000000001603612fe857857f8dbb3a9672eebfd3773e72dd9c102393436816d832c7ba9e1e1ac8fcadcac7a986868686604051612fdb9493929190615093565b60405180910390a2610a91565b6000612ff387613823565b905060005b81518110156130cc57600082828151811061301557613015614cf2565b602002602001015190506130416001826affffffffffffffffffffff191661294490919063ffffffff16565b156130c3576040517f57066c9c000000000000000000000000000000000000000000000000000000008152606082901c906357066c9c90613090908c908c908c908c908c908c906004016150d2565b600060405180830381600087803b1580156130aa57600080fd5b505af11580156130be573d6000803e3d6000fd5b505050505b50600101612ff8565b50867f8dbb3a9672eebfd3773e72dd9c102393436816d832c7ba9e1e1ac8fcadcac7a9878787876040516131039493929190615093565b60405180910390a2600061311788886125ce565b9050600060208701905061312f82600089518461408e565b600061313a8561270a565b11156131be57600061314c8a8a613c85565b878155905060208601915060008060005b6131668861270a565b8160ff1610156131b95761317b8d8d8361275a565b92506131968a8260ff166028026038011c64ffffffffff1690565b91506131a5836000848861408e565b6131af82866143f3565b945060010161315d565b505050505b60005b83518110156132955760008482815181106131de576131de614cf2565b6020026020010151905061320a6002826affffffffffffffffffffff191661294490919063ffffffff16565b1561328c576040517f5b28cdaf000000000000000000000000000000000000000000000000000000008152606082901c90635b28cdaf90613259908e908e908e908e908e908e906004016150d2565b600060405180830381600087803b15801561327357600080fd5b505af1158015613287573d6000803e3d6000fd5b505050505b506001016131c1565b50505050505050505050565b60408051602081018490529081018290526000906060016125e3565b7f6f74000000000000000000000000000000000000000000000000000000000000837fffff000000000000000000000000000000000000000000000000000000000000160361334357827f0e1f72f429eb97e64878619984a91e687ae91610348b9ff4216782cc96e49d0783604051613336919061512b565b60405180910390a2505050565b600061334e84613823565b905060005b815181101561342157600082828151811061337057613370614cf2565b6020026020010151905061339c6040826affffffffffffffffffffff191661294490919063ffffffff16565b15613418576040517f9faeaf45000000000000000000000000000000000000000000000000000000008152606082901c90639faeaf45906133e59089908990899060040161513e565b600060405180830381600087803b1580156133ff57600080fd5b505af1158015613413573d6000803e3d6000fd5b505050505b50600101613353565b50837f0e1f72f429eb97e64878619984a91e687ae91610348b9ff4216782cc96e49d0784604051613452919061512b565b60405180910390a2600061346685856125ce565b90506134bf816000613477866126ae565b67ffffffffffffffff81111561348f5761348f6147b5565b6040519080825280601f01601f1916602001820160405280156134b9576020820181803683370190505b50613895565b60006134ca8461270a565b11156134eb5760006134dc8686613c85565b90506134e981602061414d565b505b60005b8251811015610a9157600083828151811061350b5761350b614cf2565b602002602001015190506135376080826affffffffffffffffffffff191661294490919063ffffffff16565b156135b3576040517f83b5c95b000000000000000000000000000000000000000000000000000000008152606082901c906383b5c95b90613580908a908a908a9060040161513e565b600060405180830381600087803b15801561359a57600080fd5b505af11580156135ae573d6000803e3d6000fd5b505050505b506001016134ee565b604080517f737900000000000000000000000000000000000000000000000000000000000060208201526000602282018190527f756e6c696d6974656400000000000000000000000000000000000000000000006030830152910160405160208183030381529060405261362f906143b6565b909114919050565b60408051600180825281830190925260009182919060208083019080368337019050509050828160008151811061367057613670614cf2565b602090810291909101015260006136c87f7462776f726c640000000000000000004e616d6573706163654f776e6572000083837e140100140000000000000000000000000000000000000000000000000000006115b2565b60601c949350505050565b6136dd828261418a565b611132576040517f74b5e6ff0000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526001600160e01b031982166024820152604401610290565b606060008061098787878787613e96565b604080516002808252606082018352600092602083019080368337019050509050836001600160a01b031660001b8160008151811061378057613780614cf2565b60200260200101818152505082816001815181106137a0576137a0614cf2565b6020026020010181815250506119927f7462776f726c64000000000000000000496e7374616c6c65644d6f64756c657360001b826000856040516020016137ee91151560f81b815260010190565b60408051601f198184030181529190527e010100010000000000000000000000000000000000000000000000000000006115df565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061385d5761385d614cf2565b6020908102919091010152600061292d7f746273746f726500000000000000000053746f7265486f6f6b7300000000000083836119d3565b61086e838383516138a68560200190565b61408e565b60006138b9607060106143f3565b9190911b919050565b606060005b6010811015613927577fffffffffffffffffffffffffffffffff000000000000000000000000000000008316600882021b7fff000000000000000000000000000000000000000000000000000000000000001615613927576001016138c7565b604080517fffffffffffffffffffffffffffffffff000000000000000000000000000000008516602082015281516030909101909152818152806107ca565b6000806139716141a6565b9050306001600160a01b0382160361398f57611e2c868686866115b2565b6040517f8c364d590000000000000000000000000000000000000000000000000000000081526001600160a01b03821690638c364d59906139da908990899089908990600401615167565b602060405180830381865afa1580156139f7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2c9190615196565b6000613a256141a6565b9050306001600160a01b03821603613a4957613a4486868686866115df565b610a91565b6040517f390baae00000000000000000000000000000000000000000000000000000000081526001600160a01b0382169063390baae090613a9690899089908990899089906004016151af565b600060405180830381600087803b158015613ab057600080fd5b505af1158015613295573d6000803e3d6000fd5b604080516001808252818301909252600091829190602080830190803683370190505090508281600081518110613afd57613afd614cf2565b602090810291909101015260006107ca7f746273746f72650000000000000000005461626c6573000000000000000000008360017e600302202020000000000000000000000000000000000000000000000000006115b2565b604080516001808252818301909252600091829190602080830190803683370190505090508281600081518110613b8f57613b8f614cf2565b60209081029190910101526000613be77f746273746f72650000000000000000005265736f75726365496473000000000083837e010100010000000000000000000000000000000000000000000000000000006115b2565b90506107ca8160f81c90565b604080516001808252818301909252600091829190602080830190803683370190505090508281600081518110613c2c57613c2c614cf2565b602090810291909101015260006107ca7f746273746f72650000000000000000005461626c6573000000000000000000008360027e600302202020000000000000000000000000000000000000000000000000006115b2565b60008282604051602001613c9a929190614f17565b60408051601f1981840301815291905280516020909101207f14e2fcc58e58e68ec7edc30c8d50dccc3ce2714a623ec81f46b6a63922d76569189392505050565b600081831180613ceb5750835182115b15613d28578383836040517f23230fa3000000000000000000000000000000000000000000000000000000008152600401610290939291906151f6565b60208401613d3684826143f3565b90506000613d448585614d93565b6fffffffffffffffffffffffffffffffff1660809290921b9190911795945050505050565b6060600061096f83601560006141e0565b60408051600180825281830190925260009182918291602080830190803683370190505090508381600081518110613db457613db4614cf2565b602090810291909101015260008080613e0d7f7462776f726c6400000000000000000053797374656d73000000000000000000857e150200140100000000000000000000000000000000000000000000000000006115f4565b92509250925061093683838361425b565b60006060836001600160a01b03166000613e39858989614267565b604051613e46919061521b565b60006040518083038185875af1925050503d8060008114613e83576040519150601f19603f3d011682016040523d82523d6000602084013e613e88565b606091505b509097909650945050505050565b60006060836001600160a01b0316613eaf848888614267565b604051613ebc919061521b565b600060405180830381855af49150503d8060008114613e83576040519150601f19603f3d011682016040523d82523d6000602084013e613e88565b604080516002808252606082018352600092839291906020830190803683370190505090508381600081518110613f3057613f30614cf2565b602002602001018181525050826001600160a01b031660001b81600181518110613f5c57613f5c614cf2565b60209081029190910101526000613fb47f7462776f726c640000000000000000005265736f75726365416363657373000083837e010100010000000000000000000000000000000000000000000000000000006115b2565b9050610b858160f81c90565b600064ffffffffff821115614004576040517f7149a3c100000000000000000000000000000000000000000000000000000000815260048101839052602401610290565b8366ffffffffffffff811660ff851660280260380182901c64ffffffffff16808510614036578085038201915061403e565b848103820391505b5064ffffffffff6038602860ff8816020181811b197fffffffffffffffffffffffffffffffffffffffffffffffffff000000000000009490941690921792909216918416901b1790509392505050565b821561410857602083106140b8576020830484019350602083816140b4576140b4614f53565b0692505b82156141085760208390036000600019600885021c1990506008850281811c91508351811c90508119875416828216178755508184116140f9575050611992565b50600194909401939182900391015b5b6020821061412a5780518455600190930192601f1990910190602001614109565b8115611992576000600019600884021c8554835182191691161785555050505050565b6000602061415c83601f6143f3565b6141669190615237565b61417090846143f3565b90505b8083101561086e5760008355600183019250614173565b600061419583614296565b801561096f575061096f83836142e2565b7f629a4c26e296b22a8e0856e9f6ecb2d1008d7e00081111962cd175fa7488e175546000906001600160a01b0316806124ff573391505090565b606060006141ee8560801c90565b90506fffffffffffffffffffffffffffffffff8516600085828161421457614214614f53565b04905060405193506020840160208202810160405281855260005b8281101561424f578451871c82529387019360209091019060010161422f565b50505050509392505050565b6000806117088561439a565b606083838360405160200161427e93929190615259565b60405160208183030381529060405290509392505050565b60006142c2827f01ffc9a7000000000000000000000000000000000000000000000000000000006142e2565b8015610de557506142db826001600160e01b03196142e2565b1592915050565b6040516001600160e01b031982166024820152600090819060440160408051601f19818403018152919052602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825192935060009283928392909183918a617530fa92503d91506000519050828015614383575060208210155b801561438f5750600081115b979650505050505050565b6020810151603482015160609190911c9060009060f81c6128b4565b805160208083015191908110156143d7576000198160200360031b1b821691505b50919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610de557610de56143dd565b60008083601f84011261441857600080fd5b50813567ffffffffffffffff81111561443057600080fd5b6020830191508360208260051b850101111561444b57600080fd5b9250929050565b803560ff811681146124ff57600080fd5b60008060008060006080868803121561447b57600080fd5b85359450602086013567ffffffffffffffff81111561449957600080fd5b6144a588828901614406565b90955093506144b8905060408701614452565b949793965091946060013592915050565b60005b838110156144e45781810151838201526020016144cc565b50506000910152565b600081518084526145058160208601602086016144c9565b601f01601f19169290920160200192915050565b60208152600061096f60208301846144ed565b60008083601f84011261453e57600080fd5b50813567ffffffffffffffff81111561455657600080fd5b60208301915083602082850101111561444b57600080fd5b6000806000806000806080878903121561458757600080fd5b86359550602087013567ffffffffffffffff808211156145a657600080fd5b6145b28a838b01614406565b90975095508591506145c660408a01614452565b945060608901359150808211156145dc57600080fd5b506145e989828a0161452c565b979a9699509497509295939492505050565b6000806000806060858703121561461157600080fd5b84359350602085013567ffffffffffffffff81111561462f57600080fd5b61463b87828801614406565b909450925061464e905060408601614452565b905092959194509250565b60008060008060008060008060a0898b03121561467557600080fd5b88359750602089013567ffffffffffffffff8082111561469457600080fd5b6146a08c838d01614406565b909950975060408b01359150808211156146b957600080fd5b6146c58c838d0161452c565b909750955060608b0135945060808b01359150808211156146e557600080fd5b506146f28b828c0161452c565b999c989b5096995094979396929594505050565b600080600080600080600060a0888a03121561472157600080fd5b87359650602088013567ffffffffffffffff8082111561474057600080fd5b61474c8b838c01614406565b909850965086915061476060408b01614452565b955060608a013591508082111561477657600080fd5b506147838a828b0161452c565b989b979a50959894979596608090950135949350505050565b6000602082840312156147ae57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156147f4576147f46147b5565b604052919050565b600082601f83011261480d57600080fd5b813567ffffffffffffffff811115614827576148276147b5565b61483a6020601f19601f840116016147cb565b81815284602083860101111561484f57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806040838503121561487f57600080fd5b82359150602083013567ffffffffffffffff81111561489d57600080fd5b6148a9858286016147fc565b9150509250929050565b600080600080606085870312156148c957600080fd5b84359350602085013567ffffffffffffffff8111156148e757600080fd5b6148f387828801614406565b9598909750949560400135949350505050565b60608152600061491960608301866144ed565b846020840152828103604084015261099981856144ed565b600082601f83011261494257600080fd5b8135602067ffffffffffffffff82111561495e5761495e6147b5565b8160051b61496d8282016147cb565b928352848101820192828101908785111561498757600080fd5b83870192505b8483101561438f5782358252918301919083019061498d565b600080600080600060a086880312156149be57600080fd5b85359450602086013567ffffffffffffffff8111156149dc57600080fd5b6149e888828901614931565b9450506149f760408701614452565b94979396509394606081013594506080013592915050565b600080600060408486031215614a2457600080fd5b83359250602084013567ffffffffffffffff811115614a4257600080fd5b614a4e86828701614406565b9497909650939450505050565b6001600160a01b03811681146113ce57600080fd5b600080600060608486031215614a8557600080fd5b8335614a9081614a5b565b925060208401359150604084013567ffffffffffffffff811115614ab357600080fd5b614abf868287016147fc565b9150509250925092565b60008060008060808587031215614adf57600080fd5b84359350602085013567ffffffffffffffff811115614afd57600080fd5b614b0987828801614931565b935050614b1860408601614452565b9396929550929360600135925050565b600080600060608486031215614b3d57600080fd5b83359250602084013567ffffffffffffffff811115614b5b57600080fd5b614b6786828701614931565b925050614b7660408501614452565b90509250925092565b60008060408385031215614b9257600080fd5b8235614b9d81614a5b565b9150602083013567ffffffffffffffff81111561489d57600080fd5b60008060008060008060808789031215614bd257600080fd5b86359550602087013567ffffffffffffffff80821115614bf157600080fd5b614bfd8a838b01614406565b90975095506040890135915065ffffffffffff82168214614c1d57600080fd5b909350606088013590808211156145dc57600080fd5b803564ffffffffff811681146124ff57600080fd5b60008060008060008060008060c0898b031215614c6457600080fd5b88359750602089013567ffffffffffffffff80821115614c8357600080fd5b614c8f8c838d01614406565b9099509750879150614ca360408c01614452565b9650614cb160608c01614c33565b9550614cbf60808c01614c33565b945060a08b01359150808211156146e557600080fd5b600060208284031215614ce757600080fd5b813561096f81614a5b565b634e487b7160e01b600052603260045260246000fd5b604081526000614d1b60408301856144ed565b90506001600160a01b03831660208301529392505050565b600060ff821660ff8103614d4957614d496143dd565b60010192915050565b6001600160a01b0384168152826020820152606060408201526000610b8560608301846144ed565b60ff8281168282160390811115610de557610de56143dd565b81810381811115610de557610de56143dd565b600060208284031215614db857600080fd5b8151801515811461096f57600080fd5b60008151808452602080850194506020840160005b83811015614df957815187529582019590820190600101614ddd565b509495945050505050565b606081526000614e176060830186614dc8565b65ffffffffffff85166020840152828103604084015261099981856144ed565b848152608060208201526000614e506080830186614dc8565b65ffffffffffff85166040840152828103606084015261438f81856144ed565b7fffff0000000000000000000000000000000000000000000000000000000000008416815260007f3a000000000000000000000000000000000000000000000000000000000000008060028401528451614ed18160038601602089016144c9565b808401905081600382015284519150614ef18260048301602088016144c9565b0160040195945050505050565b8281526040602082015260006107ca60408301846144ed565b8281526000602080830184516020860160005b82811015614f4657815184529284019290840190600101614f2a565b5091979650505050505050565b634e487b7160e01b600052601260045260246000fd5b8082028115828204841417610de557610de56143dd565b7fffff00000000000000000000000000000000000000000000000000000000000084168152826020820152606060408201526000610b8560608301846144ed565b64ffffffffff818116838216019080821115614fdf57614fdf6143dd565b5092915050565b87815260e060208201526000614fff60e0830189614dc8565b60ff8816604084015264ffffffffff87811660608501528616608084015260a0830185905282810360c084015261503681856144ed565b9a9950505050505050505050565b60c08152600061505760c0830189614dc8565b60ff8816602084015265ffffffffffff8716604084015264ffffffffff8616606084015284608084015282810360a0840152611be181856144ed565b6080815260006150a66080830187614dc8565b82810360208401526150b881876144ed565b9050846040840152828103606084015261438f81856144ed565b86815260c0602082015260006150eb60c0830188614dc8565b82810360408401526150fd81886144ed565b9050856060840152828103608084015261511781866144ed565b9150508260a0830152979650505050505050565b60208152600061096f6020830184614dc8565b8381526060602082015260006151576060830185614dc8565b9050826040830152949350505050565b8481526080602082015260006151806080830186614dc8565b60ff949094166040830152506060015292915050565b6000602082840312156151a857600080fd5b5051919050565b85815260a0602082015260006151c860a0830187614dc8565b60ff8616604084015282810360608401526151e381866144ed565b9150508260808301529695505050505050565b60608152600061520960608301866144ed565b60208301949094525060400152919050565b6000825161522d8184602087016144c9565b9190910192915050565b60008261525457634e487b7160e01b600052601260045260246000fd5b500490565b6000845161526b8184602089016144c9565b60609490941b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169190930190815260148101919091526034019291505056fea164736f6c6343000818000a","storage":{"0x9b3d1bb743b613a7bd0807b0b0b84495469a46fb3d89a62136ff631eb85c78":"0x100000000000000000000000000000000000000000000000000000000000000","0x112fd8c58ec5f04e498bc180de3406a6abb0f4def282e333e1f3e98329f9a8b":"0x14010014000000000000000000000000000000000000000000000000000000","0x112fd8c58ec5f04e498bc180de3406a6abb0f4def282e333e1f3e98329f9a8c":"0x2001005f000000000000000000000000000000000000000000000000000000","0x112fd8c58ec5f04e498bc180de3406a6abb0f4def282e333e1f3e98329f9a8d":"0x14010061000000000000000000000000000000000000000000000000000000","0x15f537db4bc88accdd7f5bb4b054245fedd9593a395642896fe5a7be194d0c6":"0x737900000000000000000000000000004163636573734d616e6167656d656e74","0x15f537db4bc88accdd7f5bb4b054245fedd9593a395642896fe5a7be194d0c7":"0x219adc2e00000000000000000000000000000000000000000000000000000000","0x2f265d7804f75fba07f4cd52b6d54cf1436e2fcf957ba4d233cabdffecc9b94":"0x10000000000a0000000000001a0","0x3de5dd43eb4b771e24a74df3faec254ca486a16ef92800669867b58949e457d":"0x20010020000000000000000000000000000000000000000000000000000000","0x3de5dd43eb4b771e24a74df3faec254ca486a16ef92800669867b58949e457e":"0x28020061610000000000000000000000000000000000000000000000000000","0x3de5dd43eb4b771e24a74df3faec254ca486a16ef92800669867b58949e457f":"0x2001005f000000000000000000000000000000000000000000000000000000","0x5e322e7a70f64e6e7ea12d6a196b035bb7488f3a690c87f66cfee786b893a90":"0x100000000000000000000000000000000000000000000000000000000000000","0x90076908c633b635bae0581226ee8e68b690b9995a7df42e440cb84844aa173":"0xa00000000100000000000001a0","0x90c89dd21b9feaf1dba05d9f8a4595c1fe584eaecd6f56fee84c3c4c14677c4":"0x0","0xa46f28fb21d6d8232830ba4591c9e70bcf9dfc453c677cc787ed08d1c6959dc":"0x20","0xa46f28fb21d6d8232830ba4591c9e70bcf9dfc453c677cc787ed08d1c6959dd":"0x1","0xa46f28fb21d6d8232830ba4591c9e70bcf9dfc453c677cc787ed08d1c6959de":"0x20","0xa46f28fb21d6d8232830ba4591c9e70bcf9dfc453c677cc787ed08d1c6959df":"0x6","0xa46f28fb21d6d8232830ba4591c9e70bcf9dfc453c677cc787ed08d1c6959e0":"0x616d6f756e740000000000000000000000000000000000000000000000000000","0xb46f28fb21d6d8232830ba4591c9e70bcf9dfc453c677cc787ed08d1c6959dc":"0x20","0xb46f28fb21d6d8232830ba4591c9e70bcf9dfc453c677cc787ed08d1c6959dd":"0x2","0xb46f28fb21d6d8232830ba4591c9e70bcf9dfc453c677cc787ed08d1c6959de":"0x40","0xb46f28fb21d6d8232830ba4591c9e70bcf9dfc453c677cc787ed08d1c6959df":"0x80","0xb46f28fb21d6d8232830ba4591c9e70bcf9dfc453c677cc787ed08d1c6959e0":"0x6","0xb46f28fb21d6d8232830ba4591c9e70bcf9dfc453c677cc787ed08d1c6959e1":"0x706c617965720000000000000000000000000000000000000000000000000000","0xb46f28fb21d6d8232830ba4591c9e70bcf9dfc453c677cc787ed08d1c6959e2":"0x4","0xb46f28fb21d6d8232830ba4591c9e70bcf9dfc453c677cc787ed08d1c6959e3":"0x6974656d00000000000000000000000000000000000000000000000000000000","0xc23d02d1a414bfd101a030a72ec7a9b2c1fafa7d4dffb27149e9fb3b9c2bdc5":"0xf0a19f09c5334facaa4bf810903c410facb5cb94010000000000000000000000","0xda7e8a7c7fe65f2d68e0c287fa158afc7142cb7106ede08d737938733758da5":"0x573802f86c51b61d7cf620952217ec6ce0537d2e000000000000000000000000","0xe10acf674ceb79b367fd3df258a460f1aa112c3ec590af72111236fcb0cbb37":"0xa000000000a000000000000140","0xebf803a34c229378da37e128ae4e62209595cfb5ca45e03d51f9a2e9bc9fddd":"0x100000000000000000000000000000000000000000000000000000000000000","0xeca138a7a93880474ed53c10fa58dfed4edd42a1b2747a2bb9e2dfa95965575":"0x100000000000000000000000000000000000000000000000000000000000000","0x11f9bd4d19af2f1bef0ad8f19ca251139c7c979fe83043e7dc8e47dc8b1a5b80":"0x100000000000000000000000000000000000000000000000000000000000000","0x129240e1add0d550d1e1547a6714149c3cee74e4feddf1619a992fa968bad316":"0x100000000000000000000000000000000000000000000000000000000000000","0x13579f9b62ebfd0f150e90df3a61511e97eb1f76fa10e9bf7b97ab112a20eea7":"0xa000000000a000000000000140","0x1393d050512b0fa58964cb1fc7bdbe1e04e88dcd09a2eeb1f5dd8c150d78fe81":"0x73790000000000000000000000000000526567697374726174696f6e00000000","0x1393d050512b0fa58964cb1fc7bdbe1e04e88dcd09a2eeb1f5dd8c150d78fe82":"0x530f4b6000000000000000000000000000000000000000000000000000000000","0x146901cc4a89a4725abac0a6b423d8f1ed18dde647b6bf6b106a9d6a86f89da4":"0x73790000000000000000000000000000526567697374726174696f6e00000000","0x146901cc4a89a4725abac0a6b423d8f1ed18dde647b6bf6b106a9d6a86f89da5":"0x6548a90a00000000000000000000000000000000000000000000000000000000","0x158f4028907e127752d7cef746521f5d4e88a2fe56bd5cc1750bf5619758a581":"0x73790000000000000000000000000000526567697374726174696f6e00000000","0x158f4028907e127752d7cef746521f5d4e88a2fe56bd5cc1750bf5619758a582":"0x26d9810200000000000000000000000000000000000000000000000000000000","0x18f959489488543944bf9818a62e151380c3b0f8b5fc49d1709d8d53738ce995":"0x7379000000000000000000000000000042616c616e63655472616e7366657200","0x1ce5d6962d324ee332b9cc0e1c8aed0c72093a0a1c3c6018b012299a0c401eec":"0x22000000000a0000000000002c0","0x1e14654b429f723ee473957a4c4b089925991e6f72831a5874743e3e9d723c85":"0x20","0x1e14654b429f723ee473957a4c4b089925991e6f72831a5874743e3e9d723c86":"0x1","0x1e14654b429f723ee473957a4c4b089925991e6f72831a5874743e3e9d723c87":"0x20","0x1e14654b429f723ee473957a4c4b089925991e6f72831a5874743e3e9d723c88":"0xa","0x1e14654b429f723ee473957a4c4b089925991e6f72831a5874743e3e9d723c89":"0x7265736f75726365496400000000000000000000000000000000000000000000","0x1eb31b015589d89d9b0aed07bfa72897d7cd37fb093e23829ceb07dd2e962931":"0xa00000000100000000000001a0","0x1f14654b429f723ee473957a4c4b089925991e6f72831a5874743e3e9d723c85":"0x20","0x1f14654b429f723ee473957a4c4b089925991e6f72831a5874743e3e9d723c86":"0x1","0x1f14654b429f723ee473957a4c4b089925991e6f72831a5874743e3e9d723c87":"0x20","0x1f14654b429f723ee473957a4c4b089925991e6f72831a5874743e3e9d723c88":"0x6","0x1f14654b429f723ee473957a4c4b089925991e6f72831a5874743e3e9d723c89":"0x6578697374730000000000000000000000000000000000000000000000000000","0x20b352e9d8757c970d004451b0958c03b9974b9f1c15c96fb6832ba033937eaf":"0x20","0x20b352e9d8757c970d004451b0958c03b9974b9f1c15c96fb6832ba033937eb0":"0x1","0x20b352e9d8757c970d004451b0958c03b9974b9f1c15c96fb6832ba033937eb1":"0x20","0x20b352e9d8757c970d004451b0958c03b9974b9f1c15c96fb6832ba033937eb2":"0x7","0x20b352e9d8757c970d004451b0958c03b9974b9f1c15c96fb6832ba033937eb3":"0x62616c616e636500000000000000000000000000000000000000000000000000","0x21b00d84440fb942f4243b141f704b1e9617f8a6ac86531d09d352c3ee1d96a8":"0x100000000000000000000000000000000000000000000000000000000000000","0x21b352e9d8757c970d004451b0958c03b9974b9f1c15c96fb6832ba033937eaf":"0x20","0x21b352e9d8757c970d004451b0958c03b9974b9f1c15c96fb6832ba033937eb0":"0x1","0x21b352e9d8757c970d004451b0958c03b9974b9f1c15c96fb6832ba033937eb1":"0x20","0x21b352e9d8757c970d004451b0958c03b9974b9f1c15c96fb6832ba033937eb2":"0xb","0x21b352e9d8757c970d004451b0958c03b9974b9f1c15c96fb6832ba033937eb3":"0x6e616d6573706163654964000000000000000000000000000000000000000000","0x24c04f1483b65ed515676eddf646cfabd4bd9c11de33e6eccdf9481920dd7613":"0x17ffdeff94ed0b80c493a179d4b3b09d6d71f627010000000000000000000000","0x24e50c901ea6a68e09fc9c2acc03547c1fcf8698a38ab454efecd842e4f69c44":"0xa00000000100000000000001a0","0x25d29c5a60d419427f336813e3ac9343c091d230355e5f5ca5bf04243c7344b0":"0x73790000000000000000000000000000526567697374726174696f6e00000000","0x25d29c5a60d419427f336813e3ac9343c091d230355e5f5ca5bf04243c7344b1":"0xbfdfaff700000000000000000000000000000000000000000000000000000000","0x26a3888f20d8f06f60d1920fb77122ea285f52c565eb1cda73d2c34b7cd564eb":"0x20","0x26a3888f20d8f06f60d1920fb77122ea285f52c565eb1cda73d2c34b7cd564ec":"0x2","0x26a3888f20d8f06f60d1920fb77122ea285f52c565eb1cda73d2c34b7cd564ed":"0x40","0x26a3888f20d8f06f60d1920fb77122ea285f52c565eb1cda73d2c34b7cd564ee":"0x80","0x26a3888f20d8f06f60d1920fb77122ea285f52c565eb1cda73d2c34b7cd564ef":"0x6","0x26a3888f20d8f06f60d1920fb77122ea285f52c565eb1cda73d2c34b7cd564f0":"0x706c617965720000000000000000000000000000000000000000000000000000","0x26a3888f20d8f06f60d1920fb77122ea285f52c565eb1cda73d2c34b7cd564f1":"0x4","0x26a3888f20d8f06f60d1920fb77122ea285f52c565eb1cda73d2c34b7cd564f2":"0x67616d6500000000000000000000000000000000000000000000000000000000","0x27a3888f20d8f06f60d1920fb77122ea285f52c565eb1cda73d2c34b7cd564eb":"0x20","0x27a3888f20d8f06f60d1920fb77122ea285f52c565eb1cda73d2c34b7cd564ec":"0x1","0x27a3888f20d8f06f60d1920fb77122ea285f52c565eb1cda73d2c34b7cd564ed":"0x20","0x27a3888f20d8f06f60d1920fb77122ea285f52c565eb1cda73d2c34b7cd564ee":"0x5","0x27a3888f20d8f06f60d1920fb77122ea285f52c565eb1cda73d2c34b7cd564ef":"0x73636f7265000000000000000000000000000000000000000000000000000000","0x284217df73ecc8fb5407d0e68d5ff7c39a4e0a62b1cfd5cfd2e2a77108dac352":"0x14010014000000000000000000000000000000000000000000000000000000","0x284217df73ecc8fb5407d0e68d5ff7c39a4e0a62b1cfd5cfd2e2a77108dac353":"0x0","0x284217df73ecc8fb5407d0e68d5ff7c39a4e0a62b1cfd5cfd2e2a77108dac354":"0x14010061000000000000000000000000000000000000000000000000000000","0x2c519bc82cf4bef79b00db5bbe729ec3b700bba0091b79d5b4aea31006535e0c":"0x20","0x2c519bc82cf4bef79b00db5bbe729ec3b700bba0091b79d5b4aea31006535e0d":"0x2","0x2c519bc82cf4bef79b00db5bbe729ec3b700bba0091b79d5b4aea31006535e0e":"0x40","0x2c519bc82cf4bef79b00db5bbe729ec3b700bba0091b79d5b4aea31006535e0f":"0x80","0x2c519bc82cf4bef79b00db5bbe729ec3b700bba0091b79d5b4aea31006535e10":"0x6","0x2c519bc82cf4bef79b00db5bbe729ec3b700bba0091b79d5b4aea31006535e11":"0x73797374656d0000000000000000000000000000000000000000000000000000","0x2c519bc82cf4bef79b00db5bbe729ec3b700bba0091b79d5b4aea31006535e12":"0xc","0x2c519bc82cf4bef79b00db5bbe729ec3b700bba0091b79d5b4aea31006535e13":"0x7075626c69634163636573730000000000000000000000000000000000000000","0x2c8c3abefaa2dcd4096200745528271aefb366fb47626a808540d5b48b7a6dab":"0x0","0x2ca57daac9e9b59076fec0db3c7077df541d44461915e6e7a00ca5a6a680c8ae":"0x100000000000000000000000000000000000000000000000000000000000000","0x2d519bc82cf4bef79b00db5bbe729ec3b700bba0091b79d5b4aea31006535e0c":"0x20","0x2d519bc82cf4bef79b00db5bbe729ec3b700bba0091b79d5b4aea31006535e0d":"0x1","0x2d519bc82cf4bef79b00db5bbe729ec3b700bba0091b79d5b4aea31006535e0e":"0x20","0x2d519bc82cf4bef79b00db5bbe729ec3b700bba0091b79d5b4aea31006535e0f":"0x8","0x2d519bc82cf4bef79b00db5bbe729ec3b700bba0091b79d5b4aea31006535e10":"0x73797374656d4964000000000000000000000000000000000000000000000000","0x2dea399afcf29db58dcd9e8bf35c8c6b91ed03bb52735d0efb57192a2400fe3d":"0x73790000000000000000000000000000526567697374726174696f6e00000000","0x2dea399afcf29db58dcd9e8bf35c8c6b91ed03bb52735d0efb57192a2400fe3e":"0xba51f4900000000000000000000000000000000000000000000000000000000","0x2f55b27b124fc5952821cdb830b93a75c363312bb7bd4376c7ccb8df49f9ceca":"0x0","0x3010e51ef9321391a0757a892ab8e29b74fb6ea7f972e01a0b790f12d609eca9":"0x20","0x3010e51ef9321391a0757a892ab8e29b74fb6ea7f972e01a0b790f12d609ecaa":"0x1","0x3010e51ef9321391a0757a892ab8e29b74fb6ea7f972e01a0b790f12d609ecab":"0x20","0x3010e51ef9321391a0757a892ab8e29b74fb6ea7f972e01a0b790f12d609ecac":"0x6","0x3010e51ef9321391a0757a892ab8e29b74fb6ea7f972e01a0b790f12d609ecad":"0x6163636573730000000000000000000000000000000000000000000000000000","0x3110e51ef9321391a0757a892ab8e29b74fb6ea7f972e01a0b790f12d609eca9":"0x20","0x3110e51ef9321391a0757a892ab8e29b74fb6ea7f972e01a0b790f12d609ecaa":"0x2","0x3110e51ef9321391a0757a892ab8e29b74fb6ea7f972e01a0b790f12d609ecab":"0x40","0x3110e51ef9321391a0757a892ab8e29b74fb6ea7f972e01a0b790f12d609ecac":"0x80","0x3110e51ef9321391a0757a892ab8e29b74fb6ea7f972e01a0b790f12d609ecad":"0xa","0x3110e51ef9321391a0757a892ab8e29b74fb6ea7f972e01a0b790f12d609ecae":"0x7265736f75726365496400000000000000000000000000000000000000000000","0x3110e51ef9321391a0757a892ab8e29b74fb6ea7f972e01a0b790f12d609ecaf":"0x6","0x3110e51ef9321391a0757a892ab8e29b74fb6ea7f972e01a0b790f12d609ecb0":"0x63616c6c65720000000000000000000000000000000000000000000000000000","0x312232dab6ac4c4c3477cf19beae5967a4dede4d209930045826799b46f220de":"0x737900000000000000000000000000004163636573734d616e6167656d656e74","0x312232dab6ac4c4c3477cf19beae5967a4dede4d209930045826799b46f220df":"0x8d53b20800000000000000000000000000000000000000000000000000000000","0x31417bf463900fab9a9ab5658f5f273ac3f2fdea5026dfc096170cdea2163e4f":"0x0","0x316b2cc732f0148a761ef87737fc0fe323feb82f35db8a4e1db66d1c85c604e0":"0x100000000000000000000000000000000000000000000000000000000000000","0x31b79b54ee24b932df0c02f4d954c29586af473382cfd9c0e3e636f165edf91d":"0xa000000000a000000000000140","0x32462889818985ef09c65b8089952700d13f6356ec70a38027802155f4dfdb74":"0x20","0x32462889818985ef09c65b8089952700d13f6356ec70a38027802155f4dfdb75":"0x5","0x32462889818985ef09c65b8089952700d13f6356ec70a38027802155f4dfdb76":"0xa0","0x32462889818985ef09c65b8089952700d13f6356ec70a38027802155f4dfdb77":"0xe0","0x32462889818985ef09c65b8089952700d13f6356ec70a38027802155f4dfdb78":"0x120","0x32462889818985ef09c65b8089952700d13f6356ec70a38027802155f4dfdb79":"0x160","0x32462889818985ef09c65b8089952700d13f6356ec70a38027802155f4dfdb7a":"0x1a0","0x32462889818985ef09c65b8089952700d13f6356ec70a38027802155f4dfdb7b":"0xb","0x32462889818985ef09c65b8089952700d13f6356ec70a38027802155f4dfdb7c":"0x6669656c644c61796f7574000000000000000000000000000000000000000000","0x32462889818985ef09c65b8089952700d13f6356ec70a38027802155f4dfdb7d":"0x9","0x32462889818985ef09c65b8089952700d13f6356ec70a38027802155f4dfdb7e":"0x6b6579536368656d610000000000000000000000000000000000000000000000","0x32462889818985ef09c65b8089952700d13f6356ec70a38027802155f4dfdb7f":"0xb","0x32462889818985ef09c65b8089952700d13f6356ec70a38027802155f4dfdb80":"0x76616c7565536368656d61000000000000000000000000000000000000000000","0x32462889818985ef09c65b8089952700d13f6356ec70a38027802155f4dfdb81":"0x12","0x32462889818985ef09c65b8089952700d13f6356ec70a38027802155f4dfdb82":"0x616269456e636f6465644b65794e616d65730000000000000000000000000000","0x32462889818985ef09c65b8089952700d13f6356ec70a38027802155f4dfdb83":"0x14","0x32462889818985ef09c65b8089952700d13f6356ec70a38027802155f4dfdb84":"0x616269456e636f6465644669656c644e616d6573000000000000000000000000","0x33462889818985ef09c65b8089952700d13f6356ec70a38027802155f4dfdb74":"0x20","0x33462889818985ef09c65b8089952700d13f6356ec70a38027802155f4dfdb75":"0x1","0x33462889818985ef09c65b8089952700d13f6356ec70a38027802155f4dfdb76":"0x20","0x33462889818985ef09c65b8089952700d13f6356ec70a38027802155f4dfdb77":"0x7","0x33462889818985ef09c65b8089952700d13f6356ec70a38027802155f4dfdb78":"0x7461626c65496400000000000000000000000000000000000000000000000000","0x36b3cdaddae028fa0437ab4baa280961354d7e0948ab226ce3d2a5c5d86c54a5":"0x100000000000000000000000000000000000000000000000000000000000000","0x378de55505f37990d87b176d8a41da5cb79bfd9a4d87bc559639b291b7317ad3":"0xa274b9a7e743cd8df3c6fd0abd47ed55fc943bc3010000000000000000000000","0x3cf46184ce5036032e710751af7e9b1234dd462a0a5c2a27ec05a3ded2bf2b3f":"0x20","0x3cf46184ce5036032e710751af7e9b1234dd462a0a5c2a27ec05a3ded2bf2b40":"0x1","0x3cf46184ce5036032e710751af7e9b1234dd462a0a5c2a27ec05a3ded2bf2b41":"0x20","0x3cf46184ce5036032e710751af7e9b1234dd462a0a5c2a27ec05a3ded2bf2b42":"0x4","0x3cf46184ce5036032e710751af7e9b1234dd462a0a5c2a27ec05a3ded2bf2b43":"0x67616d6500000000000000000000000000000000000000000000000000000000","0x3d9587926a5366c4ca5c601c31fff6eabaea86298a2bfd5cb19f2bc8e51cf7d9":"0x737900000000000000000000000000004d6f766553797374656d000000000000","0x3df46184ce5036032e710751af7e9b1234dd462a0a5c2a27ec05a3ded2bf2b3f":"0x20","0x3df46184ce5036032e710751af7e9b1234dd462a0a5c2a27ec05a3ded2bf2b40":"0x1","0x3df46184ce5036032e710751af7e9b1234dd462a0a5c2a27ec05a3ded2bf2b41":"0x20","0x3df46184ce5036032e710751af7e9b1234dd462a0a5c2a27ec05a3ded2bf2b42":"0x6","0x3df46184ce5036032e710751af7e9b1234dd462a0a5c2a27ec05a3ded2bf2b43":"0x706c617965720000000000000000000000000000000000000000000000000000","0x3f4951930728b09e50bb9af9d552544af526d2d4cd9dbfc9fe783ce12f6eb1dd":"0x100000000000000000000000000000000000000000000000000000000000000","0x410ed696070ea6bdf91378de37858779dd9319abd55ed94c488dabdbb5610518":"0x0","0x4141fcc015dfeb94824f73d38981ea221f49c7a546d5f63e178bd0f0f5f2dcdd":"0xa00000000100000000000001a0","0x479b111fb5654abba07dd5ea07c94a1efc85de27c53d72bb3d2d5400bc1b955e":"0x73790000000000000000000000000000526567697374726174696f6e00000000","0x479b111fb5654abba07dd5ea07c94a1efc85de27c53d72bb3d2d5400bc1b955f":"0xa92813ad00000000000000000000000000000000000000000000000000000000","0x4888c37928d0da471fd699eccf17f200168e3fc07ef788c21e911855cd034fbe":"0x20","0x4888c37928d0da471fd699eccf17f200168e3fc07ef788c21e911855cd034fbf":"0x2","0x4888c37928d0da471fd699eccf17f200168e3fc07ef788c21e911855cd034fc0":"0x40","0x4888c37928d0da471fd699eccf17f200168e3fc07ef788c21e911855cd034fc1":"0x80","0x4888c37928d0da471fd699eccf17f200168e3fc07ef788c21e911855cd034fc2":"0xd","0x4888c37928d0da471fd699eccf17f200168e3fc07ef788c21e911855cd034fc3":"0x6d6f64756c654164647265737300000000000000000000000000000000000000","0x4888c37928d0da471fd699eccf17f200168e3fc07ef788c21e911855cd034fc4":"0xd","0x4888c37928d0da471fd699eccf17f200168e3fc07ef788c21e911855cd034fc5":"0x617267756d656e74734861736800000000000000000000000000000000000000","0x4988c37928d0da471fd699eccf17f200168e3fc07ef788c21e911855cd034fbe":"0x20","0x4988c37928d0da471fd699eccf17f200168e3fc07ef788c21e911855cd034fbf":"0x1","0x4988c37928d0da471fd699eccf17f200168e3fc07ef788c21e911855cd034fc0":"0x20","0x4988c37928d0da471fd699eccf17f200168e3fc07ef788c21e911855cd034fc1":"0xb","0x4988c37928d0da471fd699eccf17f200168e3fc07ef788c21e911855cd034fc2":"0x6973496e7374616c6c6564000000000000000000000000000000000000000000","0x499d6e7f50daaa3e76c48593e0f05ca712187e4f1c716391aba05e97598d7020":"0x73790000000000000000000000000000526567697374726174696f6e00000000","0x499d6e7f50daaa3e76c48593e0f05ca712187e4f1c716391aba05e97598d7021":"0xd5f8337f00000000000000000000000000000000000000000000000000000000","0x4ada8eb027149fb79b61020b579249aac15489a822c157509ab89bb2a174da6f":"0x6400000064000000000000000000000000000000000000000000000000","0x4aed9907f13c7cbaeea9bb6c3ef8cc9aad0330faaaf3ff1b4eab4c6fbce8d51f":"0x100000000000000000000000000000000000000000000000000000000000000","0x4c104b5091c35c70d0e22855c305bce817678b3f5469d9c55ad2636419bf1fb4":"0x20","0x4c104b5091c35c70d0e22855c305bce817678b3f5469d9c55ad2636419bf1fb5":"0x1","0x4c104b5091c35c70d0e22855c305bce817678b3f5469d9c55ad2636419bf1fb6":"0x20","0x4c104b5091c35c70d0e22855c305bce817678b3f5469d9c55ad2636419bf1fb7":"0x6","0x4c104b5091c35c70d0e22855c305bce817678b3f5469d9c55ad2636419bf1fb8":"0x706c617965720000000000000000000000000000000000000000000000000000","0x4c404c9894d9c4c6b2a7f6d890a0d05bcc998104633e8543383b086a57a61ddb":"0xa000000000a000000000000140","0x4d104b5091c35c70d0e22855c305bce817678b3f5469d9c55ad2636419bf1fb4":"0x20","0x4d104b5091c35c70d0e22855c305bce817678b3f5469d9c55ad2636419bf1fb5":"0x2","0x4d104b5091c35c70d0e22855c305bce817678b3f5469d9c55ad2636419bf1fb6":"0x40","0x4d104b5091c35c70d0e22855c305bce817678b3f5469d9c55ad2636419bf1fb7":"0x80","0x4d104b5091c35c70d0e22855c305bce817678b3f5469d9c55ad2636419bf1fb8":"0x1","0x4d104b5091c35c70d0e22855c305bce817678b3f5469d9c55ad2636419bf1fb9":"0x7800000000000000000000000000000000000000000000000000000000000000","0x4d104b5091c35c70d0e22855c305bce817678b3f5469d9c55ad2636419bf1fba":"0x1","0x4d104b5091c35c70d0e22855c305bce817678b3f5469d9c55ad2636419bf1fbb":"0x7900000000000000000000000000000000000000000000000000000000000000","0x4e7547122b378df6acfb12a9ce416d5759b697de0d3f74a38a5cbe5d96f51008":"0x0","0x4fa4f9e554db3e059011204ae854c1e38ecfd99fc6d7ad7d45504a64e8b5717a":"0x100000000000000000000000000000000000000000000000000000000000000","0x5006455e21d454a60c6014e13f6afe4e50e8b17894c301b5be6cf863605bfc3d":"0x0","0x51dd0de6cb1dde9b3cfd238cf0cee83e20187e51bfb8e47d2376f9b6821b2ac5":"0x0","0x51fb493cc3fdb2071d1cab9e363b63a4d8ec0af29a4de1ddf988587f43ce010d":"0x0","0x52eb2481d3dc7118794603c88053be24f709c9ac96bd5fbd3670e7572c5dd597":"0xa000000000a000000000000140","0x54432f6eecc058694acad2517014c7ea00ed1f45bc20596ff166d3fb5c88e774":"0x0","0x5451fccd680511001e63e3e74074d51aee1d6ec8548c502ef8cd228a0ad89365":"0xd416f26aafcaaeca50b0dc35bd023e7286be2961010000000000000000000000","0x54e4188b6e5255ad475b7f8c3a0d731e802d01a77fdc9f6451b70a1107009ea6":"0x20","0x54e4188b6e5255ad475b7f8c3a0d731e802d01a77fdc9f6451b70a1107009ea7":"0x1","0x54e4188b6e5255ad475b7f8c3a0d731e802d01a77fdc9f6451b70a1107009ea8":"0x20","0x54e4188b6e5255ad475b7f8c3a0d731e802d01a77fdc9f6451b70a1107009ea9":"0x5","0x54e4188b6e5255ad475b7f8c3a0d731e802d01a77fdc9f6451b70a1107009eaa":"0x76616c7565000000000000000000000000000000000000000000000000000000","0x5532724cd17abe24fcb541d628044bce0659ad94bc0d626b09aaecf31aefa891":"0x100000000000000000000000000000000000000000000000000000000","0x5532724cd17abe24fcb541d628044bce0659ad94bc0d626b09aaecf31aefa892":"0x2001005f000000000000000000000000000000000000000000000000000000","0x5532724cd17abe24fcb541d628044bce0659ad94bc0d626b09aaecf31aefa893":"0x1b6000000000000000000000000000000000000000000000000000000","0x55ac469e01c43e9fcac76ea278d0589df7472b883c95187a19f4b24221cf6a89":"0x10000000000a0000000000001a0","0x55e4188b6e5255ad475b7f8c3a0d731e802d01a77fdc9f6451b70a1107009ea6":"0x20","0x55e4188b6e5255ad475b7f8c3a0d731e802d01a77fdc9f6451b70a1107009ea7":"0x1","0x55e4188b6e5255ad475b7f8c3a0d731e802d01a77fdc9f6451b70a1107009ea8":"0x20","0x55e4188b6e5255ad475b7f8c3a0d731e802d01a77fdc9f6451b70a1107009ea9":"0x8","0x55e4188b6e5255ad475b7f8c3a0d731e802d01a77fdc9f6451b70a1107009eaa":"0x73797374656d4964000000000000000000000000000000000000000000000000","0x5631a7f33683068f2ab7b4090898c607a42d6f31bc2ffa45fb57b249cc3a8cad":"0x73790000000000000000000000000000526567697374726174696f6e00000000","0x5631a7f33683068f2ab7b4090898c607a42d6f31bc2ffa45fb57b249cc3a8cae":"0xcdc938c500000000000000000000000000000000000000000000000000000000","0x5634f8cdbcd8dd1b3a29856e9a23ad247ae0d958be81e20488f9989408e515f5":"0x0","0x56e9779a8d86299c3d77db735406730adcaca040bd986df3813e33e4ad6a2eb8":"0x20","0x56e9779a8d86299c3d77db735406730adcaca040bd986df3813e33e4ad6a2eb9":"0x1","0x56e9779a8d86299c3d77db735406730adcaca040bd986df3813e33e4ad6a2eba":"0x20","0x56e9779a8d86299c3d77db735406730adcaca040bd986df3813e33e4ad6a2ebb":"0x6","0x56e9779a8d86299c3d77db735406730adcaca040bd986df3813e33e4ad6a2ebc":"0x6865616c74680000000000000000000000000000000000000000000000000000","0x57e9779a8d86299c3d77db735406730adcaca040bd986df3813e33e4ad6a2eb8":"0x20","0x57e9779a8d86299c3d77db735406730adcaca040bd986df3813e33e4ad6a2eb9":"0x1","0x57e9779a8d86299c3d77db735406730adcaca040bd986df3813e33e4ad6a2eba":"0x20","0x57e9779a8d86299c3d77db735406730adcaca040bd986df3813e33e4ad6a2ebb":"0x6","0x57e9779a8d86299c3d77db735406730adcaca040bd986df3813e33e4ad6a2ebc":"0x706c617965720000000000000000000000000000000000000000000000000000","0x59230216010f60925f669383c0174dfbf0f94333a0f146c62a13ec7d2cb8ac7a":"0x100000000000000000000000000000000000000000000000000000000000000","0x5cce4c9b5c3b33560f2931e7eb8e518b7beba15c1b29c3aec5fb7481acc66a3c":"0x73790000000000000000000000000000426174636843616c6c00000000000000","0x5cee3dde33334a7b19ad76e9b697b3d56acc2b0c75fd7fb4f1e08a0c9d179006":"0x0","0x5d095d175d1ab0009c271060eab515a97f1dc6489b4747ccc29a0c5f4d8912cd":"0x100000000000000000000000000000000000000000000000000000000000000","0x600e6e3772fd99eaf7572dbc498f785feed0611425455f6f69884fb4bfc3e75d":"0x100000000000000000000000000000000000000000000000000000000000000","0x60ed21f4392d049a184963a7afd3e92305013a101c23f5c9ccb5b84c256bbbc9":"0x0","0x60f7c1d6e07b302a7cac2163c44b6df7f2045c578bd0f46b53eb801adf2def60":"0x100000000000000000000000000000000000000000000000000000000000000","0x61286ce9ad91ebe2bd602b40f31caef35f463a12da99be2fc42a74d2e7eb1d9f":"0x100000000000000000000000000000000000000000000000000000000000000","0x629a4c26e296b22a8e0856e9f6ecb2d1008d7e00081111962cd175fa7488e175":"0x8d8b6b8414e1e3dcfd4168561b9be6bd3bf6ec4b","0x629dc93b6507684472f60cd5682a35f59b7acdd6335262f0cedf65be03d80de2":"0x100000000000000000000000000000000000000000000000000000000000000","0x62e3b28738620fca89d8615605bf1a576fafd858937246dbafa900a5af39d843":"0x20","0x62e3b28738620fca89d8615605bf1a576fafd858937246dbafa900a5af39d844":"0x1","0x62e3b28738620fca89d8615605bf1a576fafd858937246dbafa900a5af39d845":"0x20","0x62e3b28738620fca89d8615605bf1a576fafd858937246dbafa900a5af39d846":"0x5","0x62e3b28738620fca89d8615605bf1a576fafd858937246dbafa900a5af39d847":"0x6e6f6e6365000000000000000000000000000000000000000000000000000000","0x63b3b54f3d78977ceb9dbfdb561a76e4b451d263a4251a5dcd406babe120da2c":"0x10000000000a0000000000001a0","0x63e3b28738620fca89d8615605bf1a576fafd858937246dbafa900a5af39d843":"0x20","0x63e3b28738620fca89d8615605bf1a576fafd858937246dbafa900a5af39d844":"0x1","0x63e3b28738620fca89d8615605bf1a576fafd858937246dbafa900a5af39d845":"0x20","0x63e3b28738620fca89d8615605bf1a576fafd858937246dbafa900a5af39d846":"0x6","0x63e3b28738620fca89d8615605bf1a576fafd858937246dbafa900a5af39d847":"0x7369676e65720000000000000000000000000000000000000000000000000000","0x66118a0a3eb8644e96eca6c02b744df7c436ac8a7a8721ca85a50874aed79e32":"0x737900000000000000000000000000004d6f766553797374656d000000000000","0x66118a0a3eb8644e96eca6c02b744df7c436ac8a7a8721ca85a50874aed79e33":"0xb591186e00000000000000000000000000000000000000000000000000000000","0x672b3d66846b114b24a90e625a08380cb5b8669c8ebb4b5a8903109a359c8a26":"0xa00000000100000000000001a0","0x6832b6c4b752ac1af9bd5d8590caa91b5dcdf01922248be22ebb473aa9ddb674":"0x100000000000000000000000000000000000000000000000000000000000000","0x6cab89e12f68d9b193f3fd57adf9a563d0e59a8fb43aeec9223ffcd354856d68":"0x0","0x6ebfd0a6c04da5da10e2b873592db4d5981325e306cb8d735545e4b254fa3bb4":"0x0","0x6ee202dfb9642098b930e45d1c9e202ebc7f9ef9b69935a68019d83f0d6d1945":"0x20","0x6ee202dfb9642098b930e45d1c9e202ebc7f9ef9b69935a68019d83f0d6d1946":"0x2","0x6ee202dfb9642098b930e45d1c9e202ebc7f9ef9b69935a68019d83f0d6d1947":"0x40","0x6ee202dfb9642098b930e45d1c9e202ebc7f9ef9b69935a68019d83f0d6d1948":"0x80","0x6ee202dfb9642098b930e45d1c9e202ebc7f9ef9b69935a68019d83f0d6d1949":"0x1","0x6ee202dfb9642098b930e45d1c9e202ebc7f9ef9b69935a68019d83f0d6d194a":"0x7800000000000000000000000000000000000000000000000000000000000000","0x6ee202dfb9642098b930e45d1c9e202ebc7f9ef9b69935a68019d83f0d6d194b":"0x1","0x6ee202dfb9642098b930e45d1c9e202ebc7f9ef9b69935a68019d83f0d6d194c":"0x7900000000000000000000000000000000000000000000000000000000000000","0x6fb68063042ca0d20e820eec95dff04d572d288687c8885f79b37719a672df17":"0x100000000000000000000000000000000000000000000000000000000","0x6fb68063042ca0d20e820eec95dff04d572d288687c8885f79b37719a672df18":"0x4010043000000000000000000000000000000000000000000000000000000","0x6fb68063042ca0d20e820eec95dff04d572d288687c8885f79b37719a672df19":"0x1c5000000000000000000000000000000000000000000000000000000","0x6fe202dfb9642098b930e45d1c9e202ebc7f9ef9b69935a68019d83f0d6d1945":"0x20","0x6fe202dfb9642098b930e45d1c9e202ebc7f9ef9b69935a68019d83f0d6d1946":"0x1","0x6fe202dfb9642098b930e45d1c9e202ebc7f9ef9b69935a68019d83f0d6d1947":"0x20","0x6fe202dfb9642098b930e45d1c9e202ebc7f9ef9b69935a68019d83f0d6d1948":"0xb","0x6fe202dfb9642098b930e45d1c9e202ebc7f9ef9b69935a68019d83f0d6d1949":"0x7465727261696e54797065000000000000000000000000000000000000000000","0x729f4eb9e5fc3b2a8f35667e763db6a655ee7e4c610ca357db10d0f2e3393657":"0x0","0x736ed1abd54666a76e121a8f586fc3734027b3291ed19cb0ed6fa9d8618be728":"0x73790000000000000000000000000000526567697374726174696f6e00000000","0x736ed1abd54666a76e121a8f586fc3734027b3291ed19cb0ed6fa9d8618be729":"0xb29e408900000000000000000000000000000000000000000000000000000000","0x73fb31342e00db2e5ba8060a5b2ffe7d6159de12464ce43f9a961152fdc1f276":"0x100000000000000000000000000000000000000000000000000000000000000","0x77f5189478a54c848d74c2b1f8332004344e0731f292df5b640ff93007cac209":"0x100000000000000000000000000000000000000000000000000000000000000","0x784a8985213de29006084cfdc119b9067f9af91c4dd4ae6b16ac3b2b55f5eb20":"0xa000000000a000000000000140","0x79b68386bcdc3394911e7f1aa93bcf8dbbcdd6d8e07fd56a3023dbe8ac4014c6":"0x0","0x79d302970aef504f27fabad6a253fc6a1deeccce492bfbc73b2838045848cf99":"0x100000000000000000000000000000000000000000000000000000000000000","0x7a0fb881ad7ff593f1b8f92cedcf9291547172d4ccd9dbe28e66ba8dd950af11":"0x20","0x7a0fb881ad7ff593f1b8f92cedcf9291547172d4ccd9dbe28e66ba8dd950af12":"0x1","0x7a0fb881ad7ff593f1b8f92cedcf9291547172d4ccd9dbe28e66ba8dd950af13":"0x20","0x7a0fb881ad7ff593f1b8f92cedcf9291547172d4ccd9dbe28e66ba8dd950af14":"0x15","0x7a0fb881ad7ff593f1b8f92cedcf9291547172d4ccd9dbe28e66ba8dd950af15":"0x776f726c6446756e6374696f6e53656c6563746f720000000000000000000000","0x7a47e694c2e99ea17c24e802af12b912231b58fb8f905cfcc62502deff9f5b3e":"0xa000000000a000000000000140","0x7b0fb881ad7ff593f1b8f92cedcf9291547172d4ccd9dbe28e66ba8dd950af11":"0x20","0x7b0fb881ad7ff593f1b8f92cedcf9291547172d4ccd9dbe28e66ba8dd950af12":"0x2","0x7b0fb881ad7ff593f1b8f92cedcf9291547172d4ccd9dbe28e66ba8dd950af13":"0x40","0x7b0fb881ad7ff593f1b8f92cedcf9291547172d4ccd9dbe28e66ba8dd950af14":"0x80","0x7b0fb881ad7ff593f1b8f92cedcf9291547172d4ccd9dbe28e66ba8dd950af15":"0x8","0x7b0fb881ad7ff593f1b8f92cedcf9291547172d4ccd9dbe28e66ba8dd950af16":"0x73797374656d4964000000000000000000000000000000000000000000000000","0x7b0fb881ad7ff593f1b8f92cedcf9291547172d4ccd9dbe28e66ba8dd950af17":"0x16","0x7b0fb881ad7ff593f1b8f92cedcf9291547172d4ccd9dbe28e66ba8dd950af18":"0x73797374656d46756e6374696f6e53656c6563746f7200000000000000000000","0x7c48da9e7f67ba1442399446154c7428543f90f066f19c25a1e2ef98d4c2100f":"0x20","0x7c48da9e7f67ba1442399446154c7428543f90f066f19c25a1e2ef98d4c21010":"0x1","0x7c48da9e7f67ba1442399446154c7428543f90f066f19c25a1e2ef98d4c21011":"0x20","0x7c48da9e7f67ba1442399446154c7428543f90f066f19c25a1e2ef98d4c21012":"0x8","0x7c48da9e7f67ba1442399446154c7428543f90f066f19c25a1e2ef98d4c21013":"0x73797374656d4964000000000000000000000000000000000000000000000000","0x7d48da9e7f67ba1442399446154c7428543f90f066f19c25a1e2ef98d4c2100f":"0x20","0x7d48da9e7f67ba1442399446154c7428543f90f066f19c25a1e2ef98d4c21010":"0x1","0x7d48da9e7f67ba1442399446154c7428543f90f066f19c25a1e2ef98d4c21011":"0x20","0x7d48da9e7f67ba1442399446154c7428543f90f066f19c25a1e2ef98d4c21012":"0x6","0x7d48da9e7f67ba1442399446154c7428543f90f066f19c25a1e2ef98d4c21013":"0x73797374656d0000000000000000000000000000000000000000000000000000","0x7f7e3a0477cfc2d2c0a7df25a6a3db9f89ec04bb6b948e702725c5ba168e1ed5":"0x20010020000000000000000000000000000000000000000000000000000000","0x7f7e3a0477cfc2d2c0a7df25a6a3db9f89ec04bb6b948e702725c5ba168e1ed6":"0x2001005f000000000000000000000000000000000000000000000000000000","0x7f7e3a0477cfc2d2c0a7df25a6a3db9f89ec04bb6b948e702725c5ba168e1ed7":"0x2001005f000000000000000000000000000000000000000000000000000000","0x7fbe2fb2dd427ee29e4cd4618b7f7bb64f959ebc4de62bff7f37dee0df1ef569":"0x737900000000000000000000000000004163636573734d616e6167656d656e74","0x8075a9f170f06558bb79dc4f873f05bceb108cebd681dc4ecd45f6cf33f20794":"0x0","0x812e9ab4423e9278c6a7f02ba64cbc3513e72003f6255319f24beedf51677aee":"0x100000000000000000000000000000000000000000000000000000000000000","0x81f738a187e429edaababb4393cfc2f127aa499d366402a1bdfc2226805d2c17":"0x14010014000000000000000000000000000000000000000000000000000000","0x81f738a187e429edaababb4393cfc2f127aa499d366402a1bdfc2226805d2c18":"0x2001001f000000000000000000000000000000000000000000000000000000","0x81f738a187e429edaababb4393cfc2f127aa499d366402a1bdfc2226805d2c19":"0x14010061000000000000000000000000000000000000000000000000000000","0x820744e35ec465df848d378f3f2f1bd98d1a8eb9c42a8559876c30741ed6d1d6":"0x0","0x822bbfd6ff4b16bb75648c9f3e207f0c2c0641f10783428f4abc8fe57d4bb69a":"0x100000000000000000000000000000000000000000000000000000000000000","0x833d255ea78cc089e851c01289ac6eb4d5885381850849095f4e40c47e6b78f6":"0x300000005000000000000000000000000000000000000000000000000","0x83bac1417a90086c19b238eb3523e2a488d98d0c81181c3838c9415edc26b73b":"0x73790000000000000000000000000000526567697374726174696f6e00000000","0x83bac1417a90086c19b238eb3523e2a488d98d0c81181c3838c9415edc26b73c":"0x8da798da00000000000000000000000000000000000000000000000000000000","0x83bb3c4296cb98c61244f435932365efcbc6f25355bea49ab2ca0e12055606bd":"0x100000000000000000000000000000000000000000000000000000000000000","0x84fc981ccddfff6edc2fecf00db4de61bc00fe59a5b59454ccb728e4819f4078":"0x5","0x8531249a5d01629cba1e4922b38fe741812b1ac1cd3a573b05728246e7afa5cf":"0x737900000000000000000000000000004163636573734d616e6167656d656e74","0x8531249a5d01629cba1e4922b38fe741812b1ac1cd3a573b05728246e7afa5d0":"0xef5d6bbb00000000000000000000000000000000000000000000000000000000","0x85d31e234fac3eaf0aabcc90b87430f7cdf882daceb77330b20cfc9ffe71d622":"0x100000000000000000000000000000000000000000000000000000000000000","0x87093bec0f51d39b26c6d2d541a3cb791b6b122779c1532922db748bce860dbf":"0x100000000000000000000000000000000000000000000000000000000000000","0x898d439bb77d498cd54a241cdcf6aca7d6d6d2d4664884519255723cc258b935":"0x0","0x8ad6da867ef106c6d1f149a116035030d0b4068ba5c7e79c64162a4899c8b953":"0x737900000000000000000000000000004163636573734d616e6167656d656e74","0x8ad6da867ef106c6d1f149a116035030d0b4068ba5c7e79c64162a4899c8b954":"0x40554c3a00000000000000000000000000000000000000000000000000000000","0x8b940e1bbb70b42b20e63c3de8ab5c3c7b4cd2cc02afefe9ce11aae17123bfe7":"0x73790000000000000000000000000000526567697374726174696f6e00000000","0x8c13bc3bb0860c7f24bec69b1609bb78678c6110c54ac89c5a808eea84ebeb81":"0x1010001000000000000000000000000000000000000000000000000000000","0x8c13bc3bb0860c7f24bec69b1609bb78678c6110c54ac89c5a808eea84ebeb82":"0x3402005f610000000000000000000000000000000000000000000000000000","0x8c13bc3bb0860c7f24bec69b1609bb78678c6110c54ac89c5a808eea84ebeb83":"0x1010060000000000000000000000000000000000000000000000000000000","0x8e4571acc83d9a018d0de792b5247ee3c2486ce1d0488b067679a0ada63ddc5c":"0x60030220202000000000000000000000000000000000000000000000000000","0x8e4571acc83d9a018d0de792b5247ee3c2486ce1d0488b067679a0ada63ddc5d":"0x2001005f000000000000000000000000000000000000000000000000000000","0x8e4571acc83d9a018d0de792b5247ee3c2486ce1d0488b067679a0ada63ddc5e":"0x6003025f5f5fc4c40000000000000000000000000000000000000000000000","0x9046b8d4cfddc5a1859dd70c031d1cfd84304623c74c59af41ae99e5b49964e2":"0x100000000000000000000000000000000000000000000000000000000000000","0x9052c2ed6540a1191fcb674982c3c720a477b41735235153e55722e854b15924":"0x15020014010000000000000000000000000000000000000000000000000000","0x9052c2ed6540a1191fcb674982c3c720a477b41735235153e55722e854b15925":"0x2001005f000000000000000000000000000000000000000000000000000000","0x9052c2ed6540a1191fcb674982c3c720a477b41735235153e55722e854b15926":"0x15020061600000000000000000000000000000000000000000000000000000","0x917efaeedbbb63935dfe5f43960051bb7a093cfd23e66b18afedf26f3ee387cd":"0xa00000000100000000000001a0","0x93b25ab6bde38be65b2c9784a44dd385dafa59a6235cc52df874b7af98e2583b":"0xa000000000a000000000000140","0x94414efa3a58d715d0cc6cf4b1eeae20893905d58df7fd49831b26895a38c47a":"0x20","0x94414efa3a58d715d0cc6cf4b1eeae20893905d58df7fd49831b26895a38c47b":"0x1","0x94414efa3a58d715d0cc6cf4b1eeae20893905d58df7fd49831b26895a38c47c":"0x20","0x94414efa3a58d715d0cc6cf4b1eeae20893905d58df7fd49831b26895a38c47d":"0x5","0x94414efa3a58d715d0cc6cf4b1eeae20893905d58df7fd49831b26895a38c47e":"0x76616c7565000000000000000000000000000000000000000000000000000000","0x946015aa832f49635cfa710ba22cd3893a711a01c3da57345d65c70a8c40167a":"0x73790000000000000000000000000000526567697374726174696f6e00000000","0x946015aa832f49635cfa710ba22cd3893a711a01c3da57345d65c70a8c40167b":"0xaa66e9c800000000000000000000000000000000000000000000000000000000","0x95414efa3a58d715d0cc6cf4b1eeae20893905d58df7fd49831b26895a38c47a":"0x20","0x95414efa3a58d715d0cc6cf4b1eeae20893905d58df7fd49831b26895a38c47b":"0x0","0x976e90b1c6064a91fef06336e51f0144d5d384f775208482c13796b1bb9de1d2":"0x7379000000000000000000000000000044656c65676174696f6e000000000000","0x976e90b1c6064a91fef06336e51f0144d5d384f775208482c13796b1bb9de1d3":"0x1fae630800000000000000000000000000000000000000000000000000000000","0x986dcaf23c4c20310f56066b3a5a04eb85a12fbbdefb7c6aafaad75666d6af51":"0x5","0x9b516da7d19c879b20d0ddb450bedf8d1bbbb8b2b4dfee447bc3dc86739dc81a":"0x100000000000000000000000000000000000000000000000000000000000000","0x9ba0d1aa696cef81e41a2e1d8bc07b093b285d7259d3345c222b42b32e3763c3":"0x20010020000000000000000000000000000000000000000000000000000000","0x9ba0d1aa696cef81e41a2e1d8bc07b093b285d7259d3345c222b42b32e3763c4":"0x340200611f0000000000000000000000000000000000000000000000000000","0x9ba0d1aa696cef81e41a2e1d8bc07b093b285d7259d3345c222b42b32e3763c5":"0x2001001f000000000000000000000000000000000000000000000000000000","0x9cb00bcc91c1637989cbf8438c24d5e0aae04428202de1e9e77aaa5861717987":"0x20010020000000000000000000000000000000000000000000000000000000","0x9cb00bcc91c1637989cbf8438c24d5e0aae04428202de1e9e77aaa5861717988":"0x2001005f000000000000000000000000000000000000000000000000000000","0x9cb00bcc91c1637989cbf8438c24d5e0aae04428202de1e9e77aaa5861717989":"0x2001001f000000000000000000000000000000000000000000000000000000","0xa06805710ffed17da507b77f62c4318095e67a05bc3c301ce35372189aecca0b":"0x73790000000000000000000000000000526567697374726174696f6e00000000","0xa06805710ffed17da507b77f62c4318095e67a05bc3c301ce35372189aecca0c":"0x1d2257ba00000000000000000000000000000000000000000000000000000000","0xa3173c6e0b2b6dd060b8296870fa517a36ee11d84ebb32de258dbfc6cf903bad":"0x1010001000000000000000000000000000000000000000000000000000000","0xa3173c6e0b2b6dd060b8296870fa517a36ee11d84ebb32de258dbfc6cf903bae":"0x2001005f000000000000000000000000000000000000000000000000000000","0xa3173c6e0b2b6dd060b8296870fa517a36ee11d84ebb32de258dbfc6cf903baf":"0x1010060000000000000000000000000000000000000000000000000000000","0xabdcf5fcdad32961c5464c504132d2964cc6b552027a24967bf443f726721a48":"0x7379000000000000000000000000000044656c65676174696f6e000000000000","0xacf952e824c74a077ddea81a9229dc740f19c711c06c9e2a71a9d8d8ab843fb6":"0x0","0xadc00942d1ab5906b34587fa9a584106a15cbe1b28931956b3bd6e5f871a5eef":"0x0","0xb08d0383a94bac407b8b4aadeb4bf785c45fcf356c5e084dbfa9e6f67152f7f1":"0x100000000000000000000000000000000000000000000000000000000000000","0xb645abaafba9726cb648b7b665adc793af8ed0736ffe5f4a298751754e8b5ef4":"0x4010004000000000000000000000000000000000000000000000000000000","0xb645abaafba9726cb648b7b665adc793af8ed0736ffe5f4a298751754e8b5ef5":"0x15020061000000000000000000000000000000000000000000000000000000","0xb645abaafba9726cb648b7b665adc793af8ed0736ffe5f4a298751754e8b5ef6":"0x4010003000000000000000000000000000000000000000000000000000000","0xbae2b0e596e31c19ebb3fb7a24f1642c2a0f5c897dbb3ed114892e46a2a701e2":"0xa00000000040000000000000e0","0xbc11a4a9115840ea6053000a3152198979cc00fad31006b56fe6bf60607d9da3":"0x20","0xbc11a4a9115840ea6053000a3152198979cc00fad31006b56fe6bf60607d9da4":"0x1","0xbc11a4a9115840ea6053000a3152198979cc00fad31006b56fe6bf60607d9da5":"0x20","0xbc11a4a9115840ea6053000a3152198979cc00fad31006b56fe6bf60607d9da6":"0xb","0xbc11a4a9115840ea6053000a3152198979cc00fad31006b56fe6bf60607d9da7":"0x6e616d6573706163654964000000000000000000000000000000000000000000","0xbc1d7977e8469167f263a5c90c11651cc465b2a83ebb0c7994b59cb90e03422b":"0x0","0xbca9b6ce5506d177bc6bc617ca7fdec033679bf1e319b5ef18fd9c8bb8f83d12":"0x0","0xbd11a4a9115840ea6053000a3152198979cc00fad31006b56fe6bf60607d9da3":"0x20","0xbd11a4a9115840ea6053000a3152198979cc00fad31006b56fe6bf60607d9da4":"0x1","0xbd11a4a9115840ea6053000a3152198979cc00fad31006b56fe6bf60607d9da5":"0x20","0xbd11a4a9115840ea6053000a3152198979cc00fad31006b56fe6bf60607d9da6":"0x5","0xbd11a4a9115840ea6053000a3152198979cc00fad31006b56fe6bf60607d9da7":"0x6f776e6572000000000000000000000000000000000000000000000000000000","0xbedd04f17700a89f6681c8cd031f9bb7d93f65a1d3aaa880387ffaa0c67c4255":"0x20","0xbedd04f17700a89f6681c8cd031f9bb7d93f65a1d3aaa880387ffaa0c67c4256":"0x2","0xbedd04f17700a89f6681c8cd031f9bb7d93f65a1d3aaa880387ffaa0c67c4257":"0x40","0xbedd04f17700a89f6681c8cd031f9bb7d93f65a1d3aaa880387ffaa0c67c4258":"0x80","0xbedd04f17700a89f6681c8cd031f9bb7d93f65a1d3aaa880387ffaa0c67c4259":"0x9","0xbedd04f17700a89f6681c8cd031f9bb7d93f65a1d3aaa880387ffaa0c67c425a":"0x64656c656761746f720000000000000000000000000000000000000000000000","0xbedd04f17700a89f6681c8cd031f9bb7d93f65a1d3aaa880387ffaa0c67c425b":"0x9","0xbedd04f17700a89f6681c8cd031f9bb7d93f65a1d3aaa880387ffaa0c67c425c":"0x64656c6567617465650000000000000000000000000000000000000000000000","0xbfbfb3a456b3b5b71f93a610ed63d55506d00644bf52a593e09762f2736726b2":"0x100000000000000000000000000000000000000000000000000000000000000","0xbfdd04f17700a89f6681c8cd031f9bb7d93f65a1d3aaa880387ffaa0c67c4255":"0x20","0xbfdd04f17700a89f6681c8cd031f9bb7d93f65a1d3aaa880387ffaa0c67c4256":"0x1","0xbfdd04f17700a89f6681c8cd031f9bb7d93f65a1d3aaa880387ffaa0c67c4257":"0x20","0xbfdd04f17700a89f6681c8cd031f9bb7d93f65a1d3aaa880387ffaa0c67c4258":"0x13","0xbfdd04f17700a89f6681c8cd031f9bb7d93f65a1d3aaa880387ffaa0c67c4259":"0x64656c65676174696f6e436f6e74726f6c496400000000000000000000000000","0xc04b83bb36d3a5fac6f2285429fd2dcb47489f475ac9b4a3f01b6e6086201727":"0x20010020000000000000000000000000000000000000000000000000000000","0xc04b83bb36d3a5fac6f2285429fd2dcb47489f475ac9b4a3f01b6e6086201728":"0x14010061000000000000000000000000000000000000000000000000000000","0xc04b83bb36d3a5fac6f2285429fd2dcb47489f475ac9b4a3f01b6e6086201729":"0x2001005f000000000000000000000000000000000000000000000000000000","0xc27d63213e7bdd3c446c63379a12827c9a9b0b0c57aca6f676dc4442446c19fd":"0x20","0xc27d63213e7bdd3c446c63379a12827c9a9b0b0c57aca6f676dc4442446c19fe":"0x1","0xc27d63213e7bdd3c446c63379a12827c9a9b0b0c57aca6f676dc4442446c19ff":"0x20","0xc27d63213e7bdd3c446c63379a12827c9a9b0b0c57aca6f676dc4442446c1a00":"0xb","0xc27d63213e7bdd3c446c63379a12827c9a9b0b0c57aca6f676dc4442446c1a01":"0x6e616d6573706163654964000000000000000000000000000000000000000000","0xc37d63213e7bdd3c446c63379a12827c9a9b0b0c57aca6f676dc4442446c19fd":"0x20","0xc37d63213e7bdd3c446c63379a12827c9a9b0b0c57aca6f676dc4442446c19fe":"0x1","0xc37d63213e7bdd3c446c63379a12827c9a9b0b0c57aca6f676dc4442446c19ff":"0x20","0xc37d63213e7bdd3c446c63379a12827c9a9b0b0c57aca6f676dc4442446c1a00":"0x13","0xc37d63213e7bdd3c446c63379a12827c9a9b0b0c57aca6f676dc4442446c1a01":"0x64656c65676174696f6e436f6e74726f6c496400000000000000000000000000","0xc39e0e5695ac5d7a7d9015722fd55992c29bff3503ff06901221b1fea59053e5":"0x0","0xc3b81e972cd75d2c4c6775baa9c76ba0f23478df196752ed803f651c2e395b11":"0x0","0xc481881354079103976bde920663756352709daa60b6b992cb37ec170935b730":"0x100000000000000000000000000000000000000000000000000000000000000","0xc70ce1a4e4cbea7d7573453ed17ecb7247067d63f0e1f364df9f3b758bb2a839":"0x24020020040000000000000000000000000000000000000000000000000000","0xc70ce1a4e4cbea7d7573453ed17ecb7247067d63f0e1f364df9f3b758bb2a83a":"0x4010043000000000000000000000000000000000000000000000000000000","0xc70ce1a4e4cbea7d7573453ed17ecb7247067d63f0e1f364df9f3b758bb2a83b":"0x2402005f430000000000000000000000000000000000000000000000000000","0xc792d57634756ac643016a4a81aad821b618fb7f70798975cfc165c4b0926a21":"0xa000000000a000000000000140","0xc861c9d57a2b572b297ea8aebbea9c4d0a9e7098dbfc93f2ecf1bfbd42d93914":"0x1ffffffff000000000000000000000000000000000000000000000000","0xca795e9184f885532cd187c901bb643e483ef76db569384d06a1efcc637f8797":"0x7379000000000000000000000000000042616c616e63655472616e7366657200","0xca795e9184f885532cd187c901bb643e483ef76db569384d06a1efcc637f8798":"0xc9c85a6000000000000000000000000000000000000000000000000000000000","0xcee01925594f5c2af08ec3e9f9ac724844160096b75449f07cb9c7f58b911638":"0x53e5c08d82a377167069ade46d087ab753538608010000000000000000000000","0xcfe551c3e83837b82f29b2290b50b13896b25a74dd951ce2074b1cdd4c728152":"0x0","0xd13f0638348485a411ad33ea5b88f718219923b9d2670a7ce382ca7b0313da61":"0x0","0xd2b5d9464d98bf3c8a49b2fea96ea9ae445a2731bbf0a0d9284af6e1f490d83f":"0x20","0xd2b5d9464d98bf3c8a49b2fea96ea9ae445a2731bbf0a0d9284af6e1f490d840":"0x1","0xd2b5d9464d98bf3c8a49b2fea96ea9ae445a2731bbf0a0d9284af6e1f490d841":"0x20","0xd2b5d9464d98bf3c8a49b2fea96ea9ae445a2731bbf0a0d9284af6e1f490d842":"0x10","0xd2b5d9464d98bf3c8a49b2fea96ea9ae445a2731bbf0a0d9284af6e1f490d843":"0x66756e6374696f6e53656c6563746f7200000000000000000000000000000000","0xd3316a9308e4b2011b0c8fdbba90b9a15418337754464b4bc43fb5b3f43e2483":"0x7379000000000000000000000000000042616c616e63655472616e7366657200","0xd3316a9308e4b2011b0c8fdbba90b9a15418337754464b4bc43fb5b3f43e2484":"0x45afd19900000000000000000000000000000000000000000000000000000000","0xd350e3164ec28def34ca325b0d460d6be63767af47c614c416ef467235a5f756":"0x300000005000000000000000000000000000000000000000000000000","0xd3b5d9464d98bf3c8a49b2fea96ea9ae445a2731bbf0a0d9284af6e1f490d83f":"0x20","0xd3b5d9464d98bf3c8a49b2fea96ea9ae445a2731bbf0a0d9284af6e1f490d840":"0x1","0xd3b5d9464d98bf3c8a49b2fea96ea9ae445a2731bbf0a0d9284af6e1f490d841":"0x20","0xd3b5d9464d98bf3c8a49b2fea96ea9ae445a2731bbf0a0d9284af6e1f490d842":"0x11","0xd3b5d9464d98bf3c8a49b2fea96ea9ae445a2731bbf0a0d9284af6e1f490d843":"0x66756e6374696f6e5369676e6174757265000000000000000000000000000000","0xd3e15bfaf0d03f763dfb584f202f79cdaf08914e8aa11d20d1e059c75f8f1e6d":"0x1010001000000000000000000000000000000000000000000000000000000","0xd3e15bfaf0d03f763dfb584f202f79cdaf08914e8aa11d20d1e059c75f8f1e6e":"0x8020023230000000000000000000000000000000000000000000000000000","0xd3e15bfaf0d03f763dfb584f202f79cdaf08914e8aa11d20d1e059c75f8f1e6f":"0x1010000000000000000000000000000000000000000000000000000000000","0xd4c31fb7c38b2825905418eb4ad20f9f3708e5de08075b35a570f1de21ca0fbc":"0x100000000000000000000000000000000000000000000000000000000000000","0xd5403e2a5c1269e433b84823159edb42aeeb4ee0a778b12568334b4da296df12":"0x100000000000000000000000000000000000000000000000000000000000000","0xd5419d5abea6b9547c915abadb6c5d018340a8211e94203725080e1fb6ce61fb":"0x0","0xd66ad0cb2eb3ca5203c08bccc53ffeac9d087ef93f63336829cbcb1bed498d94":"0x0","0xd7d76b7a857447d351e27e40692c8d0bbad4066a15155cf69a69a008a3158f88":"0x0","0xd9d8798cabaebe8647eacb6bb6786b388b10a791dde286dbca5b7e57b13b0455":"0x100000000000000000000000000000000000000000000000000000000000000","0xdebe7ec099213ede340f193c8bc4988497872813addff576525770f91401bccd":"0x100000000000000000000000000000000000000000000000000000000000000","0xdee0eba271d610240d13dd44390e43b47cd8d7efaf4a6e5dfe50815dfddbdf6b":"0x20010020000000000000000000000000000000000000000000000000000000","0xdee0eba271d610240d13dd44390e43b47cd8d7efaf4a6e5dfe50815dfddbdf6c":"0x14010061000000000000000000000000000000000000000000000000000000","0xdee0eba271d610240d13dd44390e43b47cd8d7efaf4a6e5dfe50815dfddbdf6d":"0x2001001f000000000000000000000000000000000000000000000000000000","0xe007f05d0027f270fcb460dce39a9a6c00916bcf592a04bcd179995496afacf3":"0x73790000000000000000000000000000426174636843616c6c00000000000000","0xe007f05d0027f270fcb460dce39a9a6c00916bcf592a04bcd179995496afacf4":"0x8fc8cf7e00000000000000000000000000000000000000000000000000000000","0xe123842220541b75cbd5af34b5b49228c7437ffb04c21e94c5c2cab059fa3907":"0x73790000000000000000000000000000426174636843616c6c00000000000000","0xe123842220541b75cbd5af34b5b49228c7437ffb04c21e94c5c2cab059fa3908":"0xce5e8dd900000000000000000000000000000000000000000000000000000000","0xe1590a705c700479c43192de27596e2bfab053ed45583f69eece475ca481d0fe":"0x100000000000000000000000000000000000000000000000000000000000000","0xe182df5ac43e52732c66523d53a8b43c0b2053c6c117d625b2d1f43130b88d36":"0x73790000000000000000000000000000526567697374726174696f6e00000000","0xe182df5ac43e52732c66523d53a8b43c0b2053c6c117d625b2d1f43130b88d37":"0x560912900000000000000000000000000000000000000000000000000000000","0xe2b7be2c1365c63484b4ed38cdb0f14ea15bfc726db0e393706c62338ed64dfa":"0xda4e062e8c69d39d9472945232a53f579904ac45000000000000000000000000","0xe6364d48753405d90146dd9fd6a216a3c10864af2a9ad4130b6ca90f1d08e0ff":"0x100000000000000000000000000000000000000000000000000000000000000","0xe70d8b7a00c164a7b909816a8e96290545adb0cbbf6a2efdf1396e3c41f9551f":"0xe26e5254da185192cb3b2c4cddeab304d979e414010000000000000000000000","0xe8312b6998cea1ca787efdc414b5122d152ea22380354aed58536d0b480dafb9":"0x20","0xe8312b6998cea1ca787efdc414b5122d152ea22380354aed58536d0b480dafba":"0x1","0xe8312b6998cea1ca787efdc414b5122d152ea22380354aed58536d0b480dafbb":"0x20","0xe8312b6998cea1ca787efdc414b5122d152ea22380354aed58536d0b480dafbc":"0x7","0xe8312b6998cea1ca787efdc414b5122d152ea22380354aed58536d0b480dafbd":"0x7461626c65496400000000000000000000000000000000000000000000000000","0xe8bb72c27df32d28a4ecdc022e59271d165b0883d0256d7a0902e9ffce821524":"0x100000000000000000000000000000000000000000000000000000000000000","0xe8e741ae27e64a43c390c39e06bc2afd935a0e1043e4b7e2004e8be955e2998e":"0x100000000000000000000000000000000000000000000000000000000","0xe8e741ae27e64a43c390c39e06bc2afd935a0e1043e4b7e2004e8be955e2998f":"0x2001005f000000000000000000000000000000000000000000000000000000","0xe8e741ae27e64a43c390c39e06bc2afd935a0e1043e4b7e2004e8be955e29990":"0x1b6000000000000000000000000000000000000000000000000000000","0xe9312b6998cea1ca787efdc414b5122d152ea22380354aed58536d0b480dafb9":"0x20","0xe9312b6998cea1ca787efdc414b5122d152ea22380354aed58536d0b480dafba":"0x1","0xe9312b6998cea1ca787efdc414b5122d152ea22380354aed58536d0b480dafbb":"0x20","0xe9312b6998cea1ca787efdc414b5122d152ea22380354aed58536d0b480dafbc":"0x5","0xe9312b6998cea1ca787efdc414b5122d152ea22380354aed58536d0b480dafbd":"0x686f6f6b73000000000000000000000000000000000000000000000000000000","0xea065f6c227b52ffe1b909dc13a774e2e20bc8ca1e37a1d8dc9136be83aa52e2":"0x573802f86c51b61d7cf620952217ec6ce0537d2e000000000000000000000000","0xeaea2ebfc4323672b9bc676168b72ae9cfdbaff781a04575d0c7b21cff882990":"0x20010020000000000000000000000000000000000000000000000000000000","0xeaea2ebfc4323672b9bc676168b72ae9cfdbaff781a04575d0c7b21cff882991":"0x14010061000000000000000000000000000000000000000000000000000000","0xeaea2ebfc4323672b9bc676168b72ae9cfdbaff781a04575d0c7b21cff882992":"0x2001001f000000000000000000000000000000000000000000000000000000","0xed9f26d6f539135e50ee3dcebaba810bf918c800a84a7126ae768fa09565866a":"0x0","0xedde9d3e92c016307f13f4b90f0d487039ad5250a7e0656ee14e4c8dbcf3dc65":"0xa000000000a000000000000140","0xf1131275d877439e54299447ffb4e50b041084886851f1430b2be29c4b5d189c":"0x8020004040000000000000000000000000000000000000000000000000000","0xf1131275d877439e54299447ffb4e50b041084886851f1430b2be29c4b5d189d":"0x14010061000000000000000000000000000000000000000000000000000000","0xf1131275d877439e54299447ffb4e50b041084886851f1430b2be29c4b5d189e":"0x8020023230000000000000000000000000000000000000000000000000000","0xf516c2ed8da4c8c3c223e23f33437f8addbee0143bf596976fb8ee003a9e5ab7":"0x0","0xf58b9a5c6164c5a99b1d25fef3a6abe305f9307742cfa0444f6899ad9fe14896":"0x1010001000000000000000000000000000000000000000000000000000000","0xf58b9a5c6164c5a99b1d25fef3a6abe305f9307742cfa0444f6899ad9fe14897":"0x340200615f0000000000000000000000000000000000000000000000000000","0xf58b9a5c6164c5a99b1d25fef3a6abe305f9307742cfa0444f6899ad9fe14898":"0x1010060000000000000000000000000000000000000000000000000000000","0xf5d74a24d2b05dcc2cc52fafc027753be34d3a4c792845a4f8c2fced2cd63ef9":"0x100000000000000000000000000000000000000000000000000000000000000","0xf88e7779c2e430f5f1a7b5332e244032ab981cf25cbe5ed75a1f728f61aba616":"0x0","0xfb0a7d7481de9d5d6801a8e234ee8cbb44cc75681ffdf00dc237e0d3fea12869":"0x100000000000000000000000000000000000000000000000000000000000000","0xfc8252f52cb141dabeba0d1ea576df3a16d535ef16a49b3ba8598177defb0415":"0x0","0xfd162759e1237430b13625703c7163a2e76c7e6d4bbc6341bfd8fe2e0c0f1da7":"0xa000000000a000000000000140","0xfde3305a74303df074c117063d7ebc1b16a2a569295e7280a51e29dee1df5454":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266000000000000000000000000","0xfe5151b977b779b712a4c12d734fadef3516f6339850da4fa664da06850d113b":"0x200000000000000000000000000000000000000000000000000000000000000","0xff5f1ad07a06856c02059917ce73032e34b059e605ec7dbf1eba1de9a3616e61":"0x73790000000000000000000000000000526567697374726174696f6e00000000","0xff5f1ad07a06856c02059917ce73032e34b059e605ec7dbf1eba1de9a3616e62":"0x3350b6a900000000000000000000000000000000000000000000000000000000","0xffa344a039c0abb916ceac52510f018943d6cf1e17152377c825c1e83d6b0bda":"0x0"}},"0x90f79bf6eb2c4f870365e785982e1f101e93b906":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x976ea74026e726554db657fa54763abd0c3a0aa9":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x9965507d1a55bcc2695c58ba16fb37d819b0a4dc":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0xa0ee7a142d267c1f36714e4a8f75612f20a79720":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0xa274b9a7e743cd8df3c6fd0abd47ed55fc943bc3":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106100725760003560e01c806345ec93541161005057806345ec9354146100e1578063c9c85a60146100f4578063e1af802c1461010757600080fd5b806301ffc9a714610077578063119df25f1461009f57806345afd199146100cc575b600080fd5b61008a610085366004611352565b61010f565b60405190151581526020015b60405180910390f35b6100a76101a8565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610096565b6100df6100da366004611394565b6101b7565b005b604051601f193601358152602001610096565b6100df6101023660046113e5565b6102b4565b6100a7610360565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fb5dee1270000000000000000000000000000000000000000000000000000000014806101a257507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b60006101b261036a565b905090565b6101bf61039c565b6101d0836101cb6101a8565b61040d565b60006101db8461045d565b905080821115610226576040517f0e0e2d4d00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044015b60405180910390fd5b610239846102348484611440565b6104f6565b6000808473ffffffffffffffffffffffffffffffffffffffff168460405160006040518083038185875af1925050503d8060008114610294576040519150601f19603f3d011682016040523d82523d6000602084013e610299565b606091505b5091509150816102ac576102ac816105af565b505050505050565b6102bc61039c565b6102c5836105b7565b6102ce826105b7565b6102d782610663565b6102e3836101cb6101a8565b60006102ee8461045d565b905080821115610334576040517f0e0e2d4d000000000000000000000000000000000000000000000000000000008152600481018290526024810183905260440161021d565b610342846102348484611440565b61035a83836103508661045d565b6102349190611453565b50505050565b60006101b26106ae565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcc36013560601c806103995750335b90565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000a274b9a7e743cd8df3c6fd0abd47ed55fc943bc316300361040b576040517f9f03a02600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b61041782826106b8565b610459576104248261071d565b816040517fd787b73700000000000000000000000000000000000000000000000000000000815260040161021d9291906114b6565b5050565b604080516001808252818301909252600091829190602080830190803683370190505090508281600081518110610496576104966114ee565b602090810291909101015260006104ee7f7462776f726c6400000000000000000042616c616e636573000000000000000083837e2001002000000000000000000000000000000000000000000000000000000061085a565b949350505050565b60408051600180825281830190925260009160208083019080368337019050509050828160008151811061052c5761052c6114ee565b6020026020010181815250506105aa7f7462776f726c6400000000000000000042616c616e636573000000000000000060001b8260008560405160200161057591815260200190565b60408051601f198184030181529190527e20010020000000000000000000000000000000000000000000000000000000610890565b505050565b805160208201fd5b7f6e730000000000000000000000000000000000000000000000000000000000007dffffffffffffffffffffffffffff000000000000000000000000000000008216178114610660577f6e730000000000000000000000000000000000000000000000000000000000008161062b8361071d565b6040517f5c30fb6f00000000000000000000000000000000000000000000000000000000815260040161021d9392919061151d565b50565b61066c816108ac565b610660578061067a8261071d565b6040517ffbf10ce600000000000000000000000000000000000000000000000000000000815260040161021d92919061155e565b60006101b2610949565b60006107067f6e730000000000000000000000000000000000000000000000000000000000007dffffffffffffffffffffffffffff0000000000000000000000000000000085161783610995565b8061071657506107168383610995565b9392505050565b606081601081901b600061073083610a6b565b9050827fffffffffffffffffffffffffffff00000000000000000000000000000000000083161561078b576107867fffffffffffffffffffffffffffff0000000000000000000000000000000000008416610a82565b6107c2565b6040518060400160405280600681526020017f3c726f6f743e00000000000000000000000000000000000000000000000000008152505b7fffffffffffffffffffffffffffffffff000000000000000000000000000000008316156107f8576107f383610a82565b61082f565b6040518060400160405280600681526020017f3c726f6f743e00000000000000000000000000000000000000000000000000008152505b60405160200161084193929190611577565b6040516020818303038152906040529350505050919050565b60006108876108698686610b26565b60ff858116601b0360080285901c166108828587610b7c565b610bb5565b95945050505050565b6108a5858561089f8487610b7c565b85610c06565b5050505050565b6040805160018082528183019092526000918291906020808301908036833701905050905082816000815181106108e5576108e56114ee565b6020908102919091010152600061093d7f746273746f72650000000000000000005265736f75726365496473000000000083837e0101000100000000000000000000000000000000000000000000000000000061085a565b90506104ee8160f81c90565b7f629a4c26e296b22a8e0856e9f6ecb2d1008d7e00081111962cd175fa7488e1755460009073ffffffffffffffffffffffffffffffffffffffff1680610990573391505090565b919050565b6040805160028082526060820183526000928392919060208301908036833701905050905083816000815181106109ce576109ce6114ee565b6020026020010181815250508273ffffffffffffffffffffffffffffffffffffffff1660001b81600181518110610a0757610a076114ee565b60209081029190910101526000610a5f7f7462776f726c640000000000000000005265736f75726365416363657373000083837e0101000100000000000000000000000000000000000000000000000000000061085a565b90506108878160f81c90565b6000610a7960706010611453565b9190911b919050565b606060005b6010811015610ae7577fffffffffffffffffffffffffffffffff000000000000000000000000000000008316600882021b7fff000000000000000000000000000000000000000000000000000000000000001615610ae757600101610a87565b604080517fffffffffffffffffffffffffffffffff000000000000000000000000000000008516602082015281516030909101909152818152806104ee565b60008282604051602001610b3b929190611605565b60408051601f1981840301815291905280516020909101207f86425bff6b57326c7859e89024fe4f238ca327a1ae4a230180dd2f0e88aaa7d9189392505050565b600080805b8360ff16811015610bad57610ba360ff601b83900360080287901c1683611453565b9150600101610b81565b509392505050565b600060208210610bdb57602082048401935060208281610bd757610bd7611641565b0691505b508254600882021b602082900380841115610bad576001850154600882021c82179150509392505050565b7f6f74000000000000000000000000000000000000000000000000000000000000847fffff0000000000000000000000000000000000000000000000000000000000001603610c9057837f8c0b5119d4cec7b284c6b1b39252a03d1e2f2d7451a5895562524c113bb952be848484604051610c83939291906116ac565b60405180910390a261035a565b6000610c9c8585610b26565b90506000610ca986610eaa565b905060005b8151811015610d7e576000828281518110610ccb57610ccb6114ee565b60200260200101519050610cf76004826affffffffffffffffffffff1916610f3390919063ffffffff16565b15610d75576040517f964f667d000000000000000000000000000000000000000000000000000000008152606082901c9063964f667d90610d42908b908b908b908b906004016116e9565b600060405180830381600087803b158015610d5c57600080fd5b505af1158015610d70573d6000803e3d6000fd5b505050505b50600101610cae565b50857f8c0b5119d4cec7b284c6b1b39252a03d1e2f2d7451a5895562524c113bb952be868686604051610db3939291906116ac565b60405180910390a2610dce828565ffffffffffff1685610f51565b60005b8151811015610ea1576000828281518110610dee57610dee6114ee565b60200260200101519050610e1a6008826affffffffffffffffffffff1916610f3390919063ffffffff16565b15610e98576040517fa8ba8721000000000000000000000000000000000000000000000000000000008152606082901c9063a8ba872190610e65908b908b908b908b906004016116e9565b600060405180830381600087803b158015610e7f57600080fd5b505af1158015610e93573d6000803e3d6000fd5b505050505b50600101610dd1565b50505050505050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110610ee457610ee46114ee565b60209081029190910101526000610f1c7f746273746f726500000000000000000053746f7265486f6f6b730000000000008383610f67565b90506104ee610f2e8260008451610fa1565b61102f565b60008160ff1682610f448560581c90565b1660ff1614905092915050565b6105aa83838351610f628560200190565b611040565b60606104ee610f778585856110ff565b6000610f9c85610f87898961117f565b9060ff166028026038011c64ffffffffff1690565b611192565b600081831180610fb15750835182115b15610fee578383836040517f23230fa300000000000000000000000000000000000000000000000000000000815260040161021d9392919061172d565b60208401610ffc8482611453565b9050600061100a8585611440565b6fffffffffffffffffffffffffffffffff1660809290921b9190911795945050505050565b6060600061071683601560006111b5565b82156110ba576020831061106a5760208304840193506020838161106657611066611641565b0692505b82156110ba5760208390036000600019600885021c1990506008850281811c91508351811c90508119875416828216178755508184116110ab57505061035a565b50600194909401939182900391015b5b602082106110dc5780518455600190930192601f19909101906020016110bb565b811561035a576000600019600884021c8554835182191691161785555050505050565b60008383604051602001611114929190611605565b604051602081830303815290604052805190602001208260f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f3b4102da22e32d82fc925482184f16c09fd4281692720b87d124aef6da48a0f1181860001c90509392505050565b600061071661118e8484611230565b5490565b60405160208101601f19603f8484010116604052828252610bad85858584611286565b606060006111c38560801c90565b90506fffffffffffffffffffffffffffffffff851660008582816111e9576111e9611641565b04905060405193506020840160208202810160405281855260005b82811015611224578451871c825293870193602090910190600101611204565b50505050509392505050565b60008282604051602001611245929190611605565b60408051601f1981840301815291905280516020909101207f14e2fcc58e58e68ec7edc30c8d50dccc3ce2714a623ec81f46b6a63922d76569189392505050565b821561130d57602083106112b0576020830484019350602083816112ac576112ac611641565b0692505b821561130d5760208390036000818410156112d35750600019600884021c6112dd565b50600019600882021c5b8554600886021b8184511682198216178452508184116112fe57505061035a565b50600194909401939182900391015b5b6020821061132f5783548152600190930192601f199091019060200161130e565b811561035a576000600019600884021c8251865482191691161782525050505050565b60006020828403121561136457600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461071657600080fd5b6000806000606084860312156113a957600080fd5b83359250602084013573ffffffffffffffffffffffffffffffffffffffff811681146113d457600080fd5b929592945050506040919091013590565b6000806000606084860312156113fa57600080fd5b505081359360208301359350604090920135919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156101a2576101a2611411565b808201808211156101a2576101a2611411565b60005b83811015611481578181015183820152602001611469565b50506000910152565b600081518084526114a2816020860160208601611466565b601f01601f19169290920160200192915050565b6040815260006114c9604083018561148a565b905073ffffffffffffffffffffffffffffffffffffffff831660208301529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7fffff00000000000000000000000000000000000000000000000000000000000084168152826020820152606060408201526000610887606083018461148a565b8281526040602082015260006104ee604083018461148a565b7fffff0000000000000000000000000000000000000000000000000000000000008416815260007f3a0000000000000000000000000000000000000000000000000000000000000080600284015284516115d8816003860160208901611466565b8084019050816003820152845191506115f8826004830160208801611466565b0160040195945050505050565b8281526000602080830184516020860160005b8281101561163457815184529284019290840190600101611618565b5091979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008151808452602080850194506020840160005b838110156116a157815187529582019590820190600101611685565b509495945050505050565b6060815260006116bf6060830186611670565b65ffffffffffff8516602084015282810360408401526116df818561148a565b9695505050505050565b8481526080602082015260006117026080830186611670565b65ffffffffffff851660408401528281036060840152611722818561148a565b979650505050505050565b606081526000611740606083018661148a565b6020830194909452506040015291905056fea164736f6c6343000818000a","storage":{}},"0xc9c022fcfebe730710ae93ca9247c5ec9d9236d0":{"nonce":0,"balance":"0xde0b6b3a7640000","code":"0x","storage":{}},"0xd416f26aafcaaeca50b0dc35bd023e7286be2961":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106101365760003560e01c80636548a90a116100b2578063b29e408911610081578063cdc938c511610066578063cdc938c514610295578063d5f8337f146102a8578063e1af802c146102bb57600080fd5b8063b29e40891461026f578063bfdfaff71461028257600080fd5b80636548a90a146102235780638da798da14610236578063a92813ad14610249578063aa66e9c81461025c57600080fd5b80631d2257ba116101095780633350b6a9116100ee5780633350b6a9146101ea57806345ec9354146101fd578063530f4b601461021057600080fd5b80631d2257ba146101ab57806326d98102146101be57600080fd5b806301ffc9a71461013b57806305609129146101635780630ba51f4914610178578063119df25f1461018b575b600080fd5b61014e610149366004614c75565b6102c3565b60405190151581526020015b60405180910390f35b610176610171366004614cb4565b61032c565b005b610176610186366004614d30565b610353565b61019361041e565b6040516001600160a01b03909116815260200161015a565b6101766101b9366004614e7d565b61042d565b6101d16101cc366004614ed6565b61044d565b6040516001600160e01b0319909116815260200161015a565b6101766101f8366004614f1d565b6105a3565b604051601f19360135815260200161015a565b61017661021e366004614f75565b61071e565b6101d1610231366004614fb3565b61078a565b610176610244366004615016565b610865565b610176610257366004614cb4565b610927565b61017661026a366004615050565b610966565b61017661027d366004615050565b610998565b610176610290366004615069565b610a2d565b6101766102a33660046150a3565b610aed565b6101766102b6366004614f75565b610b06565b610193610bc7565b60006001600160e01b031982167fb5dee12700000000000000000000000000000000000000000000000000000000148061032657506001600160e01b031982167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b610334610bd1565b6103458261034061041e565b610c35565b61034f8282610cae565b5050565b61035b610bd1565b600061036689610cd9565b6fffffffffffffffffffffffffffffffff1916036103c5578761038889610cf0565b6040517fe4ac069e0000000000000000000000000000000000000000000000000000000081526004016103bc929190615110565b60405180910390fd5b6103e8616e7360f01b6dffffffffffffffffffffffffffff60801b8a1617610e04565b6103f48861034061041e565b61041488888888610405888a615129565b61040f8789615129565b610e4f565b5050505050505050565b60006104286112b0565b905090565b610435610bd1565b61044861044061041e565b8484846112e2565b505050565b6000610457610bd1565b61737960f01b836001600160f01b031916146104b25761737960f01b8361047d85610cf0565b6040517f5c30fb6f0000000000000000000000000000000000000000000000000000000081526004016103bc939291906151af565b6104bb83610e04565b6104c78361034061041e565b60006104f06104d68560101b90565b71ffffffffffffffffffffffffffffffffffff191661133f565b9050600081846040516020016105079291906151d8565b604051602081830303815290604052905080805190602001209250600061052d846113c9565b90508015610573576040517f3d1d1ae20000000000000000000000000000000000000000000000000000000081526001600160e01b0319851660048201526024016103bc565b84516020860120610585858883611479565b61058f8187611544565b6105998584611544565b5050505092915050565b6105ab610bd1565b61737960f01b836001600160f01b031916146105d15761737960f01b8361047d85610cf0565b6dffffffffffffffffffffffffffff60801b8316616e7360f01b176105f581610e04565b6106018161034061041e565b61062b837fb5dee1270000000000000000000000000000000000000000000000000000000061160d565b600061063685610cd9565b6fffffffffffffffffffffffffffffffff191603610658578361038885610cf0565b600061066384611668565b905080158015906106745750848114155b156106b6576040517fc0b707410000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016103bc565b60006106c1866116ed565b90506001600160a01b038116156106ea576106db81611789565b6106e58382611808565b6106f5565b6106f58660016118a6565b610700868686611947565b61070a85876119ea565b61071683866001611a92565b505050505050565b610726610bd1565b610750827f1873396a0000000000000000000000000000000000000000000000000000000061160d565b610773616e7360f01b6dffffffffffffffffffffffffffff60801b851617610e04565b61077f8361034061041e565b610448838383611b41565b6000610794610bd1565b60408051616e7360f01b602082015260006022820181905260308201526107d691016040516020818303038152906040526107ce90615230565b61034061041e565b8280519060200120905060008280519060200120905060006107f7836113c9565b9050801561083d576040517f3d1d1ae20000000000000000000000000000000000000000000000000000000081526001600160e01b0319841660048201526024016103bc565b610848838784611479565b6108528285611544565b61085c8386611544565b50509392505050565b61086d610bd1565b610897827f6fdd1c800000000000000000000000000000000000000000000000000000000061160d565b6109136108a261041e565b600084846040516024016108b69190615254565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f13861fb500000000000000000000000000000000000000000000000000000000179052611c04565b5061034f8282805190602001206001611c31565b61092f610bd1565b61093b8261034061041e565b61034f7f7462776f726c6400000000000000000053797374656d486f6f6b7300000000008383611ce0565b61096e610bd1565b61097781611df3565b61098081610e04565b61098c8161034061041e565b61099581611e24565b50565b6109a0610bd1565b6109a981611df3565b6109b281611e8f565b6109bb81612081565b156109fe57806109ca82610cf0565b6040517f0dc28f6a0000000000000000000000000000000000000000000000000000000081526004016103bc929190615110565b610a098160016118a6565b610a1a81610a1561041e565b612106565b61099581610a2661041e565b6001611a92565b610a35610bd1565b610a3e83611df3565b610a47826121d0565b610a7d576040517f71ee9e8100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a898361034061041e565b6000610a94836116ed565b9050610ac0817f1a86b5500000000000000000000000000000000000000000000000000000000061160d565b610aca84846121ec565b815115610ae757610ae5610adc61041e565b8484600061226b565b505b50505050565b610af5610bd1565b610995610b0061041e565b8261227c565b610b0e610bd1565b61737960f01b836001600160f01b03191614610b345761737960f01b8361047d85610cf0565b610b5e827f540fbfa80000000000000000000000000000000000000000000000000000000061160d565b610b6783610e04565b610b8a616e7360f01b6dffffffffffffffffffffffffffff60801b851617610e04565b610b968361034061041e565b610448836bffffffffffffffffffffffff19606085901b166bff0000000000000000000000605885901b161761231e565b60006104286123c3565b6001600160a01b037f000000000000000000000000d416f26aafcaaeca50b0dc35bd023e7286be2961163003610c33576040517f9f03a02600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6001600160a01b038116610c62616e7360f01b6dffffffffffffffffffffffffffff60801b8516176123cd565b6001600160a01b03161461034f57610c7982610cf0565b816040517fd787b7370000000000000000000000000000000000000000000000000000000081526004016103bc929190615267565b61034f7f746273746f726500000000000000000053746f7265486f6f6b730000000000008383611ce0565b6000610ce7607060106152a8565b9190911b919050565b606081601081901b6000610d0383610cd9565b90508271ffffffffffffffffffffffffffffffffffff19831615610d4457610d3f71ffffffffffffffffffffffffffffffffffff19841661133f565b610d7b565b6040518060400160405280600681526020017f3c726f6f743e00000000000000000000000000000000000000000000000000008152505b6fffffffffffffffffffffffffffffffff19831615610da257610d9d8361133f565b610dd9565b6040518060400160405280600681526020017f3c726f6f743e00000000000000000000000000000000000000000000000000008152505b604051602001610deb939291906152bb565b6040516020818303038152906040529350505050919050565b610e0d81612081565b6109955780610e1b82610cf0565b6040517ffbf10ce60000000000000000000000000000000000000000000000000000000081526004016103bc929190615110565b613a3160f11b866001600160f01b03191614801590610e7d5750611bdd60f21b866001600160f01b03191614155b15610ede57613a3160f11b8687604051602001610e9c91815260200190565b60408051601f19818403018152908290527f31b466830000000000000000000000000000000000000000000000000000000082526103bc9392916004016151af565b610ee78561245e565b610ef28460016126a5565b610efd8360006126a5565b60e084901c60e885901c0160ff16825114610f5d5760e084901c60e885901c0160ff1682516040517f0f72cb98000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016103bc565b60e085901c60e886901c0160ff16815114610fbd5760e085901c60e886901c0160ff1681516040517f7dec4c00000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016103bc565b60e085901c60e886901c0160ff1660e084901c60e885901c0160ff16146110355760e085901c60e886901c0160ff1660e084901c60e885901c0160ff166040517ff29d4d88000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016103bc565b61103e85612841565b61104784612841565b146110995761105585612841565b61105e84612841565b6040517f65cc0adf000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016103bc565b6110a285612873565b6110ab84612873565b146110fd576110b985612873565b6110c284612873565b6040517fedea9587000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016103bc565b60005b61110986612841565b8110156111a45761113361111d8583612890565b60c581111561112e5761112e615331565b6128b8565b6008601b8390030287901c60ff161461119c576008601b8290030286901c60ff1661116161111d8684612890565b6040517f254c7db4000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016103bc565b600101611100565b5060006111ce613a3160f11b6111ba8960101b90565b60101c6001600160f01b0319919091161790565b905060006111e5611bdd60f21b6111ba8a60101b90565b90506111f082612081565b806111ff57506111ff81612081565b1561125957878860405160200161121891815260200190565b60408051601f19818403018152908290527fdfaaf9cf0000000000000000000000000000000000000000000000000000000082526103bc9291600401615110565b6112a588888888886040516020016112719190615347565b604051602081830303815290604052886040516020016112919190615347565b604051602081830303815290604052612918565b6104148860016118a6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcc36013560601c806112df5750335b90565b6112ed8484846129df565b6112f6826121d0565b15610ae7576000611306836116ed565b9050611332817f1a86b5500000000000000000000000000000000000000000000000000000000061160d565b610716858484600061226b565b606060005b6010811015611395576fffffffffffffffffffffffffffffffff198316600882021b7fff00000000000000000000000000000000000000000000000000000000000000161561139557600101611344565b604080516fffffffffffffffffffffffffffffffff198516602082015281516030909101909152818152805b949350505050565b60408051600180825281830190925260009182919060208083019080368337019050509050827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681600081518110611421576114216153c9565b602090810291909101015260006113c17f7462776f726c6400000000000000000046756e6374696f6e53656c6563746f7283837e24020020040000000000000000000000000000000000000000000000000000612a95565b60006114858383612acb565b60408051600180825281830190925291925060009160609183919060208083019080368337019050509050867bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916816000815181106114e3576114e36153c9565b602090810291909101015261153b7f7462776f726c6400000000000000000046756e6374696f6e53656c6563746f72828686867e24020020040000000000000000000000000000000000000000000000000000612b0a565b50505050505050565b6060600061155183612e10565b9050600061155e84612e20565b6040805160018082528183019092529192506000919060208083019080368337019050509050857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916816000815181106115b7576115b76153c9565b60209081029190910101526107167f6f74776f726c6400000000000000000046756e6374696f6e5369676e61747572828686867c0100000000000000000000000000000000000000000000000000000000612b0a565b6116178282612e49565b61034f576040517f74b5e6ff0000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526001600160e01b0319821660248201526044016103bc565b60408051600180825281830190925260009182919060208083019080368337019050509050826001600160a01b031660001b816000815181106116ad576116ad6153c9565b602090810291909101015260006113c17f7462776f726c6400000000000000000053797374656d526567697374727900008383630100080160dd1b612a95565b604080516001808252818301909252600091829190602080830190803683370190505090508281600081518110611726576117266153c9565b6020908102919091010152600061177e7f7462776f726c6400000000000000000053797374656d7300000000000000000083837e15020014010000000000000000000000000000000000000000000000000000612a95565b60601c949350505050565b60408051600180825281830190925260009160208083019080368337019050509050816001600160a01b031660001b816000815181106117cb576117cb6153c9565b602090810291909101015261034f7f7462776f726c6400000000000000000053797374656d5265676973747279000082630100080160dd1b612e65565b604080516002808252606082018352600092602083019080368337019050509050828160008151811061183d5761183d6153c9565b602002602001018181525050816001600160a01b031660001b81600181518110611869576118696153c9565b60209081029190910101526104487f7462776f726c640000000000000000005265736f75726365416363657373000082630101000160d81b612e65565b6040805160018082528183019092526000916020808301908036833701905050905082816000815181106118dc576118dc6153c9565b6020026020010181815250506104487f746273746f72650000000000000000005265736f75726365496473000000000060001b8260008560405160200161192a91151560f81b815260010190565b60408051601f19818403018152919052630101000160d81b613131565b60006119538383613146565b604080516001808252818301909252919250600091606091839190602080830190803683370190505090508681600081518110611992576119926153c9565b602090810291909101015261153b7f7462776f726c6400000000000000000053797374656d73000000000000000000828686867e15020014010000000000000000000000000000000000000000000000000000612b0a565b60408051600180825281830190925260009160208083019080368337019050509050826001600160a01b031660001b81600081518110611a2c57611a2c6153c9565b6020026020010181815250506104487f7462776f726c6400000000000000000053797374656d5265676973747279000060001b82600085604051602001611a7591815260200190565b60408051601f19818403018152919052630100080160dd1b613131565b6040805160028082526060820183526000926020830190803683370190505090508381600081518110611ac757611ac76153c9565b602002602001018181525050826001600160a01b031660001b81600181518110611af357611af36153c9565b602002602001018181525050610ae77f7462776f726c640000000000000000005265736f75726365416363657373000060001b8260008560405160200161192a91151560f81b815260010190565b613a3160f11b836001600160f01b03191614611b7157613a3160f11b8384604051602001610e9c91815260200190565b611b7a83612081565b611bd3578283604051602001611b9291815260200190565b60408051601f19818403018152908290527f41e713ad0000000000000000000000000000000000000000000000000000000082526103bc9291600401615110565b610448836bffffffffffffffffffffffff19606085901b166bff0000000000000000000000605885901b1617613176565b6060600080611c158787878761321b565b9150915081611c2757611c2781613293565b9695505050505050565b604080516002808252606082018352600092602083019080368337019050509050836001600160a01b031660001b81600081518110611c7257611c726153c9565b6020026020010181815250508281600181518110611c9257611c926153c9565b602002602001018181525050610ae77f7462776f726c64000000000000000000496e7374616c6c65644d6f64756c657360001b8260008560405160200161192a91151560f81b815260010190565b6000611cec848461329b565b90506000815167ffffffffffffffff811115611d0a57611d0a614dc6565b604051908082528060200260200182016040528015611d33578160200160208202803683370190505b5090506000805b8351811015611de457846001600160a01b0316611d7e858381518110611d6257611d626153c9565b60200260200101516affffffffffffffffffffff191660601c90565b6001600160a01b031614611ddc57838181518110611d9e57611d9e6153c9565b6020026020010151838381518110611db857611db86153c9565b6affffffffffffffffffffff19909216602092830291909101909101526001909101905b600101611d3a565b50808252610716868684613306565b616e7360f01b6dffffffffffffffffffffffffffff60801b821617811461099557616e7360f01b8161047d83610cf0565b604080516001808252818301909252600091602080830190803683370190505090508181600081518110611e5a57611e5a6153c9565b602090810291909101015261034f7f7462776f726c640000000000000000004e616d65737061636544656c656761748261335d565b6000611e9b8260101b90565b90506000611ebd71ffffffffffffffffffffffffffffffffffff19831661133f565b80519091508015610ae757611edf82611ed76001846153df565b016020015190565b7fff00000000000000000000000000000000000000000000000000000000000000167f5f0000000000000000000000000000000000000000000000000000000000000003611f70576040517f0efb4b8500000000000000000000000000000000000000000000000000000000815271ffffffffffffffffffffffffffffffffffff19841660048201526024016103bc565b60005b611f7e6001836153df565b811015610ae557602081840101517effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f5f0000000000000000000000000000000000000000000000000000000000000014801561202b5750611fe683611ed78360016152a8565b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f5f00000000000000000000000000000000000000000000000000000000000000145b15612079576040517f0efb4b8500000000000000000000000000000000000000000000000000000000815271ffffffffffffffffffffffffffffffffffff19851660048201526024016103bc565b600101611f73565b6040805160018082528183019092526000918291906020808301908036833701905050905082816000815181106120ba576120ba6153c9565b602090810291909101015260006120fa7f746273746f72650000000000000000005265736f7572636549647300000000008383630101000160d81b612a95565b90506113c18160f81c90565b60408051600180825281830190925260009160208083019080368337019050509050828160008151811061213c5761213c6153c9565b6020026020010181815250506104487f7462776f726c640000000000000000004e616d6573706163654f776e6572000060001b8260008560405160200161219b919060609190911b6bffffffffffffffffffffffff1916815260140190565b60408051601f198184030181529190527e14010014000000000000000000000000000000000000000000000000000000613131565b6000811515801561032657506121e5826133f8565b1592915050565b604080516001808252818301909252600091602080830190803683370190505090508281600081518110612222576122226153c9565b6020026020010181815250506104487f7462776f726c640000000000000000004e616d65737061636544656c6567617460001b82600085604051602001611a7591815260200190565b6060600080611c1587878787613458565b604080516002808252606082018352600092602083019080368337019050509050826001600160a01b031660001b816000815181106122bd576122bd6153c9565b602002602001018181525050816001600160a01b031660001b816001815181106122e9576122e96153c9565b60209081029190910101526104487f7462776f726c640000000000000000005573657244656c65676174696f6e436f8261335d565b604080516001808252818301909252600091602080830190803683370190505090508281600081518110612354576123546153c9565b6020026020010181815250506104487f7462776f726c6400000000000000000053797374656d486f6f6b73000000000060001b826000856040516020016123af91906affffffffffffffffffffff1991909116815260150190565b604051602081830303815290604052613628565b60006104286136d9565b604080516001808252818301909252600091829190602080830190803683370190505090508281600081518110612406576124066153c9565b6020908102919091010152600061177e7f7462776f726c640000000000000000004e616d6573706163654f776e6572000083837e14010014000000000000000000000000000000000000000000000000000000612a95565b80612495576040517fa019e4da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006124a082612873565b905060058111156124e7576040517f6793df6200000000000000000000000000000000000000000000000000000000815260048101829052600560248201526044016103bc565b60006124f283612841565b9050600061250083836152a8565b9050601c811115612547576040517fecd893b900000000000000000000000000000000000000000000000000000000815260048101829052601c60248201526044016103bc565b6000805b838110156125f25760ff601b82900360080287901c16600081900361259f576040517f53b2dd05000000000000000000000000000000000000000000000000000000008152600481018390526024016103bc565b60208111156125dd576040517f7237f237000000000000000000000000000000000000000000000000000000008152600481018390526024016103bc565b6125e781846152a8565b92505060010161254b565b506125fc85613718565b81146126485761260b85613718565b6040517feba964de0000000000000000000000000000000000000000000000000000000081526004810191909152602481018290526044016103bc565b825b601c8110156107165760ff601b82900360080287901c16801561269c576040517f1d8d44db000000000000000000000000000000000000000000000000000000008152600481018390526024016103bc565b5060010161264a565b801580156126b1575081155b156126d25760405163d498615960e01b8152600060048201526024016103bc565b60006126dd83612873565b905060058111156127045760405163d498615960e01b8152600481018290526024016103bc565b600061270f84612841565b9050600061271d83836152a8565b9050601c8111156127445760405163d498615960e01b8152600481018290526024016103bc565b6000805b838110156127b057600061275f61111d8984612890565b90508060000361279b576040517ff44b422000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127a581846152a8565b925050600101612748565b506127ba86613718565b81146127e5576127c986613718565b60405163d498615960e01b81526004016103bc91815260200190565b825b8281101561153b5760006127fe61111d8984612890565b90508015612838576040517ff44b422000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001016127e7565b600060086001612853600260206153df565b61285d91906153df565b61286791906153f2565b8260ff911c1692915050565b60006008600180612886600260206153df565b61285391906153df565b6000601b8290036008028360ff911c1660c58111156128b1576128b1615331565b9392505050565b6000808260c58111156128cd576128cd615331565b60ff16905060618110156128e757601f1660010192915050565b60618360c58111156128fb576128fb615331565b036129095750601492915050565b50600092915050565b50919050565b600061292586868661373b565b905060006129338484613771565b90506000612941858561378e565b6040805160018082528183019092529192506000919060208083019080368337019050509050898160008151811061297b5761297b6153c9565b60209081029190910101526129d37f746273746f72650000000000000000005461626c657300000000000000000000828686867e60030220202000000000000000000000000000000000000000000000000000612b0a565b50505050505050505050565b604080516002808252606082018352600092602083019080368337019050509050836001600160a01b031660001b81600081518110612a2057612a206153c9565b602002602001018181525050826001600160a01b031660001b81600181518110612a4c57612a4c6153c9565b602002602001018181525050610ae77f7462776f726c640000000000000000005573657244656c65676174696f6e436f60001b82600085604051602001611a7591815260200190565b6000612ac2612aa486866137a3565b60ff858116601b0360080285901c16612abd85876137f9565b613832565b95945050505050565b60608282604051602001612af39291909182526001600160e01b031916602082015260240190565b604051602081830303815290604052905092915050565b611bdd60f21b866001600160f01b03191603612b6357857f8dbb3a9672eebfd3773e72dd9c102393436816d832c7ba9e1e1ac8fcadcac7a986868686604051612b569493929190615445565b60405180910390a2610716565b6000612b6e87613883565b905060005b8151811015612c47576000828281518110612b9057612b906153c9565b60200260200101519050612bbc6001826affffffffffffffffffffff191661390790919063ffffffff16565b15612c3e576040517f57066c9c000000000000000000000000000000000000000000000000000000008152606082901c906357066c9c90612c0b908c908c908c908c908c908c90600401615484565b600060405180830381600087803b158015612c2557600080fd5b505af1158015612c39573d6000803e3d6000fd5b505050505b50600101612b73565b50867f8dbb3a9672eebfd3773e72dd9c102393436816d832c7ba9e1e1ac8fcadcac7a987878787604051612c7e9493929190615445565b60405180910390a26000612c9288886137a3565b90506000602087019050612caa826000895184613925565b6000612cb585612873565b1115612d39576000612cc78a8a6139e4565b878155905060208601915060008060005b612ce188612873565b8160ff161015612d3457612cf68d8d83613a3a565b9250612d118a8260ff166028026038011c64ffffffffff1690565b9150612d208360008488613925565b612d2a82866152a8565b9450600101612cd8565b505050505b60005b83518110156129d3576000848281518110612d5957612d596153c9565b60200260200101519050612d856002826affffffffffffffffffffff191661390790919063ffffffff16565b15612e07576040517f5b28cdaf000000000000000000000000000000000000000000000000000000008152606082901c90635b28cdaf90612dd4908e908e908e908e908e908e90600401615484565b600060405180830381600087803b158015612dee57600080fd5b505af1158015612e02573d6000803e3d6000fd5b505050505b50600101612d3c565b60006103268251603881901b1790565b606081604051602001612e3391906154dd565b6040516020818303038152906040529050919050565b6000612e5483613aba565b80156128b157506128b18383613afb565b611bdd60f21b836001600160f01b03191603612eb857827f0e1f72f429eb97e64878619984a91e687ae91610348b9ff4216782cc96e49d0783604051612eab91906154f9565b60405180910390a2505050565b6000612ec384613883565b905060005b8151811015612f96576000828281518110612ee557612ee56153c9565b60200260200101519050612f116040826affffffffffffffffffffff191661390790919063ffffffff16565b15612f8d576040517f9faeaf45000000000000000000000000000000000000000000000000000000008152606082901c90639faeaf4590612f5a9089908990899060040161550c565b600060405180830381600087803b158015612f7457600080fd5b505af1158015612f88573d6000803e3d6000fd5b505050505b50600101612ec8565b50837f0e1f72f429eb97e64878619984a91e687ae91610348b9ff4216782cc96e49d0784604051612fc791906154f9565b60405180910390a26000612fdb85856137a3565b9050613034816000612fec86613718565b67ffffffffffffffff81111561300457613004614dc6565b6040519080825280601f01601f19166020018201604052801561302e576020820181803683370190505b50613bb3565b600061303f84612873565b111561306057600061305186866139e4565b905061305e816020613bc9565b505b60005b8251811015610716576000838281518110613080576130806153c9565b602002602001015190506130ac6080826affffffffffffffffffffff191661390790919063ffffffff16565b15613128576040517f83b5c95b000000000000000000000000000000000000000000000000000000008152606082901c906383b5c95b906130f5908a908a908a9060040161550c565b600060405180830381600087803b15801561310f57600080fd5b505af1158015613123573d6000803e3d6000fd5b505050505b50600101613063565b610ae5858561314084876137f9565b85613c06565b604051606083811b6bffffffffffffffffffffffff1916602083015282151560f81b603483015290603501612af3565b6040805160018082528183019092526000916020808301908036833701905050905082816000815181106131ac576131ac6153c9565b6020026020010181815250506104487f746273746f726500000000000000000053746f7265486f6f6b7300000000000060001b8260008560405160200161320791906affffffffffffffffffffff1991909116815260150190565b604051602081830303815290604052613e6e565b60006060836001600160a01b03166000613236858989613ea9565b60405161324391906154dd565b60006040518083038185875af1925050503d8060008114613280576040519150601f19603f3d011682016040523d82523d6000602084013e613285565b606091505b509097909650945050505050565b805160208201fd5b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106132d5576132d56153c9565b60200260200101818152505060006132ef85836000613ec0565b9050612ac26133018260008451613efa565b613f88565b60408051600180825281830190925260009160208083019080368337019050509050828160008151811061333c5761333c6153c9565b602002602001018181525050610ae78482600061335886613f99565b613fa9565b60006133676136d9565b9050306001600160a01b03821603613383576104488383613fe4565b6040517f505a181d0000000000000000000000000000000000000000000000000000000081526001600160a01b0382169063505a181d906133ca9086908690600401615535565b600060405180830381600087803b1580156133e457600080fd5b505af115801561153b573d6000803e3d6000fd5b6040805161737960f01b60208201526000602282018190527f756e6c696d6974656400000000000000000000000000000000000000000000006030830152910160405160208183030381529060405261345090615230565b909114919050565b60006060600061346786613ff7565b905060005b815181101561353a576000828281518110613489576134896153c9565b602002602001015190506134b56001826affffffffffffffffffffff191661390790919063ffffffff16565b15613531576040517fc3323031000000000000000000000000000000000000000000000000000000008152606082901c9063c3323031906134fe908c908c908c9060040161554e565b600060405180830381600087803b15801561351857600080fd5b505af115801561352c573d6000803e3d6000fd5b505050505b5060010161346c565b5061354787858888614069565b909350915060005b815181101561361d57600082828151811061356c5761356c6153c9565b602002602001015190506135986002826affffffffffffffffffffff191661390790919063ffffffff16565b15613614576040517f973d8f99000000000000000000000000000000000000000000000000000000008152606082901c9063973d8f99906135e1908c908c908c9060040161554e565b600060405180830381600087803b1580156135fb57600080fd5b505af115801561360f573d6000803e3d6000fd5b505050505b5060010161354f565b505094509492505050565b60006136326136d9565b9050306001600160a01b038216036136555761365085858585613e6e565b610ae5565b6040517f150f32620000000000000000000000000000000000000000000000000000000081526001600160a01b0382169063150f3262906136a0908890889088908890600401615576565b600060405180830381600087803b1580156136ba57600080fd5b505af11580156136ce573d6000803e3d6000fd5b505050505050505050565b7f629a4c26e296b22a8e0856e9f6ecb2d1008d7e00081111962cd175fa7488e175546000906001600160a01b031680613713573391505090565b919050565b60006008613728600260206153df565b61373291906153f2565b9190911c919050565b60408051602081018590529081018390526060818101839052906080015b60405160208183030381529060405290509392505050565b8151815160009181810160389190911b1760609190911b176128b1565b60608282604051602001612af39291906155aa565b600082826040516020016137b89291906155d9565b60408051601f1981840301815291905280516020909101207f86425bff6b57326c7859e89024fe4f238ca327a1ae4a230180dd2f0e88aaa7d9189392505050565b600080805b8360ff1681101561382a5761382060ff601b83900360080287901c16836152a8565b91506001016137fe565b509392505050565b6000602082106138585760208204840193506020828161385457613854615615565b0691505b508254600882021b60208290038084111561382a576001850154600882021c82179150509392505050565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106138bd576138bd6153c9565b602090810291909101015260006138f57f746273746f726500000000000000000053746f7265486f6f6b730000000000008383613ec0565b90506113c16133018260008451613efa565b60008160ff16826139188560581c90565b1660ff1614905092915050565b821561399f576020831061394f5760208304840193506020838161394b5761394b615615565b0692505b821561399f5760208390036000600019600885021c1990506008850281811c91508351811c9050811987541682821617875550818411613990575050610ae7565b50600194909401939182900391015b5b602082106139c15780518455600190930192601f19909101906020016139a0565b8115610ae7576000600019600884021c8554835182191691161785555050505050565b600082826040516020016139f99291906155d9565b60408051601f1981840301815291905280516020909101207f14e2fcc58e58e68ec7edc30c8d50dccc3ce2714a623ec81f46b6a63922d76569189392505050565b60008383604051602001613a4f9291906155d9565b604051602081830303815290604052805190602001208260f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f3b4102da22e32d82fc925482184f16c09fd4281692720b87d124aef6da48a0f1181860001c90509392505050565b6000613ae6827f01ffc9a700000000000000000000000000000000000000000000000000000000613afb565b801561032657506121e5826001600160e01b03195b6040516001600160e01b031982166024820152600090819060440160408051601f19818403018152919052602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825192935060009283928392909183918a617530fa92503d91506000519050828015613b9c575060208210155b8015613ba85750600081115b979650505050505050565b61044883838351613bc48560200190565b613925565b60006020613bd883601f6152a8565b613be2919061562b565b613bec90846152a8565b90505b808310156104485760008355600183019250613bef565b611bdd60f21b846001600160f01b03191603613c5d57837f8c0b5119d4cec7b284c6b1b39252a03d1e2f2d7451a5895562524c113bb952be848484604051613c509392919061564d565b60405180910390a2610ae7565b6000613c6985856137a3565b90506000613c7686613883565b905060005b8151811015613d4b576000828281518110613c9857613c986153c9565b60200260200101519050613cc46004826affffffffffffffffffffff191661390790919063ffffffff16565b15613d42576040517f964f667d000000000000000000000000000000000000000000000000000000008152606082901c9063964f667d90613d0f908b908b908b908b90600401615680565b600060405180830381600087803b158015613d2957600080fd5b505af1158015613d3d573d6000803e3d6000fd5b505050505b50600101613c7b565b50857f8c0b5119d4cec7b284c6b1b39252a03d1e2f2d7451a5895562524c113bb952be868686604051613d809392919061564d565b60405180910390a2613d9b828565ffffffffffff1685613bb3565b60005b815181101561153b576000828281518110613dbb57613dbb6153c9565b60200260200101519050613de76008826affffffffffffffffffffff191661390790919063ffffffff16565b15613e65576040517fa8ba8721000000000000000000000000000000000000000000000000000000008152606082901c9063a8ba872190613e32908b908b908b908b90600401615680565b600060405180830381600087803b158015613e4c57600080fd5b505af1158015613e60573d6000803e3d6000fd5b505050505b50600101613d9e565b6000613e7a858561413b565b90506000613e97828560ff166028026038011c64ffffffffff1690565b9050610716868686846000888861414e565b6060838383604051602001613759939291906156b9565b60606113c1613ed0858585613a3a565b6000613ef585613ee0898961413b565b9060ff166028026038011c64ffffffffff1690565b6144f8565b600081831180613f0a5750835182115b15613f47578383836040517f23230fa30000000000000000000000000000000000000000000000000000000081526004016103bc939291906156f8565b60208401613f5584826152a8565b90506000613f6385856153df565b6fffffffffffffffffffffffffffffffff1660809290921b9190911795945050505050565b606060006128b1836015600061451b565b6060816128b18160156000614596565b6000613fb5858561413b565b90506000613fd2828560ff166028026038011c64ffffffffff1690565b9050610716868686600085888861414e565b61034f8282613ff2856145ea565b612e65565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110614031576140316153c9565b602090810291909101015260006138f57f7462776f726c6400000000000000000053797374656d486f6f6b7300000000008383613ec0565b600060606000806140798661466f565b90925090506001600160a01b0382166140965785610e1b87610cf0565b806140a5576140a58689614727565b86156140e9576dffffffffffffffffffffffffffff60801b8616616e7360f01b1760006140d18261473e565b90506140e6826140e18b846152a8565b6147b7565b50505b60006140f58760101b90565b71ffffffffffffffffffffffffffffffffffff1916146141205761411b8888848861321b565b61412c565b61412c88888488614836565b90999098509650505050505050565b60006128b161414a84846139e4565b5490565b613a3160f11b876001600160f01b0319161461417e57613a3160f11b8788604051602001610e9c91815260200190565b6000614199828760ff166028026038011c64ffffffffff1690565b9050600083518564ffffffffff16836141b291906153df565b6141bc91906152a8565b90508082141580156141de5750816141d4868861571d565b64ffffffffff1614155b1561422e576040517fa65010b400000000000000000000000000000000000000000000000000000000815264ffffffffff80881660048301528087166024830152831660448201526064016103bc565b818664ffffffffff16111561427f576040517f7e8578d30000000000000000000000000000000000000000000000000000000081526004810183905264ffffffffff871660248201526044016103bc565b600061428c848984614897565b905060006142998b613883565b905060005b81518110156143645760008282815181106142bb576142bb6153c9565b602002602001015190506142e76010826affffffffffffffffffffff191661390790919063ffffffff16565b1561435b57606081901c6001600160a01b03166355eb5a288e8e8e8e8e8d8f6040518863ffffffff1660e01b81526004016143289796959493929190615742565b600060405180830381600087803b15801561434257600080fd5b505af1158015614356573d6000803e3d6000fd5b505050505b5060010161429e565b5064ffffffffff881660005b8a60ff168160ff1610156143a357614397878260ff166028026038011c64ffffffffff1690565b90910190600101614370565b508b7ffe158a7adba34e256807c8a149028d3162918713c3838afc643ce9f96716ebfd8c8c848c888d6040516143de969594939291906157a0565b60405180910390a2508284146143ff5760006143fa8c8c6139e4565b839055505b600061440c8c8c8c613a3a565b9050614420818a64ffffffffff1689613bb3565b5060005b81518110156144ea576000828281518110614441576144416153c9565b6020026020010151905061446d6020826affffffffffffffffffffff191661390790919063ffffffff16565b156144e157606081901c6001600160a01b031663635845338e8e8e8e8e8a8f6040518863ffffffff1660e01b81526004016144ae9796959493929190615742565b600060405180830381600087803b1580156144c857600080fd5b505af11580156144dc573d6000803e3d6000fd5b505050505b50600101614424565b505050505050505050505050565b60405160208101601f19603f848401011660405282825261382a85858584614965565b606060006145298560801c90565b90506fffffffffffffffffffffffffffffffff8516600085828161454f5761454f615615565b04905060405193506020840160208202810160405281855260005b8281101561458a578451871c82529387019360209091019060010161456a565b50505050509392505050565b825160609060006145a785836153f2565b9050604051925060208301601f19603f83860101166040528184526000602088015b8482101561458a578051871b835291870191600191909101906020016145c9565b60007f8b9d8c8b908d9affffffffffffffffffab9e9d939a8d00000000000000000000820161463957507e60030220202000000000000000000000000000000000000000000000000000919050565b6103266146667f746273746f72650000000000000000005461626c65730000000000000000000084614a31565b60206000613832565b604080516001808252818301909252600091829182916020808301908036833701905050905083816000815181106146a9576146a96153c9565b6020908102919091010152600080806147027f7462776f726c6400000000000000000053797374656d73000000000000000000857e15020014010000000000000000000000000000000000000000000000000000614a4d565b5050602081015160349091015160609190911c9860f89190911c975095505050505050565b6147318282614b55565b61034f57610c7982610cf0565b604080516001808252818301909252600091829190602080830190803683370190505090508281600081518110614777576147776153c9565b602090810291909101015260006113c17f7462776f726c6400000000000000000042616c616e63657300000000000000008383630100080160dd1b612a95565b6040805160018082528183019092526000916020808301908036833701905050905082816000815181106147ed576147ed6153c9565b6020026020010181815250506104487f7462776f726c6400000000000000000042616c616e636573000000000000000060001b82600085604051602001611a7591815260200190565b60006060836001600160a01b031661484f848888613ea9565b60405161485c91906154dd565b600060405180830381855af49150503d8060008114613280576040519150601f19603f3d011682016040523d82523d6000602084013e613285565b600064ffffffffff8211156148db576040517f7149a3c1000000000000000000000000000000000000000000000000000000008152600481018390526024016103bc565b8366ffffffffffffff811660ff851660280260380182901c64ffffffffff1680851061490d5780850382019150614915565b848103820391505b5064ffffffffff6038602860ff8816020181811b197fffffffffffffffffffffffffffffffffffffffffffffffffff000000000000009490941690921792909216918416901b1790509392505050565b82156149ec576020831061498f5760208304840193506020838161498b5761498b615615565b0692505b82156149ec5760208390036000818410156149b25750600019600884021c6149bc565b50600019600882021c5b8554600886021b8184511682198216178452508184116149dd575050610ae7565b50600194909401939182900391015b5b60208210614a0e5783548152600190930192601f19909101906020016149ed565b8115610ae7576000600019600884021c8251865482191691161782525050505050565b60408051602081018490529081018290526000906060016137b8565b6060600060606000614a5e85613718565b9050614a6b878783614b8b565b93506000614a7886612873565b90508015614b4a57614a8a888861413b565b935066ffffffffffffff841667ffffffffffffffff811115614aae57614aae614dc6565b6040519080825280601f01601f191660200182016040528015614ad8576020820181803683370190505b5092506020830160005b828160ff161015614b47576000614afa8b8b84613a3a565b90506000614b17888460ff166028026038011c64ffffffffff1690565b9050614b268260008387614965565b614b3081856152a8565b935050508080614b3f906157fc565b915050614ae2565b50505b505093509350939050565b6000614b7b616e7360f01b6dffffffffffffffffffffffffffff60801b85161783614bc4565b806128b157506128b18383614bc4565b606081600003614baa57506040805160208101909152600081526128b1565b6000614bb685856137a3565b9050612ac2816000856144f8565b604080516002808252606082018352600092839291906020830190803683370190505090508381600081518110614bfd57614bfd6153c9565b602002602001018181525050826001600160a01b031660001b81600181518110614c2957614c296153c9565b60209081029190910101526000614c697f7462776f726c640000000000000000005265736f7572636541636365737300008383630101000160d81b612a95565b9050612ac28160f81c90565b600060208284031215614c8757600080fd5b81356001600160e01b0319811681146128b157600080fd5b6001600160a01b038116811461099557600080fd5b60008060408385031215614cc757600080fd5b823591506020830135614cd981614c9f565b809150509250929050565b60008083601f840112614cf657600080fd5b50813567ffffffffffffffff811115614d0e57600080fd5b6020830191508360208260051b8501011115614d2957600080fd5b9250929050565b60008060008060008060008060c0898b031215614d4c57600080fd5b88359750602089013596506040890135955060608901359450608089013567ffffffffffffffff80821115614d8057600080fd5b614d8c8c838d01614ce4565b909650945060a08b0135915080821115614da557600080fd5b50614db28b828c01614ce4565b999c989b5096995094979396929594505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715614e0557614e05614dc6565b604052919050565b600082601f830112614e1e57600080fd5b813567ffffffffffffffff811115614e3857614e38614dc6565b614e4b6020601f19601f84011601614ddc565b818152846020838601011115614e6057600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215614e9257600080fd5b8335614e9d81614c9f565b925060208401359150604084013567ffffffffffffffff811115614ec057600080fd5b614ecc86828701614e0d565b9150509250925092565b60008060408385031215614ee957600080fd5b82359150602083013567ffffffffffffffff811115614f0757600080fd5b614f1385828601614e0d565b9150509250929050565b600080600060608486031215614f3257600080fd5b833592506020840135614f4481614c9f565b915060408401358015158114614f5957600080fd5b809150509250925092565b803560ff8116811461371357600080fd5b600080600060608486031215614f8a57600080fd5b833592506020840135614f9c81614c9f565b9150614faa60408501614f64565b90509250925092565b600080600060608486031215614fc857600080fd5b83359250602084013567ffffffffffffffff80821115614fe757600080fd5b614ff387838801614e0d565b9350604086013591508082111561500957600080fd5b50614ecc86828701614e0d565b6000806040838503121561502957600080fd5b823561503481614c9f565b9150602083013567ffffffffffffffff811115614f0757600080fd5b60006020828403121561506257600080fd5b5035919050565b60008060006060848603121561507e57600080fd5b8335925060208401359150604084013567ffffffffffffffff811115614ec057600080fd5b6000602082840312156150b557600080fd5b81356128b181614c9f565b60005b838110156150db5781810151838201526020016150c3565b50506000910152565b600081518084526150fc8160208601602086016150c0565b601f01601f19169290920160200192915050565b8281526040602082015260006113c160408301846150e4565b600067ffffffffffffffff8084111561514457615144614dc6565b8360051b602061515660208301614ddc565b8681529185019160208101903684111561516f57600080fd5b865b848110156151a3578035868111156151895760008081fd5b61519536828b01614e0d565b845250918301918301615171565b50979650505050505050565b6001600160f01b031984168152826020820152606060408201526000612ac260608301846150e4565b600083516151ea8184602088016150c0565b7f5f5f00000000000000000000000000000000000000000000000000000000000090830190815283516152248160028401602088016150c0565b01600201949350505050565b805160208083015191908110156129125760001960209190910360031b1b16919050565b6020815260006128b160208301846150e4565b60408152600061527a60408301856150e4565b90506001600160a01b03831660208301529392505050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561032657610326615292565b6001600160f01b03198416815260007f3a0000000000000000000000000000000000000000000000000000000000000080600284015284516153048160038601602089016150c0565b8084019050816003820152845191506153248260048301602088016150c0565b0160040195945050505050565b634e487b7160e01b600052602160045260246000fd5b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b828110156153bc577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526153aa8583516150e4565b94509285019290850190600101615370565b5092979650505050505050565b634e487b7160e01b600052603260045260246000fd5b8181038181111561032657610326615292565b808202811582820484141761032657610326615292565b60008151808452602080850194506020840160005b8381101561543a5781518752958201959082019060010161541e565b509495945050505050565b6080815260006154586080830187615409565b828103602084015261546a81876150e4565b90508460408401528281036060840152613ba881856150e4565b86815260c06020820152600061549d60c0830188615409565b82810360408401526154af81886150e4565b905085606084015282810360808401526154c981866150e4565b9150508260a0830152979650505050505050565b600082516154ef8184602087016150c0565b9190910192915050565b6020815260006128b16020830184615409565b8381526060602082015260006155256060830185615409565b9050826040830152949350505050565b8281526040602082015260006113c16040830184615409565b6001600160a01b0384168152826020820152606060408201526000612ac260608301846150e4565b84815260806020820152600061558f6080830186615409565b60ff851660408401528281036060840152613ba881856150e4565b600083516155bc8184602088016150c0565b8351908301906155d08183602088016150c0565b01949350505050565b8281526000602080830184516020860160005b82811015615608578151845292840192908401906001016155ec565b5091979650505050505050565b634e487b7160e01b600052601260045260246000fd5b60008261564857634e487b7160e01b600052601260045260246000fd5b500490565b6060815260006156606060830186615409565b65ffffffffffff851660208401528281036040840152611c2781856150e4565b8481526080602082015260006156996080830186615409565b65ffffffffffff851660408401528281036060840152613ba881856150e4565b600084516156cb8184602089016150c0565b60609490941b6bffffffffffffffffffffffff191691909301908152601481019190915260340192915050565b60608152600061570b60608301866150e4565b60208301949094525060400152919050565b64ffffffffff81811683821601908082111561573b5761573b615292565b5092915050565b87815260e06020820152600061575b60e0830189615409565b60ff8816604084015264ffffffffff87811660608501528616608084015260a0830185905282810360c084015261579281856150e4565b9a9950505050505050505050565b60c0815260006157b360c0830189615409565b60ff8816602084015265ffffffffffff8716604084015264ffffffffff8616606084015284608084015282810360a08401526157ef81856150e4565b9998505050505050505050565b600060ff821660ff810361581257615812615292565b6001019291505056fea164736f6c6343000818000a","storage":{}},"0xda4e062e8c69d39d9472945232a53f579904ac45":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106100725760003560e01c806345ec93541161005057806345ec9354146100e15780637c5b0335146100f4578063e1af802c1461010757600080fd5b806301ffc9a714610077578063119df25f1461009f57806313861fb5146100cc575b600080fd5b61008a610085366004613fb3565b61010f565b60405190151581526020015b60405180910390f35b6100a76101f4565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610096565b6100df6100da36600461400b565b610203565b005b604051601f193601358152602001610096565b6100df61010236600461400b565b610235565b6100a7610250565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f6fdd1c800000000000000000000000000000000000000000000000000000000014806101a257507fffffffff0000000000000000000000000000000000000000000000000000000082167fb5dee12700000000000000000000000000000000000000000000000000000000145b806101ee57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b60006101fe61025a565b905090565b6040517fea8b184c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61023d61028c565b61024561056e565b61024d610727565b50565b60006101fe610943565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcc36013560601c806102895750335b90565b61029461094d565b61029c610bf5565b6102a4610c76565b6102ac610cda565b6102b4610d56565b6102bc610dba565b6102c4610df7565b6102cc610e73565b6102d4610eef565b6102dc610f83565b6102e4611013565b6102ec61108b565b6102f46110ef565b60408051616e7360f01b6020820152600060228201819052603082015261033691015b60405160208183030381529060405261032f906140bc565b600161115d565b60408051616e7360f01b6020820152600060228201819052603082015261037e91015b604051602081830303815290604052610371906140bc565b6103796101f4565b611203565b60408051616e7360f01b602082015260006022820181905260308201526103c891015b6040516020818303038152906040526103b9906140bc565b6103c16101f4565b60016112e0565b60408051616e7360f01b60208201527f73746f726500000000000000000000000000000000000000000000000000000060228201526000603082015261040e9101610317565b60408051616e7360f01b60208201527f73746f72650000000000000000000000000000000000000000000000000000006022820152600060308201526104549101610359565b60408051616e7360f01b60208201527f73746f726500000000000000000000000000000000000000000000000000000060228201526000603082015261049a91016103a1565b60408051616e7360f01b60208201527f776f726c640000000000000000000000000000000000000000000000000000006022820152600060308201526104e09101610317565b60408051616e7360f01b60208201527f776f726c640000000000000000000000000000000000000000000000000000006022820152600060308201526105269101610359565b60408051616e7360f01b60208201527f776f726c6400000000000000000000000000000000000000000000000000000060228201526000603082015261056c91016103a1565b565b6040805161737960f01b6020820152600060228201527f4163636573734d616e6167656d656e740000000000000000000000000000000060308201526105ef917f00000000000000000000000017ffdeff94ed0b80c493a179d4b3b09d6d71f62791015b6040516020818303038152906040526105ea906140bc565b6113a2565b6040805161737960f01b6020820152600060228201527f42616c616e63655472616e7366657200000000000000000000000000000000006030820152610657917f000000000000000000000000a274b9a7e743cd8df3c6fd0abd47ed55fc943bc391016105d2565b6040805161737960f01b6020820152600060228201527f426174636843616c6c000000000000000000000000000000000000000000000060308201526106bf917f00000000000000000000000053e5c08d82a377167069ade46d087ab75353860891016105d2565b6040805161737960f01b6020820152600060228201527f526567697374726174696f6e0000000000000000000000000000000000000000603082015261056c917f000000000000000000000000d416f26aafcaaeca50b0dc35bd023e7286be296191016105d2565b600061073161145f565b905060005b60048110156107bc576040805161737960f01b6020820152600060228201527f4163636573734d616e6167656d656e740000000000000000000000000000000060308201526107b49101604051602081830303815290604052610798906140bc565b8383600481106107aa576107aa6140e0565b6020020151611544565b600101610736565b5060006107c76115e4565b905060005b6002811015610849576040805161737960f01b6020820152600060228201527f42616c616e63655472616e736665720000000000000000000000000000000000603082015261084191015b60405160208183030381529060405261082f906140bc565b8383600281106107aa576107aa6140e0565b6001016107cc565b506000610854611635565b905060005b60028110156108b0576040805161737960f01b6020820152600060228201527f426174636843616c6c000000000000000000000000000000000000000000000060308201526108a89101610817565b600101610859565b5060006108bb6116a3565b905060005b600e81101561093c576040805161737960f01b6020820152600060228201527f526567697374726174696f6e000000000000000000000000000000000000000060308201526109349101604051602081830303815290604052610922906140bc565b8383600e81106107aa576107aa6140e0565b6001016108c0565b5050505050565b60006101fe6118b4565b6109767f746273746f72650000000000000000005461626c657300000000000000000000611900565b156109f457604080517f746273746f72650000000000000000005461626c6573000000000000000000006020820181905291015b60408051601f19818403018152908290527fdfaaf9cf0000000000000000000000000000000000000000000000000000000082526109eb9291600401614146565b60405180910390fd5b610a1d7f746273746f72650000000000000000005265736f757263654964730000000000611900565b15610a5557604080517f746273746f72650000000000000000005265736f7572636549647300000000006020820181905291016109aa565b610b147f746273746f72650000000000000000005461626c6573000000000000000000007e60030220202000000000000000000000000000000000000000000000000000632001005f60d81b7e6003025f5f5fc4c40000000000000000000000000000000000000000000000610ac961198d565b604051602001610ad991906141b9565b604051602081830303815290604052610af0611a12565b604051602001610b0091906141b9565b604051602081830303815290604052611bda565b610b977f746273746f72650000000000000000005265736f757263654964730000000000630101000160d81b632001005f60d81b7e01010060000000000000000000000000000000000000000000000000000000610b70611ca1565b604051602001610b8091906141b9565b604051602081830303815290604052610af0611d18565b610bc27f746273746f72650000000000000000005461626c657300000000000000000000600161115d565b610bed7f746273746f72650000000000000000005265736f757263654964730000000000600161115d565b61056c611d8f565b61056c7f7462776f726c640000000000000000004e616d6573706163654f776e657200007e14010014000000000000000000000000000000000000000000000000000000632001005f60d81b7e14010061000000000000000000000000000000000000000000000000000000610c69611e07565b610c71611e7e565b611ef5565b61056c7f7462776f726c6400000000000000000042616c616e6365730000000000000000630100080160dd1b632001005f60d81b7e2001001f000000000000000000000000000000000000000000000000000000610cd2611e07565b610c71611fc9565b61056c7f7462776f726c64000000000000000000496e7374616c6c65644d6f64756c6573630101000160d81b7e340200615f00000000000000000000000000000000000000000000000000007e01010060000000000000000000000000000000000000000000000000000000610d4e612040565b610c7161210a565b61056c7f7462776f726c640000000000000000005573657244656c65676174696f6e436f630100080160dd1b7e28020061610000000000000000000000000000000000000000000000000000632001005f60d81b610db2612181565b610c7161224b565b61056c7f7462776f726c640000000000000000004e616d65737061636544656c65676174630100080160dd1b632001005f60d81b80610db2611e07565b61056c7f7462776f726c640000000000000000005265736f757263654163636573730000630101000160d81b7e3402005f6100000000000000000000000000000000000000000000000000007e01010060000000000000000000000000000000000000000000000000000000610e6b6122c2565b610c7161238c565b61056c7f7462776f726c6400000000000000000053797374656d730000000000000000007e15020014010000000000000000000000000000000000000000000000000000632001005f60d81b7e15020061600000000000000000000000000000000000000000000000000000610ee7612403565b610c7161247a565b61056c7f7462776f726c6400000000000000000046756e6374696f6e53656c6563746f727e240200200400000000000000000000000000000000000000000000000000007e040100430000000000000000000000000000000000000000000000000000007e2402005f430000000000000000000000000000000000000000000000000000610f7b612544565b610c716125bb565b61056c7f6f74776f726c6400000000000000000046756e6374696f6e5369676e617475727c01000000000000000000000000000000000000000000000000000000007e040100430000000000000000000000000000000000000000000000000000007c01c500000000000000000000000000000000000000000000000000000061100b612685565b610c716126fc565b61056c7f7462776f726c6400000000000000000053797374656d486f6f6b7300000000007c0100000000000000000000000000000000000000000000000000000000632001005f60d81b7c01b6000000000000000000000000000000000000000000000000000000611083612403565b610c71612773565b61056c7f7462776f726c6400000000000000000053797374656d52656769737472790000630100080160dd1b7e14010061000000000000000000000000000000000000000000000000000000632001005f60d81b6110e76127ea565b610c71612403565b61056c7f7462776f726c64000000000000000000496e69744d6f64756c654164647265737e1401001400000000000000000000000000000000000000000000000000000060007e14010061000000000000000000000000000000000000000000000000000000611083612861565b604080516001808252818301909252600091602080830190803683370190505090508281600081518110611193576111936140e0565b6020026020010181815250506111fe7f746273746f72650000000000000000005265736f75726365496473000000000060001b826000856040516020016111e191151560f81b815260010190565b60408051601f19818403018152919052630101000160d81b612894565b505050565b604080516001808252818301909252600091602080830190803683370190505090508281600081518110611239576112396140e0565b6020026020010181815250506111fe7f7462776f726c640000000000000000004e616d6573706163654f776e6572000060001b826000856040516020016112ab919060609190911b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016815260140190565b60408051601f198184030181529190527e14010014000000000000000000000000000000000000000000000000000000612894565b6040805160028082526060820183526000926020830190803683370190505090508381600081518110611315576113156140e0565b6020026020010181815250508273ffffffffffffffffffffffffffffffffffffffff1660001b8160018151811061134e5761134e6140e0565b60200260200101818152505061139c7f7462776f726c640000000000000000005265736f75726365416363657373000060001b826000856040516020016111e191151560f81b815260010190565b50505050565b6111fe6113ad6101f4565b6040516024810184905273ffffffffffffffffffffffffffffffffffffffff85166044820152600160648201526000907f000000000000000000000000d416f26aafcaaeca50b0dc35bd023e7286be29619060840160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f3350b6a9000000000000000000000000000000000000000000000000000000001790526128a9565b611467613f58565b60405180608001604052806040518060400160405280601c81526020017f6772616e7441636365737328627974657333322c61646472657373290000000081525081526020016040518060400160405280601d81526020017f7265766f6b6541636365737328627974657333322c616464726573732900000081525081526020016040518060600160405280602281526020016147b16022913981526020016040518060400160405280601a81526020017f72656e6f756e63654f776e657273686970286279746573333229000000000000815250815250905090565b6111fe61154f6101f4565b60007f000000000000000000000000d416f26aafcaaeca50b0dc35bd023e7286be2961858586604051602401611587939291906141cc565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f6548a90a000000000000000000000000000000000000000000000000000000001790526128a9565b6115ec613f7f565b6040518060400160405280604051806060016040528060338152602001614755603391398152602001604051806060016040528060318152602001614624603191399052919050565b61163d613f7f565b60405180604001604052806040518060400160405280601c81526020017f626174636843616c6c2828627974657333322c6279746573295b5d290000000081525081526020016040518060600160405280602881526020016146b0602891399052919050565b6116ab613f98565b604051806101c001604052806040518060400160405280601c81526020017f696e7374616c6c4d6f64756c6528616464726573732c62797465732900000000815250815260200160405180606001604052806040815260200161456f60409139815260200160405180606001604052806028815260200161465560289139815260200160405180606001604052806024815260200161454b6024913981526020016040518060400160405280601a81526020017f72656769737465724e616d65737061636528627974657333322900000000000081525081526020016040518060600160405280602981526020016147886029913981526020016040518060600160405280602581526020016146d86025913981526020016040518060600160405280602481526020016146006024913981526020016040518060600160405280602881526020016145d860289139815260200160405180606001604052806033815260200161467d6033913981526020016040518060600160405280602981526020016145af6029913981526020016040518060400160405280601d81526020017f756e726567697374657244656c65676174696f6e28616464726573732900000081525081526020016040518060600160405280603281526020016147236032913981526020016040518060600160405280602681526020016146fd602691399052919050565b7f629a4c26e296b22a8e0856e9f6ecb2d1008d7e00081111962cd175fa7488e1755460009073ffffffffffffffffffffffffffffffffffffffff16806118fb573391505090565b919050565b604080516001808252818301909252600091829190602080830190803683370190505090508281600081518110611939576119396140e0565b602090810291909101015260006119797f746273746f72650000000000000000005265736f7572636549647300000000008383630101000160d81b6128d6565b90506119858160f81c90565b949350505050565b604080516001808252818301909252606091816020015b60608152602001906001900390816119a45790505090506040518060400160405280600781526020017f7461626c6549640000000000000000000000000000000000000000000000000081525081600081518110611a0457611a046140e0565b602002602001018190525090565b60408051600580825260c08201909252606091816020015b6060815260200190600190039081611a2a5790505090506040518060400160405280600b81526020017f6669656c644c61796f757400000000000000000000000000000000000000000081525081600081518110611a8a57611a8a6140e0565b60200260200101819052506040518060400160405280600981526020017f6b6579536368656d61000000000000000000000000000000000000000000000081525081600181518110611ade57611ade6140e0565b60200260200101819052506040518060400160405280600b81526020017f76616c7565536368656d6100000000000000000000000000000000000000000081525081600281518110611b3257611b326140e0565b60200260200101819052506040518060400160405280601281526020017f616269456e636f6465644b65794e616d6573000000000000000000000000000081525081600381518110611b8657611b866140e0565b60200260200101819052506040518060400160405280601481526020017f616269456e636f6465644669656c644e616d657300000000000000000000000081525081600481518110611a0457611a046140e0565b6000611be786868661290c565b90506000611bf58484612942565b90506000611c038585612962565b60408051600180825281830190925291925060009190602080830190803683370190505090508981600081518110611c3d57611c3d6140e0565b6020908102919091010152611c957f746273746f72650000000000000000005461626c657300000000000000000000828686867e6003022020200000000000000000000000000000000000000000000000000061298e565b50505050505050505050565b604080516001808252818301909252606091816020015b6060815260200190600190039081611cb85790505090506040518060400160405280600a81526020017f7265736f7572636549640000000000000000000000000000000000000000000081525081600081518110611a0457611a046140e0565b604080516001808252818301909252606091816020015b6060815260200190600190039081611d2f5790505090506040518060400160405280600681526020017f657869737473000000000000000000000000000000000000000000000000000081525081600081518110611a0457611a046140e0565b61056c7f746273746f726500000000000000000053746f7265486f6f6b730000000000007c0100000000000000000000000000000000000000000000000000000000632001005f60d81b7c01b6000000000000000000000000000000000000000000000000000000611dff61198d565b610c71612cb4565b604080516001808252818301909252606091816020015b6060815260200190600190039081611e1e5790505090506040518060400160405280600b81526020017f6e616d657370616365496400000000000000000000000000000000000000000081525081600081518110611a0457611a046140e0565b604080516001808252818301909252606091816020015b6060815260200190600190039081611e955790505090506040518060400160405280600581526020017f6f776e657200000000000000000000000000000000000000000000000000000081525081600081518110611a0457611a046140e0565b6000611eff6118b4565b90503073ffffffffffffffffffffffffffffffffffffffff821603611f3157611f2c878787878787612d2b565b611fc0565b6040517f0ba51f4900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821690630ba51f4990611f8d908a908a908a908a908a908a906004016141f7565b600060405180830381600087803b158015611fa757600080fd5b505af1158015611fbb573d6000803e3d6000fd5b505050505b50505050505050565b604080516001808252818301909252606091816020015b6060815260200190600190039081611fe05790505090506040518060400160405280600781526020017f62616c616e63650000000000000000000000000000000000000000000000000081525081600081518110611a0457611a046140e0565b6040805160028082526060828101909352816020015b60608152602001906001900390816120565790505090506040518060400160405280600d81526020017f6d6f64756c654164647265737300000000000000000000000000000000000000815250816000815181106120b6576120b66140e0565b60200260200101819052506040518060400160405280600d81526020017f617267756d656e7473486173680000000000000000000000000000000000000081525081600181518110611a0457611a046140e0565b604080516001808252818301909252606091816020015b60608152602001906001900390816121215790505090506040518060400160405280600b81526020017f6973496e7374616c6c656400000000000000000000000000000000000000000081525081600081518110611a0457611a046140e0565b6040805160028082526060828101909352816020015b60608152602001906001900390816121975790505090506040518060400160405280600981526020017f64656c656761746f720000000000000000000000000000000000000000000000815250816000815181106121f7576121f76140e0565b60200260200101819052506040518060400160405280600981526020017f64656c656761746565000000000000000000000000000000000000000000000081525081600181518110611a0457611a046140e0565b604080516001808252818301909252606091816020015b60608152602001906001900390816122625790505090506040518060400160405280601381526020017f64656c65676174696f6e436f6e74726f6c49640000000000000000000000000081525081600081518110611a0457611a046140e0565b6040805160028082526060828101909352816020015b60608152602001906001900390816122d85790505090506040518060400160405280600a81526020017f7265736f7572636549640000000000000000000000000000000000000000000081525081600081518110612338576123386140e0565b60200260200101819052506040518060400160405280600681526020017f63616c6c6572000000000000000000000000000000000000000000000000000081525081600181518110611a0457611a046140e0565b604080516001808252818301909252606091816020015b60608152602001906001900390816123a35790505090506040518060400160405280600681526020017f616363657373000000000000000000000000000000000000000000000000000081525081600081518110611a0457611a046140e0565b604080516001808252818301909252606091816020015b606081526020019060019003908161241a5790505090506040518060400160405280600881526020017f73797374656d496400000000000000000000000000000000000000000000000081525081600081518110611a0457611a046140e0565b6040805160028082526060828101909352816020015b60608152602001906001900390816124905790505090506040518060400160405280600681526020017f73797374656d0000000000000000000000000000000000000000000000000000815250816000815181106124f0576124f06140e0565b60200260200101819052506040518060400160405280600c81526020017f7075626c6963416363657373000000000000000000000000000000000000000081525081600181518110611a0457611a046140e0565b604080516001808252818301909252606091816020015b606081526020019060019003908161255b5790505090506040518060400160405280601581526020017f776f726c6446756e6374696f6e53656c6563746f72000000000000000000000081525081600081518110611a0457611a046140e0565b6040805160028082526060828101909352816020015b60608152602001906001900390816125d15790505090506040518060400160405280600881526020017f73797374656d496400000000000000000000000000000000000000000000000081525081600081518110612631576126316140e0565b60200260200101819052506040518060400160405280601681526020017f73797374656d46756e6374696f6e53656c6563746f720000000000000000000081525081600181518110611a0457611a046140e0565b604080516001808252818301909252606091816020015b606081526020019060019003908161269c5790505090506040518060400160405280601081526020017f66756e6374696f6e53656c6563746f720000000000000000000000000000000081525081600081518110611a0457611a046140e0565b604080516001808252818301909252606091816020015b60608152602001906001900390816127135790505090506040518060400160405280601181526020017f66756e6374696f6e5369676e617475726500000000000000000000000000000081525081600081518110611a0457611a046140e0565b604080516001808252818301909252606091816020015b606081526020019060019003908161278a5790505090506040518060400160405280600581526020017f76616c756500000000000000000000000000000000000000000000000000000081525081600081518110611a0457611a046140e0565b604080516001808252818301909252606091816020015b60608152602001906001900390816128015790505090506040518060400160405280600681526020017f73797374656d000000000000000000000000000000000000000000000000000081525081600081518110611a0457611a046140e0565b6040805160008082526020820190925260609161288e565b60608152602001906001900390816128795790505b50905090565b61093c85856128a384876131da565b85613213565b60606000806128ba87878787613493565b91509150816128cc576128cc81613514565b9695505050505050565b60006129036128e5868661351c565b60ff858116601b0360080285901c166128fe85876131da565b613572565b95945050505050565b60408051602081018590529081018390526060818101839052906080015b60405160208183030381529060405290509392505050565b8151815160009181810160389190911b1760609190911b175b9392505050565b60608282604051602001612977929190614241565b604051602081830303815290604052905092915050565b611bdd60f21b867fffff00000000000000000000000000000000000000000000000000000000000016036129ff57857f8dbb3a9672eebfd3773e72dd9c102393436816d832c7ba9e1e1ac8fcadcac7a9868686866040516129f294939291906142ac565b60405180910390a2612cac565b6000612a0a876135c3565b905060005b8151811015612ae3576000828281518110612a2c57612a2c6140e0565b60200260200101519050612a586001826affffffffffffffffffffff191661364c90919063ffffffff16565b15612ada576040517f57066c9c000000000000000000000000000000000000000000000000000000008152606082901c906357066c9c90612aa7908c908c908c908c908c908c906004016142f6565b600060405180830381600087803b158015612ac157600080fd5b505af1158015612ad5573d6000803e3d6000fd5b505050505b50600101612a0f565b50867f8dbb3a9672eebfd3773e72dd9c102393436816d832c7ba9e1e1ac8fcadcac7a987878787604051612b1a94939291906142ac565b60405180910390a26000612b2e888861351c565b90506000602087019050612b4682600089518461366a565b6000612b5185613729565b1115612bd5576000612b638a8a613766565b878155905060208601915060008060005b612b7d88613729565b8160ff161015612bd057612b928d8d836137bc565b9250612bad8a8260ff166028026038011c64ffffffffff1690565b9150612bbc836000848861366a565b612bc68286614365565b9450600101612b74565b505050505b60005b8351811015611c95576000848281518110612bf557612bf56140e0565b60200260200101519050612c216002826affffffffffffffffffffff191661364c90919063ffffffff16565b15612ca3576040517f5b28cdaf000000000000000000000000000000000000000000000000000000008152606082901c90635b28cdaf90612c70908e908e908e908e908e908e906004016142f6565b600060405180830381600087803b158015612c8a57600080fd5b505af1158015612c9e573d6000803e3d6000fd5b505050505b50600101612bd8565b505050505050565b604080516001808252818301909252606091816020015b6060815260200190600190039081612ccb5790505090506040518060400160405280600581526020017f686f6f6b7300000000000000000000000000000000000000000000000000000081525081600081518110611a0457611a046140e0565b7f7462000000000000000000000000000000000000000000000000000000000000867fffff0000000000000000000000000000000000000000000000000000000000001614801590612da45750611bdd60f21b867fffff0000000000000000000000000000000000000000000000000000000000001614155b15612e20577f74620000000000000000000000000000000000000000000000000000000000008687604051602001612dde91815260200190565b60408051601f19818403018152908290527f31b466830000000000000000000000000000000000000000000000000000000082526109eb939291600401614378565b612e298561383c565b612e34846001613a83565b612e3f836000613a83565b60e084901c60e885901c0160ff16825114612e9f5760e084901c60e885901c0160ff1682516040517f0f72cb98000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016109eb565b60e085901c60e886901c0160ff16815114612eff5760e085901c60e886901c0160ff1681516040517f7dec4c00000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016109eb565b60e085901c60e886901c0160ff1660e084901c60e885901c0160ff1614612f775760e085901c60e886901c0160ff1660e084901c60e885901c0160ff166040517ff29d4d88000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016109eb565b612f8085613c1f565b612f8984613c1f565b14612fdb57612f9785613c1f565b612fa084613c1f565b6040517f65cc0adf000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016109eb565b612fe485613729565b612fed84613729565b1461303f57612ffb85613729565b61300484613729565b6040517fedea9587000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016109eb565b60005b61304b86613c1f565b8110156130e65761307561305f8583613c31565b60c5811115613070576130706143b9565b613c52565b6008601b8390030287901c60ff16146130de576008601b8290030286901c60ff166130a361305f8684613c31565b6040517f254c7db4000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016109eb565b600101613042565b5060006131437f74620000000000000000000000000000000000000000000000000000000000006131178960101b90565b60101c7fffff000000000000000000000000000000000000000000000000000000000000919091161790565b9050600061315a611bdd60f21b6131178a60101b90565b905061316582611900565b80613174575061317481611900565b1561318d5787886040516020016109aa91815260200190565b6131c588888888886040516020016131a591906141b9565b60405160208183030381529060405288604051602001610b0091906141b9565b6131d088600161115d565b5050505050505050565b600080805b8360ff1681101561320b5761320160ff601b83900360080287901c1683614365565b91506001016131df565b509392505050565b611bdd60f21b847fffff000000000000000000000000000000000000000000000000000000000000160361328257837f8c0b5119d4cec7b284c6b1b39252a03d1e2f2d7451a5895562524c113bb952be848484604051613275939291906143cf565b60405180910390a261139c565b600061328e858561351c565b9050600061329b866135c3565b905060005b81518110156133705760008282815181106132bd576132bd6140e0565b602002602001015190506132e96004826affffffffffffffffffffff191661364c90919063ffffffff16565b15613367576040517f964f667d000000000000000000000000000000000000000000000000000000008152606082901c9063964f667d90613334908b908b908b908b90600401614402565b600060405180830381600087803b15801561334e57600080fd5b505af1158015613362573d6000803e3d6000fd5b505050505b506001016132a0565b50857f8c0b5119d4cec7b284c6b1b39252a03d1e2f2d7451a5895562524c113bb952be8686866040516133a5939291906143cf565b60405180910390a26133c0828565ffffffffffff1685613cb2565b60005b8151811015611fc05760008282815181106133e0576133e06140e0565b6020026020010151905061340c6008826affffffffffffffffffffff191661364c90919063ffffffff16565b1561348a576040517fa8ba8721000000000000000000000000000000000000000000000000000000008152606082901c9063a8ba872190613457908b908b908b908b90600401614402565b600060405180830381600087803b15801561347157600080fd5b505af1158015613485573d6000803e3d6000fd5b505050505b506001016133c3565b600060608373ffffffffffffffffffffffffffffffffffffffff166134b9848888613cc8565b6040516134c6919061443b565b600060405180830381855af49150503d8060008114613501576040519150601f19603f3d011682016040523d82523d6000602084013e613506565b606091505b509097909650945050505050565b805160208201fd5b60008282604051602001613531929190614457565b60408051601f1981840301815291905280516020909101207f86425bff6b57326c7859e89024fe4f238ca327a1ae4a230180dd2f0e88aaa7d9189392505050565b6000602082106135985760208204840193506020828161359457613594614493565b0691505b508254600882021b60208290038084111561320b576001850154600882021c82179150509392505050565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106135fd576135fd6140e0565b602090810291909101015260006136357f746273746f726500000000000000000053746f7265486f6f6b730000000000008383613cdf565b90506119856136478260008451613d19565b613da7565b60008160ff168261365d8560581c90565b1660ff1614905092915050565b82156136e457602083106136945760208304840193506020838161369057613690614493565b0692505b82156136e45760208390036000600019600885021c1990506008850281811c91508351811c90508119875416828216178755508184116136d557505061139c565b50600194909401939182900391015b5b602082106137065780518455600190930192601f19909101906020016136e5565b811561139c576000600019600884021c8554835182191691161785555050505050565b6000600860018061373c600260206144a9565b61374691906144a9565b61375091906144a9565b61375a91906144bc565b8260ff911c1692915050565b6000828260405160200161377b929190614457565b60408051601f1981840301815291905280516020909101207f14e2fcc58e58e68ec7edc30c8d50dccc3ce2714a623ec81f46b6a63922d76569189392505050565b600083836040516020016137d1929190614457565b604051602081830303815290604052805190602001208260f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f3b4102da22e32d82fc925482184f16c09fd4281692720b87d124aef6da48a0f1181860001c90509392505050565b80613873576040517fa019e4da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061387e82613729565b905060058111156138c5576040517f6793df6200000000000000000000000000000000000000000000000000000000815260048101829052600560248201526044016109eb565b60006138d083613c1f565b905060006138de8383614365565b9050601c811115613925576040517fecd893b900000000000000000000000000000000000000000000000000000000815260048101829052601c60248201526044016109eb565b6000805b838110156139d05760ff601b82900360080287901c16600081900361397d576040517f53b2dd05000000000000000000000000000000000000000000000000000000008152600481018390526024016109eb565b60208111156139bb576040517f7237f237000000000000000000000000000000000000000000000000000000008152600481018390526024016109eb565b6139c58184614365565b925050600101613929565b506139da85613db8565b8114613a26576139e985613db8565b6040517feba964de0000000000000000000000000000000000000000000000000000000081526004810191909152602481018290526044016109eb565b825b601c811015612cac5760ff601b82900360080287901c168015613a7a576040517f1d8d44db000000000000000000000000000000000000000000000000000000008152600481018390526024016109eb565b50600101613a28565b80158015613a8f575081155b15613ab05760405163d498615960e01b8152600060048201526024016109eb565b6000613abb83613729565b90506005811115613ae25760405163d498615960e01b8152600481018290526024016109eb565b6000613aed84613c1f565b90506000613afb8383614365565b9050601c811115613b225760405163d498615960e01b8152600481018290526024016109eb565b6000805b83811015613b8e576000613b3d61305f8984613c31565b905080600003613b79576040517ff44b422000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613b838184614365565b925050600101613b26565b50613b9886613db8565b8114613bc357613ba786613db8565b60405163d498615960e01b81526004016109eb91815260200190565b825b82811015611fc0576000613bdc61305f8984613c31565b90508015613c16576040517ff44b422000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50600101613bc5565b600060086001613746600260206144a9565b6000601b8290036008028360ff911c1660c581111561295b5761295b6143b9565b6000808260c5811115613c6757613c676143b9565b60ff1690506061811015613c8157601f1660010192915050565b60618360c5811115613c9557613c956143b9565b03613ca35750601492915050565b50600092915050565b50919050565b6111fe83838351613cc38560200190565b61366a565b606083838360405160200161292a939291906144d3565b6060611985613cef8585856137bc565b6000613d1485613cff8989613ddb565b9060ff166028026038011c64ffffffffff1690565b613dee565b600081831180613d295750835182115b15613d66578383836040517f23230fa30000000000000000000000000000000000000000000000000000000081526004016109eb93929190614525565b60208401613d748482614365565b90506000613d8285856144a9565b6fffffffffffffffffffffffffffffffff1660809290921b9190911795945050505050565b6060600061295b8360156000613e11565b60006008613dc8600260206144a9565b613dd291906144bc565b9190911c919050565b600061295b613dea8484613766565b5490565b60405160208101601f19603f848401011660405282825261320b85858584613e8c565b60606000613e1f8560801c90565b90506fffffffffffffffffffffffffffffffff85166000858281613e4557613e45614493565b04905060405193506020840160208202810160405281855260005b82811015613e80578451871c825293870193602090910190600101613e60565b50505050509392505050565b8215613f135760208310613eb657602083048401935060208381613eb257613eb2614493565b0692505b8215613f13576020839003600081841015613ed95750600019600884021c613ee3565b50600019600882021c5b8554600886021b818451168219821617845250818411613f0457505061139c565b50600194909401939182900391015b5b60208210613f355783548152600190930192601f1990910190602001613f14565b811561139c576000600019600884021c8251865482191691161782525050505050565b60405180608001604052806004905b6060815260200190600190039081613f675790505090565b6040805180820190915260608152600160208201613f67565b604080516101c0810190915260608152600d60208201613f67565b600060208284031215613fc557600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461295b57600080fd5b634e487b7160e01b600052604160045260246000fd5b60006020828403121561401d57600080fd5b813567ffffffffffffffff8082111561403557600080fd5b818401915084601f83011261404957600080fd5b81358181111561405b5761405b613ff5565b604051601f8201601f19908116603f0116810190838211818310171561408357614083613ff5565b8160405282815287602084870101111561409c57600080fd5b826020860160208301376000928101602001929092525095945050505050565b80516020808301519190811015613cac5760001960209190910360031b1b16919050565b634e487b7160e01b600052603260045260246000fd5b60005b838110156141115781810151838201526020016140f9565b50506000910152565b600081518084526141328160208601602086016140f6565b601f01601f19169290920160200192915050565b828152604060208201526000611985604083018461411a565b60008282518085526020808601955060208260051b8401016020860160005b848110156141ac57601f1986840301895261419a83835161411a565b9884019892509083019060010161417e565b5090979650505050505050565b60208152600061295b602083018461415f565b8381526060602082015260006141e5606083018561411a565b82810360408401526128cc818561411a565b86815285602082015284604082015283606082015260c06080820152600061422260c083018561415f565b82810360a0840152614234818561415f565b9998505050505050505050565b600083516142538184602088016140f6565b8351908301906142678183602088016140f6565b01949350505050565b60008151808452602080850194506020840160005b838110156142a157815187529582019590820190600101614285565b509495945050505050565b6080815260006142bf6080830187614270565b82810360208401526142d1818761411a565b905084604084015282810360608401526142eb818561411a565b979650505050505050565b86815260c06020820152600061430f60c0830188614270565b8281036040840152614321818861411a565b9050856060840152828103608084015261433b818661411a565b9150508260a0830152979650505050505050565b634e487b7160e01b600052601160045260246000fd5b808201808211156101ee576101ee61434f565b7fffff00000000000000000000000000000000000000000000000000000000000084168152826020820152606060408201526000612903606083018461411a565b634e487b7160e01b600052602160045260246000fd5b6060815260006143e26060830186614270565b65ffffffffffff8516602084015282810360408401526128cc818561411a565b84815260806020820152600061441b6080830186614270565b65ffffffffffff8516604084015282810360608401526142eb818561411a565b6000825161444d8184602087016140f6565b9190910192915050565b8281526000602080830184516020860160005b828110156144865781518452928401929084019060010161446a565b5091979650505050505050565b634e487b7160e01b600052601260045260246000fd5b818103818111156101ee576101ee61434f565b80820281158282048414176101ee576101ee61434f565b600084516144e58184602089016140f6565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b606081526000614538606083018661411a565b6020830194909452506040015291905056fe756e726567697374657253746f7265486f6f6b28627974657333322c616464726573732972656769737465725461626c6528627974657333322c627974657333322c627974657333322c627974657333322c737472696e675b5d2c737472696e675b5d29726567697374657244656c65676174696f6e28616464726573732c627974657333322c627974657329726567697374657246756e6374696f6e53656c6563746f7228627974657333322c737472696e6729726567697374657253797374656d28627974657333322c616464726573732c626f6f6c297472616e7366657242616c616e6365546f4164647265737328627974657333322c616464726573732c75696e7432353629726567697374657253746f7265486f6f6b28627974657333322c616464726573732c75696e7438297265676973746572526f6f7446756e6374696f6e53656c6563746f7228627974657333322c737472696e672c737472696e6729626174636843616c6c46726f6d2828616464726573732c627974657333322c6279746573295b5d29756e726567697374657253797374656d486f6f6b28627974657333322c6164647265737329756e72656769737465724e616d65737061636544656c65676174696f6e28627974657333322972656769737465724e616d65737061636544656c65676174696f6e28627974657333322c627974657333322c6279746573297472616e7366657242616c616e6365546f4e616d65737061636528627974657333322c627974657333322c75696e7432353629726567697374657253797374656d486f6f6b28627974657333322c616464726573732c75696e7438297472616e736665724f776e65727368697028627974657333322c6164647265737329a164736f6c6343000818000a","storage":{}},"0xe26e5254da185192cb3b2c4cddeab304d979e414":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061005a5760003560e01c80631fae6308116100435780631fae6308146100c157806345ec9354146100e1578063e1af802c1461010157600080fd5b806301ffc9a71461005f578063119df25f14610094575b600080fd5b34801561006b57600080fd5b5061007f61007a366004611c88565b610116565b60405190151581526020015b60405180910390f35b3480156100a057600080fd5b506100a96101af565b6040516001600160a01b03909116815260200161008b565b6100d46100cf366004611d6d565b6101be565b60405161008b9190611e49565b3480156100ed57600080fd5b50604051601f19360135815260200161008b565b34801561010d57600080fd5b506100a9610203565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fb5dee1270000000000000000000000000000000000000000000000000000000014806101a957507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b60006101b961020d565b905090565b60606101cc8585858561023f565b6101e9856101d9876102ad565b6101e4906001611e72565b610352565b6101fa85858536601f190135610417565b95945050505050565b60006101b9610444565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcc36013560601c8061023c5750335b90565b600061024a856102ad565b905060006102628686868561025d610444565b61044e565b905061026f8682856105d7565b6102a5576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050565b60408051600180825281830190925260009182919060208083019080368337019050509050826001600160a01b031660001b816000815181106102f2576102f2611e85565b6020908102919091010152600061034a7f7462000000000000000000000000000043616c6c576974685369676e6174757283837e2001002000000000000000000000000000000000000000000000000000000061064e565b949350505050565b60408051600180825281830190925260009160208083019080368337019050509050826001600160a01b031660001b8160008151811061039457610394611e85565b6020026020010181815250506104127f7462000000000000000000000000000043616c6c576974685369676e6174757260001b826000856040516020016103dd91815260200190565b60408051601f198184030181529190527e2001002000000000000000000000000000000000000000000000000000000061067b565b505050565b606060008061042887878787610697565b915091508161043a5761043a81610867565b9695505050505050565b60006101b961086f565b604080517f6268546d6d3d3a16ed8cfd22f4fe09a1d17f9af43838183ba533d41e284cf32660208201526001600160a01b038316918101919091524660608201526000908190608001604051602081830303815290604052805190602001209050807fe1aba1240c6e8ae2c09457b30ace1a1a2b13361439ce6e8d5a278d794ac997ec886104f96104df8a60101b90565b71ffffffffffffffffffffffffffffffffffff19166108ae565b8051906020012061051161050c8b610952565b6108ae565b80516020918201208a518b83012060405161055d969594938c91019586526001600160a01b0394909416602086015260408501929092526060840152608083015260a082015260c00190565b604051602081830303815290604052805190602001206040516020016105b59291907f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6040516020818303038152906040528051906020012091505095945050505050565b6000836001600160a01b03163b600003610639576000806105f88585610969565b509092509050600081600381111561061257610612611e9b565b1480156106305750856001600160a01b0316826001600160a01b0316145b92505050610647565b6106448484846109b6565b90505b9392505050565b60006101fa61065d8686610ad8565b60ff858116601b0360080285901c166106768587610b2e565b610b67565b610690858561068a8487610b2e565b85610bb8565b5050505050565b6000606060006106a686610e5d565b905060005b81518110156107795760008282815181106106c8576106c8611e85565b602002602001015190506106f46001826affffffffffffffffffffff1916610ee690919063ffffffff16565b15610770576040517fc3323031000000000000000000000000000000000000000000000000000000008152606082901c9063c33230319061073d908c908c908c90600401611eb1565b600060405180830381600087803b15801561075757600080fd5b505af115801561076b573d6000803e3d6000fd5b505050505b506001016106ab565b5061078687858888610f04565b909350915060005b815181101561085c5760008282815181106107ab576107ab611e85565b602002602001015190506107d76002826affffffffffffffffffffff1916610ee690919063ffffffff16565b15610853576040517f973d8f99000000000000000000000000000000000000000000000000000000008152606082901c9063973d8f9990610820908c908c908c90600401611eb1565b600060405180830381600087803b15801561083a57600080fd5b505af115801561084e573d6000803e3d6000fd5b505050505b5060010161078e565b505094509492505050565b805160208201fd5b7f629a4c26e296b22a8e0856e9f6ecb2d1008d7e00081111962cd175fa7488e175546000906001600160a01b0316806108a9573391505090565b919050565b606060005b6010811015610913577fffffffffffffffffffffffffffffffff000000000000000000000000000000008316600882021b7fff000000000000000000000000000000000000000000000000000000000000001615610913576001016108b3565b604080517fffffffffffffffffffffffffffffffff0000000000000000000000000000000085166020820152815160309091019091528181528061034a565b600061096060706010611e72565b9190911b919050565b600080600083516041036109a35760208401516040850151606086015160001a6109958882858561103b565b9550955095505050506109af565b50508151600091506002905b9250925092565b6000806000856001600160a01b031685856040516024016109d8929190611ed9565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1626ba7e0000000000000000000000000000000000000000000000000000000017905251610a3b9190611ef2565b600060405180830381855afa9150503d8060008114610a76576040519150601f19603f3d011682016040523d82523d6000602084013e610a7b565b606091505b5091509150818015610a8f57506020815110155b801561043a575080517f1626ba7e0000000000000000000000000000000000000000000000000000000090610acd9083016020908101908401611f0e565b149695505050505050565b60008282604051602001610aed929190611f27565b60408051601f1981840301815291905280516020909101207f86425bff6b57326c7859e89024fe4f238ca327a1ae4a230180dd2f0e88aaa7d9189392505050565b600080805b8360ff16811015610b5f57610b5560ff601b83900360080287901c1683611e72565b9150600101610b33565b509392505050565b600060208210610b8d57602082048401935060208281610b8957610b89611f63565b0691505b508254600882021b602082900380841115610b5f576001850154600882021c82179150509392505050565b7f6f74000000000000000000000000000000000000000000000000000000000000847fffff0000000000000000000000000000000000000000000000000000000000001603610c4257837f8c0b5119d4cec7b284c6b1b39252a03d1e2f2d7451a5895562524c113bb952be848484604051610c3593929190611fb5565b60405180910390a2610e57565b6000610c4e8585610ad8565b90506000610c5b8661110a565b905060005b8151811015610d30576000828281518110610c7d57610c7d611e85565b60200260200101519050610ca96004826affffffffffffffffffffff1916610ee690919063ffffffff16565b15610d27576040517f964f667d000000000000000000000000000000000000000000000000000000008152606082901c9063964f667d90610cf4908b908b908b908b90600401611fe8565b600060405180830381600087803b158015610d0e57600080fd5b505af1158015610d22573d6000803e3d6000fd5b505050505b50600101610c60565b50857f8c0b5119d4cec7b284c6b1b39252a03d1e2f2d7451a5895562524c113bb952be868686604051610d6593929190611fb5565b60405180910390a2610d80828565ffffffffffff168561117c565b60005b8151811015610e53576000828281518110610da057610da0611e85565b60200260200101519050610dcc6008826affffffffffffffffffffff1916610ee690919063ffffffff16565b15610e4a576040517fa8ba8721000000000000000000000000000000000000000000000000000000008152606082901c9063a8ba872190610e17908b908b908b908b90600401611fe8565b600060405180830381600087803b158015610e3157600080fd5b505af1158015610e45573d6000803e3d6000fd5b505050505b50600101610d83565b5050505b50505050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110610e9757610e97611e85565b60209081029190910101526000610ecf7f7462776f726c6400000000000000000053797374656d486f6f6b7300000000008383611192565b905061034a610ee182600084516111cc565b61125a565b60008160ff1682610ef78560581c90565b1660ff1614905092915050565b60006060600080610f148661126b565b90925090506001600160a01b038216610f6e5785610f3187611323565b6040517ffbf10ce6000000000000000000000000000000000000000000000000000000008152600401610f65929190611ed9565b60405180910390fd5b80610f7d57610f7d8689611446565b8615610fe9577dffffffffffffffffffffffffffff0000000000000000000000000000000086167f6e73000000000000000000000000000000000000000000000000000000000000176000610fd182611496565b9050610fe682610fe18b84611e72565b611527565b50505b6000610ff58760101b90565b71ffffffffffffffffffffffffffffffffffff1916146110205761101b888884886115a6565b61102c565b61102c8888848861161e565b90999098509650505050505050565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156110765750600091506003905082611100565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156110ca573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166110f657506000925060019150829050611100565b9250600091508190505b9450945094915050565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061114457611144611e85565b60209081029190910101526000610ecf7f746273746f726500000000000000000053746f7265486f6f6b730000000000008383611192565b6104128383835161118d8560200190565b61167f565b60606106446111a285858561173e565b60006111c7856111b289896117be565b9060ff166028026038011c64ffffffffff1690565b6117d1565b6000818311806111dc5750835182115b15611219578383836040517f23230fa3000000000000000000000000000000000000000000000000000000008152600401610f659392919061202c565b602084016112278482611e72565b905060006112358585612051565b6fffffffffffffffffffffffffffffffff1660809290921b9190911795945050505050565b6060600061064783601560006117f4565b604080516001808252818301909252600091829182916020808301908036833701905050905083816000815181106112a5576112a5611e85565b6020908102919091010152600080806112fe7f7462776f726c6400000000000000000053797374656d73000000000000000000857e1502001401000000000000000000000000000000000000000000000000000061186f565b5050602081015160349091015160609190911c9860f89190911c975095505050505050565b606081601081901b600061133683610952565b90508271ffffffffffffffffffffffffffffffffffff198316156113775761137271ffffffffffffffffffffffffffffffffffff1984166108ae565b6113ae565b6040518060400160405280600681526020017f3c726f6f743e00000000000000000000000000000000000000000000000000008152505b7fffffffffffffffffffffffffffffffff000000000000000000000000000000008316156113e4576113df836108ae565b61141b565b6040518060400160405280600681526020017f3c726f6f743e00000000000000000000000000000000000000000000000000008152505b60405160200161142d93929190612064565b6040516020818303038152906040529350505050919050565b6114508282611977565b6114925761145d82611323565b816040517fd787b737000000000000000000000000000000000000000000000000000000008152600401610f659291906120f2565b5050565b6040805160018082528183019092526000918291906020808301908036833701905050905082816000815181106114cf576114cf611e85565b6020908102919091010152600061034a7f7462776f726c6400000000000000000042616c616e636573000000000000000083837e2001002000000000000000000000000000000000000000000000000000000061064e565b60408051600180825281830190925260009160208083019080368337019050509050828160008151811061155d5761155d611e85565b6020026020010181815250506104127f7462776f726c6400000000000000000042616c616e636573000000000000000060001b826000856040516020016103dd91815260200190565b60006060836001600160a01b031660006115c18589896119d5565b6040516115ce9190611ef2565b60006040518083038185875af1925050503d806000811461160b576040519150601f19603f3d011682016040523d82523d6000602084013e611610565b606091505b509097909650945050505050565b60006060836001600160a01b03166116378488886119d5565b6040516116449190611ef2565b600060405180830381855af49150503d806000811461160b576040519150601f19603f3d011682016040523d82523d6000602084013e611610565b82156116f957602083106116a9576020830484019350602083816116a5576116a5611f63565b0692505b82156116f95760208390036000600019600885021c1990506008850281811c91508351811c90508119875416828216178755508184116116ea575050610e57565b50600194909401939182900391015b5b6020821061171b5780518455600190930192601f19909101906020016116fa565b8115610e57576000600019600884021c8554835182191691161785555050505050565b60008383604051602001611753929190611f27565b604051602081830303815290604052805190602001208260f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f3b4102da22e32d82fc925482184f16c09fd4281692720b87d124aef6da48a0f1181860001c90509392505050565b60006106476117cd8484611a04565b5490565b60405160208101601f19603f8484010116604052828252610b5f85858584611a5a565b606060006118028560801c90565b90506fffffffffffffffffffffffffffffffff8516600085828161182857611828611f63565b04905060405193506020840160208202810160405281855260005b82811015611863578451871c825293870193602090910190600101611843565b50505050509392505050565b606060006060600061188085611b26565b905061188d878783611b49565b9350600061189a86611b82565b9050801561196c576118ac88886117be565b935066ffffffffffffff841667ffffffffffffffff8111156118d0576118d0611cca565b6040519080825280601f01601f1916602001820160405280156118fa576020820181803683370190505b5092506020830160005b828160ff16101561196957600061191c8b8b8461173e565b90506000611939888460ff166028026038011c64ffffffffff1690565b90506119488260008387611a5a565b6119528185611e72565b9350505080806119619061211d565b915050611904565b50505b505093509350939050565b60006119c57f6e730000000000000000000000000000000000000000000000000000000000007dffffffffffffffffffffffffffff0000000000000000000000000000000085161783611bbf565b8061064757506106478383611bbf565b60608383836040516020016119ec9392919061213c565b60405160208183030381529060405290509392505050565b60008282604051602001611a19929190611f27565b60408051601f1981840301815291905280516020909101207f14e2fcc58e58e68ec7edc30c8d50dccc3ce2714a623ec81f46b6a63922d76569189392505050565b8215611ae15760208310611a8457602083048401935060208381611a8057611a80611f63565b0692505b8215611ae1576020839003600081841015611aa75750600019600884021c611ab1565b50600019600882021c5b8554600886021b818451168219821617845250818411611ad2575050610e57565b50600194909401939182900391015b5b60208210611b035783548152600190930192601f1990910190602001611ae2565b8115610e57576000600019600884021c8251865482191691161782525050505050565b60006008611b3660026020612051565b611b40919061218e565b9190911c919050565b606081600003611b685750604080516020810190915260008152610647565b6000611b748585610ad8565b90506101fa816000856117d1565b60006008600180611b9560026020612051565b611b9f9190612051565b611ba99190612051565b611bb3919061218e565b8260ff911c1692915050565b604080516002808252606082018352600092839291906020830190803683370190505090508381600081518110611bf857611bf8611e85565b602002602001018181525050826001600160a01b031660001b81600181518110611c2457611c24611e85565b60209081029190910101526000611c7c7f7462776f726c640000000000000000005265736f75726365416363657373000083837e0101000100000000000000000000000000000000000000000000000000000061064e565b90506101fa8160f81c90565b600060208284031215611c9a57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461064757600080fd5b634e487b7160e01b600052604160045260246000fd5b600082601f830112611cf157600080fd5b813567ffffffffffffffff80821115611d0c57611d0c611cca565b604051601f8301601f19908116603f01168101908282118183101715611d3457611d34611cca565b81604052838152866020858801011115611d4d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060008060808587031215611d8357600080fd5b84356001600160a01b0381168114611d9a57600080fd5b935060208501359250604085013567ffffffffffffffff80821115611dbe57600080fd5b611dca88838901611ce0565b93506060870135915080821115611de057600080fd5b50611ded87828801611ce0565b91505092959194509250565b60005b83811015611e14578181015183820152602001611dfc565b50506000910152565b60008151808452611e35816020860160208601611df9565b601f01601f19169290920160200192915050565b6020815260006106476020830184611e1d565b634e487b7160e01b600052601160045260246000fd5b808201808211156101a9576101a9611e5c565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b6001600160a01b03841681528260208201526060604082015260006101fa6060830184611e1d565b8281526040602082015260006106446040830184611e1d565b60008251611f04818460208701611df9565b9190910192915050565b600060208284031215611f2057600080fd5b5051919050565b8281526000602080830184516020860160005b82811015611f5657815184529284019290840190600101611f3a565b5091979650505050505050565b634e487b7160e01b600052601260045260246000fd5b60008151808452602080850194506020840160005b83811015611faa57815187529582019590820190600101611f8e565b509495945050505050565b606081526000611fc86060830186611f79565b65ffffffffffff85166020840152828103604084015261043a8185611e1d565b8481526080602082015260006120016080830186611f79565b65ffffffffffff8516604084015282810360608401526120218185611e1d565b979650505050505050565b60608152600061203f6060830186611e1d565b60208301949094525060400152919050565b818103818111156101a9576101a9611e5c565b7fffff0000000000000000000000000000000000000000000000000000000000008416815260007f3a0000000000000000000000000000000000000000000000000000000000000080600284015284516120c5816003860160208901611df9565b8084019050816003820152845191506120e5826004830160208801611df9565b0160040195945050505050565b6040815260006121056040830185611e1d565b90506001600160a01b03831660208301529392505050565b600060ff821660ff810361213357612133611e5c565b60010192915050565b6000845161214e818460208901611df9565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b80820281158282048414176101a9576101a9611e5c56fea164736f6c6343000818000a","storage":{}},"0xf0a19f09c5334facaa4bf810903c410facb5cb94":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106100675760003560e01c806345ec93541161005057806345ec9354146100c1578063b591186e146100d4578063e1af802c146100e957600080fd5b806301ffc9a71461006c578063119df25f14610094575b600080fd5b61007f61007a366004610d4e565b6100f1565b60405190151581526020015b60405180910390f35b61009c61018a565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161008b565b604051601f19360135815260200161008b565b6100e76100e2366004610da2565b610199565b005b61009c6101af565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fb5dee12700000000000000000000000000000000000000000000000000000000148061018457507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b60006101946101b9565b905090565b6101ab6101a461018a565b83836101eb565b5050565b60006101946102a7565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcc36013560601c806101e85750335b90565b6040805160e084811b6020808401919091529084901b60248301528251600881840301815260016028840181815260688501909552909360009360609385939160480190803683370190505090508673ffffffffffffffffffffffffffffffffffffffff1660001b8160008151811061026657610266610dd5565b602090810291909101015261029e7f74620000000000000000000000000000506f736974696f6e0000000000000000828686866102b1565b50505050505050565b6000610194610381565b60006102bb610381565b90503073ffffffffffffffffffffffffffffffffffffffff8216036102ec576102e786868686866103cd565b610379565b6040517f298314fb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82169063298314fb906103469089908990899089908990600401610e86565b600060405180830381600087803b15801561036057600080fd5b505af1158015610374573d6000803e3d6000fd5b505050505b505050505050565b7f629a4c26e296b22a8e0856e9f6ecb2d1008d7e00081111962cd175fa7488e1755460009073ffffffffffffffffffffffffffffffffffffffff16806103c8573391505090565b919050565b6103e385858585856103de8b6103ea565b61046f565b5050505050565b60007f8b9d8c8b908d9affffffffffffffffffab9e9d939a8d00000000000000000000820161043957507e60030220202000000000000000000000000000000000000000000000000000919050565b6101846104667f746273746f72650000000000000000005461626c657300000000000000000000846107a8565b60206000610801565b7f6f74000000000000000000000000000000000000000000000000000000000000867fffff00000000000000000000000000000000000000000000000000000000000016036104fb57857f8dbb3a9672eebfd3773e72dd9c102393436816d832c7ba9e1e1ac8fcadcac7a9868686866040516104ee9493929190610ed7565b60405180910390a2610379565b600061050687610853565b905060005b81518110156105df57600082828151811061052857610528610dd5565b602002602001015190506105546001826affffffffffffffffffffff19166108e490919063ffffffff16565b156105d6576040517f57066c9c000000000000000000000000000000000000000000000000000000008152606082901c906357066c9c906105a3908c908c908c908c908c908c90600401610f21565b600060405180830381600087803b1580156105bd57600080fd5b505af11580156105d1573d6000803e3d6000fd5b505050505b5060010161050b565b50867f8dbb3a9672eebfd3773e72dd9c102393436816d832c7ba9e1e1ac8fcadcac7a9878787876040516106169493929190610ed7565b60405180910390a2600061062a8888610902565b90506000602087019050610642826000895184610917565b600061064d856109d5565b11156106d157600061065f8a8a610a12565b878155905060208601915060008060005b610679886109d5565b8160ff1610156106cc5761068e8d8d83610a68565b92506106a98a8260ff166028026038011c64ffffffffff1690565b91506106b88360008488610917565b6106c28286610fa9565b9450600101610670565b505050505b60005b83518110156103745760008482815181106106f1576106f1610dd5565b6020026020010151905061071d6002826affffffffffffffffffffff19166108e490919063ffffffff16565b1561079f576040517f5b28cdaf000000000000000000000000000000000000000000000000000000008152606082901c90635b28cdaf9061076c908e908e908e908e908e908e90600401610f21565b600060405180830381600087803b15801561078657600080fd5b505af115801561079a573d6000803e3d6000fd5b505050505b506001016106d4565b60408051602081018490529081018290526000906060015b60408051601f1981840301815291905280516020909101207f86425bff6b57326c7859e89024fe4f238ca327a1ae4a230180dd2f0e88aaa7d9189392505050565b6000602082106108275760208204840193506020828161082357610823610fbc565b0691505b508254600882021b60208290038084111561084b576001850154600882021c821791505b509392505050565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061088d5761088d610dd5565b602090810291909101015260006108c57f746273746f726500000000000000000053746f7265486f6f6b730000000000008383610ae8565b90506108dc6108d78260008451610b22565b610bb9565b949350505050565b60008160ff16826108f58560581c90565b1660ff1614905092915050565b600082826040516020016107c0929190610feb565b821561099157602083106109415760208304840193506020838161093d5761093d610fbc565b0692505b82156109915760208390036000600019600885021c1990506008850281811c91508351811c90508119875416828216178755508184116109825750506109cf565b50600194909401939182900391015b5b602082106109b35780518455600190930192601f1990910190602001610992565b81156109cf5783548151600019600885021c9182169119161784555b50505050565b600060086001806109e860026020611027565b6109f29190611027565b6109fc9190611027565b610a06919061103a565b8260ff911c1692915050565b60008282604051602001610a27929190610feb565b60408051601f1981840301815291905280516020909101207f14e2fcc58e58e68ec7edc30c8d50dccc3ce2714a623ec81f46b6a63922d76569189392505050565b60008383604051602001610a7d929190610feb565b604051602081830303815290604052805190602001208260f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f3b4102da22e32d82fc925482184f16c09fd4281692720b87d124aef6da48a0f1181860001c90509392505050565b60606108dc610af8858585610a68565b6000610b1d85610b088989610bd1565b9060ff166028026038011c64ffffffffff1690565b610be4565b600081831180610b325750835182115b15610b78578383836040517f23230fa3000000000000000000000000000000000000000000000000000000008152600401610b6f93929190611051565b60405180910390fd5b60208401610b868482610fa9565b90506000610b948585611027565b6fffffffffffffffffffffffffffffffff1660809290921b9190911795945050505050565b60606000610bca8360156000610c07565b9392505050565b6000610bca610be08484610a12565b5490565b60405160208101601f19603f848401011660405282825261084b85858584610c82565b60606000610c158560801c90565b90506fffffffffffffffffffffffffffffffff85166000858281610c3b57610c3b610fbc565b04905060405193506020840160208202810160405281855260005b82811015610c76578451871c825293870193602090910190600101610c56565b50505050509392505050565b8215610d095760208310610cac57602083048401935060208381610ca857610ca8610fbc565b0692505b8215610d09576020839003600081841015610ccf5750600019600884021c610cd9565b50600019600882021c5b8554600886021b818451168219821617845250818411610cfa5750506109cf565b50600194909401939182900391015b5b60208210610d2b5783548152600190930192601f1990910190602001610d0a565b81156109cf576000600019600884021c8251865482191691161782525050505050565b600060208284031215610d6057600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610bca57600080fd5b8035600381900b81146103c857600080fd5b60008060408385031215610db557600080fd5b610dbe83610d90565b9150610dcc60208401610d90565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008151808452602080850194506020840160005b83811015610e3557815187529582019590820190600101610e19565b509495945050505050565b6000815180845260005b81811015610e6657602081850181015186830182015201610e4a565b506000602082860101526020601f19601f83011685010191505092915050565b85815260a060208201526000610e9f60a0830187610e04565b8281036040840152610eb18187610e40565b90508460608401528281036080840152610ecb8185610e40565b98975050505050505050565b608081526000610eea6080830187610e04565b8281036020840152610efc8187610e40565b90508460408401528281036060840152610f168185610e40565b979650505050505050565b86815260c060208201526000610f3a60c0830188610e04565b8281036040840152610f4c8188610e40565b90508560608401528281036080840152610f668186610e40565b9150508260a0830152979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561018457610184610f7a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b8281526000602080830184516020860160005b8281101561101a57815184529284019290840190600101610ffe565b5091979650505050505050565b8181038181111561018457610184610f7a565b808202811582820484141761018457610184610f7a565b6060815260006110646060830186610e40565b6020830194909452506040015291905056fea26469706673582212205a732e14e7e55f975965cc543440191a9d44a0290136efab81360d8abf6f596064736f6c63430008180033","storage":{}},"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266":{"nonce":26,"balance":"0x21e1906419858a4f58d","code":"0x","storage":{}}},"best_block_number":"0x15"} \ No newline at end of file diff --git a/packages/account-kit/playground/index.html b/packages/account-kit/playground/index.html new file mode 100644 index 0000000000..6c4ec1b8b5 --- /dev/null +++ b/packages/account-kit/playground/index.html @@ -0,0 +1,12 @@ + + + + + + Account Kit playground + + +
+ + + diff --git a/packages/account-kit/playground/index.tsx b/packages/account-kit/playground/index.tsx new file mode 100644 index 0000000000..57a147400d --- /dev/null +++ b/packages/account-kit/playground/index.tsx @@ -0,0 +1,71 @@ +import "./polyfills"; +import "@rainbow-me/rainbowkit/styles.css"; +import { StrictMode } from "react"; +import ReactDOM from "react-dom/client"; +import { WagmiProvider, createConfig } from "wagmi"; +import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; +import { RainbowKitProvider, lightTheme, midnightTheme } from "@rainbow-me/rainbowkit"; +import { garnet, mudFoundry, redstone } from "@latticexyz/common/chains"; +import { AccountModal } from "../src/AccountModal"; +import { AccountKitConfigProvider } from "../src/AccountKitConfigProvider"; +import { App } from "./App"; +import { Hex, createClient, http } from "viem"; +import { chains } from "../src/exports/chains"; + +const queryClient = new QueryClient(); + +const wagmiConfig = createConfig({ + chains: [mudFoundry, ...chains], + client: ({ chain }) => + createClient({ + chain, + // We intentionally don't use fallback+webSocket here because if a chain's RPC config + // doesn't include a `webSocket` entry, it doesn't seem to fallback and instead just + // ~never makes any requests and all queries seem to sit idle. + transport: http(), + }), +}); + +const testWorlds = { + [mudFoundry.id]: "0x8d8b6b8414e1e3dcfd4168561b9be6bd3bf6ec4b", + [garnet.id]: "0x352bd50fc7cbb8a1b3e5f84cf6f4e7d84792acd1", + [redstone.id]: "0x51778368cd250e4e3800a8fb20c32474c5f1c8cd", +} as Partial>; + +const searchParams = new URLSearchParams(window.location.search); +const chainId = parseInt(searchParams.get("chainId") ?? "") || mudFoundry.id; +const worldAddress = testWorlds[chainId]; +if (!worldAddress) { + throw new Error(`Account Kit playground is not configured with a test world address for chain ID ${chainId}`); +} + +const accountKitConfig = { + chainId, + worldAddress, + erc4337: false, + appInfo: { + termsOfUse: "#terms", + privacyPolicy: "#privacy", + }, +} as const; + +const root = ReactDOM.createRoot(document.querySelector("#react-root")!); +root.render( + + + + + + + + + + + + , +); diff --git a/packages/account-kit/playground/polyfills.ts b/packages/account-kit/playground/polyfills.ts new file mode 100644 index 0000000000..74dce127c1 --- /dev/null +++ b/packages/account-kit/playground/polyfills.ts @@ -0,0 +1,6 @@ +// See https://www.rainbowkit.com/docs/installation#vite + +window.global = window.global ?? window; +window.process = window.process ?? { env: {} }; + +export {}; diff --git a/packages/account-kit/playground/tsconfig.json b/packages/account-kit/playground/tsconfig.json new file mode 100644 index 0000000000..379a994d81 --- /dev/null +++ b/packages/account-kit/playground/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "../tsconfig.json", + "include": ["."] +} diff --git a/packages/account-kit/playground/vite.config.ts b/packages/account-kit/playground/vite.config.ts new file mode 100644 index 0000000000..fb13be8913 --- /dev/null +++ b/packages/account-kit/playground/vite.config.ts @@ -0,0 +1,15 @@ +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; + +export default defineConfig({ + plugins: [react()], + optimizeDeps: { + esbuildOptions: { + target: "es2020", + // Node.js global to browser globalThis + define: { + global: "globalThis", + }, + }, + }, +}); diff --git a/packages/account-kit/postcss.config.cjs b/packages/account-kit/postcss.config.cjs new file mode 100644 index 0000000000..12a703d900 --- /dev/null +++ b/packages/account-kit/postcss.config.cjs @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/packages/account-kit/src/AccountButton.tsx b/packages/account-kit/src/AccountButton.tsx new file mode 100644 index 0000000000..54374b422d --- /dev/null +++ b/packages/account-kit/src/AccountButton.tsx @@ -0,0 +1,175 @@ +import { useAccountModal } from "./useAccountModal"; +import { useAccountRequirements } from "./useAccountRequirements"; +import { Shadow } from "./ui/Shadow"; +import { Logo } from "./icons/Logo"; +import { useAccount, useDisconnect } from "wagmi"; +import * as DropdownMenu from "@radix-ui/react-dropdown-menu"; +import { useState } from "react"; +import { twMerge } from "tailwind-merge"; +import { PendingIcon } from "./icons/PendingIcon"; +import { CashIcon } from "./icons/CashIcon"; +import { CopyIcon } from "./icons/CopyIcon"; +import { GlobeIcon } from "./icons/GlobeIcon"; +import { LogoutIcon } from "./icons/LogoutIcon"; +import { MoreIcon } from "./icons/MoreIcon"; +import { ChevronUpIcon } from "./icons/ChevronUpIcon"; +import { AccountName } from "./AccountName"; +import { useOnboardingSteps } from "./useOnboardingSteps"; + +const containerClassNames = twMerge( + "w-60 inline-flex outline-none transition", + "border border-transparent", + "text-base leading-none", +); + +const secondaryClassNames = twMerge( + "bg-neutral-100 border-neutral-300 text-black", + "dark:bg-neutral-800 dark:border-neutral-700 dark:text-white", +); +const menuClassNames = twMerge("divide-y divide-neutral-300 dark:divide-neutral-700"); +const secondaryInteractiveClassNames = twMerge( + "cursor-pointer outline-none hover:bg-neutral-200 data-[highlighted]:bg-neutral-200 dark:hover:bg-neutral-700", +); + +export function AccountButton() { + const { requirement } = useAccountRequirements(); + const { openAccountModal, accountModalOpen } = useAccountModal(); + const { address } = useAccount(); + const [menuOpen, setMenuOpen] = useState(false); + const { disconnect, isPending: disconnectPending } = useDisconnect(); + const { setStep } = useOnboardingSteps(); + + if (requirement != null) { + return ( + + + + ); + } + + return ( + + + + + + + + {/* TODO: do we still need this zindex now that we use iframes? */} + + +
+ { + openAccountModal(); + // TODO: add support for opening modal to specific step? + setStep("deposit"); + }} + > + + Gas balance + + {/* + + Copy address + + + + Switch chain + */} + disconnect()} + > + + Disconnect + +
+
+
+
+
+ ); +} diff --git a/packages/account-kit/src/AccountKitConfigProvider.tsx b/packages/account-kit/src/AccountKitConfigProvider.tsx new file mode 100644 index 0000000000..d34aa16fb7 --- /dev/null +++ b/packages/account-kit/src/AccountKitConfigProvider.tsx @@ -0,0 +1,22 @@ +import { createContext, useContext, type ReactNode } from "react"; +import { Config } from "./config"; + +/** @internal */ +const Context = createContext(null); + +export type Props = { + config: Config; + children?: ReactNode; +}; + +export function AccountKitConfigProvider({ config, children }: Props) { + const currentConfig = useContext(Context); + if (currentConfig) throw new Error("`AccountKitProvider` can only be used once."); + return {children}; +} + +export function useConfig(): Config { + const config = useContext(Context); + if (!config) throw new Error("`useConfig` can only be used within a `AccountKitProvider`."); + return config; +} diff --git a/packages/account-kit/src/AccountKitProvider.tsx b/packages/account-kit/src/AccountKitProvider.tsx new file mode 100644 index 0000000000..349f12d082 --- /dev/null +++ b/packages/account-kit/src/AccountKitProvider.tsx @@ -0,0 +1,22 @@ +import { type ReactNode } from "react"; +import { AccountModal } from "./AccountModal"; +import { Config } from "./config"; +import { AccountKitConfigProvider } from "./AccountKitConfigProvider"; + +// We separate the config provider and wrap it here to always include the modal. +// We could do this in AccountKitConfigProvider directly, but it mucks with hot +// reloading in development and this approach lets us work around it more easily. + +export type Props = { + config: Config; + children?: ReactNode; +}; + +export function AccountKitProvider({ config, children }: Props) { + return ( + + {children} + + + ); +} diff --git a/packages/account-kit/src/AccountModal.tsx b/packages/account-kit/src/AccountModal.tsx new file mode 100644 index 0000000000..cffa3c654f --- /dev/null +++ b/packages/account-kit/src/AccountModal.tsx @@ -0,0 +1,81 @@ +import { useEffect } from "react"; +import { Modal } from "./ui/Modal"; +import { useAccount } from "wagmi"; +import { useConnectModal } from "@rainbow-me/rainbowkit"; +import { usePrevious } from "./utils/usePrevious"; +import { AccountModalContent } from "./AccountModalContent"; +import { useAccountModal } from "./useAccountModal"; +import { twMerge } from "tailwind-merge"; +import { AccountModalSidebar } from "./AccountModalSidebar"; +import { AccountModalErrorBoundary } from "./AccountModalErrorBoundary"; + +export function AccountModal() { + const { status } = useAccount(); + const { accountModalOpen, toggleAccountModal } = useAccountModal(); + const { openConnectModal, connectModalOpen } = useConnectModal(); + const shown = accountModalOpen && status === "connected"; + + const previousOpen = usePrevious(accountModalOpen); + const previousConnectModalOpen = usePrevious(connectModalOpen); + const previousStatus = usePrevious(status); + + // We are temporarily leaning on RainbowKit for connect wallet UI, but RainbowKit + // doesn't give us much data, so we'll work around it here to reactively open/close + // based on state transitions. + // TODO: remove this once we can inline connect wallet UI into our own modal + useEffect(() => { + // account modal is open and account is not connected + if (accountModalOpen && status !== "connected" && !connectModalOpen) { + // opening account modal should open connect modal + if (!previousOpen) { + console.debug("opening connect modal"); + openConnectModal?.(); + } + // disconnecting account should re-open connect modal + else if (previousStatus === "connected") { + console.debug("disconnected, reopening connect modal"); + openConnectModal?.(); + } + // closing connect modal should close account modal + else if (previousConnectModalOpen) { + console.debug("connect modal closed, closing account modal"); + toggleAccountModal(false); + } + } + }, [ + accountModalOpen, + connectModalOpen, + openConnectModal, + previousConnectModalOpen, + previousOpen, + previousStatus, + status, + toggleAccountModal, + ]); + + return ( + + {shown ? ( +
+
+ +
+ +
+ +
+
+
+ ) : null} +
+ ); +} diff --git a/packages/account-kit/src/AccountModalContent.tsx b/packages/account-kit/src/AccountModalContent.tsx new file mode 100644 index 0000000000..908268c991 --- /dev/null +++ b/packages/account-kit/src/AccountModalContent.tsx @@ -0,0 +1,24 @@ +import { assertExhaustive } from "@latticexyz/common/utils"; +import { useOnboardingSteps } from "./useOnboardingSteps"; +import { WalletStep } from "./steps/wallet/WalletStep"; +import { AppAccountStep } from "./steps/app-account/AppAccountStep"; +import { DepositStep } from "./steps/deposit/DepositStep"; +import { FinalizingStep } from "./steps/finalizing/FinalizingStep"; + +export function AccountModalContent() { + // TODO: each step should have an `onComplete` that we can use to auto-advance if you've selected a step already + const { step } = useOnboardingSteps(); + + switch (step) { + case "wallet": + return ; + case "app-account": + return ; + case "deposit": + return ; + case "finalizing": + return ; + default: + return assertExhaustive(step); + } +} diff --git a/packages/account-kit/src/AccountModalErrorBoundary.tsx b/packages/account-kit/src/AccountModalErrorBoundary.tsx new file mode 100644 index 0000000000..518947f625 --- /dev/null +++ b/packages/account-kit/src/AccountModalErrorBoundary.tsx @@ -0,0 +1,49 @@ +import { ReactNode, useState } from "react"; +import { ErrorBoundary } from "react-error-boundary"; +import { ErrorNotice } from "./ErrorNotice"; +import { wait } from "@latticexyz/common/utils"; +import { twMerge } from "tailwind-merge"; +import { useIsMounted } from "usehooks-ts"; +import { PendingIcon } from "./icons/PendingIcon"; + +export type Props = { + children: ReactNode; +}; + +export function AccountModalErrorBoundary({ children }: Props) { + const isMounted = useIsMounted(); + const [retries, setRetries] = useState(1); + + return ( + ( +
+ + {retries > 0 ? ( + + ) : null} +
+ )} + > + {children} +
+ ); +} diff --git a/packages/account-kit/src/AccountModalSection.tsx b/packages/account-kit/src/AccountModalSection.tsx new file mode 100644 index 0000000000..bb4df0024d --- /dev/null +++ b/packages/account-kit/src/AccountModalSection.tsx @@ -0,0 +1,23 @@ +import { ReactNode } from "react"; +import { twMerge } from "tailwind-merge"; + +export type Props = { + className?: string; + children: ReactNode; +}; + +export function AccountModalSection({ className, children }: Props) { + return ( +
+
+ {children} +
+
+ ); +} diff --git a/packages/account-kit/src/AccountModalSidebar.tsx b/packages/account-kit/src/AccountModalSidebar.tsx new file mode 100644 index 0000000000..9b480074e5 --- /dev/null +++ b/packages/account-kit/src/AccountModalSidebar.tsx @@ -0,0 +1,64 @@ +import { twMerge } from "tailwind-merge"; +import { useOnboardingSteps } from "./useOnboardingSteps"; +import { Logo } from "./icons/Logo"; +import { CheckIcon } from "./icons/CheckIcon"; + +type StepNavItemProps = { + isActive: boolean; + canComplete: boolean; + isComplete: boolean; + onClick: () => void; + label: string; +}; + +function StepNavItem({ isActive, canComplete, isComplete, onClick, label }: StepNavItemProps) { + return ( + + ); +} + +export function AccountModalSidebar() { + const { step: activeStep, setStep, steps } = useOnboardingSteps(); + return ( + + ); +} diff --git a/packages/account-kit/src/AccountName.tsx b/packages/account-kit/src/AccountName.tsx new file mode 100644 index 0000000000..7e875da0bc --- /dev/null +++ b/packages/account-kit/src/AccountName.tsx @@ -0,0 +1,38 @@ +import { Hex } from "viem"; +import { useENS } from "./useENS"; +import { Logo } from "./icons/Logo"; +import { TruncatedHex } from "./ui/TruncatedHex"; +import { usePreloadImage } from "./usePreloadImage"; +import { twMerge } from "tailwind-merge"; + +export type Props = { + address: Hex | undefined; +}; + +export function AccountName({ address }: Props) { + const { data: ens } = useENS(address); + const { isSuccess: hasAvatar } = usePreloadImage(ens.avatar); + + return ( + <> + + + + + {ens.name ?? (address ? : null)} + + ); +} diff --git a/packages/account-kit/src/AccoutModalTitle.tsx b/packages/account-kit/src/AccoutModalTitle.tsx new file mode 100644 index 0000000000..c8bd09a059 --- /dev/null +++ b/packages/account-kit/src/AccoutModalTitle.tsx @@ -0,0 +1,34 @@ +import { ReactNode } from "react"; +import * as Dialog from "@radix-ui/react-dialog"; +import { CloseIcon } from "./icons/CloseIcon"; +import { twMerge } from "tailwind-merge"; + +export type Props = { + title: ReactNode; +}; + +export function AccountModalTitle({ title }: Props) { + return ( +
+ + {title} + + + + +
+ ); +} diff --git a/packages/account-kit/src/ErrorNotice.tsx b/packages/account-kit/src/ErrorNotice.tsx new file mode 100644 index 0000000000..0cc91f8cc2 --- /dev/null +++ b/packages/account-kit/src/ErrorNotice.tsx @@ -0,0 +1,37 @@ +import { twMerge } from "tailwind-merge"; +import { BaseError, UserRejectedRequestError } from "viem"; + +export type Props = { + title?: string; + error?: unknown; +}; + +export function ErrorNotice({ title: initialTitle, error }: Props) { + if (!error) return null; + // no need to let users know they rejected + if (error instanceof BaseError && error.walk((e) => e instanceof UserRejectedRequestError) != null) { + return null; + } + + // TODO: extract title from error name or first line of error message? + const title = initialTitle ?? "Error"; + + // TODO: do something to protect against `[object Object]` + const message = + typeof error === "string" ? error : error instanceof Error ? String(error) : "Something unexpected happened."; + + // TODO: add "report error" link + + return ( +
+
{title}
+
{message}
+
+ ); +} diff --git a/packages/account-kit/src/abis/OptimismPortal.json b/packages/account-kit/src/abis/OptimismPortal.json new file mode 100644 index 0000000000..b0ab2c22c0 --- /dev/null +++ b/packages/account-kit/src/abis/OptimismPortal.json @@ -0,0 +1,528 @@ +[ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "stateMutability": "payable", + "type": "receive" + }, + { + "inputs": [], + "name": "GUARDIAN", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "L2_ORACLE", + "outputs": [ + { + "internalType": "contract L2OutputOracle", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SYSTEM_CONFIG", + "outputs": [ + { + "internalType": "contract SystemConfig", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_value", + "type": "uint256" + }, + { + "internalType": "uint64", + "name": "_gasLimit", + "type": "uint64" + }, + { + "internalType": "bool", + "name": "_isCreation", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "name": "depositTransaction", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "donateETH", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct Types.WithdrawalTransaction", + "name": "_tx", + "type": "tuple" + } + ], + "name": "finalizeWithdrawalTransaction", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "finalizedWithdrawals", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "guardian", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract L2OutputOracle", + "name": "_l2Oracle", + "type": "address" + }, + { + "internalType": "contract SystemConfig", + "name": "_systemConfig", + "type": "address" + }, + { + "internalType": "contract SuperchainConfig", + "name": "_superchainConfig", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_l2OutputIndex", + "type": "uint256" + } + ], + "name": "isOutputFinalized", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "l2Oracle", + "outputs": [ + { + "internalType": "contract L2OutputOracle", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "l2Sender", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "_byteCount", + "type": "uint64" + } + ], + "name": "minimumGasLimit", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "params", + "outputs": [ + { + "internalType": "uint128", + "name": "prevBaseFee", + "type": "uint128" + }, + { + "internalType": "uint64", + "name": "prevBoughtGas", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "prevBlockNum", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "paused_", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct Types.WithdrawalTransaction", + "name": "_tx", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "_l2OutputIndex", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "version", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "stateRoot", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "messagePasserStorageRoot", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "latestBlockhash", + "type": "bytes32" + } + ], + "internalType": "struct Types.OutputRootProof", + "name": "_outputRootProof", + "type": "tuple" + }, + { + "internalType": "bytes[]", + "name": "_withdrawalProof", + "type": "bytes[]" + } + ], + "name": "proveWithdrawalTransaction", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "provenWithdrawals", + "outputs": [ + { + "internalType": "bytes32", + "name": "outputRoot", + "type": "bytes32" + }, + { + "internalType": "uint128", + "name": "timestamp", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "l2OutputIndex", + "type": "uint128" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "superchainConfig", + "outputs": [ + { + "internalType": "contract SuperchainConfig", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "systemConfig", + "outputs": [ + { + "internalType": "contract SystemConfig", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "version", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "opaqueData", + "type": "bytes" + } + ], + "name": "TransactionDeposited", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "withdrawalHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "name": "WithdrawalFinalized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "withdrawalHash", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "name": "WithdrawalProven", + "type": "event" + } +] diff --git a/packages/account-kit/src/abis/PaymasterSystem.json b/packages/account-kit/src/abis/PaymasterSystem.json new file mode 100644 index 0000000000..ebe5e2ad15 --- /dev/null +++ b/packages/account-kit/src/abis/PaymasterSystem.json @@ -0,0 +1,227 @@ +[ + { + "type": "function", + "name": "_msgSender", + "inputs": [], + "outputs": [{ "name": "sender", "type": "address", "internalType": "address" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "_msgValue", + "inputs": [], + "outputs": [{ "name": "value", "type": "uint256", "internalType": "uint256" }], + "stateMutability": "pure" + }, + { + "type": "function", + "name": "_world", + "inputs": [], + "outputs": [{ "name": "", "type": "address", "internalType": "address" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "depositTo", + "inputs": [{ "name": "account", "type": "address", "internalType": "address" }], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "getAllowance", + "inputs": [{ "name": "spender", "type": "address", "internalType": "address" }], + "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getBalance", + "inputs": [{ "name": "user", "type": "address", "internalType": "address" }], + "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "postOp", + "inputs": [ + { + "name": "mode", + "type": "uint8", + "internalType": "enum IPaymaster.PostOpMode" + }, + { "name": "context", "type": "bytes", "internalType": "bytes" }, + { + "name": "actualGasCost", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "actualUserOpFeePerGas", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "registerSpender", + "inputs": [{ "name": "spender", "type": "address", "internalType": "address" }], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "supportsInterface", + "inputs": [{ "name": "interfaceId", "type": "bytes4", "internalType": "bytes4" }], + "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }], + "stateMutability": "pure" + }, + { + "type": "function", + "name": "unregisterSpender", + "inputs": [{ "name": "spender", "type": "address", "internalType": "address" }], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "validatePaymasterUserOp", + "inputs": [ + { + "name": "userOp", + "type": "tuple", + "internalType": "struct PackedUserOperation", + "components": [ + { "name": "sender", "type": "address", "internalType": "address" }, + { "name": "nonce", "type": "uint256", "internalType": "uint256" }, + { "name": "initCode", "type": "bytes", "internalType": "bytes" }, + { "name": "callData", "type": "bytes", "internalType": "bytes" }, + { + "name": "accountGasLimits", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "preVerificationGas", + "type": "uint256", + "internalType": "uint256" + }, + { "name": "gasFees", "type": "bytes32", "internalType": "bytes32" }, + { + "name": "paymasterAndData", + "type": "bytes", + "internalType": "bytes" + }, + { "name": "signature", "type": "bytes", "internalType": "bytes" } + ] + }, + { "name": "userOpHash", "type": "bytes32", "internalType": "bytes32" }, + { "name": "maxCost", "type": "uint256", "internalType": "uint256" } + ], + "outputs": [ + { "name": "context", "type": "bytes", "internalType": "bytes" }, + { + "name": "validationData", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "withdrawTo", + "inputs": [ + { + "name": "withdrawAddress", + "type": "address", + "internalType": "address payable" + }, + { + "name": "withdrawAmount", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Store_DeleteRecord", + "inputs": [ + { + "name": "tableId", + "type": "bytes32", + "indexed": true, + "internalType": "ResourceId" + }, + { + "name": "keyTuple", + "type": "bytes32[]", + "indexed": false, + "internalType": "bytes32[]" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Store_SpliceStaticData", + "inputs": [ + { + "name": "tableId", + "type": "bytes32", + "indexed": true, + "internalType": "ResourceId" + }, + { + "name": "keyTuple", + "type": "bytes32[]", + "indexed": false, + "internalType": "bytes32[]" + }, + { + "name": "start", + "type": "uint48", + "indexed": false, + "internalType": "uint48" + }, + { + "name": "data", + "type": "bytes", + "indexed": false, + "internalType": "bytes" + } + ], + "anonymous": false + }, + { "type": "error", "name": "ECDSAInvalidSignature", "inputs": [] }, + { + "type": "error", + "name": "ECDSAInvalidSignatureLength", + "inputs": [{ "name": "length", "type": "uint256", "internalType": "uint256" }] + }, + { + "type": "error", + "name": "ECDSAInvalidSignatureS", + "inputs": [{ "name": "s", "type": "bytes32", "internalType": "bytes32" }] + }, + { + "type": "error", + "name": "InvalidSignature", + "inputs": [{ "name": "signer", "type": "address", "internalType": "address" }] + }, + { + "type": "error", + "name": "Slice_OutOfBounds", + "inputs": [ + { "name": "data", "type": "bytes", "internalType": "bytes" }, + { "name": "start", "type": "uint256", "internalType": "uint256" }, + { "name": "end", "type": "uint256", "internalType": "uint256" } + ] + } +] diff --git a/packages/account-kit/src/actions/observe.ts b/packages/account-kit/src/actions/observe.ts new file mode 100644 index 0000000000..ea4459a475 --- /dev/null +++ b/packages/account-kit/src/actions/observe.ts @@ -0,0 +1,67 @@ +import type { MaybePromise } from "viem/types/utils"; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +type Callback = ((...args: any[]) => any) | undefined; +type Callbacks = Record; + +export const listenersCache = /*#__PURE__*/ new Map(); +export const cleanupCache = /*#__PURE__*/ new Map void>(); + +type EmitFunction = ( + emit: TCallbacks, + // biome-ignore lint/suspicious/noConfusingVoidType: +) => MaybePromise void)>; + +let callbackCount = 0; + +// TODO: import from viem once exported from viem +/** + * @description Sets up an observer for a given function. If another function + * is set up under the same observer id, the function will only be called once + * for both instances of the observer. + */ +export function observe( + observerId: string, + callbacks: TCallbacks, + fn: EmitFunction, +) { + const callbackId = ++callbackCount; + + const getListeners = () => listenersCache.get(observerId) || []; + + const unsubscribe = () => { + const listeners = getListeners(); + listenersCache.set( + observerId, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + listeners.filter((cb: any) => cb.id !== callbackId), + ); + }; + + const unwatch = () => { + const cleanup = cleanupCache.get(observerId); + if (getListeners().length === 1 && cleanup) cleanup(); + unsubscribe(); + }; + + const listeners = getListeners(); + listenersCache.set(observerId, [...listeners, { id: callbackId, fns: callbacks }]); + + if (listeners && listeners.length > 0) return unwatch; + + const emit: TCallbacks = {} as TCallbacks; + for (const key in callbacks) { + emit[key] = ((...args: Parameters>) => { + const listeners = getListeners(); + if (listeners.length === 0) return; + for (const listener of listeners) { + listener.fns[key]?.(...args); + } + }) as TCallbacks[Extract]; + } + + const cleanup = fn(emit); + if (typeof cleanup === "function") cleanupCache.set(observerId, cleanup); + + return unwatch; +} diff --git a/packages/account-kit/src/actions/sendTransaction.ts b/packages/account-kit/src/actions/sendTransaction.ts new file mode 100644 index 0000000000..f5cd90f786 --- /dev/null +++ b/packages/account-kit/src/actions/sendTransaction.ts @@ -0,0 +1,146 @@ +import { AccountOrClientNotFoundError, UserOperation } from "permissionless"; +import { Middleware, prepareUserOperationRequest } from "permissionless/actions/smartAccount"; +import { EntryPoint, GetEntryPointVersion } from "permissionless/types/entrypoint"; +import { SmartAccount } from "permissionless/accounts"; +import type { + Chain, + Client, + EstimateFeesPerGasReturnType, + FeeValuesEIP1559, + Hash, + SendTransactionParameters, + Transport, +} from "viem"; +import { Prettify } from "viem/chains"; +import { getAction, parseAccount } from "viem/utils"; +import { waitForUserOperationTransactionHash } from "./waitForUserOperationTransactionHash"; +import { getFeeRef } from "@latticexyz/common"; +import pRetry from "p-retry"; +import { sendUserOperation as sendUserOperationBundler } from "permissionless/actions"; + +export type SendTransactionWithPaymasterParameters< + entryPoint extends EntryPoint, + TChain extends Chain | undefined = Chain | undefined, + TAccount extends SmartAccount | undefined = SmartAccount | undefined, + TChainOverride extends Chain | undefined = Chain | undefined, +> = SendTransactionParameters & Middleware; + +export type WriteContractExtraOptions = { + estimateFeesPerGas?: () => Promise; +}; + +/** + * Override sendTransaction with smart account handling. + * Note: no guaranteed order since a unique `key` is used for every smart account nonce. + */ +export async function sendTransaction< + TChain extends Chain | undefined, + TAccount extends SmartAccount | undefined, + entryPoint extends EntryPoint, + TChainOverride extends Chain | undefined = Chain | undefined, +>( + client: Client, + args: Prettify>, + opts: WriteContractExtraOptions = {}, +): Promise { + const { + account: account_ = client.account, + data, + maxFeePerGas, + maxPriorityFeePerGas, + to, + value, + nonce, + middleware, + } = args; + + if (!account_) { + throw new AccountOrClientNotFoundError({ + docsPath: "/docs/actions/wallet/sendTransaction", + }); + } + + const account = parseAccount(account_) as SmartAccount; + + if (!to) throw new Error("Missing to address"); + + if (account.type !== "local") { + throw new Error("RPC account type not supported"); + } + + // Refetch the current fees independently of sending user ops to reduce latency + const feeRef = await getFeeRef({ + client, + refreshInterval: 10000, + args: { chain: client.chain }, + estimateFeesPerGas: opts.estimateFeesPerGas, + }); + + const callData = await account.encodeCallData({ + to, + value: value || BigInt(0), + data: data || "0x", + }); + + return pRetry( + async () => { + const { account: account_ = client.account } = args; + if (!account_) throw new AccountOrClientNotFoundError(); + + const account = parseAccount(account_) as SmartAccount; + + const userOperation = await getAction( + client, + prepareUserOperationRequest, + "prepareUserOperationRequest", + )({ + userOperation: { + sender: account.address, + maxFeePerGas: maxFeePerGas ?? (feeRef.fees as FeeValuesEIP1559).maxFeePerGas ?? BigInt(0), + maxPriorityFeePerGas: + maxPriorityFeePerGas ?? (feeRef.fees as FeeValuesEIP1559).maxPriorityFeePerGas ?? BigInt(0), + callData: callData, + nonce: nonce ? BigInt(nonce) : undefined, + }, + account: account, + middleware, + }); + + // We use Date.now() as `key` for the smart account nonce. + // Using only `key` allows us to send multiple user operations to the bundler and be included in the same block, + // but there is no guaranteed ordering of the user operations. + userOperation.nonce = nonce ? BigInt(nonce) : BigInt(Date.now()) << 64n; + + userOperation.signature = await account.signUserOperation( + userOperation as UserOperation>, + ); + + const userOpHash = await getAction( + client, + sendUserOperationBundler, + "sendUserOperationBundler", + )({ + userOperation: userOperation as UserOperation>, + entryPoint: account.entryPoint, + }); + + const userOperationTransactionHash = await getAction( + client, + waitForUserOperationTransactionHash, + "waitForUserOperationTransactionHash", + )({ + hash: userOpHash, + timeout: 10_000, + }); + + return userOperationTransactionHash.transactionHash; + }, + { + retries: 3, + onFailedAttempt: async (error) => { + // TODO: any case in which we should retry? + throw error; + }, + }, + ); +} diff --git a/packages/account-kit/src/actions/waitForUserOperationTransactionHash.ts b/packages/account-kit/src/actions/waitForUserOperationTransactionHash.ts new file mode 100644 index 0000000000..e591b9191d --- /dev/null +++ b/packages/account-kit/src/actions/waitForUserOperationTransactionHash.ts @@ -0,0 +1,115 @@ +import { getUserOperationStatus } from "permissionless/actions/pimlico"; +import { observe } from "./observe"; +import { type Account, BaseError, type Chain, type Client, type Hash, type Transport, stringify } from "viem"; +import { getAction } from "viem/utils"; +import { waitForUserOperationReceipt } from "permissionless"; + +export class WaitForUserOperationReceiptTimeoutError extends BaseError { + override name = "WaitForUserOperationReceiptTimeoutError"; + constructor({ hash }: { hash: Hash }) { + super(`Timed out while waiting for transaction with hash "${hash}" to be confirmed.`); + } +} + +export type WaitForUserOperationTransactionHashParameters = { + /** The hash of the user operation. */ + hash: Hash; + /** + * Polling frequency (in ms). Defaults to the client's pollingInterval config. + * @default client.pollingInterval + */ + pollingInterval?: number; + /** Optional timeout (in milliseconds) to wait before stopping polling. */ + timeout?: number; +}; + +export type WaitForUserOperationTransactionHashReturnType = { + /** The hash of the transaction. */ + transactionHash: Hash; +}; + +/** + * Waits for `pimlico_getUserOperationStatus` to return a transaction hash. + * + * + * @param client - Bundler Client to use + * @param parameters - {@link WaitForUserOperationReceiptParameters} + * @returns The transaction receipt. {@link GetUserOperationReceiptReturnType} + * + * @example + * import { createBundlerClient, waitForUserOperationReceipt, http } from 'viem' + * import { mainnet } from 'viem/chains' + * + * const client = createBundlerClient({ + * chain: mainnet, + * transport: http(), + * }) + * const userOperationReceipt = await waitForUserOperationReceipt(client, { + * hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d', + * }) + */ +export const waitForUserOperationTransactionHash = async < + TTransport extends Transport = Transport, + TChain extends Chain | undefined = Chain | undefined, + TAccount extends Account | undefined = Account | undefined, +>( + bundlerClient: Client, + { hash, pollingInterval = bundlerClient.pollingInterval, timeout }: WaitForUserOperationTransactionHashParameters, +): Promise => { + const observerId = stringify(["waitForUserOperationReceipt", bundlerClient.uid, hash]); + + const getUserOperationStatusPromise = new Promise((resolve, reject) => { + const unobserve = observe(observerId, { resolve, reject }, async (emit) => { + let timeoutTimer: ReturnType; + + const _removeInterval = setInterval(async () => { + const done = (fn: () => void) => { + clearInterval(_removeInterval); + fn(); + unobserve(); + if (timeout) clearTimeout(timeoutTimer); + }; + try { + const _userOperationStatus = await getAction( + bundlerClient, + getUserOperationStatus, + "getUserOperationStatus", + )({ hash }); + + if (_userOperationStatus.transactionHash !== null) { + done(() => emit.resolve({ transactionHash: _userOperationStatus.transactionHash })); + return; + } + + // The only valid state in which the status doesn not include a tx hash is "not_submitted" or "not_found" + if (_userOperationStatus.status !== "not_submitted" && _userOperationStatus.status !== "not_found") { + done(() => emit.reject("Unexpected transaction status: " + _userOperationStatus.status)); + } + } catch (err) { + done(() => emit.reject(err)); + return; + } + }, pollingInterval); + + if (timeout) { + timeoutTimer = setTimeout(() => { + clearInterval(_removeInterval); + unobserve(); + reject( + new WaitForUserOperationReceiptTimeoutError({ + hash, + }), + ); + clearTimeout(timeoutTimer); + }, timeout); + } + }); + }); + + try { + return (await getUserOperationStatusPromise) as WaitForUserOperationTransactionHashReturnType; + } catch (e) { + const result = await getAction(bundlerClient, waitForUserOperationReceipt, "waitForUserOperationReceipt")({ hash }); + return { transactionHash: result.receipt.transactionHash }; + } +}; diff --git a/packages/account-kit/src/bundle/Buttons.tsx b/packages/account-kit/src/bundle/Buttons.tsx new file mode 100644 index 0000000000..cbf60a399e --- /dev/null +++ b/packages/account-kit/src/bundle/Buttons.tsx @@ -0,0 +1,10 @@ +import ReactDOM from "react-dom"; +import { useStore } from "zustand"; +import { internalStore } from "./internalStore"; +import { AccountButton } from "../AccountButton"; + +export function Buttons() { + // TODO: do we need to assign IDs to these for `key`? + const containers = useStore(internalStore, (state) => state.buttonContainers); + return <>{containers.map((container) => ReactDOM.createPortal(, container))}; +} diff --git a/packages/account-kit/src/bundle/SyncStore.tsx b/packages/account-kit/src/bundle/SyncStore.tsx new file mode 100644 index 0000000000..04ecf38f21 --- /dev/null +++ b/packages/account-kit/src/bundle/SyncStore.tsx @@ -0,0 +1,41 @@ +import { useAccountModal } from "../useAccountModal"; +import { usePreparedAppAccountClient } from "../usePreparedAppAccountClient"; +import { useEffect } from "react"; +import { Store } from "./store"; +import { useAccount, useConnectorClient } from "wagmi"; + +export type Props = { + store: Store; +}; + +export function SyncStore({ store }: Props) { + const { accountModalOpen, openAccountModal, closeAccountModal, toggleAccountModal } = useAccountModal(); + const appAccountClient = usePreparedAppAccountClient(); + const { data: userAccountClient } = useConnectorClient(); + const { address: userAddress, chainId: userChainId } = useAccount(); + + useEffect(() => { + store.setState({ + accountModalOpen, + openAccountModal, + closeAccountModal, + toggleAccountModal, + appAccountClient, + userAccountClient, + userAddress, + userChainId, + }); + }, [ + store, + accountModalOpen, + appAccountClient, + closeAccountModal, + openAccountModal, + toggleAccountModal, + userAccountClient, + userAddress, + userChainId, + ]); + + return <>; +} diff --git a/packages/account-kit/src/bundle/internalStore.ts b/packages/account-kit/src/bundle/internalStore.ts new file mode 100644 index 0000000000..5af2b983f6 --- /dev/null +++ b/packages/account-kit/src/bundle/internalStore.ts @@ -0,0 +1,13 @@ +import { StoreApi, createStore } from "zustand/vanilla"; + +export type State = { + rootContainer: Element | undefined; + buttonContainers: readonly Element[]; +}; + +export type Store = StoreApi; + +export const internalStore = createStore(() => ({ + rootContainer: undefined, + buttonContainers: [], +})); diff --git a/packages/account-kit/src/bundle/mount.tsx b/packages/account-kit/src/bundle/mount.tsx new file mode 100644 index 0000000000..46f3c8e24e --- /dev/null +++ b/packages/account-kit/src/bundle/mount.tsx @@ -0,0 +1,96 @@ +import rainbowKitCss from "@rainbow-me/rainbowkit/styles.css?inline"; +import type { Config as WagmiConfig } from "wagmi"; +import type { Config as AccountKitConfig } from "../config"; +import { store } from "./store"; +import { internalStore } from "./internalStore"; +import { Buttons } from "./Buttons"; + +export type MountOptions = { + // TODO: accept a CSS selector? + rootContainer?: Element | undefined; + // TODO: make this a top-level config + accountKitConfig: AccountKitConfig; + // TODO: can we do sane defaults here based on e.g. chain? + wagmiConfig: WagmiConfig; +}; + +if (typeof window === "undefined" || typeof document === "undefined") { + // TODO: should we throw inside `mount()` instead of at import time? + throw new Error("MUD Account Kit should only be used in browser bundles."); +} + +export function mount({ + rootContainer: initialRootContainer, + wagmiConfig, + accountKitConfig, +}: MountOptions): () => void { + if (internalStore.getState().rootContainer) { + throw new Error("MUD Account Kit is already mounted and only one instance is allowed on the page at a time."); + } + + const rootContainer = initialRootContainer ?? document.body.appendChild(document.createElement("div")); + internalStore.setState({ rootContainer }); + + async function setup() { + // TODO: do async imports like this help us at all with bundle sizes/code splitting? + const React = await import("react"); + const ReactDOM = await import("react-dom/client"); + const { WagmiProvider } = await import("wagmi"); + const { QueryClientProvider, QueryClient } = await import("@tanstack/react-query"); + const { RainbowKitProvider, lightTheme, midnightTheme } = await import("@rainbow-me/rainbowkit"); + const { AccountKitProvider } = await import("../AccountKitProvider"); + const { SyncStore } = await import("./SyncStore"); + + const queryClient = new QueryClient(); + + const root = ReactDOM.createRoot(rootContainer); + root.render( + + + + + + + +