@aurigami/sdk 1.4.2 → 1.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"sdk.cjs.development.js","sources":["../node_modules/regenerator-runtime/runtime.js","../src/BlockchainEntity.ts","../src/types.ts","../src/constants.ts","../src/aurora-api-helpers.ts","../src/decimals.ts","../src/helpers.ts","../src/token.ts","../src/tokenAmount.ts","../src/priceFetcher.ts","../src/MoneyMarket.ts","../src/SDK.ts","../src/dummy.ts","../src/transfer-event-query.ts","../src/airdrop-lottery.ts","../src/index.ts"],"sourcesContent":["/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar runtime = (function (exports) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n function define(obj, key, value) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n return obj[key];\n }\n try {\n // IE 8 has a broken Object.defineProperty that only works on DOM objects.\n define({}, \"\");\n } catch (err) {\n define = function(obj, key, value) {\n return obj[key] = value;\n };\n }\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n exports.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n define(IteratorPrototype, iteratorSymbol, function () {\n return this;\n });\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = GeneratorFunctionPrototype;\n define(Gp, \"constructor\", GeneratorFunctionPrototype);\n define(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction);\n GeneratorFunction.displayName = define(\n GeneratorFunctionPrototype,\n toStringTagSymbol,\n \"GeneratorFunction\"\n );\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n define(prototype, method, function(arg) {\n return this._invoke(method, arg);\n });\n });\n }\n\n exports.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n exports.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n define(genFun, toStringTagSymbol, \"GeneratorFunction\");\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n exports.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator, PromiseImpl) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return PromiseImpl.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return PromiseImpl.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration.\n result.value = unwrapped;\n resolve(result);\n }, function(error) {\n // If a rejected Promise was yielded, throw the rejection back\n // into the async generator function so it can be handled there.\n return invoke(\"throw\", error, resolve, reject);\n });\n }\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new PromiseImpl(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n define(AsyncIterator.prototype, asyncIteratorSymbol, function () {\n return this;\n });\n exports.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n exports.async = function(innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n if (PromiseImpl === void 0) PromiseImpl = Promise;\n\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList),\n PromiseImpl\n );\n\n return exports.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n // Note: [\"return\"] must be used for ES3 parsing compatibility.\n if (delegate.iterator[\"return\"]) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n define(Gp, toStringTagSymbol, \"Generator\");\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n define(Gp, iteratorSymbol, function() {\n return this;\n });\n\n define(Gp, \"toString\", function() {\n return \"[object Generator]\";\n });\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n exports.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n exports.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n\n // Regardless of whether this script is executing as a CommonJS module\n // or not, return the runtime object so that we can declare the variable\n // regeneratorRuntime in the outer scope, which allows this module to be\n // injected easily by `bin/regenerator --include-runtime script.js`.\n return exports;\n\n}(\n // If this script is executing as a CommonJS module, use module.exports\n // as the regeneratorRuntime namespace. Otherwise create a new empty\n // object. Either way, the resulting object will be used to initialize\n // the regeneratorRuntime variable at the top of this file.\n typeof module === \"object\" ? module.exports : {}\n));\n\ntry {\n regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n // This module should not be running in strict mode, so the above\n // assignment should always work unless something is misconfigured. Just\n // in case runtime.js accidentally runs in strict mode, in modern engines\n // we can explicitly access globalThis. In older engines we can escape\n // strict mode using a global Function call. This could conceivably fail\n // if a Content Security Policy forbids using Function, but in that case\n // the proper solution is to fix the accidental strict mode problem. If\n // you've misconfigured your bundler to force strict mode and applied a\n // CSP to forbid Function, and you're not willing to fix either of those\n // problems, please detail your unique predicament in a GitHub issue.\n if (typeof globalThis === \"object\") {\n globalThis.regeneratorRuntime = runtime;\n } else {\n Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n }\n}\n","import { Signer } from '@ethersproject/abstract-signer';\nimport { NetworkConnection } from './types';\n\nexport class BlockchainEntityRead {\n protected _networkConnection: NetworkConnection;\n public constructor(networkConnection: NetworkConnection) {\n this._networkConnection = networkConnection;\n }\n}\n\nexport class BlockchainEntityReadWrite extends BlockchainEntityRead {\n public constructor(networkConnection: NetworkConnection) {\n if (!(networkConnection.signer instanceof Signer)) {\n throw Error(\"Signer is not provided when constructing BlockchainEntityReadWrite\");\n }\n super(networkConnection);\n }\n}\n\nexport class BlockchainEntity {\n constructor() {}\n public read(networkConnection: NetworkConnection): BlockchainEntityRead {\n return new BlockchainEntityRead(networkConnection);\n }\n\n public readWrite(networkConnection: NetworkConnection): BlockchainEntityReadWrite {\n return new BlockchainEntityReadWrite(networkConnection);\n }\n}\n","import type { BigNumber, providers, Signer } from 'ethers';\nimport { TokenAmount } from './tokenAmount';\n\nexport enum ComptrollerRewardType {\n PLY = 0,\n AURORA\n};\nexport type NetworkConnection = {\n provider: providers.Provider,\n signer?: Signer\n}\n\nexport type Address = string;\n\nexport type CurrencyAmount = {\n currency: string,\n amount: string\n};\n\nexport type MoneyMarketDetails = {\n auTokenAddress: string;\n totalTokenDeposited: TokenAmount;\n totalTokenBorrowed: TokenAmount;\n depositApy: number;\n depositPlyApy: number;\n borrowApy: number;\n borrowPlyApy: number;\n collateralRatio: number;\n depositPlyPerWeek: TokenAmount;\n borrowPlyPerWeek: TokenAmount;\n depositMETAApy: number;\n depositNEARApy: number;\n borrowNEARApy: number;\n};\n\nexport type UserDetails = {\n markets: UserMarketDetails[];\n borrowLimit: CurrencyAmount;\n accruedPly: TokenAmount;\n lockedPly: TokenAmount;\n borrowableAmount: CurrencyAmount;\n};\n\nexport type LockingDetails = {\n vestingStart: number;\n currentUnlockPortion: number;\n nextUnlockPortion: number;\n};\n\nexport type PlyAuroraPool = {\n totalStakedLiquidity: CurrencyAmount;\n apy: number;\n};\n\nexport type UserMarketDetails = {\n market: string;\n depositBalance: TokenAmount;\n borrowBalance: TokenAmount;\n isCollateral: boolean;\n maxWithdrawableAmount: TokenAmount;\n collateralRatio: number;\n underlyingPrice: string;\n};\n\nexport type PlyAuroraPoolDetails = {\n totalStakedLiquidity: TokenAmount;\n apy: string;\n};\n\nexport enum MarketAction {\n Deposit = 0,\n Borrow,\n Withdraw,\n Repay,\n EnableCollateral,\n DisableCollateral\n}\nexport type HypotheticalStats = {\n newBorrowLimit: CurrencyAmount;\n newBorrowUtilization: number;\n}","import BigNumber from 'bignumber.js';\nimport { ethers, Signer, BigNumber as BN} from 'ethers';\nexport const dummyAddress: string = \"0xDEADbeEfEEeEEEeEEEeEEeeeeeEeEEeeeeEEEEeE\";\nexport const ETHAddress: string = \"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE\";\n\nexport const AURORA_CHAINID = 1313161554;\n\nexport const DECIMAL_PRECISION = 10;\n\nexport type NetworkAddresses = {\n auTokens: {\n name: string,\n address: string,\n underlying: string\n }[],\n misc: Record<string, string>,\n tokens: Record<string, string>\n}\nexport const networkAddresses: NetworkAddresses = {\n auTokens: [\n {\n name: \"auUSDC\",\n address: '0x4f0d864b1ABf4B701799a0b30b57A22dFEB5917b'.toLowerCase(),\n underlying: '0xb12bfca5a55806aaf64e99521918a4bf0fc40802'.toLowerCase()\n },\n {\n name: \"auETH\",\n address: '0xca9511B610bA5fc7E311FDeF9cE16050eE4449E9'.toLowerCase(),\n underlying: ETHAddress.toLowerCase()\n },\n {\n name: \"auWBTC\",\n address: '0xCFb6b0498cb7555e7e21502E0F449bf28760Adbb'.toLowerCase(),\n underlying: '0xf4eb217ba2454613b15dbdea6e5f22276410e89e'.toLowerCase()\n },\n {\n name: \"auUSDT\",\n address: '0xaD5A2437Ff55ed7A8Cad3b797b3eC7c5a19B1c54'.toLowerCase(),\n underlying: '0x4988a896b1227218e4a686fde5eabdcabd91571f'.toLowerCase()\n },\n {\n name: \"auDAI\",\n address: '0xCE4166363E3a584DAc84A47bCD3414B43EfCDd1c'.toLowerCase(),\n underlying: '0xe3520349f477a5f6eb06107066048508498a291b'.toLowerCase()\n },\n {\n name: \"auWNEAR\",\n address: '0xaE4fac24dCdAE0132C6d04f564dCf059616E9423'.toLowerCase(),\n underlying: '0xC42C30aC6Cc15faC9bD938618BcaA1a1FaE8501d'.toLowerCase()\n },\n {\n name: \"auSTNEAR\",\n address: \"0x3195949f267702723bc614cAE037cdc8D1E94786\".toLowerCase(),\n underlying: '0x07F9F7f963C5cD2BBFFd30CcfB964Be114332E30'.toLowerCase()\n },\n {\n name: \"auAURORA\",\n address: \"0x8888682E24dd4Df7B7Ff2B91fccB575737E433bf\".toLowerCase(),\n underlying: \"0x8bec47865ade3b172a928df8f990bc7f2a3b9f79\".toLowerCase(),\n },\n {\n name: \"auTRI\",\n address: \"0x6Ea6C03061bDdCE23d4Ec60B6E6e880c33d24dca\".toLowerCase(),\n underlying: \"0xFa94348467f64D5A457F75F8bc40495D33c65aBB\".toLowerCase()\n }\n ],\n misc: {\n COMPTROLLER: \"0x817af6cfAF35BdC1A634d6cC94eE9e4c68369Aeb\".toLowerCase(),\n oracle: \"0xC6e5185438e1730959c1eF3551059A3feC744E90\".toLowerCase(),\n AURIFAIRLAUNCH: \"0x9F9ceE911509abC6Af899c12ED625B0A6580D6e6\".toLowerCase(),\n AURILENS: '0xC41a5C1625d492436600789469c1CE2eA20CEA6B'.toLowerCase(),\n TOKENLOCK: '0xDACC02a4Ff16Ea3c1515AdbfdCeb7B1F448B79c8'.toLowerCase(),\n ETHREPAYHELPER: \"0xa308A5003fA1A25BFdD9418FcEE51d48Dbe441e6\".toLowerCase(),\n AURI_AIRDROP: \"0x6C42aA5b128B62D6CCf357726D7d13F3888335EC\".toLowerCase()\n },\n tokens: {\n AURORA: \"0x8bec47865ade3b172a928df8f990bc7f2a3b9f79\".toLowerCase(),\n PLY: \"0x981bD5832EAB9C8F607940E0e9faCBf8C09ee20a\".toLowerCase(),\n stNEAR: \"0x07f9f7f963c5cd2bbffd30ccfb964be114332e30\".toLowerCase(),\n USDC: '0xb12bfca5a55806aaf64e99521918a4bf0fc40802'.toLowerCase(),\n WNEAR: '0xC42C30aC6Cc15faC9bD938618BcaA1a1FaE8501d'.toLowerCase(),\n TRI: '0xFa94348467f64D5A457F75F8bc40495D33c65aBB'.toLowerCase(),\n META: '0xc21ff01229e982d7c8b8691163b0a3cb8f357453'.toLocaleLowerCase(),\n AURPLY: dummyAddress.toLowerCase() // This is dummy\n }\n}\n\nexport const BORROW_LIMIT_BUFFER = new BigNumber(1);\n\nexport const REWARDCLAIMSTART = 1640995200;\n\nexport const ONE_DAY = 86400;\nexport const ONE_YEAR = ONE_DAY * 365;\n\nexport const AurPlyPid = 0;\nexport const INF = BN.from(2).pow(256).sub(1)\n\n\nexport const AIRDROP_START_TIMESTAMP = 1649858400;\nexport const AIRDROP_END_TIMESTAMP = 1651068000;\nexport const AIRDROP_KEEP_THRESHOLD = 7 * 86400;\n\nexport const DEPOSIT_NEAR_REWARDS_PER_WEEK: {[k : string]: string} = Object.fromEntries(\n // lower case all addresses\n Object.entries({\n '0xb12bfca5a55806aaf64e99521918a4bf0fc40802': '36375', // USDC\n '0x4988a896b1227218e4a686fde5eabdcabd91571f': '14550', // USDT\n '0xf4eb217ba2454613b15dbdea6e5f22276410e89e': '3638', // WBTC\n '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE': '14550', // ETH\n '0xc42c30ac6cc15fac9bd938618bcaa1a1fae8501d': '3638', // WNEAR\n }).map(([k, v]) => [k.toLowerCase(), v])\n);\n\nexport const BORROW_NEAR_REWARDS_PER_WEEK: {[k : string]: string} = {\n // currently 0 for all markets\n}\n","import fetch from 'node-fetch';\n\nconst AURORA_API_BASE_URL = 'https://api.aurorascan.dev/api';\n\nexport async function getQuery(\n module: string, action: string, params: Record<string, any> = {},\n): Promise<any> {\n params = {...params, 'module': module, 'action': action};\n\n let resp = await fetch(AURORA_API_BASE_URL + '?' + new URLSearchParams(params), {\n headers: { 'Content-Type': 'application/json' },\n method: 'GET'\n });\n return (await resp.json()).result!;\n}\n","export const decimalRecords: Record<string, number> = {\n '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee': 18,\n '0x981bd5832eab9c8f607940e0e9facbf8c09ee20a': 18,\n '0x3195949f267702723bc614cae037cdc8d1e94786': 8,\n '0xfa94348467f64d5a457f75f8bc40495d33c65abb': 18,\n '0x07f9f7f963c5cd2bbffd30ccfb964be114332e30': 24,\n '0xc42c30ac6cc15fac9bd938618bcaa1a1fae8501d': 24,\n '0x6ea6c03061bddce23d4ec60b6e6e880c33d24dca': 8,\n '0xca9511b610ba5fc7e311fdef9ce16050ee4449e9': 8,\n '0x8bec47865ade3b172a928df8f990bc7f2a3b9f79': 18,\n '0xcfb6b0498cb7555e7e21502e0f449bf28760adbb': 8,\n '0x4f0d864b1abf4b701799a0b30b57a22dfeb5917b': 8,\n '0xad5a2437ff55ed7a8cad3b797b3ec7c5a19b1c54': 8,\n '0x4988a896b1227218e4a686fde5eabdcabd91571f': 6,\n '0xb12bfca5a55806aaf64e99521918a4bf0fc40802': 6,\n '0xe3520349f477a5f6eb06107066048508498a291b': 18,\n '0x8888682e24dd4df7b7ff2b91fccb575737e433bf': 8,\n '0xae4fac24dcdae0132c6d04f564dcf059616e9423': 8,\n '0xce4166363e3a584dac84a47bcd3414b43efcdd1c': 8,\n '0xf4eb217ba2454613b15dbdea6e5f22276410e89e': 8,\n '0xc21ff01229e982d7c8b8691163b0a3cb8f357453': 24\n}\n","import EIP20InterfaceABI from \"@aurigami/contracts/artifacts/contracts/interfaces/EIP20Interface.sol/EIP20Interface.json\"\nimport { EIP20Interface, IERC20 } from \"@aurigami/contracts/typechain\";\nimport { Provider } from \"@ethersproject/abstract-provider\";\nimport BigNumber from \"bignumber.js\";\nimport { BigNumber as BN, Contract, providers, utils } from \"ethers\";\nimport { getQuery as getAuroraAPIQuery } from \"./aurora-api-helpers\";\nimport { decimalRecords } from \"./decimals\";\nimport { Address, NetworkConnection } from \"./types\";\n\nexport function formatObject(object: Object) {\n return JSON.stringify(object, null, ' ');\n}\n\nexport function decimalFactor(decimal: number) {\n return BN.from(10).pow(decimal).toString();\n}\n\nexport const isSameAddress = (address1: Address, address2: Address): boolean => {\n return address1.toLowerCase() == address2.toLowerCase()\n}\n\nexport const getCurrentTimestamp = (): number => {\n return Math.trunc(Date.now() / 1000)\n}\n\nexport function validateAndParseAddress(address: Address): Address {\n try {\n return utils.getAddress(address);\n } catch (error) {\n throw new Error(\"Invalid address: \" + address);\n }\n}\n\nexport function getDecimal(address: Address): number {\n return decimalRecords[address.toLowerCase()];\n}\n\nexport function calcLMRewardApr(rewardsValue: BigNumber, totalStakeValue: BigNumber, frequencyPerYear: number): BigNumber {\n if (totalStakeValue.lte(0)) { // avoid division by zero when there is no stake\n return new BigNumber('999999999');\n }\n return rewardsValue.multipliedBy(frequencyPerYear).dividedBy(totalStakeValue);\n}\n\nexport async function getBlockTimestamp(provider: Provider, blockNumber: number): Promise<number> {\n const block = await provider.getBlock(blockNumber);\n return block.timestamp;\n}\n\n/**\n * Get the block number of the last block that has a timestamp before the given timestamp\n * @param timestamp input timestamp\n * @returns return the last block that its timestamp <= the give timestamp\n * @note Check this API for more information: https://aurorascan.dev/apis#blocks\n *\n * This function is much faster than using binary search.\n */\n export async function getBlockBeforeTimestamp(provider: Provider, timestamp: number) {\n let result = await getAuroraAPIQuery(\n 'block',\n 'getblocknobytime',\n {'timestamp': timestamp, 'closest': 'before'}\n );\n\n // In case the API return `Block timestamp too far in the future`\n // use the last block number\n return parseInt(result) || await provider.getBlockNumber();\n}\n","import { getDecimal } from \"./helpers\";\nimport { networkAddresses } from \"./constants\";\n\nexport class Token {\n public readonly address: string;\n public readonly decimals: number; \n public constructor(address: string, decimals: number) {\n this.address = address.toLowerCase();\n this.decimals = decimals;\n } \n}\n\nexport const PLYToken = new Token(\n networkAddresses.tokens.PLY,\n getDecimal(networkAddresses.tokens.PLY)\n)\n \nexport const AURPLYToken = new Token(\n networkAddresses.tokens.AURPLY,\n getDecimal(networkAddresses.tokens.AURPLY)\n)","import { Token } from \"./token\";\nimport BigNumber from 'bignumber.js';\nimport { decimalFactor } from \"./helpers\";\n\nexport class TokenAmount {\n public readonly token: Token;\n private rawAmnt: string;\n\n public constructor(token: Token, amount: string, isRaw: boolean = true) {\n if (isRaw) {\n this.rawAmnt = amount;\n } else {\n this.rawAmnt = new BigNumber(amount)\n .times(decimalFactor(token.decimals))\n .toFixed(0);\n }\n this.token = token;\n }\n\n public formattedAmount(): string {\n return new BigNumber(this.rawAmnt)\n .div(decimalFactor(this.token.decimals))\n .toString();\n }\n\n public rawAmount(): string {\n return this.rawAmnt;\n }\n}\n","import BigNumber from \"bignumber.js\";\nimport { Contract, providers, BigNumber as BN, ethers } from \"ethers\";\nimport { networkAddresses } from \"./constants\";\nimport OracleABI from \"./abis/Oracle.json\";\nimport { isSameAddress, decimalFactor, getDecimal } from \"./helpers\";\nimport { PriceOracle } from \"@aurigami/contracts/typechain\";\nimport { TokenAmount } from \"./tokenAmount\";\nimport { Address } from \"./types\";\nimport IUniswapV2PairABI from './abis/IUniswapV2Pair.json';\nimport AuriLensABI from '@aurigami/contracts/artifacts/contracts/AuriLens.sol/AuriLens.json';\nimport axios from 'axios';\n\nconst hardcodePLYPrice = true;\nexport async function fetchPriceFromCoingeckoAPI(id: string): Promise<BigNumber> {\n const price = await axios.get(\n `https://api.coingecko.com/api/v3/simple/price?ids=${id}&vs_currencies=usd`\n ).then((res: any) => {\n return res.data\n })\n\n return new BigNumber(price[id].usd)\n}\n\nexport async function fetchPriceFromCoingecko(id: Address): Promise<BigNumber> {\n switch (id.toLowerCase()) {\n case networkAddresses.tokens.AURORA:\n return fetchPriceFromCoingeckoAPI('aurora-near');\n\n case networkAddresses.tokens.TRI:\n return fetchPriceFromCoingeckoAPI('trisolaris');\n\n case networkAddresses.tokens.META:\n return fetchPriceFromCoingeckoAPI('meta-pool');\n\n default:\n throw Error(`Unknown token ${id} in fetchPriceFromCoingecko`);\n }\n}\n\nexport async function fetchLPPositions(LPAddress: Address, provider: providers.Provider): Promise<{\n token0: Address,\n token1: Address,\n reserve0: BN,\n reserve1: BN,\n totalSupply: BN\n}> {\n var promises = [];\n const LPContract = new Contract(LPAddress, IUniswapV2PairABI.abi, provider);\n promises.push(LPContract.token0());\n promises.push(LPContract.toekn1());\n promises.push(LPContract.getReserves());\n promises.push(LPContract.totalSupply());\n const values = await Promise.all(promises);\n return {\n token0: values[0],\n token1: values[1],\n reserve0: values[2].reserve0,\n reserve1: values[2].reserve1,\n totalSupply: values[3]\n }\n}\n\nexport async function fetchLPPrice(address: Address, provider: providers.Provider): Promise<BigNumber> {\n var LPInfo = await fetchLPPositions(address, provider);\n try {\n const token0Price: BigNumber = await fetchPrice(LPInfo.token0, provider);\n const reserveUSD: BigNumber = token0Price.multipliedBy(LPInfo.reserve0.toString()).multipliedBy(2);\n return reserveUSD.multipliedBy(decimalFactor(18)).dividedBy(new BigNumber(LPInfo.totalSupply.toString()));\n } catch {\n try {\n const token1Price: BigNumber = await fetchPrice(LPInfo.token1, provider);\n const reserveUSD: BigNumber = token1Price.multipliedBy(LPInfo.reserve1.toString()).multipliedBy(2);\n return reserveUSD.multipliedBy(decimalFactor(18)).dividedBy(new BigNumber(LPInfo.totalSupply.toString()));\n } catch {\n throw Error(`Unable to fetch price for both tokens of LP ${address}`);\n }\n }\n }\n\nfunction processPriceFromOracle(rawPrice: BN, underlyingDecimal: number) {\n return new BigNumber(rawPrice.toString()).div(decimalFactor(36 - underlyingDecimal));\n}\nexport async function fetchPriceFromOracle(auTokenAddress: Address, underlyingDecimal: number, provider: providers.Provider): Promise<BigNumber> {\n const oracleContract: PriceOracle = new Contract(networkAddresses.misc.oracle, OracleABI.abi, provider) as PriceOracle;\n const rawPrice = await oracleContract.getUnderlyingPrice(auTokenAddress);\n return processPriceFromOracle(rawPrice, underlyingDecimal)\n}\n\nexport async function fetchUnderlyingTokensPrices(provider: providers.Provider): Promise<{\n auToken: string,\n underlyingPrice: BigNumber\n}[]> {\n const auriLens: Contract = new Contract(networkAddresses.misc.AURILENS, AuriLensABI.abi, provider);\n const auTokenAddresses = networkAddresses.auTokens.map((auToken) => auToken.address);\n const underlyingDecimals = networkAddresses.auTokens.map((auToken) => getDecimal(auToken.underlying));\n const rawPrices = await auriLens.auTokenUnderlyingPriceAll(auTokenAddresses);\n return rawPrices.map((res: any, ind: number) => {\n return {\n auToken: res.auToken,\n underlyingPrice: processPriceFromOracle(res.underlyingPrice, underlyingDecimals[ind])\n }\n })\n}\n\nexport async function fetchStNEARPrice(): Promise<BigNumber> {\n const ratioPromise = axios.get(\"https://validators.narwallets.com/metrics_json\").then((res) => res.data);\n const nearPricePromise = fetchPriceFromCoingeckoAPI('near');\n const [ratioRes, nearPrice]: [any, BigNumber] = await Promise.all([ratioPromise, nearPricePromise]);\n const ratio = new BigNumber(ratioRes.st_near_price);\n return ratio.multipliedBy(nearPrice)\n}\n\nfunction shouldFetchFromCoingecko(address: string) {\n address = address.toLowerCase();\n return address == networkAddresses.tokens.AURORA ||\n address == networkAddresses.tokens.TRI ||\n address == networkAddresses.tokens.META;\n}\n\nexport async function fetchPrice(address: Address, provider: providers.Provider): Promise<BigNumber> {\n if (hardcodePLYPrice && isSameAddress(address, networkAddresses.tokens.PLY)) return new BigNumber(0);\n\n // if (isSameAddress(address, networkAddresses.tokens.stNEAR)) return fetchStNEARPrice();\n if (shouldFetchFromCoingecko(address)) return fetchPriceFromCoingecko(address);\n\n const matchingAuToken = networkAddresses.auTokens.find((auToken) => {\n return isSameAddress(auToken.underlying, address)\n });\n if (matchingAuToken !== undefined) {\n return fetchPriceFromOracle(matchingAuToken.address, getDecimal(address), provider);\n } else if (isSameAddress(address, networkAddresses.tokens.AURPLY)) {\n return fetchLPPrice(address, provider);\n } else {\n return fetchPriceFromCoingecko(address);\n }\n}\nexport async function fetchValuation(tokenAmount: TokenAmount, provider: providers.Provider): Promise<BigNumber> {\n if (tokenAmount.rawAmount() == \"0\") return new BigNumber(0);\n var price = await fetchPrice(tokenAmount.token.address, provider);\n return calcValuation(tokenAmount, price);\n}\n\nexport function calcValuation(tokenAmount: TokenAmount, price: BigNumber) {\n return new BigNumber(tokenAmount.formattedAmount()).multipliedBy(price);\n}\n","import { BlockchainEntity, BlockchainEntityRead } from './BlockchainEntity';\nimport { MoneyMarketDetails, NetworkConnection, Address, ComptrollerRewardType } from './types';\nimport { Contract, BigNumber as BN } from 'ethers';\nimport AuErc20ABI from '@aurigami/contracts/artifacts/contracts/AuErc20.sol/AuErc20.json';\nimport AuETHABI from '@aurigami/contracts/artifacts/contracts/AuETH.sol/AuETH.json';\nimport ComptrollerABI from '@aurigami/contracts/artifacts/contracts/Comptroller.sol/Comptroller.json';\nimport AuriLensABI from '@aurigami/contracts/artifacts/contracts/AuriLens.sol/AuriLens.json';\nimport EthRepayHelperABI from \"@aurigami/contracts/artifacts/contracts/EthRepayHelper.sol/EthRepayHelper.json\"\nimport { AuErc20, AuETH, AuriLens, Comptroller, EthRepayHelper } from \"@aurigami/contracts/typechain\";\nimport { TransactionResponse } from '@ethersproject/abstract-provider';\nimport { networkAddresses, ETHAddress, ONE_YEAR, INF, ONE_DAY, DEPOSIT_NEAR_REWARDS_PER_WEEK, BORROW_NEAR_REWARDS_PER_WEEK } from \"./constants\";\nimport BigNumber from \"bignumber.js\";\nimport { decimalFactor, isSameAddress, calcLMRewardApr, getCurrentTimestamp } from './helpers';\nimport { Token, PLYToken } from './token';\nimport { TokenAmount } from './tokenAmount';\nimport { getDecimal, validateAndParseAddress } from './helpers';\nimport { fetchPrice, calcValuation, fetchValuation } from \"./priceFetcher\";\n\n\ntype RewardSpeeds = {\n plyRewardSupplySpeed: BN;\n plyRewardBorrowSpeed: BN;\n auroraRewardSupplySpeed: BN;\n auroraRewardBorrowSpeed: BN;\n}\n\nexport class MoneyMarketRead extends BlockchainEntityRead {\n public underlying: Token;\n public auToken: AuErc20 | AuETH;\n protected _comptroller: Comptroller;\n\n protected _auriLens: AuriLens;\n constructor(networkConnection: NetworkConnection, auToken: Address, underlyingAsset: Address) {\n super(networkConnection);\n if (isSameAddress(underlyingAsset, ETHAddress)) {\n this.auToken = new Contract(auToken, AuETHABI.abi, networkConnection.provider) as AuETH;\n } else {\n this.auToken = new Contract(auToken, AuErc20ABI.abi, networkConnection.provider) as AuErc20;\n }\n this.underlying = new Token(\n underlyingAsset,\n getDecimal(underlyingAsset),\n );\n this._comptroller = new Contract(networkAddresses.misc.COMPTROLLER, ComptrollerABI.abi, networkConnection.provider) as Comptroller;\n this._auriLens = new Contract(networkAddresses.misc.AURILENS, AuriLensABI.abi, networkConnection.provider) as AuriLens;\n }\n\n protected async getRewardSpeeds(): Promise<RewardSpeeds> {\n var speeds = await this._auriLens.getRewardSpeeds(this._comptroller.address, this.auToken.address);\n return speeds;\n }\n public async getTotalTokenBorrowed(): Promise<TokenAmount> {\n return new TokenAmount(\n this.underlying,\n (await this.auToken.totalBorrows()).toString()\n )\n }\n public async getTotalTokenDeposited(): Promise<TokenAmount> {\n var promises = [];\n var totalBorrow: TokenAmount, totalCash: TokenAmount;\n promises.push(this.getTotalTokenBorrowed().then((res: TokenAmount) => {\n totalBorrow = res\n }));\n promises.push(this.auToken.getCash().then((res: BN) => {\n totalCash = new TokenAmount(\n this.underlying,\n res.toString()\n )\n }))\n await Promise.all(promises);\n return new TokenAmount(\n this.underlying,\n BN.from(totalCash!.rawAmount()).add(totalBorrow!.rawAmount()).toString()\n )\n }\n\n public async getDepositAPY(): Promise<BigNumber> {\n const supplyRatePerTimestamp = await this.auToken.supplyRatePerTimestamp();\n return new BigNumber(supplyRatePerTimestamp.toString()).multipliedBy(60*60*24*365).div(decimalFactor(18));\n }\n\n public async getBorrowAPY(): Promise<BigNumber> {\n const borrowRatePerTimestamp = await this.auToken.borrowRatePerTimestamp();\n return new BigNumber(borrowRatePerTimestamp.toString()).multipliedBy(60*60*24*365).div(decimalFactor(18));\n }\n\n public async getCollateralRatio(): Promise<BigNumber> {\n return this._comptroller.markets(this.auToken.address).then((res: any) => {\n return new BigNumber(res.collateralFactorMantissa.toString()).div(decimalFactor(18));\n })\n }\n\n public async getBorrowPlyAPY(): Promise<BigNumber> {\n var promises = [];\n var totalBorrowed: TokenAmount, rewardSpeed: TokenAmount, plyPrice: BigNumber, underlyingPrice: BigNumber;\n promises.push(this.getTotalTokenBorrowed().then((res: TokenAmount) => {totalBorrowed = res}));\n promises.push(this._comptroller.rewardSpeeds(ComptrollerRewardType.PLY, this.auToken.address, false).then((res) => {\n rewardSpeed = new TokenAmount(\n PLYToken,\n res.toString()\n )\n }));\n promises.push(fetchPrice(networkAddresses.tokens.PLY, this._networkConnection.provider).then((res) => {plyPrice = res}));\n promises.push(fetchPrice(this.underlying.address, this._networkConnection.provider).then((res) => {underlyingPrice = res}));\n await Promise.all(promises);\n return calcLMRewardApr(plyPrice!.multipliedBy(rewardSpeed!.formattedAmount()),\n underlyingPrice!.multipliedBy(totalBorrowed!.formattedAmount()), ONE_YEAR);\n }\n\n public async getDepositPlyAPY(): Promise<BigNumber> {\n var promises = [];\n var totalDeposited: TokenAmount, rewardSpeed: TokenAmount, plyPrice: BigNumber, underlyingPrice: BigNumber;\n promises.push(this.getTotalTokenDeposited().then((res: TokenAmount) => {totalDeposited = res}));\n promises.push(this._comptroller.rewardSpeeds(ComptrollerRewardType.PLY, this.auToken.address, true).then((res) => {\n rewardSpeed = new TokenAmount(\n PLYToken,\n res.toString()\n )\n }));\n promises.push(fetchPrice(networkAddresses.tokens.PLY, this._networkConnection.provider).then((res) => {plyPrice = res}));\n promises.push(fetchPrice(this.underlying.address, this._networkConnection.provider).then((res) => {underlyingPrice = res}));\n await Promise.all(promises);\n return calcLMRewardApr(plyPrice!.multipliedBy(rewardSpeed!.formattedAmount()),\n underlyingPrice!.multipliedBy(totalDeposited!.formattedAmount()), ONE_YEAR);\n }\n public async getDetails(): Promise<MoneyMarketDetails> {\n var promises = [], totalDeposited: TokenAmount, totalBorrowed: TokenAmount, depositAPY: number, borrowAPY: number, collateralRatio: number;\n promises.push(this.getTotalTokenDeposited().then((res: TokenAmount) => {totalDeposited = res}));\n promises.push(this.getTotalTokenBorrowed().then((res: TokenAmount) => {totalBorrowed = res}));\n promises.push(this.getDepositAPY().then((res: BigNumber) => {depositAPY = res.toNumber()}));\n promises.push(this.getBorrowAPY().then((res: BigNumber) => {borrowAPY = res.toNumber()}));\n promises.push(this.getCollateralRatio().then((res: BigNumber) => {collateralRatio = res.toNumber()}));\n\n var plyPrice: BigNumber, underlyingPrice: BigNumber, rewardSpeeds: RewardSpeeds;\n promises.push(this.getRewardSpeeds().then((res) => {rewardSpeeds = res}));\n promises.push(fetchPrice(networkAddresses.tokens.PLY, this._networkConnection.provider).then((res) => {plyPrice = res}));\n promises.push(fetchPrice(this.underlying.address, this._networkConnection.provider).then((res) => {underlyingPrice = res}));\n\n await Promise.all(promises);\n\n var borrowPlyApy = calcLMRewardApr(\n calcValuation(\n new TokenAmount(\n PLYToken,\n rewardSpeeds!.plyRewardBorrowSpeed.toString()\n ),\n plyPrice!\n ),\n underlyingPrice!.multipliedBy(totalBorrowed!.formattedAmount()),\n ONE_YEAR\n );\n var depositPlyApy = calcLMRewardApr(\n calcValuation(\n new TokenAmount(\n PLYToken,\n rewardSpeeds!.plyRewardSupplySpeed.toString()\n ),\n plyPrice!\n ),\n underlyingPrice!.multipliedBy(totalDeposited!.formattedAmount()),\n ONE_YEAR\n );\n\n var depositNEARApy = calcLMRewardApr(await fetchValuation(this.getDepositNEARRewardPerWeek(), this._networkConnection.provider), underlyingPrice!.multipliedBy(totalDeposited!.formattedAmount()), 52)\n var borrowNEARApy = calcLMRewardApr(await fetchValuation(this.getBorrowNEARRewardPerWeek(), this._networkConnection.provider), underlyingPrice!.multipliedBy(totalBorrowed!.formattedAmount()), 52)\n var depositMETAApy;\n if (isSameAddress(this.underlying.address, networkAddresses.tokens.stNEAR)) {\n depositMETAApy = calcLMRewardApr(new BigNumber(50000), underlyingPrice!.multipliedBy(totalDeposited!.formattedAmount()), 12);\n } else {\n depositMETAApy = new BigNumber(0);\n }\n\n return {\n auTokenAddress: this.auToken.address,\n totalTokenDeposited: totalDeposited!,\n totalTokenBorrowed: totalBorrowed!,\n depositApy: depositAPY!,\n depositPlyApy: depositPlyApy.toNumber(),\n borrowApy: borrowAPY!,\n borrowPlyApy: borrowPlyApy.toNumber() * -1,\n collateralRatio: collateralRatio!,\n depositPlyPerWeek: new TokenAmount(\n PLYToken,\n rewardSpeeds!.plyRewardSupplySpeed.mul(ONE_DAY).mul(7).toString()\n ),\n borrowPlyPerWeek: new TokenAmount(\n PLYToken,\n rewardSpeeds!.plyRewardBorrowSpeed.mul(ONE_DAY).mul(7).toString()\n ),\n depositNEARApy: depositNEARApy.toNumber(),\n borrowNEARApy: borrowNEARApy.toNumber() * -1,\n depositMETAApy: depositMETAApy.toNumber()\n };\n }\n\n public async getUserBorrowBalance(userAddress: string): Promise<TokenAmount> {\n const totalBorrow: BN = await this.auToken.callStatic.borrowBalanceCurrent(userAddress);\n return new TokenAmount(\n this.underlying,\n totalBorrow.toString()\n )\n }\n\n public async getUserDepositBalance(userAddress: string): Promise<TokenAmount> {\n const totalDeposit: BN = await this.auToken.callStatic.balanceOfUnderlying(userAddress);\n return new TokenAmount(\n this.underlying,\n totalDeposit.toString()\n )\n }\n\n private getDepositNEARRewardPerWeek(): TokenAmount {\n const NEARToken = new Token(networkAddresses.tokens.WNEAR, getDecimal(networkAddresses.tokens.WNEAR));\n const rewardStartTime = 1650636000;\n const rewardStopTime = 1651845600; // May 06, 2022 2 PM GMT\n const currentTime = getCurrentTimestamp();\n if (currentTime <= rewardStopTime && currentTime > rewardStartTime) {\n const reward = DEPOSIT_NEAR_REWARDS_PER_WEEK[this.underlying.address.toLocaleLowerCase()] ?? \"0\";\n return new TokenAmount(NEARToken, reward, false);\n } else {\n return new TokenAmount(NEARToken, \"0\");\n }\n }\n\n private getBorrowNEARRewardPerWeek(): TokenAmount {\n const NEARToken = new Token(networkAddresses.tokens.WNEAR, getDecimal(networkAddresses.tokens.WNEAR));\n const rewardStartTime = 1650636000;\n const rewardStopTime = 1651845600; // May 06, 2022 2 PM GMT\n const currentTime = getCurrentTimestamp();\n if (currentTime <= rewardStopTime && currentTime > rewardStartTime) {\n const reward = BORROW_NEAR_REWARDS_PER_WEEK[this.underlying.address.toLocaleLowerCase()] ?? \"0\";\n return new TokenAmount(NEARToken, reward, false);\n } else {\n return new TokenAmount(NEARToken, \"0\");\n }\n }\n}\n\nexport class MoneyMarketReadWrite extends MoneyMarketRead {\n\n protected _EthRepayHelper: EthRepayHelper;\n constructor(networkConnection: NetworkConnection, auToken: Address, underlyingAsset: Address) {\n super(networkConnection, auToken, underlyingAsset);\n this._EthRepayHelper = new Contract(networkAddresses.misc.ETHREPAYHELPER, EthRepayHelperABI.abi, networkConnection.provider) as EthRepayHelper;\n }\n\n public async deposit(amount: TokenAmount): Promise<TransactionResponse> {\n if (isSameAddress(amount.token.address, ETHAddress)) {\n return (this.auToken as AuETH).connect(this._networkConnection.signer!).mint({value: amount.rawAmount()});\n } else {\n return (this.auToken as AuErc20).connect(this._networkConnection.signer!).mint(amount.rawAmount());\n }\n }\n public async borrow(amount: TokenAmount): Promise<TransactionResponse> {\n return this.auToken.connect(this._networkConnection.signer!).borrow(amount.rawAmount());\n }\n public async withdraw(amount: TokenAmount): Promise<TransactionResponse> {\n if (new BigNumber(amount.rawAmount()).lt(0)) {\n return this.auToken.connect(this._networkConnection.signer!).redeemUnderlying(INF);\n }\n return this.auToken.connect(this._networkConnection.signer!).redeemUnderlying(amount.rawAmount());\n }\n public async repay(amount: TokenAmount): Promise<TransactionResponse> {\n if (isSameAddress(amount.token.address, ETHAddress)) {\n return this._EthRepayHelper.connect(this._networkConnection.signer!).repayBorrow({value: amount.rawAmount()});\n } else {\n if (new BigNumber(amount.rawAmount()).lt(0)) {\n return this.auToken.connect(this._networkConnection.signer!).repayBorrow(INF);\n } else {\n return this.auToken.connect(this._networkConnection.signer!).repayBorrow(amount.rawAmount());\n }\n }\n }\n public async enableCollateral(): Promise<TransactionResponse> {\n return this._comptroller.connect(this._networkConnection.signer!).enterMarkets([this.auToken.address]);\n }\n public async disableCollateral(): Promise<TransactionResponse> {\n return this._comptroller.connect(this._networkConnection.signer!).exitMarket(this.auToken.address);\n }\n}\n\nexport class MoneyMarket extends BlockchainEntity {\n protected address: Address;\n\n protected underlying: Address;\n constructor(address: string, underlying: string) {\n super();\n this.address = validateAndParseAddress(address);\n this.underlying = validateAndParseAddress(underlying);\n }\n public read(networkConnection: NetworkConnection): MoneyMarketRead {\n return new MoneyMarketRead(networkConnection, this.address, this.underlying);\n }\n\n public readWrite(networkConnection: NetworkConnection): MoneyMarketReadWrite {\n return new MoneyMarketReadWrite(networkConnection, this.address, this.underlying);\n }\n}\n","import { BlockchainEntity, BlockchainEntityRead } from './BlockchainEntity';\nimport {\n LockingDetails,\n PlyAuroraPoolDetails,\n NetworkConnection,\n UserDetails,\n UserMarketDetails,\n Address,\n CurrencyAmount,\n HypotheticalStats,\n MarketAction\n} from './types';\nimport { networkAddresses, BORROW_LIMIT_BUFFER, DECIMAL_PRECISION, REWARDCLAIMSTART, ONE_DAY, AurPlyPid } from './constants';\nimport { TransactionResponse } from '@ethersproject/abstract-provider';\nimport { Contract, BigNumber as BN, ethers, providers } from 'ethers';\nimport { isSameAddress, decimalFactor, getCurrentTimestamp, calcLMRewardApr } from './helpers';\nimport { MoneyMarketRead } from './MoneyMarket';\nimport { fetchValuation, fetchPrice, calcValuation } from './priceFetcher';\nimport { AuriFairLaunch, Comptroller, TokenLock, AuriLens } from '@aurigami/contracts/typechain';\nimport { TokenAmount } from './tokenAmount';\nimport { AURPLYToken, PLYToken, Token } from './token';\nimport BigNumber from 'bignumber.js';\nimport AuriLensABI from '@aurigami/contracts/artifacts/contracts/AuriLens.sol/AuriLens.json';\nimport ComptrollerABI from '@aurigami/contracts/artifacts/contracts/Comptroller.sol/Comptroller.json';\nimport TokenLockABI from \"@aurigami/contracts/artifacts/contracts/TokenLock.sol/TokenLock.json\";\nimport AuriFairLaunchABI from \"@aurigami/contracts/artifacts/contracts/AuriFairLaunch.sol/AuriFairLaunch.json\";\nimport FaucetABI from \"@aurigami/contracts/artifacts/contracts/mock/Faucet.sol/Faucet.json\";\n\nexport class SdkRead extends BlockchainEntityRead {\n\n protected _comptroller: Comptroller;\n protected _tokenLock: TokenLock;\n protected _auriFairLaunch: AuriFairLaunch;\n protected _auriLens: AuriLens;\n constructor(networkConnection: NetworkConnection) {\n super(networkConnection);\n this._comptroller = new Contract(networkAddresses.misc.COMPTROLLER, ComptrollerABI.abi, networkConnection.provider) as Comptroller;\n this._tokenLock = new Contract(networkAddresses.misc.TOKENLOCK, TokenLockABI.abi, networkConnection.provider) as TokenLock;\n this._auriFairLaunch = new Contract(networkAddresses.misc.AURIFAIRLAUNCH, AuriFairLaunchABI.abi, networkConnection.provider) as AuriFairLaunch;\n this._auriLens = new Contract(networkAddresses.misc.AURILENS, AuriLensABI.abi, networkConnection.provider) as AuriLens;\n }\n\n public async getLockingDetails(): Promise<LockingDetails> {\n const currentTime = getCurrentTimestamp();\n const currentWeek = BN.from(currentTime - REWARDCLAIMSTART).div(7 * ONE_DAY).toNumber();\n const denominator = 10000;\n var promises = [];\n promises.push(this._tokenLock.percentageLock(currentWeek));\n promises.push(this._tokenLock.percentageLock(currentWeek + 1).catch((err: any) => {return denominator}));\n var values: string[] = await Promise.all(promises).then((res) => {\n return res.map((v) => {return v.toString()})\n });\n return {\n vestingStart: REWARDCLAIMSTART, // 10 Jan 2023\n currentUnlockPortion: (new BigNumber(denominator).minus(values[0])).div(denominator).toNumber(),\n nextUnlockPortion: (new BigNumber(denominator).minus(values[1])).div(denominator).toNumber(),\n };\n }\n\n public async getUserDetails(userAddress: string): Promise<UserDetails> {\n const marketCount = networkAddresses.auTokens.length;\n var userMarketDetails: UserMarketDetails[] = [], assetsIn: string[];\n var promises = [];\n var totalBorrowLimit = new BigNumber(0);\n var pricePromises = [];\n for (const auToken of networkAddresses.auTokens) {\n const userMarketDetail: UserMarketDetails = {} as UserMarketDetails;\n userMarketDetails.push(userMarketDetail);\n userMarketDetail.market = auToken.underlying;\n const moneyMarket: MoneyMarketRead = new MoneyMarketRead(this._networkConnection, auToken.address, auToken.underlying);\n promises.push(moneyMarket.getUserDepositBalance(userAddress).then((res: TokenAmount) => {userMarketDetail.depositBalance = res}));\n promises.push(moneyMarket.getUserBorrowBalance(userAddress).then((res: TokenAmount) => {userMarketDetail.borrowBalance = res}));\n promises.push(moneyMarket.getCollateralRatio().then((res: BigNumber) => {userMarketDetail.collateralRatio = res.toNumber()}));\n pricePromises.push(fetchPrice(moneyMarket.underlying.address, this._networkConnection.provider).then((res) => {\n userMarketDetail.underlyingPrice = res.toString();\n return res;\n }));\n }\n\n promises.push(this._comptroller.getAssetsIn(userAddress).then((res: string[]) => {assetsIn = res}));\n \n await Promise.all(promises);\n var underlyingPrices = await Promise.all(pricePromises);\n var depositValues = []\n for (var i = 0; i < marketCount; i ++) {\n const auToken = networkAddresses.auTokens[i];\n if (assetsIn!.find((auAddress: Address) => isSameAddress(auToken.address, auAddress)) !== undefined) {\n userMarketDetails[i].isCollateral = true;\n } else {\n userMarketDetails[i].isCollateral = false;\n }\n depositValues.push(calcValuation(userMarketDetails[i].depositBalance, underlyingPrices[i]));\n }\n\n totalBorrowLimit = depositValues.reduce((p: BigNumber, v: BigNumber, index: number)=> {\n if (userMarketDetails[index].isCollateral) return p.plus(v.multipliedBy(userMarketDetails[index].collateralRatio));\n return p;\n }, new BigNumber(0))\n\n promises = new Array(3);\n var accountLiquidity: [BN, BN], rewardBalancesMetadata, lockedAmount: BN;\n promises[0] = this._comptroller.getAccountLiquidity(userAddress);\n promises[1] = this._auriLens.callStatic.claimAndGetRewardBalancesMetadata(this._comptroller.address, this._auriFairLaunch.address, [], {from: userAddress});\n promises[2] = this._tokenLock.lockedAmounts(userAddress);\n var values = await Promise.all(promises);\n\n accountLiquidity = values[0]; rewardBalancesMetadata = values[1]; lockedAmount = values[2];\n var borrowedvaluation: BigNumber = totalBorrowLimit.minus(new BigNumber(accountLiquidity[0].toString()).div(decimalFactor(18)));\n\n if (borrowedvaluation.lt(\"0.00001\")) { // Igore dust, dust could be the result of network delay causing collateral valuation calc to be different on vs off chain\n borrowedvaluation = new BigNumber(0);\n } \n \n const bufferedBorrowLimit: BigNumber = totalBorrowLimit.multipliedBy(BORROW_LIMIT_BUFFER);\n const minimumBorrowLimitAllowed = borrowedvaluation.div(BORROW_LIMIT_BUFFER);\n\n var borrowableAmount: BigNumber;\n if (bufferedBorrowLimit.lte(borrowedvaluation)) {\n borrowableAmount = new BigNumber(0)\n } else {\n borrowableAmount = bufferedBorrowLimit.minus(borrowedvaluation);\n }\n\n for (var i = 0; i < marketCount; i ++) {\n const auToken = networkAddresses.auTokens[i];\n const moneyMarket: MoneyMarketRead = new MoneyMarketRead(this._networkConnection, auToken.address, auToken.underlying);\n const borrowLimitMargin = totalBorrowLimit.minus(minimumBorrowLimitAllowed).gt(0) ? totalBorrowLimit.minus(minimumBorrowLimitAllowed) : new BigNumber(0);\n const maxWithdrawCap: BigNumber = borrowLimitMargin.div(userMarketDetails[i].collateralRatio).div(underlyingPrices[i]);\n userMarketDetails[i].maxWithdrawableAmount = userMarketDetails[i].isCollateral && maxWithdrawCap.lt(userMarketDetails[i].depositBalance.formattedAmount()) \n ? new TokenAmount(\n moneyMarket.underlying,\n maxWithdrawCap.toFixed(24),\n false\n )\n : new TokenAmount(\n moneyMarket.underlying,\n userMarketDetails[i].depositBalance.rawAmount()\n );\n }\n\n return {\n markets: userMarketDetails,\n borrowLimit: {\n currency: \"USD\",\n amount: bufferedBorrowLimit.toFixed(DECIMAL_PRECISION)\n },\n accruedPly: new TokenAmount(PLYToken, rewardBalancesMetadata.plyAccrued.toString()),\n lockedPly: new TokenAmount(PLYToken, lockedAmount.toString()),\n borrowableAmount: {\n currency: \"USD\",\n amount: borrowableAmount.toFixed(DECIMAL_PRECISION)\n },\n };\n }\n\n public async getPlyAuroraPoolDetails(): Promise<PlyAuroraPoolDetails> {\n var stakedLiquidity: BN, rewardPerSecond: BN; \n var promises = [];\n promises.push(this._auriFairLaunch.getPoolInfo(AurPlyPid).then((res) => {\n stakedLiquidity = res.totalStake;\n rewardPerSecond = res.rewardPerSecond; \n }));\n await Promise.all(promises);\n\n promises = [];\n var rewardPerSecondValuation: BigNumber, totalStakeValuation: BigNumber;\n promises.push(fetchValuation(new TokenAmount(\n PLYToken,\n rewardPerSecond!.toString()\n ), this._networkConnection.provider).then((res) => rewardPerSecondValuation = res));\n promises.push(fetchValuation(new TokenAmount(\n AURPLYToken,\n stakedLiquidity!.toString()\n ), this._networkConnection.provider).then((res) => totalStakeValuation = res));\n await Promise.all(promises);\n\n return {\n totalStakedLiquidity: new TokenAmount(\n AURPLYToken,\n stakedLiquidity!.toString()\n ),\n apy: calcLMRewardApr(rewardPerSecondValuation!, totalStakeValuation!, ONE_DAY * 365).toFixed(DECIMAL_PRECISION),\n };\n }\n\n public async getTokenPrice(token: Token): Promise<CurrencyAmount> {\n const price = await fetchPrice(token.address, this._networkConnection.provider);\n return {\n currency: \"USD\",\n amount: price.toFixed(DECIMAL_PRECISION)\n }\n }\n public async stakeBalanceOf(user: string): Promise<TokenAmount> {\n const userInfo = await this._auriFairLaunch.getUserInfo(AurPlyPid, user);\n return new TokenAmount(\n AURPLYToken,\n userInfo.amount.toString()\n )\n }\n\n public calcHypotheticalStats({\n userMarketDetail, \n currentBorrowLimit,\n currentBorrowValuation,\n action,\n tokenAmount\n }: {\n userMarketDetail: UserMarketDetails,\n currentBorrowLimit: CurrencyAmount, \n currentBorrowValuation: CurrencyAmount, \n action: MarketAction,\n tokenAmount?: TokenAmount\n }): HypotheticalStats {\n var newBorrowLimit = new BigNumber(currentBorrowLimit.amount), newBorrowValuation = new BigNumber(currentBorrowValuation.amount);\n switch (action) {\n case MarketAction.EnableCollateral:\n case MarketAction.DisableCollateral:\n var deltaBorrowLimit = calcValuation(userMarketDetail.depositBalance, new BigNumber(userMarketDetail.underlyingPrice)).multipliedBy(userMarketDetail.collateralRatio).multipliedBy(BORROW_LIMIT_BUFFER);\n newBorrowLimit = action == MarketAction.EnableCollateral ? newBorrowLimit.plus(deltaBorrowLimit) : newBorrowLimit.minus(deltaBorrowLimit);\n break;\n\n case MarketAction.Deposit:\n case MarketAction.Withdraw:\n deltaBorrowLimit = calcValuation(tokenAmount!, new BigNumber(userMarketDetail.underlyingPrice)).multipliedBy(userMarketDetail.collateralRatio).multipliedBy(BORROW_LIMIT_BUFFER);\n newBorrowLimit = action == MarketAction.Deposit ? newBorrowLimit.plus(deltaBorrowLimit) : newBorrowLimit.minus(deltaBorrowLimit);\n break;\n\n case MarketAction.Borrow:\n case MarketAction.Repay:\n var deltaBorrowValuation = calcValuation(tokenAmount!, new BigNumber(userMarketDetail.underlyingPrice));\n newBorrowValuation = action == MarketAction.Borrow ? newBorrowValuation.plus(deltaBorrowValuation) : newBorrowValuation.minus(deltaBorrowValuation);\n break;\n }\n return {\n newBorrowLimit: {\n amount: newBorrowLimit!.toFixed(DECIMAL_PRECISION),\n currency: \"USD\"\n },\n newBorrowUtilization: newBorrowLimit.eq(0) ? newBorrowValuation.eq(0) ? 0 : 9999.99\n : newBorrowValuation!.div(newBorrowLimit!).toNumber()\n }\n }\n}\n\nexport class SdkReadWrite extends SdkRead {\n public async claim(): Promise<TransactionResponse> {\n return this._auriLens.connect(this._networkConnection.signer!).claimRewards(\n this._comptroller.address,\n this._auriFairLaunch.address,\n [AurPlyPid]\n );\n }\n public async stake(amount: TokenAmount): Promise<TransactionResponse> {\n return this._auriFairLaunch.connect(this._networkConnection.signer!).deposit(AurPlyPid, amount.rawAmount());\n }\n public async unstake(amount: TokenAmount): Promise<TransactionResponse> {\n return this._auriFairLaunch.connect(this._networkConnection.signer!).withdraw(AurPlyPid, amount.rawAmount());\n }\n public async faucetDrip(): Promise<TransactionResponse> {\n const faucet = new Contract(networkAddresses.misc.FAUCET, FaucetABI.abi, this._networkConnection.provider);\n return faucet.connect(this._networkConnection.signer!).drip();\n }\n}\n\nexport class SDK extends BlockchainEntity {\n constructor() {\n super();\n }\n public read(networkConnection: NetworkConnection): SdkRead {\n return new SdkRead(networkConnection);\n }\n\n public readWrite(networkConnection: NetworkConnection): SdkReadWrite {\n return new SdkReadWrite(networkConnection);\n }\n}\n","import { Token } from './token';\nimport { TokenAmount } from './tokenAmount';\nimport { UserMarketDetails } from './types';\n\nexport const dummyToken = new Token('0xb97ef9ef8734c71904d8002f8b6bc66dd9c48a6e', 6);\n\nexport const dummyPly = new Token('0x8729438eb15e2c8b576fcc6aecda6a148776c0f5', 18);\n\nexport const dummyPlyAurora = new Token('0xE530dC2095Ef5653205CF5ea79F8979a7028065c', 18);\n\nexport const dummyTokenAmount = new TokenAmount(\n dummyToken,\n '123.456',\n false,\n);\n\nexport const dummyZeroTokenAmount = new TokenAmount(\n dummyToken,\n '0',\n);\n\nexport const dummyTokenAmount2 = new TokenAmount(\n dummyToken,\n '456.123',\n false,\n);\n\nexport const dummyTokenAmount3 = new TokenAmount(\n dummyToken,\n '1000.123',\n false,\n);\n\nexport const dummyMarketAddress = '0xbeb5d47a3f720ec0a390d04b4d41ed7d9688bc7f'; // qiUSDC\n\nexport const dummyUserMarketDetails: UserMarketDetails = {\n market: dummyMarketAddress,\n depositBalance: dummyTokenAmount2,\n borrowBalance: dummyZeroTokenAmount,\n isCollateral: true,\n maxWithdrawableAmount: dummyTokenAmount,\n collateralRatio: 0.5,\n underlyingPrice: \"1\"\n};\n","import { BlockchainEntityRead } from \"./BlockchainEntity\";\nimport { NetworkConnection } from \"./types\";\nimport { AuToken } from \"@aurigami/contracts/typechain\";\nimport AuTokenABI from '@aurigami/contracts/artifacts/contracts/AuToken.sol/AuToken.json';\nimport { BigNumber as BN, Contract } from \"ethers\";\n\ntype SimpleTransfer = {\n from: string;\n to: string;\n amount: BN;\n blockNumber: number;\n}\n\n\nexport class TransferEventQuery extends BlockchainEntityRead {\n auToken: AuToken;\n\n constructor(\n tokenAddr: string,\n networkConnection: NetworkConnection\n ) {\n super(networkConnection);\n this.auToken = new Contract(tokenAddr, AuTokenABI.abi, this._networkConnection.provider) as AuToken;\n }\n\n /**\n * query ERC20 transfers from/to an address & auto convert them into SimpleTransfer.\n * The result will be sorted by blocknumber.\n */\n async queryERC20TransfersOf(address: string, fromBlock: number, toBlock: number): Promise<SimpleTransfer[]> {\n const filters = [\n this.auToken.filters.Transfer(address, null),\n this.auToken.filters.Transfer(null, address)\n ]\n\n const events = (await Promise.all(filters.map(filter => this.auToken.queryFilter(filter, fromBlock, toBlock)))).flat();\n\n let results: SimpleTransfer[] = events.map((event) => {\n return {\n from: event.args![0],\n to: event.args![1],\n amount: event.args![2],\n blockNumber: event.blockNumber,\n };\n });\n\n results.sort((a, b) => a.blockNumber - b.blockNumber);\n\n return results;\n }\n\n /**\n * Get the balance of an address at a given block number.\n *\n * Note that this will return the balance after the block get mined.\n */\n async queryERC20BalanceAt(address: string, endBlock: number): Promise<BN> {\n return this.auToken.balanceOf(address, {blockTag: endBlock + 1});\n }\n}\n","import { Provider } from \"@ethersproject/abstract-provider\";\nimport { TransactionResponse } from '@ethersproject/abstract-provider';\nimport { BlockchainEntity, BlockchainEntityRead } from \"./BlockchainEntity\";\nimport { Address, NetworkConnection } from \"./types\";\nimport { BigNumber as BN, Contract, utils } from \"ethers\";\nimport { TransferEventQuery } from \"./transfer-event-query\";\nimport { AIRDROP_START_TIMESTAMP, AIRDROP_KEEP_THRESHOLD, AIRDROP_END_TIMESTAMP, networkAddresses } from \"./constants\";\nimport AuriAirdropABI from \"@aurigami/contracts/artifacts/contracts/AuriAirdrop.sol/AuriAirdrop.json\"\nimport { getBlockBeforeTimestamp, getCurrentTimestamp, getDecimal, isSameAddress } from \"./helpers\";\nimport AIRDROP_AUTOKEN_INFO from \"./airdrop_misc/auTokensInfo.json\"\nimport AIRDROP_WHITELIST_ADDRESSES from \"./airdrop_misc/whitelist.json\"\nimport { AuriAirdrop } from \"@aurigami/contracts/typechain\";\nimport assert from 'assert';\nimport { TokenAmount } from \"./tokenAmount\";\nimport { Token } from \"./token\";\n\ntype AirdropUnderlyingInfo = {\n minDeposit: BN,\n}\n\ntype AirdropAuTokenInfo = {\n address: string,\n exchangeRate: BN,\n deploymentBlock: number,\n underlying: AirdropUnderlyingInfo\n}\n\nclass AirdropSettings {\n private static _instance: AirdropSettings;\n\n airdropStartBlock: number = 0;\n airdropEndBlock: number = 0;\n airdropStartTimestamp: number = AIRDROP_START_TIMESTAMP;\n airdropEndTimestamp: number = AIRDROP_END_TIMESTAMP;\n airdropThreshold: number = AIRDROP_KEEP_THRESHOLD;\n private constructor() {}\n\n public static async getSettings(provider: Provider): Promise<AirdropSettings> {\n if (this._instance)\n return this._instance;\n\n let settings: AirdropSettings = new AirdropSettings();\n\n settings.airdropStartBlock = await getBlockBeforeTimestamp(\n provider,\n settings.airdropStartTimestamp,\n );\n\n settings.airdropEndBlock = await getBlockBeforeTimestamp(\n provider,\n settings.airdropEndTimestamp,\n );\n\n this._instance = settings;\n return settings;\n }\n}\n\nclass AirdropAuTokenKeepTracker extends BlockchainEntityRead {\n private _transferQuery: TransferEventQuery;\n private _airdropAuTokenInfo: AirdropAuTokenInfo;\n public constructor(networkConnection: NetworkConnection, airdropAuTokenInfo: AirdropAuTokenInfo) {\n super(networkConnection);\n this._transferQuery = new TransferEventQuery(airdropAuTokenInfo.address, networkConnection);\n this._airdropAuTokenInfo = airdropAuTokenInfo;\n\n // exchangeRate = 102% * exchangeRate, see why in the comment of _toUnderlyingValue\n this._airdropAuTokenInfo.exchangeRate = this._airdropAuTokenInfo.exchangeRate.add(\n this._airdropAuTokenInfo.exchangeRate.div(50)\n )\n }\n\n /**\n * Convert the given amount of auToken to the underlying value with the stored exchange rate\n *\n * Why we need to do this?\n *\n * By transfer event, we cannot know the exact underlying, the only\n * info that we can keep track of via transfer is event is the auToken amount. So we need to\n * convert it to the underlying value with the stored exchange rate.\n *\n * However, we cannot just simply use auTokenAmount * exchangeRate, because the exchange rate\n * is changing over time. As advice of the contract team, use fixed exchangeRate * 102% is good enough.\n *\n */\n private _toUnderlyingValue(auTokenAmount: BN): BN {\n return auTokenAmount.mul(\n this._airdropAuTokenInfo.exchangeRate\n ).div(BN.from(10).pow(18));\n }\n\n /**\n * Check if the user has been deposit at least (minDeposit) and keep it for\n * more than AIRDROP_KEEP_THRESHOLD milliseconds\n *\n * How it works:\n * Whenever the user balance is exceed minDeposit, we will record the timestamp,\n * and when the balance is below minDeposit, we will compare with the saved timestamp to see\n * whether it has been keep for more than AIRDROP_KEEP_THRESHOLD milliseconds.\n *\n */\n public async isEligible(address: string): Promise<boolean> {\n const settings = await AirdropSettings.getSettings(this._networkConnection.provider);\n const minDeposit = this._airdropAuTokenInfo.underlying.minDeposit;\n\n // Get user balance at the time of Airdrop start\n let balance = await this._transferQuery.queryERC20BalanceAt(\n address,\n settings.airdropStartBlock - 1\n );\n\n const [BELOW, ABOVE] = [false, true];\n let flag = BELOW;\n // variable to store the last timestamp that, from it to \"current\" timestamp,\n // the balance is always above minDeposit\n let lastEligibleBalanceTimestamp = 0;\n\n if (this._toUnderlyingValue(balance).gte(minDeposit)) {\n lastEligibleBalanceTimestamp = settings.airdropStartTimestamp;\n flag = ABOVE;\n }\n\n let events = await this._transferQuery.queryERC20TransfersOf(\n address,\n settings.airdropStartBlock,\n settings.airdropEndBlock\n );\n\n for (let { from, to, amount, blockNumber } of events) {\n if (isSameAddress(from, address)) {\n balance = balance.sub(amount);\n }\n if (isSameAddress(to, address)) {\n balance = balance.add(amount);\n }\n\n // if it is different from the flag, that means the balance is changing\n if (this._toUnderlyingValue(balance).gte(minDeposit) != flag) {\n flag = !flag;\n const timestamp = (await this._networkConnection.provider.getBlock(blockNumber)).timestamp;\n\n // if this txn make the balance below the minDeposit,\n // check whether it has been keep for more than AIRDROP_KEEP_THRESHOLD\n if (flag == BELOW) {\n if (timestamp - lastEligibleBalanceTimestamp >= settings.airdropThreshold) {\n return true;\n }\n lastEligibleBalanceTimestamp = 0;\n }\n else {\n // record the timestamp when the balance is above minDeposit\n lastEligibleBalanceTimestamp = timestamp;\n }\n }\n }\n\n // if after the last txn, the balance is still above minDeposit,\n // we should check from the last timestamp to \"now\"\n if (flag == ABOVE) {\n const timestamp = Math.min(settings.airdropEndTimestamp, getCurrentTimestamp());\n return timestamp - lastEligibleBalanceTimestamp >= settings.airdropThreshold;\n }\n\n return false;\n }\n}\n\nexport class AirdropRead extends BlockchainEntityRead {\n protected _airDrop: AuriAirdrop;\n private _whitelistedAddresses: Set<string>;\n private keepTrackers: AirdropAuTokenKeepTracker[] = [];\n public constructor(networkConnection: NetworkConnection) {\n super(networkConnection);\n this._airDrop = new Contract(\n networkAddresses.misc.AURI_AIRDROP,\n AuriAirdropABI.abi,\n networkConnection.provider\n ) as AuriAirdrop;\n\n this._whitelistedAddresses = new Set(\n (AIRDROP_WHITELIST_ADDRESSES as string[]).map(e => e.toLocaleLowerCase())\n );\n\n let auTokens: any = AIRDROP_AUTOKEN_INFO;\n\n for (let auToken in auTokens) {\n let { address, exchangeRate, deploymentBlock, underlying } = auTokens[auToken];\n\n let airdropInfo: AirdropAuTokenInfo = {\n address: address,\n exchangeRate: BN.from(exchangeRate),\n deploymentBlock: parseInt(deploymentBlock),\n underlying: {\n minDeposit: BN.from(underlying.minDeposit),\n }\n }\n\n this.keepTrackers.push(\n new AirdropAuTokenKeepTracker(\n networkConnection,\n airdropInfo\n )\n )\n }\n }\n\n public countWhitelistedAddresses(): number {\n return this._whitelistedAddresses.size;\n }\n\n public isWhitelisted(user: string): boolean {\n return this._whitelistedAddresses.has(user.toLocaleLowerCase());\n }\n\n public async hasCompletedChallenge(user: string): Promise<boolean> {\n const settings = await AirdropSettings.getSettings(this._networkConnection.provider);\n\n if (getCurrentTimestamp() < settings.airdropStartTimestamp) {\n return false;\n }\n\n if (!this.isWhitelisted(user)) {\n return false;\n }\n\n // iterate for all the market and check if the user has completed the challenge\n return (await Promise.all(this.keepTrackers.map(async (keepTracker) => {\n return keepTracker.isEligible(user);\n }))).includes(true);\n }\n\n /**\n * Get redeemable rewards amount of user\n */\n public async getRedeemableReward(campaign: string, token: Address, user: Address): Promise<TokenAmount> {\n let tokenInstance: Token = new Token(\n token,\n getDecimal(token),\n );\n\n let rewards: BN = await this._airDrop.getRedeemableReward(\n utils.formatBytes32String(campaign),\n token,\n user\n )\n\n return new TokenAmount(tokenInstance, rewards.toString());\n }\n}\n\nexport class AirdropReadWrite extends AirdropRead {\n /**\n * Transfer rewards from multiple campaigns to msg.sender\n */\n public async redeemMultiple(campaigns: string[], tokens: Address[]): Promise<TransactionResponse> {\n assert(campaigns.length == tokens.length, \"campaigns and tokens must have the same length\");\n return this._airDrop.connect(this._networkConnection.signer!).redeem(\n campaigns.map(e => utils.formatBytes32String(e)),\n tokens,\n await this._networkConnection.signer!.getAddress(),\n );\n }\n\n /**\n * Redeem reward from a single campaign\n */\n public async redeemSingle(campaign: string, token: Address): Promise<TransactionResponse> {\n return this.redeemMultiple([campaign], [token]);\n }\n}\n\nexport class Airdrop extends BlockchainEntity {\n constructor() {\n super();\n }\n public read(networkConnection: NetworkConnection): AirdropRead {\n return new AirdropRead(networkConnection);\n }\n public readWrite(networkConnection: NetworkConnection): AirdropReadWrite {\n return new AirdropReadWrite(networkConnection);\n }\n}\n","import BigNumber from 'bignumber.js';\nimport { ethers } from 'ethers';\nimport { Logger } from 'ethers/lib/utils';\n\nethers.utils.Logger.setLogLevel(Logger.levels.ERROR);\nBigNumber.config({DECIMAL_PLACES: 50})\n\nexport * from './SDK';\nexport * from './MoneyMarket';\nexport * from './BlockchainEntity';\nexport * from './helpers';\nexport * from './constants';\nexport * from './dummy';\nexport * from './priceFetcher';\nexport * from './token';\nexport * from './tokenAmount';\nexport * from './types';\nexport * from './airdrop-lottery';\nexport * from './transfer-event-query';\n"],"names":["undefined","BlockchainEntityRead","networkConnection","_networkConnection","BlockchainEntityReadWrite","signer","Signer","Error","BlockchainEntity","read","readWrite","ComptrollerRewardType","MarketAction","dummyAddress","ETHAddress","AURORA_CHAINID","DECIMAL_PRECISION","networkAddresses","auTokens","name","address","toLowerCase","underlying","misc","COMPTROLLER","oracle","AURIFAIRLAUNCH","AURILENS","TOKENLOCK","ETHREPAYHELPER","AURI_AIRDROP","tokens","AURORA","PLY","stNEAR","USDC","WNEAR","TRI","META","toLocaleLowerCase","AURPLY","BORROW_LIMIT_BUFFER","BigNumber","REWARDCLAIMSTART","ONE_DAY","ONE_YEAR","AurPlyPid","INF","BN","from","pow","sub","AIRDROP_START_TIMESTAMP","AIRDROP_END_TIMESTAMP","AIRDROP_KEEP_THRESHOLD","DEPOSIT_NEAR_REWARDS_PER_WEEK","Object","fromEntries","entries","map","k","v","BORROW_NEAR_REWARDS_PER_WEEK","AURORA_API_BASE_URL","getQuery","module","action","params","fetch","URLSearchParams","headers","method","resp","json","result","decimalRecords","formatObject","object","JSON","stringify","decimalFactor","decimal","toString","isSameAddress","address1","address2","getCurrentTimestamp","Math","trunc","Date","now","validateAndParseAddress","utils","getAddress","error","getDecimal","calcLMRewardApr","rewardsValue","totalStakeValue","frequencyPerYear","lte","multipliedBy","dividedBy","getBlockTimestamp","provider","blockNumber","getBlock","block","timestamp","getBlockBeforeTimestamp","getAuroraAPIQuery","parseInt","getBlockNumber","Token","decimals","PLYToken","AURPLYToken","TokenAmount","token","amount","isRaw","rawAmnt","times","toFixed","formattedAmount","div","rawAmount","fetchPriceFromCoingeckoAPI","id","axios","get","then","res","data","price","usd","fetchPriceFromCoingecko","fetchLPPositions","LPAddress","promises","LPContract","Contract","IUniswapV2PairABI","abi","push","token0","toekn1","getReserves","totalSupply","Promise","all","values","token1","reserve0","reserve1","fetchLPPrice","LPInfo","fetchPrice","token0Price","reserveUSD","token1Price","processPriceFromOracle","rawPrice","underlyingDecimal","fetchPriceFromOracle","auTokenAddress","oracleContract","OracleABI","getUnderlyingPrice","fetchUnderlyingTokensPrices","auriLens","AuriLensABI","auTokenAddresses","auToken","underlyingDecimals","auTokenUnderlyingPriceAll","rawPrices","ind","underlyingPrice","fetchStNEARPrice","ratioPromise","nearPricePromise","ratioRes","nearPrice","ratio","st_near_price","shouldFetchFromCoingecko","hardcodePLYPrice","matchingAuToken","find","fetchValuation","tokenAmount","calcValuation","MoneyMarketRead","underlyingAsset","AuETHABI","AuErc20ABI","_comptroller","ComptrollerABI","_auriLens","getRewardSpeeds","speeds","getTotalTokenBorrowed","totalBorrows","getTotalTokenDeposited","totalBorrow","getCash","totalCash","add","getDepositAPY","supplyRatePerTimestamp","getBorrowAPY","borrowRatePerTimestamp","getCollateralRatio","markets","collateralFactorMantissa","getBorrowPlyAPY","totalBorrowed","rewardSpeeds","rewardSpeed","plyPrice","getDepositPlyAPY","totalDeposited","getDetails","depositAPY","toNumber","borrowAPY","collateralRatio","borrowPlyApy","plyRewardBorrowSpeed","depositPlyApy","plyRewardSupplySpeed","getDepositNEARRewardPerWeek","depositNEARApy","getBorrowNEARRewardPerWeek","borrowNEARApy","depositMETAApy","totalTokenDeposited","totalTokenBorrowed","depositApy","borrowApy","depositPlyPerWeek","mul","borrowPlyPerWeek","getUserBorrowBalance","userAddress","callStatic","borrowBalanceCurrent","getUserDepositBalance","balanceOfUnderlying","totalDeposit","NEARToken","rewardStartTime","rewardStopTime","currentTime","reward","MoneyMarketReadWrite","_EthRepayHelper","EthRepayHelperABI","deposit","connect","mint","value","borrow","withdraw","lt","redeemUnderlying","repay","repayBorrow","enableCollateral","enterMarkets","disableCollateral","exitMarket","MoneyMarket","SdkRead","_tokenLock","TokenLockABI","_auriFairLaunch","AuriFairLaunchABI","getLockingDetails","currentWeek","denominator","percentageLock","err","vestingStart","currentUnlockPortion","minus","nextUnlockPortion","getUserDetails","marketCount","length","userMarketDetails","totalBorrowLimit","pricePromises","userMarketDetail","market","moneyMarket","depositBalance","borrowBalance","getAssetsIn","assetsIn","underlyingPrices","depositValues","i","auAddress","isCollateral","reduce","p","index","plus","Array","getAccountLiquidity","claimAndGetRewardBalancesMetadata","lockedAmounts","accountLiquidity","rewardBalancesMetadata","lockedAmount","borrowedvaluation","bufferedBorrowLimit","minimumBorrowLimitAllowed","borrowableAmount","borrowLimitMargin","gt","maxWithdrawCap","maxWithdrawableAmount","borrowLimit","currency","accruedPly","plyAccrued","lockedPly","getPlyAuroraPoolDetails","getPoolInfo","stakedLiquidity","totalStake","rewardPerSecond","rewardPerSecondValuation","totalStakeValuation","totalStakedLiquidity","apy","getTokenPrice","stakeBalanceOf","user","getUserInfo","userInfo","calcHypotheticalStats","currentBorrowLimit","currentBorrowValuation","newBorrowLimit","newBorrowValuation","EnableCollateral","DisableCollateral","deltaBorrowLimit","Deposit","Withdraw","Borrow","Repay","deltaBorrowValuation","newBorrowUtilization","eq","SdkReadWrite","claim","claimRewards","stake","unstake","faucetDrip","faucet","FAUCET","FaucetABI","drip","SDK","dummyToken","dummyPly","dummyPlyAurora","dummyTokenAmount","dummyZeroTokenAmount","dummyTokenAmount2","dummyTokenAmount3","dummyMarketAddress","dummyUserMarketDetails","TransferEventQuery","tokenAddr","AuTokenABI","queryERC20TransfersOf","fromBlock","toBlock","filters","Transfer","filter","queryFilter","events","flat","results","event","args","to","sort","a","b","queryERC20BalanceAt","endBlock","balanceOf","blockTag","AirdropSettings","getSettings","_instance","settings","airdropStartTimestamp","airdropStartBlock","airdropEndTimestamp","airdropEndBlock","AirdropAuTokenKeepTracker","airdropAuTokenInfo","_transferQuery","_airdropAuTokenInfo","exchangeRate","_toUnderlyingValue","auTokenAmount","isEligible","minDeposit","balance","BELOW","ABOVE","flag","lastEligibleBalanceTimestamp","gte","airdropThreshold","min","AirdropRead","_airDrop","AuriAirdropABI","_whitelistedAddresses","Set","AIRDROP_WHITELIST_ADDRESSES","e","AIRDROP_AUTOKEN_INFO","deploymentBlock","airdropInfo","keepTrackers","countWhitelistedAddresses","size","isWhitelisted","has","hasCompletedChallenge","keepTracker","includes","getRedeemableReward","campaign","tokenInstance","formatBytes32String","rewards","AirdropReadWrite","redeemMultiple","campaigns","assert","redeem","redeemSingle","Airdrop","ethers","Logger","setLogLevel","levels","ERROR","config","DECIMAL_PLACES"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
1
+ {"version":3,"file":"sdk.cjs.development.js","sources":["../node_modules/regenerator-runtime/runtime.js","../src/BlockchainEntity.ts","../src/types.ts","../src/constants.ts","../src/aurora-api-helpers.ts","../src/decimals.ts","../src/helpers.ts","../src/token.ts","../src/tokenAmount.ts","../src/priceFetcher.ts","../src/MoneyMarket.ts","../src/SDK.ts","../src/dummy.ts","../src/transfer-event-query.ts","../src/airdrop-lottery.ts","../src/index.ts"],"sourcesContent":["/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar runtime = (function (exports) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n function define(obj, key, value) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n return obj[key];\n }\n try {\n // IE 8 has a broken Object.defineProperty that only works on DOM objects.\n define({}, \"\");\n } catch (err) {\n define = function(obj, key, value) {\n return obj[key] = value;\n };\n }\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n exports.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n define(IteratorPrototype, iteratorSymbol, function () {\n return this;\n });\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = GeneratorFunctionPrototype;\n define(Gp, \"constructor\", GeneratorFunctionPrototype);\n define(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction);\n GeneratorFunction.displayName = define(\n GeneratorFunctionPrototype,\n toStringTagSymbol,\n \"GeneratorFunction\"\n );\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n define(prototype, method, function(arg) {\n return this._invoke(method, arg);\n });\n });\n }\n\n exports.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n exports.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n define(genFun, toStringTagSymbol, \"GeneratorFunction\");\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n exports.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator, PromiseImpl) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return PromiseImpl.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return PromiseImpl.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration.\n result.value = unwrapped;\n resolve(result);\n }, function(error) {\n // If a rejected Promise was yielded, throw the rejection back\n // into the async generator function so it can be handled there.\n return invoke(\"throw\", error, resolve, reject);\n });\n }\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new PromiseImpl(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n define(AsyncIterator.prototype, asyncIteratorSymbol, function () {\n return this;\n });\n exports.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n exports.async = function(innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n if (PromiseImpl === void 0) PromiseImpl = Promise;\n\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList),\n PromiseImpl\n );\n\n return exports.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n // Note: [\"return\"] must be used for ES3 parsing compatibility.\n if (delegate.iterator[\"return\"]) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n define(Gp, toStringTagSymbol, \"Generator\");\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n define(Gp, iteratorSymbol, function() {\n return this;\n });\n\n define(Gp, \"toString\", function() {\n return \"[object Generator]\";\n });\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n exports.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n exports.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n\n // Regardless of whether this script is executing as a CommonJS module\n // or not, return the runtime object so that we can declare the variable\n // regeneratorRuntime in the outer scope, which allows this module to be\n // injected easily by `bin/regenerator --include-runtime script.js`.\n return exports;\n\n}(\n // If this script is executing as a CommonJS module, use module.exports\n // as the regeneratorRuntime namespace. Otherwise create a new empty\n // object. Either way, the resulting object will be used to initialize\n // the regeneratorRuntime variable at the top of this file.\n typeof module === \"object\" ? module.exports : {}\n));\n\ntry {\n regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n // This module should not be running in strict mode, so the above\n // assignment should always work unless something is misconfigured. Just\n // in case runtime.js accidentally runs in strict mode, in modern engines\n // we can explicitly access globalThis. In older engines we can escape\n // strict mode using a global Function call. This could conceivably fail\n // if a Content Security Policy forbids using Function, but in that case\n // the proper solution is to fix the accidental strict mode problem. If\n // you've misconfigured your bundler to force strict mode and applied a\n // CSP to forbid Function, and you're not willing to fix either of those\n // problems, please detail your unique predicament in a GitHub issue.\n if (typeof globalThis === \"object\") {\n globalThis.regeneratorRuntime = runtime;\n } else {\n Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n }\n}\n","import { Signer } from '@ethersproject/abstract-signer';\nimport { NetworkConnection } from './types';\n\nexport class BlockchainEntityRead {\n protected _networkConnection: NetworkConnection;\n public constructor(networkConnection: NetworkConnection) {\n this._networkConnection = networkConnection;\n }\n}\n\nexport class BlockchainEntityReadWrite extends BlockchainEntityRead {\n public constructor(networkConnection: NetworkConnection) {\n if (!(networkConnection.signer instanceof Signer)) {\n throw Error(\"Signer is not provided when constructing BlockchainEntityReadWrite\");\n }\n super(networkConnection);\n }\n}\n\nexport class BlockchainEntity {\n constructor() {}\n public read(networkConnection: NetworkConnection): BlockchainEntityRead {\n return new BlockchainEntityRead(networkConnection);\n }\n\n public readWrite(networkConnection: NetworkConnection): BlockchainEntityReadWrite {\n return new BlockchainEntityReadWrite(networkConnection);\n }\n}\n","import type { BigNumber, providers, Signer } from 'ethers';\nimport { TokenAmount } from './tokenAmount';\n\nexport enum ComptrollerRewardType {\n PLY = 0,\n AURORA\n};\nexport type NetworkConnection = {\n provider: providers.Provider,\n signer?: Signer\n}\n\nexport type Address = string;\n\nexport type CurrencyAmount = {\n currency: string,\n amount: string\n};\n\nexport type MoneyMarketDetails = {\n auTokenAddress: string;\n totalTokenDeposited: TokenAmount;\n totalTokenBorrowed: TokenAmount;\n depositApy: number;\n depositPlyApy: number;\n borrowApy: number;\n borrowPlyApy: number;\n collateralRatio: number;\n depositPlyPerWeek: TokenAmount;\n borrowPlyPerWeek: TokenAmount;\n depositMETAApy: number;\n depositNEARApy: number;\n borrowNEARApy: number;\n};\n\nexport type UserDetails = {\n markets: UserMarketDetails[];\n borrowLimit: CurrencyAmount;\n accruedPly: TokenAmount;\n lockedPly: TokenAmount;\n borrowableAmount: CurrencyAmount;\n};\n\nexport type LockingDetails = {\n vestingStart: number;\n currentUnlockPortion: number;\n nextUnlockPortion: number;\n};\n\nexport type PlyAuroraPool = {\n totalStakedLiquidity: CurrencyAmount;\n apy: number;\n};\n\nexport type UserMarketDetails = {\n market: string;\n depositBalance: TokenAmount;\n borrowBalance: TokenAmount;\n isCollateral: boolean;\n maxWithdrawableAmount: TokenAmount;\n collateralRatio: number;\n underlyingPrice: string;\n};\n\nexport type PlyAuroraPoolDetails = {\n totalStakedLiquidity: TokenAmount;\n apy: string;\n};\n\nexport enum MarketAction {\n Deposit = 0,\n Borrow,\n Withdraw,\n Repay,\n EnableCollateral,\n DisableCollateral\n}\nexport type HypotheticalStats = {\n newBorrowLimit: CurrencyAmount;\n newBorrowUtilization: number;\n}","import BigNumber from 'bignumber.js';\nimport { ethers, Signer, BigNumber as BN} from 'ethers';\nexport const dummyAddress: string = \"0xDEADbeEfEEeEEEeEEEeEEeeeeeEeEEeeeeEEEEeE\";\nexport const ETHAddress: string = \"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE\";\n\nexport const AURORA_CHAINID = 1313161554;\n\nexport const DECIMAL_PRECISION = 10;\n\nexport type NetworkAddresses = {\n auTokens: {\n name: string,\n address: string,\n underlying: string\n }[],\n misc: Record<string, string>,\n tokens: Record<string, string>\n}\nexport const networkAddresses: NetworkAddresses = {\n auTokens: [\n {\n name: \"auUSDC\",\n address: '0x4f0d864b1ABf4B701799a0b30b57A22dFEB5917b'.toLowerCase(),\n underlying: '0xb12bfca5a55806aaf64e99521918a4bf0fc40802'.toLowerCase()\n },\n {\n name: \"auETH\",\n address: '0xca9511B610bA5fc7E311FDeF9cE16050eE4449E9'.toLowerCase(),\n underlying: ETHAddress.toLowerCase()\n },\n {\n name: \"auWBTC\",\n address: '0xCFb6b0498cb7555e7e21502E0F449bf28760Adbb'.toLowerCase(),\n underlying: '0xf4eb217ba2454613b15dbdea6e5f22276410e89e'.toLowerCase()\n },\n {\n name: \"auUSDT\",\n address: '0xaD5A2437Ff55ed7A8Cad3b797b3eC7c5a19B1c54'.toLowerCase(),\n underlying: '0x4988a896b1227218e4a686fde5eabdcabd91571f'.toLowerCase()\n },\n {\n name: \"auDAI\",\n address: '0xCE4166363E3a584DAc84A47bCD3414B43EfCDd1c'.toLowerCase(),\n underlying: '0xe3520349f477a5f6eb06107066048508498a291b'.toLowerCase()\n },\n {\n name: \"auWNEAR\",\n address: '0xaE4fac24dCdAE0132C6d04f564dCf059616E9423'.toLowerCase(),\n underlying: '0xC42C30aC6Cc15faC9bD938618BcaA1a1FaE8501d'.toLowerCase()\n },\n {\n name: \"auSTNEAR\",\n address: \"0x3195949f267702723bc614cAE037cdc8D1E94786\".toLowerCase(),\n underlying: '0x07F9F7f963C5cD2BBFFd30CcfB964Be114332E30'.toLowerCase()\n },\n {\n name: \"auAURORA\",\n address: \"0x8888682E24dd4Df7B7Ff2B91fccB575737E433bf\".toLowerCase(),\n underlying: \"0x8bec47865ade3b172a928df8f990bc7f2a3b9f79\".toLowerCase(),\n },\n {\n name: \"auTRI\",\n address: \"0x6Ea6C03061bDdCE23d4Ec60B6E6e880c33d24dca\".toLowerCase(),\n underlying: \"0xFa94348467f64D5A457F75F8bc40495D33c65aBB\".toLowerCase()\n }\n ],\n misc: {\n COMPTROLLER: \"0x817af6cfAF35BdC1A634d6cC94eE9e4c68369Aeb\".toLowerCase(),\n oracle: \"0xC6e5185438e1730959c1eF3551059A3feC744E90\".toLowerCase(),\n AURIFAIRLAUNCH: \"0x9F9ceE911509abC6Af899c12ED625B0A6580D6e6\".toLowerCase(),\n AURILENS: '0xC41a5C1625d492436600789469c1CE2eA20CEA6B'.toLowerCase(),\n TOKENLOCK: '0xDACC02a4Ff16Ea3c1515AdbfdCeb7B1F448B79c8'.toLowerCase(),\n ETHREPAYHELPER: \"0xa308A5003fA1A25BFdD9418FcEE51d48Dbe441e6\".toLowerCase(),\n AURI_AIRDROP: \"0x6C42aA5b128B62D6CCf357726D7d13F3888335EC\".toLowerCase()\n },\n tokens: {\n AURORA: \"0x8bec47865ade3b172a928df8f990bc7f2a3b9f79\".toLowerCase(),\n PLY: \"0x981bD5832EAB9C8F607940E0e9faCBf8C09ee20a\".toLowerCase(),\n stNEAR: \"0x07f9f7f963c5cd2bbffd30ccfb964be114332e30\".toLowerCase(),\n USDC: '0xb12bfca5a55806aaf64e99521918a4bf0fc40802'.toLowerCase(),\n WNEAR: '0xC42C30aC6Cc15faC9bD938618BcaA1a1FaE8501d'.toLowerCase(),\n TRI: '0xFa94348467f64D5A457F75F8bc40495D33c65aBB'.toLowerCase(),\n META: '0xc21ff01229e982d7c8b8691163b0a3cb8f357453'.toLocaleLowerCase(),\n AURPLY: dummyAddress.toLowerCase() // This is dummy\n }\n}\n\nexport const BORROW_LIMIT_BUFFER = new BigNumber(1);\n\nexport const REWARDCLAIMSTART = 1640995200;\n\nexport const ONE_DAY = 86400;\nexport const ONE_YEAR = ONE_DAY * 365;\n\nexport const AurPlyPid = 0;\nexport const INF = BN.from(2).pow(256).sub(1)\n\n\nexport const AIRDROP_START_TIMESTAMP = 1649858400;\nexport const AIRDROP_END_TIMESTAMP = 1651068000;\nexport const AIRDROP_KEEP_THRESHOLD = 7 * 86400;\n\nexport const DEPOSIT_NEAR_REWARDS_PER_WEEK: {[k : string]: string} = Object.fromEntries(\n // lower case all addresses\n Object.entries({\n '0xb12bfca5a55806aaf64e99521918a4bf0fc40802': '36375', // USDC\n '0x4988a896b1227218e4a686fde5eabdcabd91571f': '14550', // USDT\n '0xf4eb217ba2454613b15dbdea6e5f22276410e89e': '3638', // WBTC\n '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE': '14550', // ETH\n '0xc42c30ac6cc15fac9bd938618bcaa1a1fae8501d': '3638', // WNEAR\n }).map(([k, v]) => [k.toLowerCase(), v])\n);\n\nexport const BORROW_NEAR_REWARDS_PER_WEEK: {[k : string]: string} = {\n // currently 0 for all markets\n}\n","import fetch from 'node-fetch';\n\nconst AURORA_API_BASE_URL = 'https://api.aurorascan.dev/api';\n\nexport async function getQuery(\n module: string, action: string, params: Record<string, any> = {},\n): Promise<any> {\n if (!globalThis.fetch) {\n Object.assign(globalThis, { fetch })\n }\n\n params = {...params, 'module': module, 'action': action};\n\n let resp = await globalThis.fetch(AURORA_API_BASE_URL + '?' + new URLSearchParams(params), {\n headers: { 'Content-Type': 'application/json' },\n method: 'GET'\n });\n return (await resp.json()).result!;\n}\n","export const decimalRecords: Record<string, number> = {\n '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee': 18,\n '0x981bd5832eab9c8f607940e0e9facbf8c09ee20a': 18,\n '0x3195949f267702723bc614cae037cdc8d1e94786': 8,\n '0xfa94348467f64d5a457f75f8bc40495d33c65abb': 18,\n '0x07f9f7f963c5cd2bbffd30ccfb964be114332e30': 24,\n '0xc42c30ac6cc15fac9bd938618bcaa1a1fae8501d': 24,\n '0x6ea6c03061bddce23d4ec60b6e6e880c33d24dca': 8,\n '0xca9511b610ba5fc7e311fdef9ce16050ee4449e9': 8,\n '0x8bec47865ade3b172a928df8f990bc7f2a3b9f79': 18,\n '0xcfb6b0498cb7555e7e21502e0f449bf28760adbb': 8,\n '0x4f0d864b1abf4b701799a0b30b57a22dfeb5917b': 8,\n '0xad5a2437ff55ed7a8cad3b797b3ec7c5a19b1c54': 8,\n '0x4988a896b1227218e4a686fde5eabdcabd91571f': 6,\n '0xb12bfca5a55806aaf64e99521918a4bf0fc40802': 6,\n '0xe3520349f477a5f6eb06107066048508498a291b': 18,\n '0x8888682e24dd4df7b7ff2b91fccb575737e433bf': 8,\n '0xae4fac24dcdae0132c6d04f564dcf059616e9423': 8,\n '0xce4166363e3a584dac84a47bcd3414b43efcdd1c': 8,\n '0xf4eb217ba2454613b15dbdea6e5f22276410e89e': 8,\n '0xc21ff01229e982d7c8b8691163b0a3cb8f357453': 24\n}\n","import EIP20InterfaceABI from \"@aurigami/contracts/artifacts/contracts/interfaces/EIP20Interface.sol/EIP20Interface.json\"\nimport { EIP20Interface, IERC20 } from \"@aurigami/contracts/typechain\";\nimport { Provider } from \"@ethersproject/abstract-provider\";\nimport BigNumber from \"bignumber.js\";\nimport { BigNumber as BN, Contract, providers, utils } from \"ethers\";\nimport { getQuery as getAuroraAPIQuery } from \"./aurora-api-helpers\";\nimport { decimalRecords } from \"./decimals\";\nimport { Address, NetworkConnection } from \"./types\";\n\nexport function formatObject(object: Object) {\n return JSON.stringify(object, null, ' ');\n}\n\nexport function decimalFactor(decimal: number) {\n return BN.from(10).pow(decimal).toString();\n}\n\nexport const isSameAddress = (address1: Address, address2: Address): boolean => {\n return address1.toLowerCase() == address2.toLowerCase()\n}\n\nexport const getCurrentTimestamp = (): number => {\n return Math.trunc(Date.now() / 1000)\n}\n\nexport function validateAndParseAddress(address: Address): Address {\n try {\n return utils.getAddress(address);\n } catch (error) {\n throw new Error(\"Invalid address: \" + address);\n }\n}\n\nexport function getDecimal(address: Address): number {\n return decimalRecords[address.toLowerCase()];\n}\n\nexport function calcLMRewardApr(rewardsValue: BigNumber, totalStakeValue: BigNumber, frequencyPerYear: number): BigNumber {\n if (totalStakeValue.lte(0)) { // avoid division by zero when there is no stake\n return new BigNumber('999999999');\n }\n return rewardsValue.multipliedBy(frequencyPerYear).dividedBy(totalStakeValue);\n}\n\nexport async function getBlockTimestamp(provider: Provider, blockNumber: number): Promise<number> {\n const block = await provider.getBlock(blockNumber);\n return block.timestamp;\n}\n\n/**\n * Get the block number of the last block that has a timestamp before the given timestamp\n * @param timestamp input timestamp\n * @returns return the last block that its timestamp <= the give timestamp\n * @note Check this API for more information: https://aurorascan.dev/apis#blocks\n *\n * This function is much faster than using binary search.\n */\n export async function getBlockBeforeTimestamp(provider: Provider, timestamp: number) {\n let result = await getAuroraAPIQuery(\n 'block',\n 'getblocknobytime',\n {'timestamp': timestamp, 'closest': 'before'}\n );\n\n // In case the API return `Block timestamp too far in the future`\n // use the last block number\n return parseInt(result) || await provider.getBlockNumber();\n}\n","import { getDecimal } from \"./helpers\";\nimport { networkAddresses } from \"./constants\";\n\nexport class Token {\n public readonly address: string;\n public readonly decimals: number; \n public constructor(address: string, decimals: number) {\n this.address = address.toLowerCase();\n this.decimals = decimals;\n } \n}\n\nexport const PLYToken = new Token(\n networkAddresses.tokens.PLY,\n getDecimal(networkAddresses.tokens.PLY)\n)\n \nexport const AURPLYToken = new Token(\n networkAddresses.tokens.AURPLY,\n getDecimal(networkAddresses.tokens.AURPLY)\n)","import { Token } from \"./token\";\nimport BigNumber from 'bignumber.js';\nimport { decimalFactor } from \"./helpers\";\n\nexport class TokenAmount {\n public readonly token: Token;\n private rawAmnt: string;\n\n public constructor(token: Token, amount: string, isRaw: boolean = true) {\n if (isRaw) {\n this.rawAmnt = amount;\n } else {\n this.rawAmnt = new BigNumber(amount)\n .times(decimalFactor(token.decimals))\n .toFixed(0);\n }\n this.token = token;\n }\n\n public formattedAmount(): string {\n return new BigNumber(this.rawAmnt)\n .div(decimalFactor(this.token.decimals))\n .toString();\n }\n\n public rawAmount(): string {\n return this.rawAmnt;\n }\n}\n","import BigNumber from \"bignumber.js\";\nimport { Contract, providers, BigNumber as BN, ethers } from \"ethers\";\nimport { networkAddresses } from \"./constants\";\nimport OracleABI from \"./abis/Oracle.json\";\nimport { isSameAddress, decimalFactor, getDecimal } from \"./helpers\";\nimport { PriceOracle } from \"@aurigami/contracts/typechain\";\nimport { TokenAmount } from \"./tokenAmount\";\nimport { Address } from \"./types\";\nimport IUniswapV2PairABI from './abis/IUniswapV2Pair.json';\nimport AuriLensABI from '@aurigami/contracts/artifacts/contracts/AuriLens.sol/AuriLens.json';\nimport axios from 'axios';\n\nconst hardcodePLYPrice = true;\nexport async function fetchPriceFromCoingeckoAPI(id: string): Promise<BigNumber> {\n const price = await axios.get(\n `https://api.coingecko.com/api/v3/simple/price?ids=${id}&vs_currencies=usd`\n ).then((res: any) => {\n return res.data\n })\n\n return new BigNumber(price[id].usd)\n}\n\nexport async function fetchPriceFromCoingecko(id: Address): Promise<BigNumber> {\n switch (id.toLowerCase()) {\n case networkAddresses.tokens.AURORA:\n return fetchPriceFromCoingeckoAPI('aurora-near');\n\n case networkAddresses.tokens.TRI:\n return fetchPriceFromCoingeckoAPI('trisolaris');\n\n case networkAddresses.tokens.META:\n return fetchPriceFromCoingeckoAPI('meta-pool');\n\n default:\n throw Error(`Unknown token ${id} in fetchPriceFromCoingecko`);\n }\n}\n\nexport async function fetchLPPositions(LPAddress: Address, provider: providers.Provider): Promise<{\n token0: Address,\n token1: Address,\n reserve0: BN,\n reserve1: BN,\n totalSupply: BN\n}> {\n var promises = [];\n const LPContract = new Contract(LPAddress, IUniswapV2PairABI.abi, provider);\n promises.push(LPContract.token0());\n promises.push(LPContract.toekn1());\n promises.push(LPContract.getReserves());\n promises.push(LPContract.totalSupply());\n const values = await Promise.all(promises);\n return {\n token0: values[0],\n token1: values[1],\n reserve0: values[2].reserve0,\n reserve1: values[2].reserve1,\n totalSupply: values[3]\n }\n}\n\nexport async function fetchLPPrice(address: Address, provider: providers.Provider): Promise<BigNumber> {\n var LPInfo = await fetchLPPositions(address, provider);\n try {\n const token0Price: BigNumber = await fetchPrice(LPInfo.token0, provider);\n const reserveUSD: BigNumber = token0Price.multipliedBy(LPInfo.reserve0.toString()).multipliedBy(2);\n return reserveUSD.multipliedBy(decimalFactor(18)).dividedBy(new BigNumber(LPInfo.totalSupply.toString()));\n } catch {\n try {\n const token1Price: BigNumber = await fetchPrice(LPInfo.token1, provider);\n const reserveUSD: BigNumber = token1Price.multipliedBy(LPInfo.reserve1.toString()).multipliedBy(2);\n return reserveUSD.multipliedBy(decimalFactor(18)).dividedBy(new BigNumber(LPInfo.totalSupply.toString()));\n } catch {\n throw Error(`Unable to fetch price for both tokens of LP ${address}`);\n }\n }\n }\n\nfunction processPriceFromOracle(rawPrice: BN, underlyingDecimal: number) {\n return new BigNumber(rawPrice.toString()).div(decimalFactor(36 - underlyingDecimal));\n}\nexport async function fetchPriceFromOracle(auTokenAddress: Address, underlyingDecimal: number, provider: providers.Provider): Promise<BigNumber> {\n const oracleContract: PriceOracle = new Contract(networkAddresses.misc.oracle, OracleABI.abi, provider) as PriceOracle;\n const rawPrice = await oracleContract.getUnderlyingPrice(auTokenAddress);\n return processPriceFromOracle(rawPrice, underlyingDecimal)\n}\n\nexport async function fetchUnderlyingTokensPrices(provider: providers.Provider): Promise<{\n auToken: string,\n underlyingPrice: BigNumber\n}[]> {\n const auriLens: Contract = new Contract(networkAddresses.misc.AURILENS, AuriLensABI.abi, provider);\n const auTokenAddresses = networkAddresses.auTokens.map((auToken) => auToken.address);\n const underlyingDecimals = networkAddresses.auTokens.map((auToken) => getDecimal(auToken.underlying));\n const rawPrices = await auriLens.auTokenUnderlyingPriceAll(auTokenAddresses);\n return rawPrices.map((res: any, ind: number) => {\n return {\n auToken: res.auToken,\n underlyingPrice: processPriceFromOracle(res.underlyingPrice, underlyingDecimals[ind])\n }\n })\n}\n\nexport async function fetchStNEARPrice(): Promise<BigNumber> {\n const ratioPromise = axios.get(\"https://validators.narwallets.com/metrics_json\").then((res) => res.data);\n const nearPricePromise = fetchPriceFromCoingeckoAPI('near');\n const [ratioRes, nearPrice]: [any, BigNumber] = await Promise.all([ratioPromise, nearPricePromise]);\n const ratio = new BigNumber(ratioRes.st_near_price);\n return ratio.multipliedBy(nearPrice)\n}\n\nfunction shouldFetchFromCoingecko(address: string) {\n address = address.toLowerCase();\n return address == networkAddresses.tokens.AURORA ||\n address == networkAddresses.tokens.TRI ||\n address == networkAddresses.tokens.META;\n}\n\nexport async function fetchPrice(address: Address, provider: providers.Provider): Promise<BigNumber> {\n if (hardcodePLYPrice && isSameAddress(address, networkAddresses.tokens.PLY)) return new BigNumber(0);\n\n // if (isSameAddress(address, networkAddresses.tokens.stNEAR)) return fetchStNEARPrice();\n if (shouldFetchFromCoingecko(address)) return fetchPriceFromCoingecko(address);\n\n const matchingAuToken = networkAddresses.auTokens.find((auToken) => {\n return isSameAddress(auToken.underlying, address)\n });\n if (matchingAuToken !== undefined) {\n return fetchPriceFromOracle(matchingAuToken.address, getDecimal(address), provider);\n } else if (isSameAddress(address, networkAddresses.tokens.AURPLY)) {\n return fetchLPPrice(address, provider);\n } else {\n return fetchPriceFromCoingecko(address);\n }\n}\nexport async function fetchValuation(tokenAmount: TokenAmount, provider: providers.Provider): Promise<BigNumber> {\n if (tokenAmount.rawAmount() == \"0\") return new BigNumber(0);\n var price = await fetchPrice(tokenAmount.token.address, provider);\n return calcValuation(tokenAmount, price);\n}\n\nexport function calcValuation(tokenAmount: TokenAmount, price: BigNumber) {\n return new BigNumber(tokenAmount.formattedAmount()).multipliedBy(price);\n}\n","import { BlockchainEntity, BlockchainEntityRead } from './BlockchainEntity';\nimport { MoneyMarketDetails, NetworkConnection, Address, ComptrollerRewardType } from './types';\nimport { Contract, BigNumber as BN } from 'ethers';\nimport AuErc20ABI from '@aurigami/contracts/artifacts/contracts/AuErc20.sol/AuErc20.json';\nimport AuETHABI from '@aurigami/contracts/artifacts/contracts/AuETH.sol/AuETH.json';\nimport ComptrollerABI from '@aurigami/contracts/artifacts/contracts/Comptroller.sol/Comptroller.json';\nimport AuriLensABI from '@aurigami/contracts/artifacts/contracts/AuriLens.sol/AuriLens.json';\nimport EthRepayHelperABI from \"@aurigami/contracts/artifacts/contracts/EthRepayHelper.sol/EthRepayHelper.json\"\nimport { AuErc20, AuETH, AuriLens, Comptroller, EthRepayHelper } from \"@aurigami/contracts/typechain\";\nimport { TransactionResponse } from '@ethersproject/abstract-provider';\nimport { networkAddresses, ETHAddress, ONE_YEAR, INF, ONE_DAY, DEPOSIT_NEAR_REWARDS_PER_WEEK, BORROW_NEAR_REWARDS_PER_WEEK } from \"./constants\";\nimport BigNumber from \"bignumber.js\";\nimport { decimalFactor, isSameAddress, calcLMRewardApr, getCurrentTimestamp } from './helpers';\nimport { Token, PLYToken } from './token';\nimport { TokenAmount } from './tokenAmount';\nimport { getDecimal, validateAndParseAddress } from './helpers';\nimport { fetchPrice, calcValuation, fetchValuation } from \"./priceFetcher\";\n\n\ntype RewardSpeeds = {\n plyRewardSupplySpeed: BN;\n plyRewardBorrowSpeed: BN;\n auroraRewardSupplySpeed: BN;\n auroraRewardBorrowSpeed: BN;\n}\n\nexport class MoneyMarketRead extends BlockchainEntityRead {\n public underlying: Token;\n public auToken: AuErc20 | AuETH;\n protected _comptroller: Comptroller;\n\n protected _auriLens: AuriLens;\n constructor(networkConnection: NetworkConnection, auToken: Address, underlyingAsset: Address) {\n super(networkConnection);\n if (isSameAddress(underlyingAsset, ETHAddress)) {\n this.auToken = new Contract(auToken, AuETHABI.abi, networkConnection.provider) as AuETH;\n } else {\n this.auToken = new Contract(auToken, AuErc20ABI.abi, networkConnection.provider) as AuErc20;\n }\n this.underlying = new Token(\n underlyingAsset,\n getDecimal(underlyingAsset),\n );\n this._comptroller = new Contract(networkAddresses.misc.COMPTROLLER, ComptrollerABI.abi, networkConnection.provider) as Comptroller;\n this._auriLens = new Contract(networkAddresses.misc.AURILENS, AuriLensABI.abi, networkConnection.provider) as AuriLens;\n }\n\n protected async getRewardSpeeds(): Promise<RewardSpeeds> {\n var speeds = await this._auriLens.getRewardSpeeds(this._comptroller.address, this.auToken.address);\n return speeds;\n }\n public async getTotalTokenBorrowed(): Promise<TokenAmount> {\n return new TokenAmount(\n this.underlying,\n (await this.auToken.totalBorrows()).toString()\n )\n }\n public async getTotalTokenDeposited(): Promise<TokenAmount> {\n var promises = [];\n var totalBorrow: TokenAmount, totalCash: TokenAmount;\n promises.push(this.getTotalTokenBorrowed().then((res: TokenAmount) => {\n totalBorrow = res\n }));\n promises.push(this.auToken.getCash().then((res: BN) => {\n totalCash = new TokenAmount(\n this.underlying,\n res.toString()\n )\n }))\n await Promise.all(promises);\n return new TokenAmount(\n this.underlying,\n BN.from(totalCash!.rawAmount()).add(totalBorrow!.rawAmount()).toString()\n )\n }\n\n public async getDepositAPY(): Promise<BigNumber> {\n const supplyRatePerTimestamp = await this.auToken.supplyRatePerTimestamp();\n return new BigNumber(supplyRatePerTimestamp.toString()).multipliedBy(60*60*24*365).div(decimalFactor(18));\n }\n\n public async getBorrowAPY(): Promise<BigNumber> {\n const borrowRatePerTimestamp = await this.auToken.borrowRatePerTimestamp();\n return new BigNumber(borrowRatePerTimestamp.toString()).multipliedBy(60*60*24*365).div(decimalFactor(18));\n }\n\n public async getCollateralRatio(): Promise<BigNumber> {\n return this._comptroller.markets(this.auToken.address).then((res: any) => {\n return new BigNumber(res.collateralFactorMantissa.toString()).div(decimalFactor(18));\n })\n }\n\n public async getBorrowPlyAPY(): Promise<BigNumber> {\n var promises = [];\n var totalBorrowed: TokenAmount, rewardSpeed: TokenAmount, plyPrice: BigNumber, underlyingPrice: BigNumber;\n promises.push(this.getTotalTokenBorrowed().then((res: TokenAmount) => {totalBorrowed = res}));\n promises.push(this._comptroller.rewardSpeeds(ComptrollerRewardType.PLY, this.auToken.address, false).then((res) => {\n rewardSpeed = new TokenAmount(\n PLYToken,\n res.toString()\n )\n }));\n promises.push(fetchPrice(networkAddresses.tokens.PLY, this._networkConnection.provider).then((res) => {plyPrice = res}));\n promises.push(fetchPrice(this.underlying.address, this._networkConnection.provider).then((res) => {underlyingPrice = res}));\n await Promise.all(promises);\n return calcLMRewardApr(plyPrice!.multipliedBy(rewardSpeed!.formattedAmount()),\n underlyingPrice!.multipliedBy(totalBorrowed!.formattedAmount()), ONE_YEAR);\n }\n\n public async getDepositPlyAPY(): Promise<BigNumber> {\n var promises = [];\n var totalDeposited: TokenAmount, rewardSpeed: TokenAmount, plyPrice: BigNumber, underlyingPrice: BigNumber;\n promises.push(this.getTotalTokenDeposited().then((res: TokenAmount) => {totalDeposited = res}));\n promises.push(this._comptroller.rewardSpeeds(ComptrollerRewardType.PLY, this.auToken.address, true).then((res) => {\n rewardSpeed = new TokenAmount(\n PLYToken,\n res.toString()\n )\n }));\n promises.push(fetchPrice(networkAddresses.tokens.PLY, this._networkConnection.provider).then((res) => {plyPrice = res}));\n promises.push(fetchPrice(this.underlying.address, this._networkConnection.provider).then((res) => {underlyingPrice = res}));\n await Promise.all(promises);\n return calcLMRewardApr(plyPrice!.multipliedBy(rewardSpeed!.formattedAmount()),\n underlyingPrice!.multipliedBy(totalDeposited!.formattedAmount()), ONE_YEAR);\n }\n public async getDetails(): Promise<MoneyMarketDetails> {\n var promises = [], totalDeposited: TokenAmount, totalBorrowed: TokenAmount, depositAPY: number, borrowAPY: number, collateralRatio: number;\n promises.push(this.getTotalTokenDeposited().then((res: TokenAmount) => {totalDeposited = res}));\n promises.push(this.getTotalTokenBorrowed().then((res: TokenAmount) => {totalBorrowed = res}));\n promises.push(this.getDepositAPY().then((res: BigNumber) => {depositAPY = res.toNumber()}));\n promises.push(this.getBorrowAPY().then((res: BigNumber) => {borrowAPY = res.toNumber()}));\n promises.push(this.getCollateralRatio().then((res: BigNumber) => {collateralRatio = res.toNumber()}));\n\n var plyPrice: BigNumber, underlyingPrice: BigNumber, rewardSpeeds: RewardSpeeds;\n promises.push(this.getRewardSpeeds().then((res) => {rewardSpeeds = res}));\n promises.push(fetchPrice(networkAddresses.tokens.PLY, this._networkConnection.provider).then((res) => {plyPrice = res}));\n promises.push(fetchPrice(this.underlying.address, this._networkConnection.provider).then((res) => {underlyingPrice = res}));\n\n await Promise.all(promises);\n\n var borrowPlyApy = calcLMRewardApr(\n calcValuation(\n new TokenAmount(\n PLYToken,\n rewardSpeeds!.plyRewardBorrowSpeed.toString()\n ),\n plyPrice!\n ),\n underlyingPrice!.multipliedBy(totalBorrowed!.formattedAmount()),\n ONE_YEAR\n );\n var depositPlyApy = calcLMRewardApr(\n calcValuation(\n new TokenAmount(\n PLYToken,\n rewardSpeeds!.plyRewardSupplySpeed.toString()\n ),\n plyPrice!\n ),\n underlyingPrice!.multipliedBy(totalDeposited!.formattedAmount()),\n ONE_YEAR\n );\n\n var depositNEARApy = calcLMRewardApr(await fetchValuation(this.getDepositNEARRewardPerWeek(), this._networkConnection.provider), underlyingPrice!.multipliedBy(totalDeposited!.formattedAmount()), 52)\n var borrowNEARApy = calcLMRewardApr(await fetchValuation(this.getBorrowNEARRewardPerWeek(), this._networkConnection.provider), underlyingPrice!.multipliedBy(totalBorrowed!.formattedAmount()), 52)\n var depositMETAApy;\n if (isSameAddress(this.underlying.address, networkAddresses.tokens.stNEAR)) {\n depositMETAApy = calcLMRewardApr(new BigNumber(50000), underlyingPrice!.multipliedBy(totalDeposited!.formattedAmount()), 12);\n } else {\n depositMETAApy = new BigNumber(0);\n }\n\n return {\n auTokenAddress: this.auToken.address,\n totalTokenDeposited: totalDeposited!,\n totalTokenBorrowed: totalBorrowed!,\n depositApy: depositAPY!,\n depositPlyApy: depositPlyApy.toNumber(),\n borrowApy: borrowAPY!,\n borrowPlyApy: borrowPlyApy.toNumber() * -1,\n collateralRatio: collateralRatio!,\n depositPlyPerWeek: new TokenAmount(\n PLYToken,\n rewardSpeeds!.plyRewardSupplySpeed.mul(ONE_DAY).mul(7).toString()\n ),\n borrowPlyPerWeek: new TokenAmount(\n PLYToken,\n rewardSpeeds!.plyRewardBorrowSpeed.mul(ONE_DAY).mul(7).toString()\n ),\n depositNEARApy: depositNEARApy.toNumber(),\n borrowNEARApy: borrowNEARApy.toNumber() * -1,\n depositMETAApy: depositMETAApy.toNumber()\n };\n }\n\n public async getUserBorrowBalance(userAddress: string): Promise<TokenAmount> {\n const totalBorrow: BN = await this.auToken.callStatic.borrowBalanceCurrent(userAddress);\n return new TokenAmount(\n this.underlying,\n totalBorrow.toString()\n )\n }\n\n public async getUserDepositBalance(userAddress: string): Promise<TokenAmount> {\n const totalDeposit: BN = await this.auToken.callStatic.balanceOfUnderlying(userAddress);\n return new TokenAmount(\n this.underlying,\n totalDeposit.toString()\n )\n }\n\n private getDepositNEARRewardPerWeek(): TokenAmount {\n const NEARToken = new Token(networkAddresses.tokens.WNEAR, getDecimal(networkAddresses.tokens.WNEAR));\n const rewardStartTime = 1650636000;\n const rewardStopTime = 1651845600; // May 06, 2022 2 PM GMT\n const currentTime = getCurrentTimestamp();\n if (currentTime <= rewardStopTime && currentTime > rewardStartTime) {\n const reward = DEPOSIT_NEAR_REWARDS_PER_WEEK[this.underlying.address.toLocaleLowerCase()] ?? \"0\";\n return new TokenAmount(NEARToken, reward, false);\n } else {\n return new TokenAmount(NEARToken, \"0\");\n }\n }\n\n private getBorrowNEARRewardPerWeek(): TokenAmount {\n const NEARToken = new Token(networkAddresses.tokens.WNEAR, getDecimal(networkAddresses.tokens.WNEAR));\n const rewardStartTime = 1650636000;\n const rewardStopTime = 1651845600; // May 06, 2022 2 PM GMT\n const currentTime = getCurrentTimestamp();\n if (currentTime <= rewardStopTime && currentTime > rewardStartTime) {\n const reward = BORROW_NEAR_REWARDS_PER_WEEK[this.underlying.address.toLocaleLowerCase()] ?? \"0\";\n return new TokenAmount(NEARToken, reward, false);\n } else {\n return new TokenAmount(NEARToken, \"0\");\n }\n }\n}\n\nexport class MoneyMarketReadWrite extends MoneyMarketRead {\n\n protected _EthRepayHelper: EthRepayHelper;\n constructor(networkConnection: NetworkConnection, auToken: Address, underlyingAsset: Address) {\n super(networkConnection, auToken, underlyingAsset);\n this._EthRepayHelper = new Contract(networkAddresses.misc.ETHREPAYHELPER, EthRepayHelperABI.abi, networkConnection.provider) as EthRepayHelper;\n }\n\n public async deposit(amount: TokenAmount): Promise<TransactionResponse> {\n if (isSameAddress(amount.token.address, ETHAddress)) {\n return (this.auToken as AuETH).connect(this._networkConnection.signer!).mint({value: amount.rawAmount()});\n } else {\n return (this.auToken as AuErc20).connect(this._networkConnection.signer!).mint(amount.rawAmount());\n }\n }\n public async borrow(amount: TokenAmount): Promise<TransactionResponse> {\n return this.auToken.connect(this._networkConnection.signer!).borrow(amount.rawAmount());\n }\n public async withdraw(amount: TokenAmount): Promise<TransactionResponse> {\n if (new BigNumber(amount.rawAmount()).lt(0)) {\n return this.auToken.connect(this._networkConnection.signer!).redeemUnderlying(INF);\n }\n return this.auToken.connect(this._networkConnection.signer!).redeemUnderlying(amount.rawAmount());\n }\n public async repay(amount: TokenAmount): Promise<TransactionResponse> {\n if (isSameAddress(amount.token.address, ETHAddress)) {\n return this._EthRepayHelper.connect(this._networkConnection.signer!).repayBorrow({value: amount.rawAmount()});\n } else {\n if (new BigNumber(amount.rawAmount()).lt(0)) {\n return this.auToken.connect(this._networkConnection.signer!).repayBorrow(INF);\n } else {\n return this.auToken.connect(this._networkConnection.signer!).repayBorrow(amount.rawAmount());\n }\n }\n }\n public async enableCollateral(): Promise<TransactionResponse> {\n return this._comptroller.connect(this._networkConnection.signer!).enterMarkets([this.auToken.address]);\n }\n public async disableCollateral(): Promise<TransactionResponse> {\n return this._comptroller.connect(this._networkConnection.signer!).exitMarket(this.auToken.address);\n }\n}\n\nexport class MoneyMarket extends BlockchainEntity {\n protected address: Address;\n\n protected underlying: Address;\n constructor(address: string, underlying: string) {\n super();\n this.address = validateAndParseAddress(address);\n this.underlying = validateAndParseAddress(underlying);\n }\n public read(networkConnection: NetworkConnection): MoneyMarketRead {\n return new MoneyMarketRead(networkConnection, this.address, this.underlying);\n }\n\n public readWrite(networkConnection: NetworkConnection): MoneyMarketReadWrite {\n return new MoneyMarketReadWrite(networkConnection, this.address, this.underlying);\n }\n}\n","import { BlockchainEntity, BlockchainEntityRead } from './BlockchainEntity';\nimport {\n LockingDetails,\n PlyAuroraPoolDetails,\n NetworkConnection,\n UserDetails,\n UserMarketDetails,\n Address,\n CurrencyAmount,\n HypotheticalStats,\n MarketAction\n} from './types';\nimport { networkAddresses, BORROW_LIMIT_BUFFER, DECIMAL_PRECISION, REWARDCLAIMSTART, ONE_DAY, AurPlyPid } from './constants';\nimport { TransactionResponse } from '@ethersproject/abstract-provider';\nimport { Contract, BigNumber as BN, ethers, providers } from 'ethers';\nimport { isSameAddress, decimalFactor, getCurrentTimestamp, calcLMRewardApr } from './helpers';\nimport { MoneyMarketRead } from './MoneyMarket';\nimport { fetchValuation, fetchPrice, calcValuation } from './priceFetcher';\nimport { AuriFairLaunch, Comptroller, TokenLock, AuriLens } from '@aurigami/contracts/typechain';\nimport { TokenAmount } from './tokenAmount';\nimport { AURPLYToken, PLYToken, Token } from './token';\nimport BigNumber from 'bignumber.js';\nimport AuriLensABI from '@aurigami/contracts/artifacts/contracts/AuriLens.sol/AuriLens.json';\nimport ComptrollerABI from '@aurigami/contracts/artifacts/contracts/Comptroller.sol/Comptroller.json';\nimport TokenLockABI from \"@aurigami/contracts/artifacts/contracts/TokenLock.sol/TokenLock.json\";\nimport AuriFairLaunchABI from \"@aurigami/contracts/artifacts/contracts/AuriFairLaunch.sol/AuriFairLaunch.json\";\nimport FaucetABI from \"@aurigami/contracts/artifacts/contracts/mock/Faucet.sol/Faucet.json\";\n\nexport class SdkRead extends BlockchainEntityRead {\n\n protected _comptroller: Comptroller;\n protected _tokenLock: TokenLock;\n protected _auriFairLaunch: AuriFairLaunch;\n protected _auriLens: AuriLens;\n constructor(networkConnection: NetworkConnection) {\n super(networkConnection);\n this._comptroller = new Contract(networkAddresses.misc.COMPTROLLER, ComptrollerABI.abi, networkConnection.provider) as Comptroller;\n this._tokenLock = new Contract(networkAddresses.misc.TOKENLOCK, TokenLockABI.abi, networkConnection.provider) as TokenLock;\n this._auriFairLaunch = new Contract(networkAddresses.misc.AURIFAIRLAUNCH, AuriFairLaunchABI.abi, networkConnection.provider) as AuriFairLaunch;\n this._auriLens = new Contract(networkAddresses.misc.AURILENS, AuriLensABI.abi, networkConnection.provider) as AuriLens;\n }\n\n public async getLockingDetails(): Promise<LockingDetails> {\n const currentTime = getCurrentTimestamp();\n const currentWeek = BN.from(currentTime - REWARDCLAIMSTART).div(7 * ONE_DAY).toNumber();\n const denominator = 10000;\n var promises = [];\n promises.push(this._tokenLock.percentageLock(currentWeek));\n promises.push(this._tokenLock.percentageLock(currentWeek + 1).catch((err: any) => {return denominator}));\n var values: string[] = await Promise.all(promises).then((res) => {\n return res.map((v) => {return v.toString()})\n });\n return {\n vestingStart: REWARDCLAIMSTART, // 10 Jan 2023\n currentUnlockPortion: (new BigNumber(denominator).minus(values[0])).div(denominator).toNumber(),\n nextUnlockPortion: (new BigNumber(denominator).minus(values[1])).div(denominator).toNumber(),\n };\n }\n\n public async getUserDetails(userAddress: string): Promise<UserDetails> {\n const marketCount = networkAddresses.auTokens.length;\n var userMarketDetails: UserMarketDetails[] = [], assetsIn: string[];\n var promises = [];\n var totalBorrowLimit = new BigNumber(0);\n var pricePromises = [];\n for (const auToken of networkAddresses.auTokens) {\n const userMarketDetail: UserMarketDetails = {} as UserMarketDetails;\n userMarketDetails.push(userMarketDetail);\n userMarketDetail.market = auToken.underlying;\n const moneyMarket: MoneyMarketRead = new MoneyMarketRead(this._networkConnection, auToken.address, auToken.underlying);\n promises.push(moneyMarket.getUserDepositBalance(userAddress).then((res: TokenAmount) => {userMarketDetail.depositBalance = res}));\n promises.push(moneyMarket.getUserBorrowBalance(userAddress).then((res: TokenAmount) => {userMarketDetail.borrowBalance = res}));\n promises.push(moneyMarket.getCollateralRatio().then((res: BigNumber) => {userMarketDetail.collateralRatio = res.toNumber()}));\n pricePromises.push(fetchPrice(moneyMarket.underlying.address, this._networkConnection.provider).then((res) => {\n userMarketDetail.underlyingPrice = res.toString();\n return res;\n }));\n }\n\n promises.push(this._comptroller.getAssetsIn(userAddress).then((res: string[]) => {assetsIn = res}));\n \n await Promise.all(promises);\n var underlyingPrices = await Promise.all(pricePromises);\n var depositValues = []\n for (var i = 0; i < marketCount; i ++) {\n const auToken = networkAddresses.auTokens[i];\n if (assetsIn!.find((auAddress: Address) => isSameAddress(auToken.address, auAddress)) !== undefined) {\n userMarketDetails[i].isCollateral = true;\n } else {\n userMarketDetails[i].isCollateral = false;\n }\n depositValues.push(calcValuation(userMarketDetails[i].depositBalance, underlyingPrices[i]));\n }\n\n totalBorrowLimit = depositValues.reduce((p: BigNumber, v: BigNumber, index: number)=> {\n if (userMarketDetails[index].isCollateral) return p.plus(v.multipliedBy(userMarketDetails[index].collateralRatio));\n return p;\n }, new BigNumber(0))\n\n promises = new Array(3);\n var accountLiquidity: [BN, BN], rewardBalancesMetadata, lockedAmount: BN;\n promises[0] = this._comptroller.getAccountLiquidity(userAddress);\n promises[1] = this._auriLens.callStatic.claimAndGetRewardBalancesMetadata(this._comptroller.address, this._auriFairLaunch.address, [], {from: userAddress});\n promises[2] = this._tokenLock.lockedAmounts(userAddress);\n var values = await Promise.all(promises);\n\n accountLiquidity = values[0]; rewardBalancesMetadata = values[1]; lockedAmount = values[2];\n var borrowedvaluation: BigNumber = totalBorrowLimit.minus(new BigNumber(accountLiquidity[0].toString()).div(decimalFactor(18)));\n\n if (borrowedvaluation.lt(\"0.00001\")) { // Igore dust, dust could be the result of network delay causing collateral valuation calc to be different on vs off chain\n borrowedvaluation = new BigNumber(0);\n } \n \n const bufferedBorrowLimit: BigNumber = totalBorrowLimit.multipliedBy(BORROW_LIMIT_BUFFER);\n const minimumBorrowLimitAllowed = borrowedvaluation.div(BORROW_LIMIT_BUFFER);\n\n var borrowableAmount: BigNumber;\n if (bufferedBorrowLimit.lte(borrowedvaluation)) {\n borrowableAmount = new BigNumber(0)\n } else {\n borrowableAmount = bufferedBorrowLimit.minus(borrowedvaluation);\n }\n\n for (var i = 0; i < marketCount; i ++) {\n const auToken = networkAddresses.auTokens[i];\n const moneyMarket: MoneyMarketRead = new MoneyMarketRead(this._networkConnection, auToken.address, auToken.underlying);\n const borrowLimitMargin = totalBorrowLimit.minus(minimumBorrowLimitAllowed).gt(0) ? totalBorrowLimit.minus(minimumBorrowLimitAllowed) : new BigNumber(0);\n const maxWithdrawCap: BigNumber = borrowLimitMargin.div(userMarketDetails[i].collateralRatio).div(underlyingPrices[i]);\n userMarketDetails[i].maxWithdrawableAmount = userMarketDetails[i].isCollateral && maxWithdrawCap.lt(userMarketDetails[i].depositBalance.formattedAmount()) \n ? new TokenAmount(\n moneyMarket.underlying,\n maxWithdrawCap.toFixed(24),\n false\n )\n : new TokenAmount(\n moneyMarket.underlying,\n userMarketDetails[i].depositBalance.rawAmount()\n );\n }\n\n return {\n markets: userMarketDetails,\n borrowLimit: {\n currency: \"USD\",\n amount: bufferedBorrowLimit.toFixed(DECIMAL_PRECISION)\n },\n accruedPly: new TokenAmount(PLYToken, rewardBalancesMetadata.plyAccrued.toString()),\n lockedPly: new TokenAmount(PLYToken, lockedAmount.toString()),\n borrowableAmount: {\n currency: \"USD\",\n amount: borrowableAmount.toFixed(DECIMAL_PRECISION)\n },\n };\n }\n\n public async getPlyAuroraPoolDetails(): Promise<PlyAuroraPoolDetails> {\n var stakedLiquidity: BN, rewardPerSecond: BN; \n var promises = [];\n promises.push(this._auriFairLaunch.getPoolInfo(AurPlyPid).then((res) => {\n stakedLiquidity = res.totalStake;\n rewardPerSecond = res.rewardPerSecond; \n }));\n await Promise.all(promises);\n\n promises = [];\n var rewardPerSecondValuation: BigNumber, totalStakeValuation: BigNumber;\n promises.push(fetchValuation(new TokenAmount(\n PLYToken,\n rewardPerSecond!.toString()\n ), this._networkConnection.provider).then((res) => rewardPerSecondValuation = res));\n promises.push(fetchValuation(new TokenAmount(\n AURPLYToken,\n stakedLiquidity!.toString()\n ), this._networkConnection.provider).then((res) => totalStakeValuation = res));\n await Promise.all(promises);\n\n return {\n totalStakedLiquidity: new TokenAmount(\n AURPLYToken,\n stakedLiquidity!.toString()\n ),\n apy: calcLMRewardApr(rewardPerSecondValuation!, totalStakeValuation!, ONE_DAY * 365).toFixed(DECIMAL_PRECISION),\n };\n }\n\n public async getTokenPrice(token: Token): Promise<CurrencyAmount> {\n const price = await fetchPrice(token.address, this._networkConnection.provider);\n return {\n currency: \"USD\",\n amount: price.toFixed(DECIMAL_PRECISION)\n }\n }\n public async stakeBalanceOf(user: string): Promise<TokenAmount> {\n const userInfo = await this._auriFairLaunch.getUserInfo(AurPlyPid, user);\n return new TokenAmount(\n AURPLYToken,\n userInfo.amount.toString()\n )\n }\n\n public calcHypotheticalStats({\n userMarketDetail, \n currentBorrowLimit,\n currentBorrowValuation,\n action,\n tokenAmount\n }: {\n userMarketDetail: UserMarketDetails,\n currentBorrowLimit: CurrencyAmount, \n currentBorrowValuation: CurrencyAmount, \n action: MarketAction,\n tokenAmount?: TokenAmount\n }): HypotheticalStats {\n var newBorrowLimit = new BigNumber(currentBorrowLimit.amount), newBorrowValuation = new BigNumber(currentBorrowValuation.amount);\n switch (action) {\n case MarketAction.EnableCollateral:\n case MarketAction.DisableCollateral:\n var deltaBorrowLimit = calcValuation(userMarketDetail.depositBalance, new BigNumber(userMarketDetail.underlyingPrice)).multipliedBy(userMarketDetail.collateralRatio).multipliedBy(BORROW_LIMIT_BUFFER);\n newBorrowLimit = action == MarketAction.EnableCollateral ? newBorrowLimit.plus(deltaBorrowLimit) : newBorrowLimit.minus(deltaBorrowLimit);\n break;\n\n case MarketAction.Deposit:\n case MarketAction.Withdraw:\n deltaBorrowLimit = calcValuation(tokenAmount!, new BigNumber(userMarketDetail.underlyingPrice)).multipliedBy(userMarketDetail.collateralRatio).multipliedBy(BORROW_LIMIT_BUFFER);\n newBorrowLimit = action == MarketAction.Deposit ? newBorrowLimit.plus(deltaBorrowLimit) : newBorrowLimit.minus(deltaBorrowLimit);\n break;\n\n case MarketAction.Borrow:\n case MarketAction.Repay:\n var deltaBorrowValuation = calcValuation(tokenAmount!, new BigNumber(userMarketDetail.underlyingPrice));\n newBorrowValuation = action == MarketAction.Borrow ? newBorrowValuation.plus(deltaBorrowValuation) : newBorrowValuation.minus(deltaBorrowValuation);\n break;\n }\n return {\n newBorrowLimit: {\n amount: newBorrowLimit!.toFixed(DECIMAL_PRECISION),\n currency: \"USD\"\n },\n newBorrowUtilization: newBorrowLimit.eq(0) ? newBorrowValuation.eq(0) ? 0 : 9999.99\n : newBorrowValuation!.div(newBorrowLimit!).toNumber()\n }\n }\n}\n\nexport class SdkReadWrite extends SdkRead {\n public async claim(): Promise<TransactionResponse> {\n return this._auriLens.connect(this._networkConnection.signer!).claimRewards(\n this._comptroller.address,\n this._auriFairLaunch.address,\n [AurPlyPid]\n );\n }\n public async stake(amount: TokenAmount): Promise<TransactionResponse> {\n return this._auriFairLaunch.connect(this._networkConnection.signer!).deposit(AurPlyPid, amount.rawAmount());\n }\n public async unstake(amount: TokenAmount): Promise<TransactionResponse> {\n return this._auriFairLaunch.connect(this._networkConnection.signer!).withdraw(AurPlyPid, amount.rawAmount());\n }\n public async faucetDrip(): Promise<TransactionResponse> {\n const faucet = new Contract(networkAddresses.misc.FAUCET, FaucetABI.abi, this._networkConnection.provider);\n return faucet.connect(this._networkConnection.signer!).drip();\n }\n}\n\nexport class SDK extends BlockchainEntity {\n constructor() {\n super();\n }\n public read(networkConnection: NetworkConnection): SdkRead {\n return new SdkRead(networkConnection);\n }\n\n public readWrite(networkConnection: NetworkConnection): SdkReadWrite {\n return new SdkReadWrite(networkConnection);\n }\n}\n","import { Token } from './token';\nimport { TokenAmount } from './tokenAmount';\nimport { UserMarketDetails } from './types';\n\nexport const dummyToken = new Token('0xb97ef9ef8734c71904d8002f8b6bc66dd9c48a6e', 6);\n\nexport const dummyPly = new Token('0x8729438eb15e2c8b576fcc6aecda6a148776c0f5', 18);\n\nexport const dummyPlyAurora = new Token('0xE530dC2095Ef5653205CF5ea79F8979a7028065c', 18);\n\nexport const dummyTokenAmount = new TokenAmount(\n dummyToken,\n '123.456',\n false,\n);\n\nexport const dummyZeroTokenAmount = new TokenAmount(\n dummyToken,\n '0',\n);\n\nexport const dummyTokenAmount2 = new TokenAmount(\n dummyToken,\n '456.123',\n false,\n);\n\nexport const dummyTokenAmount3 = new TokenAmount(\n dummyToken,\n '1000.123',\n false,\n);\n\nexport const dummyMarketAddress = '0xbeb5d47a3f720ec0a390d04b4d41ed7d9688bc7f'; // qiUSDC\n\nexport const dummyUserMarketDetails: UserMarketDetails = {\n market: dummyMarketAddress,\n depositBalance: dummyTokenAmount2,\n borrowBalance: dummyZeroTokenAmount,\n isCollateral: true,\n maxWithdrawableAmount: dummyTokenAmount,\n collateralRatio: 0.5,\n underlyingPrice: \"1\"\n};\n","import { BlockchainEntityRead } from \"./BlockchainEntity\";\nimport { NetworkConnection } from \"./types\";\nimport { AuToken } from \"@aurigami/contracts/typechain\";\nimport AuTokenABI from '@aurigami/contracts/artifacts/contracts/AuToken.sol/AuToken.json';\nimport { BigNumber as BN, Contract } from \"ethers\";\n\ntype SimpleTransfer = {\n from: string;\n to: string;\n amount: BN;\n blockNumber: number;\n}\n\n\nexport class TransferEventQuery extends BlockchainEntityRead {\n auToken: AuToken;\n\n constructor(\n tokenAddr: string,\n networkConnection: NetworkConnection\n ) {\n super(networkConnection);\n this.auToken = new Contract(tokenAddr, AuTokenABI.abi, this._networkConnection.provider) as AuToken;\n }\n\n /**\n * query ERC20 transfers from/to an address & auto convert them into SimpleTransfer.\n * The result will be sorted by blocknumber.\n */\n async queryERC20TransfersOf(address: string, fromBlock: number, toBlock: number): Promise<SimpleTransfer[]> {\n const filters = [\n this.auToken.filters.Transfer(address, null),\n this.auToken.filters.Transfer(null, address)\n ]\n\n const events = (await Promise.all(filters.map(filter => this.auToken.queryFilter(filter, fromBlock, toBlock)))).flat();\n\n let results: SimpleTransfer[] = events.map((event) => {\n return {\n from: event.args![0],\n to: event.args![1],\n amount: event.args![2],\n blockNumber: event.blockNumber,\n };\n });\n\n results.sort((a, b) => a.blockNumber - b.blockNumber);\n\n return results;\n }\n\n /**\n * Get the balance of an address at a given block number.\n *\n * Note that this will return the balance after the block get mined.\n */\n async queryERC20BalanceAt(address: string, endBlock: number): Promise<BN> {\n return this.auToken.balanceOf(address, {blockTag: endBlock + 1});\n }\n}\n","import { Provider } from \"@ethersproject/abstract-provider\";\nimport { TransactionResponse } from '@ethersproject/abstract-provider';\nimport { BlockchainEntity, BlockchainEntityRead } from \"./BlockchainEntity\";\nimport { Address, NetworkConnection } from \"./types\";\nimport { BigNumber as BN, Contract, utils } from \"ethers\";\nimport { TransferEventQuery } from \"./transfer-event-query\";\nimport { AIRDROP_START_TIMESTAMP, AIRDROP_KEEP_THRESHOLD, AIRDROP_END_TIMESTAMP, networkAddresses } from \"./constants\";\nimport AuriAirdropABI from \"@aurigami/contracts/artifacts/contracts/AuriAirdrop.sol/AuriAirdrop.json\"\nimport { getBlockBeforeTimestamp, getCurrentTimestamp, getDecimal, isSameAddress } from \"./helpers\";\nimport AIRDROP_AUTOKEN_INFO from \"./airdrop_misc/auTokensInfo.json\"\nimport AIRDROP_WHITELIST_ADDRESSES from \"./airdrop_misc/whitelist.json\"\nimport { AuriAirdrop } from \"@aurigami/contracts/typechain\";\nimport assert from 'assert';\nimport { TokenAmount } from \"./tokenAmount\";\nimport { Token } from \"./token\";\n\ntype AirdropUnderlyingInfo = {\n minDeposit: BN,\n}\n\ntype AirdropAuTokenInfo = {\n address: string,\n exchangeRate: BN,\n deploymentBlock: number,\n underlying: AirdropUnderlyingInfo\n}\n\nclass AirdropSettings {\n private static _instance: AirdropSettings;\n\n airdropStartBlock: number = 0;\n airdropEndBlock: number = 0;\n airdropStartTimestamp: number = AIRDROP_START_TIMESTAMP;\n airdropEndTimestamp: number = AIRDROP_END_TIMESTAMP;\n airdropThreshold: number = AIRDROP_KEEP_THRESHOLD;\n private constructor() {}\n\n public static async getSettings(provider: Provider): Promise<AirdropSettings> {\n if (this._instance)\n return this._instance;\n\n let settings: AirdropSettings = new AirdropSettings();\n\n settings.airdropStartBlock = await getBlockBeforeTimestamp(\n provider,\n settings.airdropStartTimestamp,\n );\n\n settings.airdropEndBlock = await getBlockBeforeTimestamp(\n provider,\n settings.airdropEndTimestamp,\n );\n\n this._instance = settings;\n return settings;\n }\n}\n\nclass AirdropAuTokenKeepTracker extends BlockchainEntityRead {\n private _transferQuery: TransferEventQuery;\n private _airdropAuTokenInfo: AirdropAuTokenInfo;\n public constructor(networkConnection: NetworkConnection, airdropAuTokenInfo: AirdropAuTokenInfo) {\n super(networkConnection);\n this._transferQuery = new TransferEventQuery(airdropAuTokenInfo.address, networkConnection);\n this._airdropAuTokenInfo = airdropAuTokenInfo;\n\n // exchangeRate = 102% * exchangeRate, see why in the comment of _toUnderlyingValue\n this._airdropAuTokenInfo.exchangeRate = this._airdropAuTokenInfo.exchangeRate.add(\n this._airdropAuTokenInfo.exchangeRate.div(50)\n )\n }\n\n /**\n * Convert the given amount of auToken to the underlying value with the stored exchange rate\n *\n * Why we need to do this?\n *\n * By transfer event, we cannot know the exact underlying, the only\n * info that we can keep track of via transfer is event is the auToken amount. So we need to\n * convert it to the underlying value with the stored exchange rate.\n *\n * However, we cannot just simply use auTokenAmount * exchangeRate, because the exchange rate\n * is changing over time. As advice of the contract team, use fixed exchangeRate * 102% is good enough.\n *\n */\n private _toUnderlyingValue(auTokenAmount: BN): BN {\n return auTokenAmount.mul(\n this._airdropAuTokenInfo.exchangeRate\n ).div(BN.from(10).pow(18));\n }\n\n /**\n * Check if the user has been deposit at least (minDeposit) and keep it for\n * more than AIRDROP_KEEP_THRESHOLD milliseconds\n *\n * How it works:\n * Whenever the user balance is exceed minDeposit, we will record the timestamp,\n * and when the balance is below minDeposit, we will compare with the saved timestamp to see\n * whether it has been keep for more than AIRDROP_KEEP_THRESHOLD milliseconds.\n *\n */\n public async isEligible(address: string): Promise<boolean> {\n const settings = await AirdropSettings.getSettings(this._networkConnection.provider);\n const minDeposit = this._airdropAuTokenInfo.underlying.minDeposit;\n\n // Get user balance at the time of Airdrop start\n let balance = await this._transferQuery.queryERC20BalanceAt(\n address,\n settings.airdropStartBlock - 1\n );\n\n const [BELOW, ABOVE] = [false, true];\n let flag = BELOW;\n // variable to store the last timestamp that, from it to \"current\" timestamp,\n // the balance is always above minDeposit\n let lastEligibleBalanceTimestamp = 0;\n\n if (this._toUnderlyingValue(balance).gte(minDeposit)) {\n lastEligibleBalanceTimestamp = settings.airdropStartTimestamp;\n flag = ABOVE;\n }\n\n let events = await this._transferQuery.queryERC20TransfersOf(\n address,\n settings.airdropStartBlock,\n settings.airdropEndBlock\n );\n\n for (let { from, to, amount, blockNumber } of events) {\n if (isSameAddress(from, address)) {\n balance = balance.sub(amount);\n }\n if (isSameAddress(to, address)) {\n balance = balance.add(amount);\n }\n\n // if it is different from the flag, that means the balance is changing\n if (this._toUnderlyingValue(balance).gte(minDeposit) != flag) {\n flag = !flag;\n const timestamp = (await this._networkConnection.provider.getBlock(blockNumber)).timestamp;\n\n // if this txn make the balance below the minDeposit,\n // check whether it has been keep for more than AIRDROP_KEEP_THRESHOLD\n if (flag == BELOW) {\n if (timestamp - lastEligibleBalanceTimestamp >= settings.airdropThreshold) {\n return true;\n }\n lastEligibleBalanceTimestamp = 0;\n }\n else {\n // record the timestamp when the balance is above minDeposit\n lastEligibleBalanceTimestamp = timestamp;\n }\n }\n }\n\n // if after the last txn, the balance is still above minDeposit,\n // we should check from the last timestamp to \"now\"\n if (flag == ABOVE) {\n const timestamp = Math.min(settings.airdropEndTimestamp, getCurrentTimestamp());\n return timestamp - lastEligibleBalanceTimestamp >= settings.airdropThreshold;\n }\n\n return false;\n }\n}\n\nexport class AirdropRead extends BlockchainEntityRead {\n protected _airDrop: AuriAirdrop;\n private _whitelistedAddresses: Set<string>;\n private keepTrackers: AirdropAuTokenKeepTracker[] = [];\n public constructor(networkConnection: NetworkConnection) {\n super(networkConnection);\n this._airDrop = new Contract(\n networkAddresses.misc.AURI_AIRDROP,\n AuriAirdropABI.abi,\n networkConnection.provider\n ) as AuriAirdrop;\n\n this._whitelistedAddresses = new Set(\n (AIRDROP_WHITELIST_ADDRESSES as string[]).map(e => e.toLocaleLowerCase())\n );\n\n let auTokens: any = AIRDROP_AUTOKEN_INFO;\n\n for (let auToken in auTokens) {\n let { address, exchangeRate, deploymentBlock, underlying } = auTokens[auToken];\n\n let airdropInfo: AirdropAuTokenInfo = {\n address: address,\n exchangeRate: BN.from(exchangeRate),\n deploymentBlock: parseInt(deploymentBlock),\n underlying: {\n minDeposit: BN.from(underlying.minDeposit),\n }\n }\n\n this.keepTrackers.push(\n new AirdropAuTokenKeepTracker(\n networkConnection,\n airdropInfo\n )\n )\n }\n }\n\n public countWhitelistedAddresses(): number {\n return this._whitelistedAddresses.size;\n }\n\n public isWhitelisted(user: string): boolean {\n return this._whitelistedAddresses.has(user.toLocaleLowerCase());\n }\n\n public async hasCompletedChallenge(user: string): Promise<boolean> {\n const settings = await AirdropSettings.getSettings(this._networkConnection.provider);\n\n if (getCurrentTimestamp() < settings.airdropStartTimestamp) {\n return false;\n }\n\n if (!this.isWhitelisted(user)) {\n return false;\n }\n\n // iterate for all the market and check if the user has completed the challenge\n return (await Promise.all(this.keepTrackers.map(async (keepTracker) => {\n return keepTracker.isEligible(user);\n }))).includes(true);\n }\n\n /**\n * Get redeemable rewards amount of user\n */\n public async getRedeemableReward(campaign: string, token: Address, user: Address): Promise<TokenAmount> {\n let tokenInstance: Token = new Token(\n token,\n getDecimal(token),\n );\n\n let rewards: BN = await this._airDrop.getRedeemableReward(\n utils.formatBytes32String(campaign),\n token,\n user\n )\n\n return new TokenAmount(tokenInstance, rewards.toString());\n }\n}\n\nexport class AirdropReadWrite extends AirdropRead {\n /**\n * Transfer rewards from multiple campaigns to msg.sender\n */\n public async redeemMultiple(campaigns: string[], tokens: Address[]): Promise<TransactionResponse> {\n assert(campaigns.length == tokens.length, \"campaigns and tokens must have the same length\");\n return this._airDrop.connect(this._networkConnection.signer!).redeem(\n campaigns.map(e => utils.formatBytes32String(e)),\n tokens,\n await this._networkConnection.signer!.getAddress(),\n );\n }\n\n /**\n * Redeem reward from a single campaign\n */\n public async redeemSingle(campaign: string, token: Address): Promise<TransactionResponse> {\n return this.redeemMultiple([campaign], [token]);\n }\n}\n\nexport class Airdrop extends BlockchainEntity {\n constructor() {\n super();\n }\n public read(networkConnection: NetworkConnection): AirdropRead {\n return new AirdropRead(networkConnection);\n }\n public readWrite(networkConnection: NetworkConnection): AirdropReadWrite {\n return new AirdropReadWrite(networkConnection);\n }\n}\n","import BigNumber from 'bignumber.js';\nimport { ethers } from 'ethers';\nimport { Logger } from 'ethers/lib/utils';\n\nethers.utils.Logger.setLogLevel(Logger.levels.ERROR);\nBigNumber.config({DECIMAL_PLACES: 50})\n\nexport * from './SDK';\nexport * from './MoneyMarket';\nexport * from './BlockchainEntity';\nexport * from './helpers';\nexport * from './constants';\nexport * from './dummy';\nexport * from './priceFetcher';\nexport * from './token';\nexport * from './tokenAmount';\nexport * from './types';\nexport * from './airdrop-lottery';\nexport * from './transfer-event-query';\n"],"names":["undefined","BlockchainEntityRead","networkConnection","_networkConnection","BlockchainEntityReadWrite","signer","Signer","Error","BlockchainEntity","read","readWrite","ComptrollerRewardType","MarketAction","dummyAddress","ETHAddress","AURORA_CHAINID","DECIMAL_PRECISION","networkAddresses","auTokens","name","address","toLowerCase","underlying","misc","COMPTROLLER","oracle","AURIFAIRLAUNCH","AURILENS","TOKENLOCK","ETHREPAYHELPER","AURI_AIRDROP","tokens","AURORA","PLY","stNEAR","USDC","WNEAR","TRI","META","toLocaleLowerCase","AURPLY","BORROW_LIMIT_BUFFER","BigNumber","REWARDCLAIMSTART","ONE_DAY","ONE_YEAR","AurPlyPid","INF","BN","from","pow","sub","AIRDROP_START_TIMESTAMP","AIRDROP_END_TIMESTAMP","AIRDROP_KEEP_THRESHOLD","DEPOSIT_NEAR_REWARDS_PER_WEEK","Object","fromEntries","entries","map","k","v","BORROW_NEAR_REWARDS_PER_WEEK","AURORA_API_BASE_URL","getQuery","module","action","params","globalThis","fetch","assign","URLSearchParams","headers","method","resp","json","result","decimalRecords","formatObject","object","JSON","stringify","decimalFactor","decimal","toString","isSameAddress","address1","address2","getCurrentTimestamp","Math","trunc","Date","now","validateAndParseAddress","utils","getAddress","error","getDecimal","calcLMRewardApr","rewardsValue","totalStakeValue","frequencyPerYear","lte","multipliedBy","dividedBy","getBlockTimestamp","provider","blockNumber","getBlock","block","timestamp","getBlockBeforeTimestamp","getAuroraAPIQuery","parseInt","getBlockNumber","Token","decimals","PLYToken","AURPLYToken","TokenAmount","token","amount","isRaw","rawAmnt","times","toFixed","formattedAmount","div","rawAmount","fetchPriceFromCoingeckoAPI","id","axios","get","then","res","data","price","usd","fetchPriceFromCoingecko","fetchLPPositions","LPAddress","promises","LPContract","Contract","IUniswapV2PairABI","abi","push","token0","toekn1","getReserves","totalSupply","Promise","all","values","token1","reserve0","reserve1","fetchLPPrice","LPInfo","fetchPrice","token0Price","reserveUSD","token1Price","processPriceFromOracle","rawPrice","underlyingDecimal","fetchPriceFromOracle","auTokenAddress","oracleContract","OracleABI","getUnderlyingPrice","fetchUnderlyingTokensPrices","auriLens","AuriLensABI","auTokenAddresses","auToken","underlyingDecimals","auTokenUnderlyingPriceAll","rawPrices","ind","underlyingPrice","fetchStNEARPrice","ratioPromise","nearPricePromise","ratioRes","nearPrice","ratio","st_near_price","shouldFetchFromCoingecko","hardcodePLYPrice","matchingAuToken","find","fetchValuation","tokenAmount","calcValuation","MoneyMarketRead","underlyingAsset","AuETHABI","AuErc20ABI","_comptroller","ComptrollerABI","_auriLens","getRewardSpeeds","speeds","getTotalTokenBorrowed","totalBorrows","getTotalTokenDeposited","totalBorrow","getCash","totalCash","add","getDepositAPY","supplyRatePerTimestamp","getBorrowAPY","borrowRatePerTimestamp","getCollateralRatio","markets","collateralFactorMantissa","getBorrowPlyAPY","totalBorrowed","rewardSpeeds","rewardSpeed","plyPrice","getDepositPlyAPY","totalDeposited","getDetails","depositAPY","toNumber","borrowAPY","collateralRatio","borrowPlyApy","plyRewardBorrowSpeed","depositPlyApy","plyRewardSupplySpeed","getDepositNEARRewardPerWeek","depositNEARApy","getBorrowNEARRewardPerWeek","borrowNEARApy","depositMETAApy","totalTokenDeposited","totalTokenBorrowed","depositApy","borrowApy","depositPlyPerWeek","mul","borrowPlyPerWeek","getUserBorrowBalance","userAddress","callStatic","borrowBalanceCurrent","getUserDepositBalance","balanceOfUnderlying","totalDeposit","NEARToken","rewardStartTime","rewardStopTime","currentTime","reward","MoneyMarketReadWrite","_EthRepayHelper","EthRepayHelperABI","deposit","connect","mint","value","borrow","withdraw","lt","redeemUnderlying","repay","repayBorrow","enableCollateral","enterMarkets","disableCollateral","exitMarket","MoneyMarket","SdkRead","_tokenLock","TokenLockABI","_auriFairLaunch","AuriFairLaunchABI","getLockingDetails","currentWeek","denominator","percentageLock","err","vestingStart","currentUnlockPortion","minus","nextUnlockPortion","getUserDetails","marketCount","length","userMarketDetails","totalBorrowLimit","pricePromises","userMarketDetail","market","moneyMarket","depositBalance","borrowBalance","getAssetsIn","assetsIn","underlyingPrices","depositValues","i","auAddress","isCollateral","reduce","p","index","plus","Array","getAccountLiquidity","claimAndGetRewardBalancesMetadata","lockedAmounts","accountLiquidity","rewardBalancesMetadata","lockedAmount","borrowedvaluation","bufferedBorrowLimit","minimumBorrowLimitAllowed","borrowableAmount","borrowLimitMargin","gt","maxWithdrawCap","maxWithdrawableAmount","borrowLimit","currency","accruedPly","plyAccrued","lockedPly","getPlyAuroraPoolDetails","getPoolInfo","stakedLiquidity","totalStake","rewardPerSecond","rewardPerSecondValuation","totalStakeValuation","totalStakedLiquidity","apy","getTokenPrice","stakeBalanceOf","user","getUserInfo","userInfo","calcHypotheticalStats","currentBorrowLimit","currentBorrowValuation","newBorrowLimit","newBorrowValuation","EnableCollateral","DisableCollateral","deltaBorrowLimit","Deposit","Withdraw","Borrow","Repay","deltaBorrowValuation","newBorrowUtilization","eq","SdkReadWrite","claim","claimRewards","stake","unstake","faucetDrip","faucet","FAUCET","FaucetABI","drip","SDK","dummyToken","dummyPly","dummyPlyAurora","dummyTokenAmount","dummyZeroTokenAmount","dummyTokenAmount2","dummyTokenAmount3","dummyMarketAddress","dummyUserMarketDetails","TransferEventQuery","tokenAddr","AuTokenABI","queryERC20TransfersOf","fromBlock","toBlock","filters","Transfer","filter","queryFilter","events","flat","results","event","args","to","sort","a","b","queryERC20BalanceAt","endBlock","balanceOf","blockTag","AirdropSettings","getSettings","_instance","settings","airdropStartTimestamp","airdropStartBlock","airdropEndTimestamp","airdropEndBlock","AirdropAuTokenKeepTracker","airdropAuTokenInfo","_transferQuery","_airdropAuTokenInfo","exchangeRate","_toUnderlyingValue","auTokenAmount","isEligible","minDeposit","balance","BELOW","ABOVE","flag","lastEligibleBalanceTimestamp","gte","airdropThreshold","min","AirdropRead","_airDrop","AuriAirdropABI","_whitelistedAddresses","Set","AIRDROP_WHITELIST_ADDRESSES","e","AIRDROP_AUTOKEN_INFO","deploymentBlock","airdropInfo","keepTrackers","countWhitelistedAddresses","size","isWhitelisted","has","hasCompletedChallenge","keepTracker","includes","getRedeemableReward","campaign","tokenInstance","formatBytes32String","rewards","AirdropReadWrite","redeemMultiple","campaigns","assert","redeem","redeemSingle","Airdrop","ethers","Logger","setLogLevel","levels","ERROR","config","DECIMAL_PLACES"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ICaMmZ;AAQF;AALA,0BAAA,GAA4B,CAA5B;AACA,wBAAA,GAA0B,CAA1B;AACA,8BA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"}