-
Notifications
You must be signed in to change notification settings - Fork 1
/
BaseV1Factory.json
478 lines (478 loc) · 120 KB
/
BaseV1Factory.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
{
"address": "0xE387067f12561e579C5f7d4294f51867E0c1cFba",
"abi": [
{
"inputs": [],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "token0",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "token1",
"type": "address"
},
{
"indexed": false,
"internalType": "bool",
"name": "stable",
"type": "bool"
},
{
"indexed": false,
"internalType": "address",
"name": "pair",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"name": "PairCreated",
"type": "event"
},
{
"inputs": [],
"name": "acceptPauser",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "admin",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"name": "allPairs",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "allPairsLength",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "tokenA",
"type": "address"
},
{
"internalType": "address",
"name": "tokenB",
"type": "address"
},
{
"internalType": "bool",
"name": "stable",
"type": "bool"
}
],
"name": "createPair",
"outputs": [
{
"internalType": "address",
"name": "pair",
"type": "address"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "getInitializable",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"name": "getPair",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "isPair",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "isPaused",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "pairCodeHash",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "pure",
"type": "function"
},
{
"inputs": [],
"name": "pauser",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "pendingPauser",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "admin_",
"type": "address"
}
],
"name": "setAdmin",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bool",
"name": "_state",
"type": "bool"
}
],
"name": "setPause",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_pauser",
"type": "address"
}
],
"name": "setPauser",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "newPeriod",
"type": "uint256"
}
],
"name": "setPeriodSize",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
],
"transactionHash": "0xb196b1aa3fe62b13698fc39eb6a792ff578bd9015c6c240ab5937f1d680aaa09",
"receipt": {
"to": null,
"from": "0x2fA8e44e9A3D833019FCc52D62B4dD05125cA1b1",
"contractAddress": "0xE387067f12561e579C5f7d4294f51867E0c1cFba",
"transactionIndex": 0,
"gasUsed": "4313236",
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"blockHash": "0xc2d13208f65bdf997f2afc167044ceac1c2db8fecd7c90acdf23fcd2f58c78f5",
"transactionHash": "0xb196b1aa3fe62b13698fc39eb6a792ff578bd9015c6c240ab5937f1d680aaa09",
"logs": [],
"blockNumber": 224994,
"cumulativeGasUsed": "4313236",
"status": 1,
"byzantium": true
},
"args": [],
"numDeployments": 1,
"solcInputHash": "a822655fb04b3944b585567b09afe37c",
"metadata": "{\"compiler\":{\"version\":\"0.8.11+commit.d7f03943\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token0\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token1\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"stable\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"pair\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"PairCreated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptPauser\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"admin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"allPairs\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"allPairsLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenA\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenB\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"stable\",\"type\":\"bool\"}],\"name\":\"createPair\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"pair\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getInitializable\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"name\":\"getPair\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"isPair\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pairCodeHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pauser\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingPauser\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"admin_\",\"type\":\"address\"}],\"name\":\"setAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"_state\",\"type\":\"bool\"}],\"name\":\"setPause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_pauser\",\"type\":\"address\"}],\"name\":\"setPauser\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newPeriod\",\"type\":\"uint256\"}],\"name\":\"setPeriodSize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/Swap/BaseV1-core.sol\":\"BaseV1Factory\"},\"evmVersion\":\"london\",\"libraries\":{\":__CACHE_BREAKER__\":\"0x0000000000000031363630313837333733303434\"},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"src/Swap/BaseV1-core.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.11;\\n\\nimport \\\"./BaseV1-libs.sol\\\";\\n\\ninterface IBaseV1Callee {\\n function hook(address sender, uint amount0, uint amount1, bytes calldata data) external;\\n}\\n\\n// The base pair of pools, either stable or volatile\\ncontract BaseV1Pair {\\n\\n string public name;\\n string public symbol;\\n uint8 public constant decimals = 18;\\n\\n // Used to denote stable or volatile pair, not immutable since construction happens in the initialize method for CREATE2 deterministic addresses\\n bool public immutable stable;\\n\\n uint public totalSupply = 0;\\n\\n mapping(address => mapping (address => uint)) public allowance;\\n mapping(address => uint) public balanceOf;\\n\\n bytes32 internal DOMAIN_SEPARATOR;\\n // keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n bytes32 internal constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;\\n mapping(address => uint) public nonces;\\n\\n uint internal constant MINIMUM_LIQUIDITY = 10**3;\\n\\n address public immutable token0;\\n address public immutable token1;\\n address immutable factory;\\n\\n // Structure to capture time period obervations every 30 minutes, used for local oracles\\n struct Observation {\\n uint timestamp;\\n uint reserve0Cumulative;\\n uint reserve1Cumulative;\\n uint totalSupplyCumulative;\\n }\\n\\n // Capture oracle reading every 30 minutes\\n uint public periodSize = 1800;\\n\\n Observation[] public observations;\\n\\n uint internal immutable decimals0;\\n uint internal immutable decimals1;\\n\\n uint public reserve0;\\n uint public reserve1;\\n uint public blockTimestampLast;\\n\\n uint public reserve0CumulativeLast;\\n uint public reserve1CumulativeLast;\\n uint public totalSupplyCumulativeLast;\\n\\n\\n // position assigned to each LP to track their current index0 & index1 vs the global position\\n mapping(address => uint) public supplyIndex0;\\n mapping(address => uint) public supplyIndex1;\\n\\n event Mint(address indexed sender, uint amount0, uint amount1);\\n event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);\\n event Swap(\\n address indexed sender,\\n uint amount0In,\\n uint amount1In,\\n uint amount0Out,\\n uint amount1Out,\\n address indexed to\\n );\\n event Sync(uint reserve0, uint reserve1);\\n event Claim(address indexed sender, address indexed recipient, uint amount0, uint amount1);\\n\\n event Transfer(address indexed from, address indexed to, uint amount);\\n event Approval(address indexed owner, address indexed spender, uint amount);\\n\\n constructor() {\\n factory = msg.sender;\\n (address _token0, address _token1, bool _stable) = BaseV1Factory(msg.sender).getInitializable();\\n (token0, token1, stable) = (_token0, _token1, _stable);\\n if (_stable) {\\n name = string(abi.encodePacked(\\\"StableV1 AMM - \\\", erc20(_token0).symbol(), \\\"/\\\", erc20(_token1).symbol()));\\n symbol = string(abi.encodePacked(\\\"sAMM-\\\", erc20(_token0).symbol(), \\\"/\\\", erc20(_token1).symbol()));\\n } else {\\n name = string(abi.encodePacked(\\\"VolatileV1 AMM - \\\", erc20(_token0).symbol(), \\\"/\\\", erc20(_token1).symbol()));\\n symbol = string(abi.encodePacked(\\\"vAMM-\\\", erc20(_token0).symbol(), \\\"/\\\", erc20(_token1).symbol()));\\n }\\n\\n decimals0 = 10**erc20(_token0).decimals();\\n decimals1 = 10**erc20(_token1).decimals();\\n\\n observations.push(Observation(block.timestamp, 0, 0,0));\\n }\\n\\n function setPeriodSize(uint periodSize_) external {\\n require(msg.sender == factory);\\n periodSize = periodSize_;\\n }\\n\\n\\n // simple re-entrancy check\\n uint internal _unlocked = 1;\\n modifier lock() {\\n require(_unlocked == 1);\\n _unlocked = 2;\\n _;\\n _unlocked = 1;\\n }\\n\\n function observationLength() external view returns (uint) {\\n return observations.length;\\n }\\n\\n function lastObservation() public view returns (Observation memory) {\\n return observations[observations.length-1];\\n }\\n\\n function metadata() external view returns (uint dec0, uint dec1, uint r0, uint r1, bool st, address t0, address t1) {\\n return (decimals0, decimals1, reserve0, reserve1, stable, token0, token1);\\n }\\n\\n function tokens() external view returns (address, address) {\\n return (token0, token1);\\n }\\n\\n function getReserves() public view returns (uint _reserve0, uint _reserve1, uint _blockTimestampLast) {\\n _reserve0 = reserve0;\\n _reserve1 = reserve1;\\n _blockTimestampLast = blockTimestampLast;\\n }\\n\\n // update reserves and, on the first call per block, price accumulators\\n function _update(uint balance0, uint balance1, uint _reserve0, uint _reserve1) internal {\\n uint blockTimestamp = block.timestamp;\\n uint timeElapsed = blockTimestamp - blockTimestampLast;\\n if (timeElapsed > 0 && _reserve0 != 0 && _reserve1 != 0) {\\n reserve0CumulativeLast += _reserve0 * timeElapsed;\\n reserve1CumulativeLast += _reserve1 * timeElapsed;\\n totalSupplyCumulativeLast += totalSupply * timeElapsed; //update totalSupply after each change in LP Token supply \\n }\\n\\n Observation memory _point = lastObservation();\\n timeElapsed = blockTimestamp - _point.timestamp; // compare the last observation with current timestamp, if greater than 30 minutes, record a new event\\n if (timeElapsed > periodSize) {\\n observations.push(Observation(blockTimestamp, reserve0CumulativeLast, reserve1CumulativeLast, totalSupplyCumulativeLast));\\n }\\n reserve0 = balance0;\\n reserve1 = balance1;\\n blockTimestampLast = blockTimestamp;\\n emit Sync(reserve0, reserve1);\\n }\\n\\n // produces the cumulative price using counterfactuals to save gas and avoid a call to sync.\\n function currentCumulativePrices() public view returns (uint reserve0Cumulative, uint reserve1Cumulative, uint blockTimestamp) {\\n blockTimestamp = block.timestamp;\\n reserve0Cumulative = reserve0CumulativeLast;\\n reserve1Cumulative = reserve1CumulativeLast;\\n\\n // if time has elapsed since the last update on the pair, mock the accumulated price values\\n (uint _reserve0, uint _reserve1, uint _blockTimestampLast) = getReserves();\\n if (_blockTimestampLast != blockTimestamp) {\\n uint timeElapsed = blockTimestamp - _blockTimestampLast;\\n reserve0Cumulative += _reserve0 * timeElapsed;\\n reserve1Cumulative += _reserve1 * timeElapsed;\\n }\\n }\\n\\n // gives the current twap price measured from amountIn * tokenIn gives amountOut\\n function current(address tokenIn, uint amountIn) external view returns (uint amountOut) {\\n Observation memory _observation = lastObservation();\\n (uint reserve0Cumulative, uint reserve1Cumulative,) = currentCumulativePrices();\\n if (block.timestamp == _observation.timestamp) {\\n _observation = observations[observations.length-2];\\n }\\n\\n uint timeElapsed = block.timestamp - _observation.timestamp;\\n uint _reserve0 = (reserve0Cumulative - _observation.reserve0Cumulative) / timeElapsed;\\n uint _reserve1 = (reserve1Cumulative - _observation.reserve1Cumulative) / timeElapsed;\\n amountOut = _getAmountOut(amountIn, tokenIn, _reserve0, _reserve1);\\n }\\n\\n // as per `current`, however allows user configured granularity, up to the full window size\\n function quote(address tokenIn, uint amountIn, uint granularity) external view returns (uint amountOut) {\\n uint [] memory _prices = sample(tokenIn, amountIn, granularity, 1);\\n uint priceAverageCumulative;\\n for (uint i = 0; i < _prices.length; i++) {\\n priceAverageCumulative += _prices[i];\\n }\\n return priceAverageCumulative / granularity;\\n }\\n\\n // returns a memory set of twap prices\\n function prices(address tokenIn, uint amountIn, uint points) external view returns (uint[] memory) {\\n return sample(tokenIn, amountIn, points, 1);\\n }\\n\\n function sample(address tokenIn, uint amountIn, uint points, uint window) public view returns (uint[] memory) {\\n uint[] memory _prices = new uint[](points);\\n\\n uint lastIndex = observations.length-1;\\n \\n require(lastIndex >= points * window, \\\"PAIR::NOT READY FOR PRICING\\\"); //log if the price is requested and there are not enough observations\\n \\n uint i = lastIndex - (points * window); // point from which to begin the sample\\n uint nextIndex = 0;\\n uint index = 0;\\n\\n for (; i < lastIndex; i+=window) {\\n nextIndex = i + window;\\n uint timeElapsed = observations[nextIndex].timestamp - observations[i].timestamp;\\n uint _reserve0 = (observations[nextIndex].reserve0Cumulative - observations[i].reserve0Cumulative) / timeElapsed;\\n uint _reserve1 = (observations[nextIndex].reserve1Cumulative - observations[i].reserve1Cumulative) / timeElapsed;\\n _prices[index] = _getAmountOut(amountIn, tokenIn, _reserve0, _reserve1);\\n index = index + 1;\\n }\\n\\n return _prices;\\n }\\n\\n function reserves(uint granularity) external view returns(uint, uint) {\\n (uint[] memory _reserves0, uint[] memory _reserves1)= sampleReserves(granularity, 1);\\n uint reserveAverageCumulative0;\\n uint reserveAverageCumulative1;\\n\\n for (uint i = 0; i < _reserves0.length; ++i) {\\n reserveAverageCumulative0 += _reserves0[i]; //normalize the reserves for TWAP LP Oracle pricing, \\n reserveAverageCumulative1 += _reserves1[i]; //\\n }\\n\\n return (reserveAverageCumulative0 / granularity, reserveAverageCumulative1 / granularity);\\n }\\n\\n function sampleReserves(uint points, uint window) public view returns (uint[] memory, uint[] memory) {\\n uint[] memory _reserves0 = new uint[](points);\\n uint[] memory _reserves1 = new uint[](points);\\n \\n uint lastIndex = observations.length-1;\\n require(lastIndex >= points * window, \\\"PAIR::NOT READY FOR PRICING\\\");\\n uint i = lastIndex - (points * window); // point from which to begin the sample\\n uint nextIndex = 0;\\n uint index = 0;\\n uint timeElapsed;\\n\\n for(; i < lastIndex; i+=window) {\\n nextIndex = i + window;\\n timeElapsed = observations[nextIndex].timestamp - observations[i].timestamp;\\n _reserves0[index] = (observations[nextIndex].reserve0Cumulative - observations[i].reserve0Cumulative) / timeElapsed;\\n _reserves1[index] = (observations[nextIndex].reserve1Cumulative - observations[i].reserve1Cumulative) / timeElapsed;\\n \\n index = index + 1;\\n }\\n\\n return (_reserves0, _reserves1);\\n }\\n\\n function totalSupplyAvg(uint granularity) external view returns(uint) {\\n uint[] memory _totalSupplyAvg = sampleSupply(granularity, 1);\\n uint totalSupplyCumulativeAvg;\\n\\n for (uint i = 0; i < _totalSupplyAvg.length; ++i) {\\n totalSupplyCumulativeAvg += _totalSupplyAvg[i]; //totalSupply denominated in terms of 1e18 \\n }\\n\\n return (totalSupplyCumulativeAvg / granularity);\\n }\\n\\n function sampleSupply(uint points, uint window) public view returns (uint[] memory) {\\n uint[] memory _totalSupply = new uint[](points);\\n \\n uint lastIndex = observations.length-1;\\n require(lastIndex >= points * window, \\\"PAIR::NOT READY FOR PRICING\\\");\\n uint i = lastIndex - (points * window); // point from which to begin the sample\\n uint nextIndex = 0;\\n uint index = 0;\\n uint timeElapsed;\\n\\n for(; i < lastIndex; i+=window) {\\n nextIndex = i + window;\\n timeElapsed = observations[nextIndex].timestamp - observations[i].timestamp;\\n _totalSupply[index] = (observations[nextIndex].totalSupplyCumulative - observations[i].totalSupplyCumulative) / timeElapsed;\\n index = index + 1;\\n }\\n\\n return _totalSupply;\\n }\\n\\n\\n // this low-level function should be called from a contract which performs important safety checks\\n // standard uniswap v2 implementation\\n function mint(address to) external lock returns (uint liquidity) {\\n (uint _reserve0, uint _reserve1) = (reserve0, reserve1);\\n uint _balance0 = erc20(token0).balanceOf(address(this));\\n uint _balance1 = erc20(token1).balanceOf(address(this));\\n uint _amount0 = _balance0 - _reserve0;\\n uint _amount1 = _balance1 - _reserve1;\\n\\n uint _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee\\n \\n if (_totalSupply == 0) {\\n liquidity = Math.sqrt(_amount0 * _amount1) - MINIMUM_LIQUIDITY;\\n _mint(address(0), MINIMUM_LIQUIDITY); // permanently lock the first MINIMUM_LIQUIDITY tokens\\n } else {\\n liquidity = Math.min(_amount0 * _totalSupply / _reserve0, _amount1 * _totalSupply / _reserve1);\\n }\\n\\n require(liquidity > 0, \\\"ILM\\\"); // BaseV1: INSUFFICIENT_LIQUIDITY_MINTED\\n _mint(to, liquidity);\\n\\n _update(_balance0, _balance1, _reserve0, _reserve1);\\n emit Mint(msg.sender, _amount0, _amount1);\\n }\\n\\n // this low-level function should be called from a contract which performs important safety checks\\n // standard uniswap v2 implementation\\n function burn(address to) external lock returns (uint amount0, uint amount1) {\\n (uint _reserve0, uint _reserve1) = (reserve0, reserve1);\\n (address _token0, address _token1) = (token0, token1);\\n uint _balance0 = erc20(_token0).balanceOf(address(this));\\n uint _balance1 = erc20(_token1).balanceOf(address(this));\\n uint _liquidity = balanceOf[address(this)];\\n\\n uint _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee\\n amount0 = _liquidity * _balance0 / _totalSupply; // using balances ensures pro-rata distribution\\n amount1 = _liquidity * _balance1 / _totalSupply; // using balances ensures pro-rata distribution\\n require(amount0 > 0 && amount1 > 0, \\\"ILB\\\"); // BaseV1: INSUFFICIENT_LIQUIDITY_BURNED\\n _burn(address(this), _liquidity);\\n _safeTransfer(_token0, to, amount0);\\n _safeTransfer(_token1, to, amount1);\\n _balance0 = erc20(_token0).balanceOf(address(this));\\n _balance1 = erc20(_token1).balanceOf(address(this));\\n\\n _update(_balance0, _balance1, _reserve0, _reserve1);\\n emit Burn(msg.sender, amount0, amount1, to);\\n }\\n\\n // this low-level function should be called from a contract which performs important safety checks\\n function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external lock {\\n require(!BaseV1Factory(factory).isPaused());\\n require(amount0Out > 0 || amount1Out > 0, \\\"IOA\\\"); // BaseV1: INSUFFICIENT_OUTPUT_AMOUNT\\n (uint _reserve0, uint _reserve1) = (reserve0, reserve1);\\n require(amount0Out < _reserve0 && amount1Out < _reserve1, \\\"IL\\\"); // BaseV1: INSUFFICIENT_LIQUIDITY\\n\\n uint _balance0;\\n uint _balance1;\\n { // scope for _token{0,1}, avoids stack too deep errors\\n (address _token0, address _token1) = (token0, token1);\\n require(to != _token0 && to != _token1, \\\"IT\\\"); // BaseV1: INVALID_TO\\n if (amount0Out > 0) _safeTransfer(_token0, to, amount0Out); // optimistically transfer tokens\\n if (amount1Out > 0) _safeTransfer(_token1, to, amount1Out); // optimistically transfer tokens\\n if (data.length > 0) IBaseV1Callee(to).hook(msg.sender, amount0Out, amount1Out, data); // callback, used for flash loans\\n _balance0 = erc20(_token0).balanceOf(address(this));\\n _balance1 = erc20(_token1).balanceOf(address(this));\\n }\\n uint amount0In = _balance0 > _reserve0 - amount0Out ? _balance0 - (_reserve0 - amount0Out) : 0;\\n uint amount1In = _balance1 > _reserve1 - amount1Out ? _balance1 - (_reserve1 - amount1Out) : 0;\\n require(amount0In > 0 || amount1In > 0, \\\"IIA\\\"); // BaseV1: INSUFFICIENT_INPUT_AMOUNT\\n { // scope for reserve{0,1}Adjusted, avoids stack too deep errors\\n (address _token0, address _token1) = (token0, token1);\\n _balance0 = erc20(_token0).balanceOf(address(this));\\n // since we removed tokens, we need to reconfirm balances, can also simply use previous balance - amountIn/ 10000, but doing balanceOf again as safety check\\n _balance1 = erc20(_token1).balanceOf(address(this));\\n // The curve, either x3y+y3x for stable pools, or x*y for volatile pools\\n require(_k(_balance0, _balance1) >= _k(_reserve0, _reserve1), \\\"K\\\"); // BaseV1: K\\n }\\n\\n _update(_balance0, _balance1, _reserve0, _reserve1);\\n emit Swap(msg.sender, amount0In, amount1In, amount0Out, amount1Out, to);\\n }\\n\\n // force balances to match reserves\\n function skim(address to) external lock {\\n (address _token0, address _token1) = (token0, token1);\\n _safeTransfer(_token0, to, erc20(_token0).balanceOf(address(this)) - (reserve0));\\n _safeTransfer(_token1, to, erc20(_token1).balanceOf(address(this)) - (reserve1));\\n }\\n\\n // force reserves to match balances\\n function sync() external lock {\\n _update(erc20(token0).balanceOf(address(this)), erc20(token1).balanceOf(address(this)), reserve0, reserve1);\\n }\\n\\n function _f(uint x0, uint y) internal pure returns (uint) {\\n return x0*(y*y/1e18*y/1e18)/1e18+(x0*x0/1e18*x0/1e18)*y/1e18;\\n }\\n\\n function _d(uint x0, uint y) internal pure returns (uint) {\\n return 3*x0*(y*y/1e18)/1e18+(x0*x0/1e18*x0/1e18);\\n }\\n\\n function _get_y(uint x0, uint xy, uint y) internal pure returns (uint) {\\n for (uint i = 0; i < 255; i++) {\\n uint y_prev = y;\\n uint k = _f(x0, y);\\n if (k < xy) {\\n uint dy = (xy - k)*1e18/_d(x0, y);\\n y = y + dy;\\n } else {\\n uint dy = (k - xy)*1e18/_d(x0, y);\\n y = y - dy;\\n }\\n if (y > y_prev) {\\n if (y - y_prev <= 1) {\\n return y;\\n }\\n } else {\\n if (y_prev - y <= 1) {\\n return y;\\n }\\n }\\n }\\n return y;\\n }\\n\\n function getAmountOut(uint amountIn, address tokenIn) external view returns (uint) {\\n (uint _reserve0, uint _reserve1) = (reserve0, reserve1);\\n //amountIn -= amountIn / 10000; // remove fee from amount received\\n return _getAmountOut(amountIn, tokenIn, _reserve0, _reserve1);\\n }\\n\\n function _getAmountOut(uint amountIn, address tokenIn, uint _reserve0, uint _reserve1) internal view returns (uint) {\\n if (stable) {\\n uint xy = _k(_reserve0, _reserve1);\\n _reserve0 = _reserve0 * 1e18 / decimals0;\\n _reserve1 = _reserve1 * 1e18 / decimals1;\\n (uint reserveA, uint reserveB) = tokenIn == token0 ? (_reserve0, _reserve1) : (_reserve1, _reserve0);\\n amountIn = tokenIn == token0 ? amountIn * 1e18 / decimals0 : amountIn * 1e18 / decimals1;\\n uint y = reserveB - _get_y(amountIn+reserveA, xy, reserveB);\\n return y * (tokenIn == token0 ? decimals1 : decimals0) / 1e18;\\n } else {\\n (uint reserveA, uint reserveB) = tokenIn == token0 ? (_reserve0, _reserve1) : (_reserve1, _reserve0);\\n return amountIn * reserveB / (reserveA + amountIn);\\n }\\n }\\n\\n function _k(uint x, uint y) public view returns (uint) {\\n if (stable) {\\n uint _x = x * 1e18 / decimals0;\\n uint _y = y * 1e18 / decimals1;\\n uint _a = (_x * _y) / 1e18;\\n uint _b = ((_x * _x) / 1e18 + (_y * _y) / 1e18);\\n return _a * _b / 1e18; // x3y+y3x >= k\\n } else {\\n return x * y; // xy >= k\\n }\\n }\\n\\n function _mint(address dst, uint amount) internal {\\n totalSupply += amount;\\n balanceOf[dst] += amount;\\n emit Transfer(address(0), dst, amount);\\n }\\n\\n function _burn(address dst, uint amount) internal {\\n totalSupply -= amount;\\n balanceOf[dst] -= amount;\\n emit Transfer(dst, address(0), amount);\\n }\\n\\n function approve(address spender, uint amount) external returns (bool) {\\n allowance[msg.sender][spender] = amount;\\n\\n emit Approval(msg.sender, spender, amount);\\n return true;\\n }\\n\\n function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external {\\n require(deadline >= block.timestamp, \\\"BaseV1: EXPIRED\\\");\\n DOMAIN_SEPARATOR = keccak256(\\n abi.encode(\\n keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),\\n keccak256(bytes(name)),\\n keccak256(\\\"1\\\"),\\n block.chainid,\\n address(this)\\n )\\n );\\n bytes32 digest = keccak256(\\n abi.encodePacked(\\n \\\"\\\\x19\\\\x01\\\",\\n DOMAIN_SEPARATOR,\\n keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline))\\n )\\n );\\n address recoveredAddress = ecrecover(digest, v, r, s);\\n require(recoveredAddress != address(0) && recoveredAddress == owner, \\\"BaseV1: INVALID_SIGNATURE\\\");\\n allowance[owner][spender] = value;\\n\\n emit Approval(owner, spender, value);\\n }\\n\\n function transfer(address dst, uint amount) external returns (bool) {\\n _transferTokens(msg.sender, dst, amount);\\n return true;\\n }\\n\\n function transferFrom(address src, address dst, uint amount) external returns (bool) {\\n address spender = msg.sender;\\n uint spenderAllowance = allowance[src][spender];\\n\\n if (spender != src && spenderAllowance != type(uint).max) {\\n uint newAllowance = spenderAllowance - amount;\\n allowance[src][spender] = newAllowance;\\n\\n emit Approval(src, spender, newAllowance);\\n }\\n\\n _transferTokens(src, dst, amount);\\n return true;\\n }\\n\\n function _transferTokens(address src, address dst, uint amount) internal {\\n balanceOf[src] -= amount;\\n balanceOf[dst] += amount;\\n\\n emit Transfer(src, dst, amount);\\n }\\n\\n function _safeTransfer(address token,address to,uint256 value) internal {\\n require(token.code.length > 0);\\n (bool success, bytes memory data) =\\n token.call(abi.encodeWithSelector(erc20.transfer.selector, to, value));\\n require(success && (data.length == 0 || abi.decode(data, (bool))));\\n }\\n}\\n\\ncontract BaseV1Factory {\\n\\n bool public isPaused;\\n address public pauser;\\n address public pendingPauser;\\n address public admin;\\n uint MaxPeriod = 3600;\\n\\n mapping(address => mapping(address => mapping(bool => address))) public getPair;\\n address[] public allPairs;\\n mapping(address => bool) public isPair; // simplified check if its a pair, given that `stable` flag might not be available in peripherals\\n\\n address internal _temp0;\\n address internal _temp1;\\n bool internal _temp;\\n\\n event PairCreated(address indexed token0, address indexed token1, bool stable, address pair, uint);\\n\\n constructor() {\\n pauser = msg.sender;\\n isPaused = false;\\n admin = msg.sender;\\n }\\n\\n // admin for setting the periodSize in pairs\\n function setAdmin(address admin_) external {\\n require(msg.sender == admin);\\n admin = admin_;\\n }\\n\\n function setPeriodSize(uint newPeriod) external {\\n require(msg.sender == admin);\\n require(newPeriod <= MaxPeriod);\\n\\n for (uint i; i < allPairs.length; ) {\\n BaseV1Pair(allPairs[i]).setPeriodSize(newPeriod);\\n unchecked {++i;}\\n }\\n }\\n\\n\\n function allPairsLength() external view returns (uint) {\\n return allPairs.length;\\n }\\n\\n function setPauser(address _pauser) external {\\n require(msg.sender == pauser);\\n pendingPauser = _pauser;\\n }\\n\\n function acceptPauser() external {\\n require(msg.sender == pendingPauser);\\n pauser = pendingPauser;\\n }\\n\\n function setPause(bool _state) external {\\n require(msg.sender == pauser);\\n isPaused = _state;\\n }\\n\\n function pairCodeHash() external pure returns (bytes32) {\\n return keccak256(type(BaseV1Pair).creationCode);\\n }\\n\\n function getInitializable() external view returns (address, address, bool) {\\n return (_temp0, _temp1, _temp);\\n }\\n\\n function createPair(address tokenA, address tokenB, bool stable) external returns (address pair) {\\n require(tokenA != tokenB, \\\"IA\\\"); // BaseV1: IDENTICAL_ADDRESSES\\n (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);\\n require(token0 != address(0), \\\"ZA\\\"); // BaseV1: ZERO_ADDRESS\\n require(getPair[token0][token1][stable] == address(0), \\\"PE\\\"); // BaseV1: PAIR_EXISTS - single check is sufficient\\n bytes32 salt = keccak256(abi.encodePacked(token0, token1, stable)); // notice salt includes stable as well, 3 parameters\\n (_temp0, _temp1, _temp) = (token0, token1, stable);\\n pair = address(new BaseV1Pair{salt:salt}());\\n getPair[token0][token1][stable] = pair;\\n getPair[token1][token0][stable] = pair; // populate mapping in the reverse direction\\n allPairs.push(pair);\\n isPair[pair] = true;\\n emit PairCreated(token0, token1, stable, pair, allPairs.length);\\n }\\n}\\n\",\"keccak256\":\"0x7f78b45e70ecdd7091280ad2cbabca621f5468d8d2be44f2c20d0a3b5959e8f5\",\"license\":\"MIT\"},\"src/Swap/BaseV1-libs.sol\":{\"content\":\"pragma solidity 0.8.11;\\n\\n\\ninterface erc20 {\\n function totalSupply() external view returns (uint256);\\n function transfer(address recipient, uint256 amount) external returns (bool);\\n function decimals() external view returns (uint8);\\n function symbol() external view returns (string memory);\\n function balanceOf(address) external view returns (uint);\\n function transferFrom(address sender, address recipient, uint amount) external returns (bool);\\n function approve(address spender, uint value) external returns (bool);\\n}\\n\\nlibrary Math {\\n function min(uint a, uint b) internal pure returns (uint) {\\n return a < b ? a : b;\\n }\\n function sqrt(uint y) internal pure returns (uint z) {\\n if (y > 3) {\\n z = y;\\n uint x = y / 2 + 1;\\n while (x < z) {\\n z = x;\\n x = (y / x + x) / 2;\\n }\\n } else if (y != 0) {\\n z = 1;\\n }\\n }\\n}\",\"keccak256\":\"0x1e9bf0b17252bc691a6798415a032687444bf32ab2942777fd2f697225874cab\"}},\"version\":1}",
"bytecode": "0x6080604052610e1060035534801561001657600080fd5b50600080546001600160a81b03191633610100810260ff1916919091178255600280546001600160a01b0319169091179055614c2a90819061005890396000f3fe60806040523480156200001157600080fd5b5060043610620001155760003560e01c80639aab924811620000a3578063e5e31b13116200006e578063e5e31b13146200025c578063eb13c4cf1462000282578063ed12c5b414620002bb578063f851a44014620002d257600080fd5b80639aab924814620002035780639fd0506d146200020d578063b187bd261462000226578063bedb86fb146200024557600080fd5b80636801cc3011620000e45780636801cc301462000184578063704b6c0214620001c157806382dfdce414620001d85780639a7165e414620001ef57600080fd5b8063167a6f90146200011a5780631e3dd18b14620001265780632d88af4a146200015a578063574f2ba31462000171575b600080fd5b62000124620002e6565b005b6200013d62000137366004620007f4565b62000329565b6040516001600160a01b0390911681526020015b60405180910390f35b620001246200016b3660046200082b565b62000354565b6005545b60405190815260200162000151565b6200013d6200019536600462000861565b60046020908152600093845260408085208252928452828420905282529020546001600160a01b031681565b62000124620001d23660046200082b565b62000393565b6200013d620001e936600462000861565b620003cd565b6001546200013d906001600160a01b031681565b62000175620006bd565b6000546200013d9061010090046001600160a01b031681565b600054620002349060ff1681565b604051901515815260200162000151565b6200012462000256366004620008ab565b620006f1565b620002346200026d3660046200082b565b60066020526000908152604090205460ff1681565b600754600854604080516001600160a01b0393841681529282166020840152600160a01b90910460ff1615159082015260600162000151565b62000124620002cc366004620007f4565b62000721565b6002546200013d906001600160a01b031681565b6001546001600160a01b03163314620002fe57600080fd5b600154600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b600581815481106200033a57600080fd5b6000918252602090912001546001600160a01b0316905081565b60005461010090046001600160a01b031633146200037157600080fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b03163314620003ab57600080fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000826001600160a01b0316846001600160a01b031614156200041c5760405162461bcd60e51b8152602060048201526002602482015261494160f01b60448201526064015b60405180910390fd5b600080846001600160a01b0316866001600160a01b0316106200044157848662000444565b85855b90925090506001600160a01b038216620004865760405162461bcd60e51b81526020600482015260026024820152615a4160f01b604482015260640162000413565b6001600160a01b0382811660009081526004602090815260408083208585168452825280832088151584529091529020541615620004ec5760405162461bcd60e51b8152602060048201526002602482015261504560f01b604482015260640162000413565b6040516bffffffffffffffffffffffff19606084811b8216602084015283901b16603482015284151560f81b604882015260009060490160408051601f19818403018152908290528051602090910120600880546001600160a01b038087166001600160a01b03198b1515600160a01b0281166001600160a81b031990941693909317179092556007805492881692909116919091179055915081906200059390620007e6565b8190604051809103906000f5905080158015620005b4573d6000803e3d6000fd5b506001600160a01b0384811660008181526004602081815260408084208987168086529083528185208d15158087529084528286208054988a166001600160a01b0319998a16811790915582875294845282862087875284528286208187528452828620805489168617905560058054600181810183557f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db09091018054909a1687179099558587526006855295839020805460ff1916909817909755935481519687529186019290925290840152929650907fc4805696c66d7cf352fc1d6bb633ad5ee82f6cb577c453024b6e0eb8306c6fc99060600160405180910390a35050509392505050565b600060405180602001620006d190620007e6565b6020820181038252601f19601f8201166040525080519060200120905090565b60005461010090046001600160a01b031633146200070e57600080fd5b6000805460ff1916911515919091179055565b6002546001600160a01b031633146200073957600080fd5b6003548111156200074957600080fd5b60005b600554811015620007e257600581815481106200076d576200076d620008c9565b600091825260209091200154604051633b44b16d60e21b8152600481018490526001600160a01b039091169063ed12c5b490602401600060405180830381600087803b158015620007bd57600080fd5b505af1158015620007d2573d6000803e3d6000fd5b505050508060010190506200074c565b5050565b61431580620008e083390190565b6000602082840312156200080757600080fd5b5035919050565b80356001600160a01b03811681146200082657600080fd5b919050565b6000602082840312156200083e57600080fd5b62000849826200080e565b9392505050565b803580151581146200082657600080fd5b6000806000606084860312156200087757600080fd5b62000882846200080e565b925062000892602085016200080e565b9150620008a26040850162000850565b90509250925092565b600060208284031215620008be57600080fd5b620008498262000850565b634e487b7160e01b600052603260045260246000fdfe610140604052600060025561070860075560016011553480156200002257600080fd5b50336001600160a01b031660e0816001600160a01b0316815250506000806000336001600160a01b031663eb13c4cf6040518163ffffffff1660e01b8152600401606060405180830381865afa15801562000081573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000a791906200078e565b801580156080526001600160a01b0380841660c052841660a0529295509093509150620002ec57826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa1580156200010d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000137919081019062000829565b826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000176573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620001a0919081019062000829565b604051602001620001b3929190620008e1565b60405160208183030381529060405260009080519060200190620001d9929190620006cb565b50826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000219573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000243919081019062000829565b826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000282573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620002ac919081019062000829565b604051602001620002bf9291906200093c565b60405160208183030381529060405260019080519060200190620002e5929190620006cb565b5062000505565b826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa1580156200032b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000355919081019062000829565b826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000394573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620003be919081019062000829565b604051602001620003d19291906200098d565b60405160208183030381529060405260009080519060200190620003f7929190620006cb565b50826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000437573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000461919081019062000829565b826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015620004a0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620004ca919081019062000829565b604051602001620004dd929190620009ea565b6040516020818303038152906040526001908051906020019062000503929190620006cb565b505b826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000544573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200056a919062000a0c565b6200057790600a62000b4d565b6101008181525050816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015620005be573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005e4919062000a0c565b620005f190600a62000b4d565b610120525050604080516080810182524281526000602082018181529282018181526060830182815260088054600181018255935292517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee360049093029283015592517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee482015591517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee5830155517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee6909101555062000b9b565b828054620006d99062000b5e565b90600052602060002090601f016020900481019282620006fd576000855562000748565b82601f106200071857805160ff191683800117855562000748565b8280016001018555821562000748579182015b82811115620007485782518255916020019190600101906200072b565b50620007569291506200075a565b5090565b5b808211156200075657600081556001016200075b565b80516001600160a01b03811681146200078957600080fd5b919050565b600080600060608486031215620007a457600080fd5b620007af8462000771565b9250620007bf6020850162000771565b915060408401518015158114620007d557600080fd5b809150509250925092565b634e487b7160e01b600052604160045260246000fd5b60005b8381101562000813578181015183820152602001620007f9565b8381111562000823576000848401525b50505050565b6000602082840312156200083c57600080fd5b81516001600160401b03808211156200085457600080fd5b818401915084601f8301126200086957600080fd5b8151818111156200087e576200087e620007e0565b604051601f8201601f19908116603f01168101908382118183101715620008a957620008a9620007e0565b81604052828152876020848701011115620008c357600080fd5b620008d6836020830160208801620007f6565b979650505050505050565b6e029ba30b13632ab189020a6a690169608d1b8152600083516200090d81600f850160208801620007f6565b602f60f81b600f91840191820152835162000930816010840160208801620007f6565b01601001949350505050565b6473414d4d2d60d81b8152600083516200095e816005850160208801620007f6565b602f60f81b600591840191820152835162000981816006840160208801620007f6565b01600601949350505050565b7002b37b630ba34b632ab189020a6a690169607d1b815260008351620009bb816011850160208801620007f6565b602f60f81b6011918401918201528351620009de816012840160208801620007f6565b01601201949350505050565b6476414d4d2d60d81b8152600083516200095e816005850160208801620007f6565b60006020828403121562000a1f57600080fd5b815160ff8116811462000a3157600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111562000a8f57816000190482111562000a735762000a7362000a38565b8085161562000a8157918102915b93841c939080029062000a53565b509250929050565b60008262000aa85750600162000b47565b8162000ab75750600062000b47565b816001811462000ad0576002811462000adb5762000afb565b600191505062000b47565b60ff84111562000aef5762000aef62000a38565b50506001821b62000b47565b5060208310610133831016604e8410600b841016171562000b20575081810a62000b47565b62000b2c838362000a4e565b806000190482111562000b435762000b4362000a38565b0290505b92915050565b600062000a3160ff84168362000a97565b600181811c9082168062000b7357607f821691505b6020821081141562000b9557634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e051610100516101205161364a62000ccb6000396000818161047101528181611acc0152818161295801528181612a1a0152612b2501526000818161044e01528181611a8b0152818161291901528181612a5c0152612aff01526000818161081001526122020152600081816104fb015281816106770152818161071b0152818161094b01528181610c070152818161146d015281816116f801528181611c7c015261258401526000818161030f015281816104d3015281816106520152818161092a01528181610be5015281816113d7015281816116d601528181611c5a015281816124fc0152818161299a015281816129e101528181612ac60152612b690152600081816103c0015281816104a301528181611a6301526128e5015261364a6000f3fe608060405234801561001057600080fd5b506004361061028a5760003560e01c806389afcb441161015c578063c5700a02116100ce578063ebeb31db11610087578063ebeb31db14610797578063ed12c5b41461079f578063f140a35a146107b2578063f3f24eb1146107c5578063f99f51a6146107ce578063fff6cae9146107ef57600080fd5b8063c5700a021461070d578063d21220a714610716578063d505accf1461073d578063dd62ed3e14610750578063e4463eb21461077b578063eba6aef91461078457600080fd5b80639e8cc04b116101205780639e8cc04b146106a25780639f767c88146106b5578063a9059cbb146106d5578063bc25cf77146106e8578063bf944dbc146106fb578063c245febc1461070457600080fd5b806389afcb44146105db5780638a7b8cf2146105ee57806395d89b41146106295780639cf42614146106315780639d63848a1461064457600080fd5b806323b872dd116102005780635881c475116101b95780635881c475146105445780635a76f25e146105575780636a6278421461056057806370a08231146105735780637ecebe00146105935780638334278d146105b357600080fd5b806323b872dd146103e2578063252c09d7146103f5578063313ce56714610428578063392f37e914610442578063443cb4bc14610528578063517b3f821461053157600080fd5b806313345fe11161025257806313345fe11461034957806318160ddd146103695780631df8c717146103805780631ed4202e14610388578063205aabf11461039b57806322be3de1146103bb57600080fd5b8063022c0d9f1461028f57806306fdde03146102a45780630902f1ac146102c2578063095ea7b3146102e75780630dfe16811461030a575b600080fd5b6102a261029d366004613041565b6107f7565b005b6102ac610da4565b6040516102b99190613105565b60405180910390f35b600954600a54600b545b604080519384526020840192909252908201526060016102b9565b6102fa6102f5366004613138565b610e32565b60405190151581526020016102b9565b6103317f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016102b9565b61035c610357366004613162565b610e9f565b6040516102b991906131d6565b61037260025481565b6040519081526020016102b9565b6102cc6110d0565b6103726103963660046131e9565b61113f565b6103726103a9366004613202565b60106020526000908152604090205481565b6102fa7f000000000000000000000000000000000000000000000000000000000000000081565b6102fa6103f036600461321d565b61119e565b6104086104033660046131e9565b611267565b6040805194855260208501939093529183015260608201526080016102b9565b610430601281565b60405160ff90911681526020016102b9565b600954600a54604080517f000000000000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060208201529081019290925260608201527f0000000000000000000000000000000000000000000000000000000000000000151560808201526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660a08301527f00000000000000000000000000000000000000000000000000000000000000001660c082015260e0016102b9565b61037260095481565b61037261053f366004613138565b6112a1565b61035c610552366004613259565b611394565b610372600a5481565b61037261056e366004613202565b6113a3565b610372610581366004613202565b60046020526000908152604090205481565b6103726105a1366004613202565b60066020526000908152604090205481565b6105c66105c13660046131e9565b611600565b604080519283526020830191909152016102b9565b6105c66105e9366004613202565b6116a4565b6105f66119c1565b6040516102b991908151815260208083015190820152604080830151908201526060918201519181019190915260800190565b6102ac611a52565b61037261063f36600461328c565b611a5f565b604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811682527f0000000000000000000000000000000000000000000000000000000000000000166020820152016102b9565b6103726106b0366004613259565b611bab565b6103726106c3366004613202565b600f6020526000908152604090205481565b6102fa6106e3366004613138565b611c18565b6102a26106f6366004613202565b611c2e565b610372600c5481565b610372600d5481565b610372600b5481565b6103317f000000000000000000000000000000000000000000000000000000000000000081565b6102a261074b3660046132ae565b611d4c565b61037261075e366004613321565b600360209081526000928352604080842090915290825290205481565b61037260075481565b61035c61079236600461328c565b612041565b600854610372565b6102a26107ad3660046131e9565b6121f7565b6103726107c0366004613354565b612231565b610372600e5481565b6107e16107dc36600461328c565b612250565b6040516102b9929190613377565b6102a26124cf565b60115460011461080657600080fd5b60026011819055507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b187bd266040518163ffffffff1660e01b8152600401602060405180830381865afa15801561086c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610890919061339c565b1561089a57600080fd5b60008511806108a95750600084115b6108e05760405162461bcd60e51b8152602060048201526003602482015262494f4160e81b60448201526064015b60405180910390fd5b600954600a5481871080156108f457508086105b6109255760405162461bcd60e51b8152602060048201526002602482015261125360f21b60448201526064016108d7565b6000807f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03898116908316148015906109985750806001600160a01b0316896001600160a01b031614155b6109c95760405162461bcd60e51b8152602060048201526002602482015261125560f21b60448201526064016108d7565b8a156109da576109da828a8d612609565b89156109eb576109eb818a8c612609565b8615610a5857604051639a7bff7960e01b81526001600160a01b038a1690639a7bff7990610a259033908f908f908e908e906004016133be565b600060405180830381600087803b158015610a3f57600080fd5b505af1158015610a53573d6000803e3d6000fd5b505050505b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa158015610a9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac0919061340a565b6040516370a0823160e01b81523060048201529094506001600160a01b038216906370a0823190602401602060405180830381865afa158015610b07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2b919061340a565b9250505060008985610b3d9190613439565b8311610b4a576000610b5e565b610b548a86613439565b610b5e9084613439565b90506000610b6c8a86613439565b8311610b79576000610b8d565b610b838a86613439565b610b8d9084613439565b90506000821180610b9e5750600081115b610bd05760405162461bcd60e51b815260206004820152600360248201526249494160e81b60448201526064016108d7565b6040516370a0823160e01b81523060048201527f0000000000000000000000000000000000000000000000000000000000000000907f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610c58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7c919061340a565b6040516370a0823160e01b81523060048201529096506001600160a01b038216906370a0823190602401602060405180830381865afa158015610cc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce7919061340a565b9450610cf38888611a5f565b610cfd8787611a5f565b1015610d2f5760405162461bcd60e51b81526020600482015260016024820152604b60f81b60448201526064016108d7565b5050610d3d848488886126f8565b60408051838152602081018390529081018c9052606081018b90526001600160a01b038a169033907fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8229060800160405180910390a350506001601155505050505050505050565b60008054610db190613450565b80601f0160208091040260200160405190810160405280929190818152602001828054610ddd90613450565b8015610e2a5780601f10610dff57610100808354040283529160200191610e2a565b820191906000526020600020905b815481529060010190602001808311610e0d57829003601f168201915b505050505081565b3360008181526003602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610e8d9086815260200190565b60405180910390a35060015b92915050565b606060008367ffffffffffffffff811115610ebc57610ebc613485565b604051908082528060200260200182016040528015610ee5578160200160208202803683370190505b50600854909150600090610efb90600190613439565b9050610f07848661349b565b811015610f265760405162461bcd60e51b81526004016108d7906134ba565b6000610f32858761349b565b610f3c9083613439565b90506000805b838310156110c057610f5487846134f1565b9150600060088481548110610f6b57610f6b613509565b90600052602060002090600402016000015460088481548110610f9057610f90613509565b906000526020600020906004020160000154610fac9190613439565b905060008160088681548110610fc457610fc4613509565b90600052602060002090600402016001015460088681548110610fe957610fe9613509565b9060005260206000209060040201600101546110059190613439565b61100f919061351f565b90506000826008878154811061102757611027613509565b9060005260206000209060040201600201546008878154811061104c5761104c613509565b9060005260206000209060040201600201546110689190613439565b611072919061351f565b90506110808c8e84846128e1565b88858151811061109257611092613509565b60209081029190910101526110a88460016134f1565b935050505086836110b991906134f1565b9250610f42565b509293505050505b949350505050565b600c54600d5442600080806110ee600954600a54600b549192909190565b9250925092508381146111375760006111078286613439565b9050611113818561349b565b61111d90886134f1565b9650611129818461349b565b61113390876134f1565b9550505b505050909192565b60008061114d836001612041565b90506000805b82518110156111935782818151811061116e5761116e613509565b60200260200101518261118191906134f1565b915061118c81613541565b9050611153565b506110c8848261351f565b6001600160a01b0383166000818152600360209081526040808320338085529252822054919290919082148015906111d857506000198114155b1561124e5760006111e98583613439565b6001600160a01b038881166000818152600360209081526040808320948916808452948252918290208590559051848152939450919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505b611259868686612bd6565b6001925050505b9392505050565b6008818154811061127757600080fd5b60009182526020909120600490910201805460018201546002830154600390930154919350919084565b6000806112ac6119c1565b90506000806112b96110d0565b508451919350915042141561132c57600880546112d890600290613439565b815481106112e8576112e8613509565b906000526020600020906004020160405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505092505b825160009061133b9042613439565b90506000818560200151856113509190613439565b61135a919061351f565b905060008286604001518561136f9190613439565b611379919061351f565b9050611387888a84846128e1565b9998505050505050505050565b60606110c88484846001610e9f565b60006011546001146113b457600080fd5b6002601155600954600a546040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611426573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144a919061340a565b6040516370a0823160e01b81523060048201529091506000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156114b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d8919061340a565b905060006114e68584613439565b905060006114f48584613439565b60025490915080611532576103e861151461150f848661349b565b612c84565b61151e9190613439565b975061152d60006103e8612cf4565b611567565b61156487611540838661349b565b61154a919061351f565b87611555848661349b565b61155f919061351f565b612d7e565b97505b6000881161159d5760405162461bcd60e51b8152602060048201526003602482015262494c4d60e81b60448201526064016108d7565b6115a78989612cf4565b6115b3858589896126f8565b604080518481526020810184905233917f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f910160405180910390a250506001601155509395945050505050565b600080600080611611856001612250565b9150915060008060005b84518110156116825784818151811061163657611636613509565b60200260200101518361164991906134f1565b925083818151811061165d5761165d613509565b60200260200101518261167091906134f1565b915061167b81613541565b905061161b565b5061168d878361351f565b611697888361351f565b9550955050505050915091565b6000806011546001146116b657600080fd5b6002601155600954600a546040516370a0823160e01b81523060048201527f0000000000000000000000000000000000000000000000000000000000000000907f0000000000000000000000000000000000000000000000000000000000000000906000906001600160a01b038416906370a0823190602401602060405180830381865afa15801561174c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611770919061340a565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038416906370a0823190602401602060405180830381865afa1580156117ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117de919061340a565b306000908152600460205260409020546002549192509080611800858461349b565b61180a919061351f565b995080611817848461349b565b611821919061351f565b985060008a1180156118335750600089115b6118655760405162461bcd60e51b815260206004820152600360248201526224a62160e91b60448201526064016108d7565b61186f3083612d94565b61187a868c8c612609565b611885858c8b612609565b6040516370a0823160e01b81523060048201526001600160a01b038716906370a0823190602401602060405180830381865afa1580156118c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ed919061340a565b6040516370a0823160e01b81523060048201529094506001600160a01b038616906370a0823190602401602060405180830381865afa158015611934573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611958919061340a565b925061196684848a8a6126f8565b604080518b8152602081018b90526001600160a01b038d169133917fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496910160405180910390a350505050505050506001601181905550915091565b6119ec6040518060800160405280600081526020016000815260200160008152602001600081525090565b600880546119fc90600190613439565b81548110611a0c57611a0c613509565b9060005260206000209060040201604051806080016040529081600082015481526020016001820154815260200160028201548152602001600382015481525050905090565b60018054610db190613450565b60007f000000000000000000000000000000000000000000000000000000000000000015611b9a5760007f0000000000000000000000000000000000000000000000000000000000000000611abc85670de0b6b3a764000061349b565b611ac6919061351f565b905060007f0000000000000000000000000000000000000000000000000000000000000000611afd85670de0b6b3a764000061349b565b611b07919061351f565b90506000670de0b6b3a7640000611b1e838561349b565b611b28919061351f565b90506000670de0b6b3a7640000611b3f848061349b565b611b49919061351f565b670de0b6b3a7640000611b5c868061349b565b611b66919061351f565b611b7091906134f1565b9050670de0b6b3a7640000611b85828461349b565b611b8f919061351f565b945050505050610e99565b611ba4828461349b565b9050610e99565b600080611bbb8585856001610e9f565b90506000805b8251811015611c0357828181518110611bdc57611bdc613509565b602002602001015182611bef91906134f1565b915080611bfb81613541565b915050611bc1565b50611c0e848261351f565b9695505050505050565b6000611c25338484612bd6565b50600192915050565b601154600114611c3d57600080fd5b60026011556009546040516370a0823160e01b81523060048201527f0000000000000000000000000000000000000000000000000000000000000000917f000000000000000000000000000000000000000000000000000000000000000091611d0a9184918691906001600160a01b038416906370a08231906024015b602060405180830381865afa158015611cd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cfb919061340a565b611d059190613439565b612609565b600a546040516370a0823160e01b8152306004820152611d429183918691906001600160a01b038416906370a0823190602401611cba565b5050600160115550565b42841015611d8e5760405162461bcd60e51b815260206004820152600f60248201526e10985cd9558c4e8811561412549151608a1b60448201526064016108d7565b7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051611dbe919061355c565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160408051601f19818403018152918152815160209283012060058190556001600160a01b038a166000908152600690935290822080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b919087611e7483613541565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e00160405160208183030381529060405280519060200120604051602001611eed92919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015611f58573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590611f8e5750886001600160a01b0316816001600160a01b0316145b611fda5760405162461bcd60e51b815260206004820152601960248201527f4261736556313a20494e56414c49445f5349474e41545552450000000000000060448201526064016108d7565b6001600160a01b038981166000818152600360209081526040808320948d16808452948252918290208b905590518a81527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050505050505050565b606060008367ffffffffffffffff81111561205e5761205e613485565b604051908082528060200260200182016040528015612087578160200160208202803683370190505b5060085490915060009061209d90600190613439565b90506120a9848661349b565b8110156120c85760405162461bcd60e51b81526004016108d7906134ba565b60006120d4858761349b565b6120de9083613439565b905060008060005b848410156121ea576120f888856134f1565b92506008848154811061210d5761210d613509565b9060005260206000209060040201600001546008848154811061213257612132613509565b90600052602060002090600402016000015461214e9190613439565b9050806008858154811061216457612164613509565b9060005260206000209060040201600301546008858154811061218957612189613509565b9060005260206000209060040201600301546121a59190613439565b6121af919061351f565b8683815181106121c1576121c1613509565b60209081029190910101526121d78260016134f1565b91506121e388856134f1565b93506120e6565b5093979650505050505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461222c57600080fd5b600755565b600954600a5460009190612247858584846128e1565b95945050505050565b60608060008467ffffffffffffffff81111561226e5761226e613485565b604051908082528060200260200182016040528015612297578160200160208202803683370190505b50905060008567ffffffffffffffff8111156122b5576122b5613485565b6040519080825280602002602001820160405280156122de578160200160208202803683370190505b506008549091506000906122f490600190613439565b9050612300868861349b565b81101561231f5760405162461bcd60e51b81526004016108d7906134ba565b600061232b878961349b565b6123359083613439565b905060008060005b848410156124be5761234f8a856134f1565b92506008848154811061236457612364613509565b9060005260206000209060040201600001546008848154811061238957612389613509565b9060005260206000209060040201600001546123a59190613439565b905080600885815481106123bb576123bb613509565b906000526020600020906004020160010154600885815481106123e0576123e0613509565b9060005260206000209060040201600101546123fc9190613439565b612406919061351f565b87838151811061241857612418613509565b602002602001018181525050806008858154811061243857612438613509565b9060005260206000209060040201600201546008858154811061245d5761245d613509565b9060005260206000209060040201600201546124799190613439565b612483919061351f565b86838151811061249557612495613509565b60209081029190910101526124ab8260016134f1565b91506124b78a856134f1565b935061233d565b509499939850929650505050505050565b6011546001146124de57600080fd5b60026011556040516370a0823160e01b8152306004820152612602907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa15801561254b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256f919061340a565b6040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa1580156125d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125f7919061340a565b600954600a546126f8565b6001601155565b6000836001600160a01b03163b1161262057600080fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b179052915160009283929087169161267c91906135f8565b6000604051808303816000865af19150503d80600081146126b9576040519150601f19603f3d011682016040523d82523d6000602084013e6126be565b606091505b50915091508180156126e85750805115806126e85750808060200190518101906126e8919061339c565b6126f157600080fd5b5050505050565b600b54429060009061270a9083613439565b905060008111801561271b57508315155b801561272657508215155b1561279157612735818561349b565b600c600082825461274691906134f1565b909155506127569050818461349b565b600d600082825461276791906134f1565b909155505060025461277a90829061349b565b600e600082825461278b91906134f1565b90915550505b600061279b6119c1565b80519091506127aa9084613439565b91506007548211156128905760408051608081018252848152600c5460208201908152600d54928201928352600e54606083019081526008805460018101825560009190915292517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee360049094029384015590517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee483015591517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee582015590517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee6909101555b6009879055600a869055600b83905560408051888152602081018890527fcf2aa50876cdfbb541206f89af0ee78d44a2abf8d328e37fa4917f982149848a910160405180910390a150505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000015612b645760006129158484611a5f565b90507f000000000000000000000000000000000000000000000000000000000000000061294a85670de0b6b3a764000061349b565b612954919061351f565b93507f000000000000000000000000000000000000000000000000000000000000000061298984670de0b6b3a764000061349b565b612993919061351f565b92506000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316876001600160a01b0316146129d85784866129db565b85855b915091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316876001600160a01b031614612a5a577f0000000000000000000000000000000000000000000000000000000000000000612a4b89670de0b6b3a764000061349b565b612a55919061351f565b612a97565b7f0000000000000000000000000000000000000000000000000000000000000000612a8d89670de0b6b3a764000061349b565b612a97919061351f565b97506000612aaf612aa8848b6134f1565b8584612e16565b612ab99083613439565b9050670de0b6b3a76400007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316896001600160a01b031614612b23577f0000000000000000000000000000000000000000000000000000000000000000612b45565b7f00000000000000000000000000000000000000000000000000000000000000005b612b4f908361349b565b612b59919061351f565b9450505050506110c8565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b031614612ba7578385612baa565b84845b9092509050612bb987836134f1565b612bc3828961349b565b612bcd919061351f565b925050506110c8565b6001600160a01b03831660009081526004602052604081208054839290612bfe908490613439565b90915550506001600160a01b03821660009081526004602052604081208054839290612c2b9084906134f1565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612c7791815260200190565b60405180910390a3505050565b60006003821115612ce55750806000612c9e60028361351f565b612ca99060016134f1565b90505b81811015612cdf57905080600281612cc4818661351f565b612cce91906134f1565b612cd8919061351f565b9050612cac565b50919050565b8115612cef575060015b919050565b8060026000828254612d0691906134f1565b90915550506001600160a01b03821660009081526004602052604081208054839290612d339084906134f1565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b6000818310612d8d5781611260565b5090919050565b8060026000828254612da69190613439565b90915550506001600160a01b03821660009081526004602052604081208054839290612dd3908490613439565b90915550506040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001612d72565b6000805b60ff811015612f1c57826000612e308783612f25565b905085811015612e80576000612e468887612fc2565b612e508389613439565b612e6290670de0b6b3a764000061349b565b612e6c919061351f565b9050612e7881876134f1565b955050612ec2565b6000612e8c8887612fc2565b612e968884613439565b612ea890670de0b6b3a764000061349b565b612eb2919061351f565b9050612ebe8187613439565b9550505b81851115612eeb576001612ed68387613439565b11612ee657849350505050611260565b612f07565b6001612ef78684613439565b11612f0757849350505050611260565b50508080612f1490613541565b915050612e1a565b50909392505050565b6000670de0b6b3a764000082818581612f3e828061349b565b612f48919061351f565b612f52919061349b565b612f5c919061351f565b612f66919061349b565b612f70919061351f565b670de0b6b3a7640000808481612f86828061349b565b612f90919061351f565b612f9a919061349b565b612fa4919061351f565b612fae908661349b565b612fb8919061351f565b61126091906134f1565b6000670de0b6b3a76400008381612fd9828061349b565b612fe3919061351f565b612fed919061349b565b612ff7919061351f565b670de0b6b3a76400008061300b858061349b565b613015919061351f565b61302086600361349b565b612fae919061349b565b80356001600160a01b0381168114612cef57600080fd5b60008060008060006080868803121561305957600080fd5b85359450602086013593506130706040870161302a565b9250606086013567ffffffffffffffff8082111561308d57600080fd5b818801915088601f8301126130a157600080fd5b8135818111156130b057600080fd5b8960208285010111156130c257600080fd5b9699959850939650602001949392505050565b60005b838110156130f05781810151838201526020016130d8565b838111156130ff576000848401525b50505050565b60208152600082518060208401526131248160408501602087016130d5565b601f01601f19169190910160400192915050565b6000806040838503121561314b57600080fd5b6131548361302a565b946020939093013593505050565b6000806000806080858703121561317857600080fd5b6131818561302a565b966020860135965060408601359560600135945092505050565b600081518084526020808501945080840160005b838110156131cb578151875295820195908201906001016131af565b509495945050505050565b602081526000611260602083018461319b565b6000602082840312156131fb57600080fd5b5035919050565b60006020828403121561321457600080fd5b6112608261302a565b60008060006060848603121561323257600080fd5b61323b8461302a565b92506132496020850161302a565b9150604084013590509250925092565b60008060006060848603121561326e57600080fd5b6132778461302a565b95602085013595506040909401359392505050565b6000806040838503121561329f57600080fd5b50508035926020909101359150565b600080600080600080600060e0888a0312156132c957600080fd5b6132d28861302a565b96506132e06020890161302a565b95506040880135945060608801359350608088013560ff8116811461330457600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561333457600080fd5b61333d8361302a565b915061334b6020840161302a565b90509250929050565b6000806040838503121561336757600080fd5b8235915061334b6020840161302a565b60408152600061338a604083018561319b565b8281036020840152612247818561319b565b6000602082840312156133ae57600080fd5b8151801515811461126057600080fd5b60018060a01b038616815284602082015283604082015260806060820152816080820152818360a0830137600081830160a090810191909152601f909201601f19160101949350505050565b60006020828403121561341c57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b60008282101561344b5761344b613423565b500390565b600181811c9082168061346457607f821691505b60208210811415612cdf57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b60008160001904831182151516156134b5576134b5613423565b500290565b6020808252601b908201527f504149523a3a4e4f5420524541445920464f522050524943494e470000000000604082015260600190565b6000821982111561350457613504613423565b500190565b634e487b7160e01b600052603260045260246000fd5b60008261353c57634e487b7160e01b600052601260045260246000fd5b500490565b600060001982141561355557613555613423565b5060010190565b600080835481600182811c91508083168061357857607f831692505b602080841082141561359857634e487b7160e01b86526022600452602486fd5b8180156135ac57600181146135bd576135ea565b60ff198616895284890196506135ea565b60008a81526020902060005b868110156135e25781548b8201529085019083016135c9565b505084890196505b509498975050505050505050565b6000825161360a8184602087016130d5565b919091019291505056fea26469706673582212203c3fcd0160262f7289c5b6ceef5d82c0ab9d4c7dea5fbcbc2649a8857a795f6864736f6c634300080b0033a2646970667358221220e2fe4b05758f5ea22cecc572f02185dc4b90b9de836a56996a39e4a9e18aa23864736f6c634300080b0033",
"deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620001155760003560e01c80639aab924811620000a3578063e5e31b13116200006e578063e5e31b13146200025c578063eb13c4cf1462000282578063ed12c5b414620002bb578063f851a44014620002d257600080fd5b80639aab924814620002035780639fd0506d146200020d578063b187bd261462000226578063bedb86fb146200024557600080fd5b80636801cc3011620000e45780636801cc301462000184578063704b6c0214620001c157806382dfdce414620001d85780639a7165e414620001ef57600080fd5b8063167a6f90146200011a5780631e3dd18b14620001265780632d88af4a146200015a578063574f2ba31462000171575b600080fd5b62000124620002e6565b005b6200013d62000137366004620007f4565b62000329565b6040516001600160a01b0390911681526020015b60405180910390f35b620001246200016b3660046200082b565b62000354565b6005545b60405190815260200162000151565b6200013d6200019536600462000861565b60046020908152600093845260408085208252928452828420905282529020546001600160a01b031681565b62000124620001d23660046200082b565b62000393565b6200013d620001e936600462000861565b620003cd565b6001546200013d906001600160a01b031681565b62000175620006bd565b6000546200013d9061010090046001600160a01b031681565b600054620002349060ff1681565b604051901515815260200162000151565b6200012462000256366004620008ab565b620006f1565b620002346200026d3660046200082b565b60066020526000908152604090205460ff1681565b600754600854604080516001600160a01b0393841681529282166020840152600160a01b90910460ff1615159082015260600162000151565b62000124620002cc366004620007f4565b62000721565b6002546200013d906001600160a01b031681565b6001546001600160a01b03163314620002fe57600080fd5b600154600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b600581815481106200033a57600080fd5b6000918252602090912001546001600160a01b0316905081565b60005461010090046001600160a01b031633146200037157600080fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b03163314620003ab57600080fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000826001600160a01b0316846001600160a01b031614156200041c5760405162461bcd60e51b8152602060048201526002602482015261494160f01b60448201526064015b60405180910390fd5b600080846001600160a01b0316866001600160a01b0316106200044157848662000444565b85855b90925090506001600160a01b038216620004865760405162461bcd60e51b81526020600482015260026024820152615a4160f01b604482015260640162000413565b6001600160a01b0382811660009081526004602090815260408083208585168452825280832088151584529091529020541615620004ec5760405162461bcd60e51b8152602060048201526002602482015261504560f01b604482015260640162000413565b6040516bffffffffffffffffffffffff19606084811b8216602084015283901b16603482015284151560f81b604882015260009060490160408051601f19818403018152908290528051602090910120600880546001600160a01b038087166001600160a01b03198b1515600160a01b0281166001600160a81b031990941693909317179092556007805492881692909116919091179055915081906200059390620007e6565b8190604051809103906000f5905080158015620005b4573d6000803e3d6000fd5b506001600160a01b0384811660008181526004602081815260408084208987168086529083528185208d15158087529084528286208054988a166001600160a01b0319998a16811790915582875294845282862087875284528286208187528452828620805489168617905560058054600181810183557f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db09091018054909a1687179099558587526006855295839020805460ff1916909817909755935481519687529186019290925290840152929650907fc4805696c66d7cf352fc1d6bb633ad5ee82f6cb577c453024b6e0eb8306c6fc99060600160405180910390a35050509392505050565b600060405180602001620006d190620007e6565b6020820181038252601f19601f8201166040525080519060200120905090565b60005461010090046001600160a01b031633146200070e57600080fd5b6000805460ff1916911515919091179055565b6002546001600160a01b031633146200073957600080fd5b6003548111156200074957600080fd5b60005b600554811015620007e257600581815481106200076d576200076d620008c9565b600091825260209091200154604051633b44b16d60e21b8152600481018490526001600160a01b039091169063ed12c5b490602401600060405180830381600087803b158015620007bd57600080fd5b505af1158015620007d2573d6000803e3d6000fd5b505050508060010190506200074c565b5050565b61431580620008e083390190565b6000602082840312156200080757600080fd5b5035919050565b80356001600160a01b03811681146200082657600080fd5b919050565b6000602082840312156200083e57600080fd5b62000849826200080e565b9392505050565b803580151581146200082657600080fd5b6000806000606084860312156200087757600080fd5b62000882846200080e565b925062000892602085016200080e565b9150620008a26040850162000850565b90509250925092565b600060208284031215620008be57600080fd5b620008498262000850565b634e487b7160e01b600052603260045260246000fdfe610140604052600060025561070860075560016011553480156200002257600080fd5b50336001600160a01b031660e0816001600160a01b0316815250506000806000336001600160a01b031663eb13c4cf6040518163ffffffff1660e01b8152600401606060405180830381865afa15801562000081573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000a791906200078e565b801580156080526001600160a01b0380841660c052841660a0529295509093509150620002ec57826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa1580156200010d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000137919081019062000829565b826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000176573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620001a0919081019062000829565b604051602001620001b3929190620008e1565b60405160208183030381529060405260009080519060200190620001d9929190620006cb565b50826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000219573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000243919081019062000829565b826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000282573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620002ac919081019062000829565b604051602001620002bf9291906200093c565b60405160208183030381529060405260019080519060200190620002e5929190620006cb565b5062000505565b826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa1580156200032b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000355919081019062000829565b826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000394573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620003be919081019062000829565b604051602001620003d19291906200098d565b60405160208183030381529060405260009080519060200190620003f7929190620006cb565b50826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000437573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000461919081019062000829565b826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015620004a0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620004ca919081019062000829565b604051602001620004dd929190620009ea565b6040516020818303038152906040526001908051906020019062000503929190620006cb565b505b826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000544573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200056a919062000a0c565b6200057790600a62000b4d565b6101008181525050816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015620005be573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005e4919062000a0c565b620005f190600a62000b4d565b610120525050604080516080810182524281526000602082018181529282018181526060830182815260088054600181018255935292517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee360049093029283015592517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee482015591517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee5830155517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee6909101555062000b9b565b828054620006d99062000b5e565b90600052602060002090601f016020900481019282620006fd576000855562000748565b82601f106200071857805160ff191683800117855562000748565b8280016001018555821562000748579182015b82811115620007485782518255916020019190600101906200072b565b50620007569291506200075a565b5090565b5b808211156200075657600081556001016200075b565b80516001600160a01b03811681146200078957600080fd5b919050565b600080600060608486031215620007a457600080fd5b620007af8462000771565b9250620007bf6020850162000771565b915060408401518015158114620007d557600080fd5b809150509250925092565b634e487b7160e01b600052604160045260246000fd5b60005b8381101562000813578181015183820152602001620007f9565b8381111562000823576000848401525b50505050565b6000602082840312156200083c57600080fd5b81516001600160401b03808211156200085457600080fd5b818401915084601f8301126200086957600080fd5b8151818111156200087e576200087e620007e0565b604051601f8201601f19908116603f01168101908382118183101715620008a957620008a9620007e0565b81604052828152876020848701011115620008c357600080fd5b620008d6836020830160208801620007f6565b979650505050505050565b6e029ba30b13632ab189020a6a690169608d1b8152600083516200090d81600f850160208801620007f6565b602f60f81b600f91840191820152835162000930816010840160208801620007f6565b01601001949350505050565b6473414d4d2d60d81b8152600083516200095e816005850160208801620007f6565b602f60f81b600591840191820152835162000981816006840160208801620007f6565b01600601949350505050565b7002b37b630ba34b632ab189020a6a690169607d1b815260008351620009bb816011850160208801620007f6565b602f60f81b6011918401918201528351620009de816012840160208801620007f6565b01601201949350505050565b6476414d4d2d60d81b8152600083516200095e816005850160208801620007f6565b60006020828403121562000a1f57600080fd5b815160ff8116811462000a3157600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111562000a8f57816000190482111562000a735762000a7362000a38565b8085161562000a8157918102915b93841c939080029062000a53565b509250929050565b60008262000aa85750600162000b47565b8162000ab75750600062000b47565b816001811462000ad0576002811462000adb5762000afb565b600191505062000b47565b60ff84111562000aef5762000aef62000a38565b50506001821b62000b47565b5060208310610133831016604e8410600b841016171562000b20575081810a62000b47565b62000b2c838362000a4e565b806000190482111562000b435762000b4362000a38565b0290505b92915050565b600062000a3160ff84168362000a97565b600181811c9082168062000b7357607f821691505b6020821081141562000b9557634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e051610100516101205161364a62000ccb6000396000818161047101528181611acc0152818161295801528181612a1a0152612b2501526000818161044e01528181611a8b0152818161291901528181612a5c0152612aff01526000818161081001526122020152600081816104fb015281816106770152818161071b0152818161094b01528181610c070152818161146d015281816116f801528181611c7c015261258401526000818161030f015281816104d3015281816106520152818161092a01528181610be5015281816113d7015281816116d601528181611c5a015281816124fc0152818161299a015281816129e101528181612ac60152612b690152600081816103c0015281816104a301528181611a6301526128e5015261364a6000f3fe608060405234801561001057600080fd5b506004361061028a5760003560e01c806389afcb441161015c578063c5700a02116100ce578063ebeb31db11610087578063ebeb31db14610797578063ed12c5b41461079f578063f140a35a146107b2578063f3f24eb1146107c5578063f99f51a6146107ce578063fff6cae9146107ef57600080fd5b8063c5700a021461070d578063d21220a714610716578063d505accf1461073d578063dd62ed3e14610750578063e4463eb21461077b578063eba6aef91461078457600080fd5b80639e8cc04b116101205780639e8cc04b146106a25780639f767c88146106b5578063a9059cbb146106d5578063bc25cf77146106e8578063bf944dbc146106fb578063c245febc1461070457600080fd5b806389afcb44146105db5780638a7b8cf2146105ee57806395d89b41146106295780639cf42614146106315780639d63848a1461064457600080fd5b806323b872dd116102005780635881c475116101b95780635881c475146105445780635a76f25e146105575780636a6278421461056057806370a08231146105735780637ecebe00146105935780638334278d146105b357600080fd5b806323b872dd146103e2578063252c09d7146103f5578063313ce56714610428578063392f37e914610442578063443cb4bc14610528578063517b3f821461053157600080fd5b806313345fe11161025257806313345fe11461034957806318160ddd146103695780631df8c717146103805780631ed4202e14610388578063205aabf11461039b57806322be3de1146103bb57600080fd5b8063022c0d9f1461028f57806306fdde03146102a45780630902f1ac146102c2578063095ea7b3146102e75780630dfe16811461030a575b600080fd5b6102a261029d366004613041565b6107f7565b005b6102ac610da4565b6040516102b99190613105565b60405180910390f35b600954600a54600b545b604080519384526020840192909252908201526060016102b9565b6102fa6102f5366004613138565b610e32565b60405190151581526020016102b9565b6103317f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016102b9565b61035c610357366004613162565b610e9f565b6040516102b991906131d6565b61037260025481565b6040519081526020016102b9565b6102cc6110d0565b6103726103963660046131e9565b61113f565b6103726103a9366004613202565b60106020526000908152604090205481565b6102fa7f000000000000000000000000000000000000000000000000000000000000000081565b6102fa6103f036600461321d565b61119e565b6104086104033660046131e9565b611267565b6040805194855260208501939093529183015260608201526080016102b9565b610430601281565b60405160ff90911681526020016102b9565b600954600a54604080517f000000000000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060208201529081019290925260608201527f0000000000000000000000000000000000000000000000000000000000000000151560808201526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660a08301527f00000000000000000000000000000000000000000000000000000000000000001660c082015260e0016102b9565b61037260095481565b61037261053f366004613138565b6112a1565b61035c610552366004613259565b611394565b610372600a5481565b61037261056e366004613202565b6113a3565b610372610581366004613202565b60046020526000908152604090205481565b6103726105a1366004613202565b60066020526000908152604090205481565b6105c66105c13660046131e9565b611600565b604080519283526020830191909152016102b9565b6105c66105e9366004613202565b6116a4565b6105f66119c1565b6040516102b991908151815260208083015190820152604080830151908201526060918201519181019190915260800190565b6102ac611a52565b61037261063f36600461328c565b611a5f565b604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811682527f0000000000000000000000000000000000000000000000000000000000000000166020820152016102b9565b6103726106b0366004613259565b611bab565b6103726106c3366004613202565b600f6020526000908152604090205481565b6102fa6106e3366004613138565b611c18565b6102a26106f6366004613202565b611c2e565b610372600c5481565b610372600d5481565b610372600b5481565b6103317f000000000000000000000000000000000000000000000000000000000000000081565b6102a261074b3660046132ae565b611d4c565b61037261075e366004613321565b600360209081526000928352604080842090915290825290205481565b61037260075481565b61035c61079236600461328c565b612041565b600854610372565b6102a26107ad3660046131e9565b6121f7565b6103726107c0366004613354565b612231565b610372600e5481565b6107e16107dc36600461328c565b612250565b6040516102b9929190613377565b6102a26124cf565b60115460011461080657600080fd5b60026011819055507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b187bd266040518163ffffffff1660e01b8152600401602060405180830381865afa15801561086c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610890919061339c565b1561089a57600080fd5b60008511806108a95750600084115b6108e05760405162461bcd60e51b8152602060048201526003602482015262494f4160e81b60448201526064015b60405180910390fd5b600954600a5481871080156108f457508086105b6109255760405162461bcd60e51b8152602060048201526002602482015261125360f21b60448201526064016108d7565b6000807f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03898116908316148015906109985750806001600160a01b0316896001600160a01b031614155b6109c95760405162461bcd60e51b8152602060048201526002602482015261125560f21b60448201526064016108d7565b8a156109da576109da828a8d612609565b89156109eb576109eb818a8c612609565b8615610a5857604051639a7bff7960e01b81526001600160a01b038a1690639a7bff7990610a259033908f908f908e908e906004016133be565b600060405180830381600087803b158015610a3f57600080fd5b505af1158015610a53573d6000803e3d6000fd5b505050505b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa158015610a9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac0919061340a565b6040516370a0823160e01b81523060048201529094506001600160a01b038216906370a0823190602401602060405180830381865afa158015610b07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2b919061340a565b9250505060008985610b3d9190613439565b8311610b4a576000610b5e565b610b548a86613439565b610b5e9084613439565b90506000610b6c8a86613439565b8311610b79576000610b8d565b610b838a86613439565b610b8d9084613439565b90506000821180610b9e5750600081115b610bd05760405162461bcd60e51b815260206004820152600360248201526249494160e81b60448201526064016108d7565b6040516370a0823160e01b81523060048201527f0000000000000000000000000000000000000000000000000000000000000000907f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610c58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7c919061340a565b6040516370a0823160e01b81523060048201529096506001600160a01b038216906370a0823190602401602060405180830381865afa158015610cc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce7919061340a565b9450610cf38888611a5f565b610cfd8787611a5f565b1015610d2f5760405162461bcd60e51b81526020600482015260016024820152604b60f81b60448201526064016108d7565b5050610d3d848488886126f8565b60408051838152602081018390529081018c9052606081018b90526001600160a01b038a169033907fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8229060800160405180910390a350506001601155505050505050505050565b60008054610db190613450565b80601f0160208091040260200160405190810160405280929190818152602001828054610ddd90613450565b8015610e2a5780601f10610dff57610100808354040283529160200191610e2a565b820191906000526020600020905b815481529060010190602001808311610e0d57829003601f168201915b505050505081565b3360008181526003602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610e8d9086815260200190565b60405180910390a35060015b92915050565b606060008367ffffffffffffffff811115610ebc57610ebc613485565b604051908082528060200260200182016040528015610ee5578160200160208202803683370190505b50600854909150600090610efb90600190613439565b9050610f07848661349b565b811015610f265760405162461bcd60e51b81526004016108d7906134ba565b6000610f32858761349b565b610f3c9083613439565b90506000805b838310156110c057610f5487846134f1565b9150600060088481548110610f6b57610f6b613509565b90600052602060002090600402016000015460088481548110610f9057610f90613509565b906000526020600020906004020160000154610fac9190613439565b905060008160088681548110610fc457610fc4613509565b90600052602060002090600402016001015460088681548110610fe957610fe9613509565b9060005260206000209060040201600101546110059190613439565b61100f919061351f565b90506000826008878154811061102757611027613509565b9060005260206000209060040201600201546008878154811061104c5761104c613509565b9060005260206000209060040201600201546110689190613439565b611072919061351f565b90506110808c8e84846128e1565b88858151811061109257611092613509565b60209081029190910101526110a88460016134f1565b935050505086836110b991906134f1565b9250610f42565b509293505050505b949350505050565b600c54600d5442600080806110ee600954600a54600b549192909190565b9250925092508381146111375760006111078286613439565b9050611113818561349b565b61111d90886134f1565b9650611129818461349b565b61113390876134f1565b9550505b505050909192565b60008061114d836001612041565b90506000805b82518110156111935782818151811061116e5761116e613509565b60200260200101518261118191906134f1565b915061118c81613541565b9050611153565b506110c8848261351f565b6001600160a01b0383166000818152600360209081526040808320338085529252822054919290919082148015906111d857506000198114155b1561124e5760006111e98583613439565b6001600160a01b038881166000818152600360209081526040808320948916808452948252918290208590559051848152939450919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505b611259868686612bd6565b6001925050505b9392505050565b6008818154811061127757600080fd5b60009182526020909120600490910201805460018201546002830154600390930154919350919084565b6000806112ac6119c1565b90506000806112b96110d0565b508451919350915042141561132c57600880546112d890600290613439565b815481106112e8576112e8613509565b906000526020600020906004020160405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505092505b825160009061133b9042613439565b90506000818560200151856113509190613439565b61135a919061351f565b905060008286604001518561136f9190613439565b611379919061351f565b9050611387888a84846128e1565b9998505050505050505050565b60606110c88484846001610e9f565b60006011546001146113b457600080fd5b6002601155600954600a546040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611426573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144a919061340a565b6040516370a0823160e01b81523060048201529091506000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156114b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d8919061340a565b905060006114e68584613439565b905060006114f48584613439565b60025490915080611532576103e861151461150f848661349b565b612c84565b61151e9190613439565b975061152d60006103e8612cf4565b611567565b61156487611540838661349b565b61154a919061351f565b87611555848661349b565b61155f919061351f565b612d7e565b97505b6000881161159d5760405162461bcd60e51b8152602060048201526003602482015262494c4d60e81b60448201526064016108d7565b6115a78989612cf4565b6115b3858589896126f8565b604080518481526020810184905233917f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f910160405180910390a250506001601155509395945050505050565b600080600080611611856001612250565b9150915060008060005b84518110156116825784818151811061163657611636613509565b60200260200101518361164991906134f1565b925083818151811061165d5761165d613509565b60200260200101518261167091906134f1565b915061167b81613541565b905061161b565b5061168d878361351f565b611697888361351f565b9550955050505050915091565b6000806011546001146116b657600080fd5b6002601155600954600a546040516370a0823160e01b81523060048201527f0000000000000000000000000000000000000000000000000000000000000000907f0000000000000000000000000000000000000000000000000000000000000000906000906001600160a01b038416906370a0823190602401602060405180830381865afa15801561174c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611770919061340a565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038416906370a0823190602401602060405180830381865afa1580156117ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117de919061340a565b306000908152600460205260409020546002549192509080611800858461349b565b61180a919061351f565b995080611817848461349b565b611821919061351f565b985060008a1180156118335750600089115b6118655760405162461bcd60e51b815260206004820152600360248201526224a62160e91b60448201526064016108d7565b61186f3083612d94565b61187a868c8c612609565b611885858c8b612609565b6040516370a0823160e01b81523060048201526001600160a01b038716906370a0823190602401602060405180830381865afa1580156118c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ed919061340a565b6040516370a0823160e01b81523060048201529094506001600160a01b038616906370a0823190602401602060405180830381865afa158015611934573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611958919061340a565b925061196684848a8a6126f8565b604080518b8152602081018b90526001600160a01b038d169133917fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496910160405180910390a350505050505050506001601181905550915091565b6119ec6040518060800160405280600081526020016000815260200160008152602001600081525090565b600880546119fc90600190613439565b81548110611a0c57611a0c613509565b9060005260206000209060040201604051806080016040529081600082015481526020016001820154815260200160028201548152602001600382015481525050905090565b60018054610db190613450565b60007f000000000000000000000000000000000000000000000000000000000000000015611b9a5760007f0000000000000000000000000000000000000000000000000000000000000000611abc85670de0b6b3a764000061349b565b611ac6919061351f565b905060007f0000000000000000000000000000000000000000000000000000000000000000611afd85670de0b6b3a764000061349b565b611b07919061351f565b90506000670de0b6b3a7640000611b1e838561349b565b611b28919061351f565b90506000670de0b6b3a7640000611b3f848061349b565b611b49919061351f565b670de0b6b3a7640000611b5c868061349b565b611b66919061351f565b611b7091906134f1565b9050670de0b6b3a7640000611b85828461349b565b611b8f919061351f565b945050505050610e99565b611ba4828461349b565b9050610e99565b600080611bbb8585856001610e9f565b90506000805b8251811015611c0357828181518110611bdc57611bdc613509565b602002602001015182611bef91906134f1565b915080611bfb81613541565b915050611bc1565b50611c0e848261351f565b9695505050505050565b6000611c25338484612bd6565b50600192915050565b601154600114611c3d57600080fd5b60026011556009546040516370a0823160e01b81523060048201527f0000000000000000000000000000000000000000000000000000000000000000917f000000000000000000000000000000000000000000000000000000000000000091611d0a9184918691906001600160a01b038416906370a08231906024015b602060405180830381865afa158015611cd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cfb919061340a565b611d059190613439565b612609565b600a546040516370a0823160e01b8152306004820152611d429183918691906001600160a01b038416906370a0823190602401611cba565b5050600160115550565b42841015611d8e5760405162461bcd60e51b815260206004820152600f60248201526e10985cd9558c4e8811561412549151608a1b60448201526064016108d7565b7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051611dbe919061355c565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160408051601f19818403018152918152815160209283012060058190556001600160a01b038a166000908152600690935290822080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b919087611e7483613541565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e00160405160208183030381529060405280519060200120604051602001611eed92919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015611f58573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590611f8e5750886001600160a01b0316816001600160a01b0316145b611fda5760405162461bcd60e51b815260206004820152601960248201527f4261736556313a20494e56414c49445f5349474e41545552450000000000000060448201526064016108d7565b6001600160a01b038981166000818152600360209081526040808320948d16808452948252918290208b905590518a81527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050505050505050565b606060008367ffffffffffffffff81111561205e5761205e613485565b604051908082528060200260200182016040528015612087578160200160208202803683370190505b5060085490915060009061209d90600190613439565b90506120a9848661349b565b8110156120c85760405162461bcd60e51b81526004016108d7906134ba565b60006120d4858761349b565b6120de9083613439565b905060008060005b848410156121ea576120f888856134f1565b92506008848154811061210d5761210d613509565b9060005260206000209060040201600001546008848154811061213257612132613509565b90600052602060002090600402016000015461214e9190613439565b9050806008858154811061216457612164613509565b9060005260206000209060040201600301546008858154811061218957612189613509565b9060005260206000209060040201600301546121a59190613439565b6121af919061351f565b8683815181106121c1576121c1613509565b60209081029190910101526121d78260016134f1565b91506121e388856134f1565b93506120e6565b5093979650505050505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461222c57600080fd5b600755565b600954600a5460009190612247858584846128e1565b95945050505050565b60608060008467ffffffffffffffff81111561226e5761226e613485565b604051908082528060200260200182016040528015612297578160200160208202803683370190505b50905060008567ffffffffffffffff8111156122b5576122b5613485565b6040519080825280602002602001820160405280156122de578160200160208202803683370190505b506008549091506000906122f490600190613439565b9050612300868861349b565b81101561231f5760405162461bcd60e51b81526004016108d7906134ba565b600061232b878961349b565b6123359083613439565b905060008060005b848410156124be5761234f8a856134f1565b92506008848154811061236457612364613509565b9060005260206000209060040201600001546008848154811061238957612389613509565b9060005260206000209060040201600001546123a59190613439565b905080600885815481106123bb576123bb613509565b906000526020600020906004020160010154600885815481106123e0576123e0613509565b9060005260206000209060040201600101546123fc9190613439565b612406919061351f565b87838151811061241857612418613509565b602002602001018181525050806008858154811061243857612438613509565b9060005260206000209060040201600201546008858154811061245d5761245d613509565b9060005260206000209060040201600201546124799190613439565b612483919061351f565b86838151811061249557612495613509565b60209081029190910101526124ab8260016134f1565b91506124b78a856134f1565b935061233d565b509499939850929650505050505050565b6011546001146124de57600080fd5b60026011556040516370a0823160e01b8152306004820152612602907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa15801561254b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256f919061340a565b6040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa1580156125d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125f7919061340a565b600954600a546126f8565b6001601155565b6000836001600160a01b03163b1161262057600080fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b179052915160009283929087169161267c91906135f8565b6000604051808303816000865af19150503d80600081146126b9576040519150601f19603f3d011682016040523d82523d6000602084013e6126be565b606091505b50915091508180156126e85750805115806126e85750808060200190518101906126e8919061339c565b6126f157600080fd5b5050505050565b600b54429060009061270a9083613439565b905060008111801561271b57508315155b801561272657508215155b1561279157612735818561349b565b600c600082825461274691906134f1565b909155506127569050818461349b565b600d600082825461276791906134f1565b909155505060025461277a90829061349b565b600e600082825461278b91906134f1565b90915550505b600061279b6119c1565b80519091506127aa9084613439565b91506007548211156128905760408051608081018252848152600c5460208201908152600d54928201928352600e54606083019081526008805460018101825560009190915292517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee360049094029384015590517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee483015591517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee582015590517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee6909101555b6009879055600a869055600b83905560408051888152602081018890527fcf2aa50876cdfbb541206f89af0ee78d44a2abf8d328e37fa4917f982149848a910160405180910390a150505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000015612b645760006129158484611a5f565b90507f000000000000000000000000000000000000000000000000000000000000000061294a85670de0b6b3a764000061349b565b612954919061351f565b93507f000000000000000000000000000000000000000000000000000000000000000061298984670de0b6b3a764000061349b565b612993919061351f565b92506000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316876001600160a01b0316146129d85784866129db565b85855b915091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316876001600160a01b031614612a5a577f0000000000000000000000000000000000000000000000000000000000000000612a4b89670de0b6b3a764000061349b565b612a55919061351f565b612a97565b7f0000000000000000000000000000000000000000000000000000000000000000612a8d89670de0b6b3a764000061349b565b612a97919061351f565b97506000612aaf612aa8848b6134f1565b8584612e16565b612ab99083613439565b9050670de0b6b3a76400007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316896001600160a01b031614612b23577f0000000000000000000000000000000000000000000000000000000000000000612b45565b7f00000000000000000000000000000000000000000000000000000000000000005b612b4f908361349b565b612b59919061351f565b9450505050506110c8565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b031614612ba7578385612baa565b84845b9092509050612bb987836134f1565b612bc3828961349b565b612bcd919061351f565b925050506110c8565b6001600160a01b03831660009081526004602052604081208054839290612bfe908490613439565b90915550506001600160a01b03821660009081526004602052604081208054839290612c2b9084906134f1565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612c7791815260200190565b60405180910390a3505050565b60006003821115612ce55750806000612c9e60028361351f565b612ca99060016134f1565b90505b81811015612cdf57905080600281612cc4818661351f565b612cce91906134f1565b612cd8919061351f565b9050612cac565b50919050565b8115612cef575060015b919050565b8060026000828254612d0691906134f1565b90915550506001600160a01b03821660009081526004602052604081208054839290612d339084906134f1565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b6000818310612d8d5781611260565b5090919050565b8060026000828254612da69190613439565b90915550506001600160a01b03821660009081526004602052604081208054839290612dd3908490613439565b90915550506040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001612d72565b6000805b60ff811015612f1c57826000612e308783612f25565b905085811015612e80576000612e468887612fc2565b612e508389613439565b612e6290670de0b6b3a764000061349b565b612e6c919061351f565b9050612e7881876134f1565b955050612ec2565b6000612e8c8887612fc2565b612e968884613439565b612ea890670de0b6b3a764000061349b565b612eb2919061351f565b9050612ebe8187613439565b9550505b81851115612eeb576001612ed68387613439565b11612ee657849350505050611260565b612f07565b6001612ef78684613439565b11612f0757849350505050611260565b50508080612f1490613541565b915050612e1a565b50909392505050565b6000670de0b6b3a764000082818581612f3e828061349b565b612f48919061351f565b612f52919061349b565b612f5c919061351f565b612f66919061349b565b612f70919061351f565b670de0b6b3a7640000808481612f86828061349b565b612f90919061351f565b612f9a919061349b565b612fa4919061351f565b612fae908661349b565b612fb8919061351f565b61126091906134f1565b6000670de0b6b3a76400008381612fd9828061349b565b612fe3919061351f565b612fed919061349b565b612ff7919061351f565b670de0b6b3a76400008061300b858061349b565b613015919061351f565b61302086600361349b565b612fae919061349b565b80356001600160a01b0381168114612cef57600080fd5b60008060008060006080868803121561305957600080fd5b85359450602086013593506130706040870161302a565b9250606086013567ffffffffffffffff8082111561308d57600080fd5b818801915088601f8301126130a157600080fd5b8135818111156130b057600080fd5b8960208285010111156130c257600080fd5b9699959850939650602001949392505050565b60005b838110156130f05781810151838201526020016130d8565b838111156130ff576000848401525b50505050565b60208152600082518060208401526131248160408501602087016130d5565b601f01601f19169190910160400192915050565b6000806040838503121561314b57600080fd5b6131548361302a565b946020939093013593505050565b6000806000806080858703121561317857600080fd5b6131818561302a565b966020860135965060408601359560600135945092505050565b600081518084526020808501945080840160005b838110156131cb578151875295820195908201906001016131af565b509495945050505050565b602081526000611260602083018461319b565b6000602082840312156131fb57600080fd5b5035919050565b60006020828403121561321457600080fd5b6112608261302a565b60008060006060848603121561323257600080fd5b61323b8461302a565b92506132496020850161302a565b9150604084013590509250925092565b60008060006060848603121561326e57600080fd5b6132778461302a565b95602085013595506040909401359392505050565b6000806040838503121561329f57600080fd5b50508035926020909101359150565b600080600080600080600060e0888a0312156132c957600080fd5b6132d28861302a565b96506132e06020890161302a565b95506040880135945060608801359350608088013560ff8116811461330457600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561333457600080fd5b61333d8361302a565b915061334b6020840161302a565b90509250929050565b6000806040838503121561336757600080fd5b8235915061334b6020840161302a565b60408152600061338a604083018561319b565b8281036020840152612247818561319b565b6000602082840312156133ae57600080fd5b8151801515811461126057600080fd5b60018060a01b038616815284602082015283604082015260806060820152816080820152818360a0830137600081830160a090810191909152601f909201601f19160101949350505050565b60006020828403121561341c57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b60008282101561344b5761344b613423565b500390565b600181811c9082168061346457607f821691505b60208210811415612cdf57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b60008160001904831182151516156134b5576134b5613423565b500290565b6020808252601b908201527f504149523a3a4e4f5420524541445920464f522050524943494e470000000000604082015260600190565b6000821982111561350457613504613423565b500190565b634e487b7160e01b600052603260045260246000fd5b60008261353c57634e487b7160e01b600052601260045260246000fd5b500490565b600060001982141561355557613555613423565b5060010190565b600080835481600182811c91508083168061357857607f831692505b602080841082141561359857634e487b7160e01b86526022600452602486fd5b8180156135ac57600181146135bd576135ea565b60ff198616895284890196506135ea565b60008a81526020902060005b868110156135e25781548b8201529085019083016135c9565b505084890196505b509498975050505050505050565b6000825161360a8184602087016130d5565b919091019291505056fea26469706673582212203c3fcd0160262f7289c5b6ceef5d82c0ab9d4c7dea5fbcbc2649a8857a795f6864736f6c634300080b0033a2646970667358221220e2fe4b05758f5ea22cecc572f02185dc4b90b9de836a56996a39e4a9e18aa23864736f6c634300080b0033",
"devdoc": {
"kind": "dev",
"methods": {},
"version": 1
},
"userdoc": {
"kind": "user",
"methods": {},
"version": 1
},
"storageLayout": {
"storage": [
{
"astId": 24669,
"contract": "src/Swap/BaseV1-core.sol:BaseV1Factory",
"label": "isPaused",
"offset": 0,
"slot": "0",
"type": "t_bool"
},
{
"astId": 24671,
"contract": "src/Swap/BaseV1-core.sol:BaseV1Factory",
"label": "pauser",
"offset": 1,
"slot": "0",
"type": "t_address"
},
{
"astId": 24673,
"contract": "src/Swap/BaseV1-core.sol:BaseV1Factory",
"label": "pendingPauser",
"offset": 0,
"slot": "1",
"type": "t_address"
},
{
"astId": 24675,
"contract": "src/Swap/BaseV1-core.sol:BaseV1Factory",
"label": "admin",
"offset": 0,
"slot": "2",
"type": "t_address"
},
{
"astId": 24678,
"contract": "src/Swap/BaseV1-core.sol:BaseV1Factory",
"label": "MaxPeriod",
"offset": 0,
"slot": "3",
"type": "t_uint256"
},
{
"astId": 24686,
"contract": "src/Swap/BaseV1-core.sol:BaseV1Factory",
"label": "getPair",
"offset": 0,
"slot": "4",
"type": "t_mapping(t_address,t_mapping(t_address,t_mapping(t_bool,t_address)))"
},
{
"astId": 24689,
"contract": "src/Swap/BaseV1-core.sol:BaseV1Factory",
"label": "allPairs",
"offset": 0,
"slot": "5",
"type": "t_array(t_address)dyn_storage"
},
{
"astId": 24693,
"contract": "src/Swap/BaseV1-core.sol:BaseV1Factory",
"label": "isPair",
"offset": 0,
"slot": "6",
"type": "t_mapping(t_address,t_bool)"
},
{
"astId": 24695,
"contract": "src/Swap/BaseV1-core.sol:BaseV1Factory",
"label": "_temp0",
"offset": 0,
"slot": "7",
"type": "t_address"
},
{
"astId": 24697,
"contract": "src/Swap/BaseV1-core.sol:BaseV1Factory",
"label": "_temp1",
"offset": 0,
"slot": "8",
"type": "t_address"
},
{
"astId": 24699,
"contract": "src/Swap/BaseV1-core.sol:BaseV1Factory",
"label": "_temp",
"offset": 20,
"slot": "8",
"type": "t_bool"
}
],
"types": {
"t_address": {
"encoding": "inplace",
"label": "address",
"numberOfBytes": "20"
},
"t_array(t_address)dyn_storage": {
"base": "t_address",
"encoding": "dynamic_array",
"label": "address[]",
"numberOfBytes": "32"
},
"t_bool": {
"encoding": "inplace",
"label": "bool",
"numberOfBytes": "1"
},
"t_mapping(t_address,t_bool)": {
"encoding": "mapping",
"key": "t_address",
"label": "mapping(address => bool)",
"numberOfBytes": "32",
"value": "t_bool"
},
"t_mapping(t_address,t_mapping(t_address,t_mapping(t_bool,t_address)))": {
"encoding": "mapping",
"key": "t_address",
"label": "mapping(address => mapping(address => mapping(bool => address)))",
"numberOfBytes": "32",
"value": "t_mapping(t_address,t_mapping(t_bool,t_address))"
},
"t_mapping(t_address,t_mapping(t_bool,t_address))": {
"encoding": "mapping",
"key": "t_address",
"label": "mapping(address => mapping(bool => address))",
"numberOfBytes": "32",
"value": "t_mapping(t_bool,t_address)"
},
"t_mapping(t_bool,t_address)": {
"encoding": "mapping",
"key": "t_bool",
"label": "mapping(bool => address)",
"numberOfBytes": "32",
"value": "t_address"
},
"t_uint256": {
"encoding": "inplace",
"label": "uint256",
"numberOfBytes": "32"
}
}
}
}